From 7e8ee264aae07a779370a279709cf7bb30375a85 Mon Sep 17 00:00:00 2001 From: alex Date: Sun, 12 Oct 2025 18:56:59 +0200 Subject: [PATCH] Sync from remote server: 2025-10-12 18:56:41 --- .gitignore | 1 + .python-version | 1 + ATD/ATD.m | 1102 ++++ ATD/ATD_Dati.m | 999 ++++ ATD/CANCELLA.m | 109 + ATD/CalcoloBiax_PCL.m | 52 + ATD/CalcoloBiax_PCLHR.m | 44 + ATD/CalcoloBiax_RL.m | 49 + ATD/CalcoloBiax_TLH.m | 31 + ATD/CalcoloBiax_TLHRH.m | 31 + ATD/CalcoloBiax_TuL.m | 56 + ATD/CalcoloStar.m | 88 + ATD/CalcoloStar_Report.m | 42 + ATD/DB_date_time.m | 25 + ATD/DBwrite2DCrL.m | 41 + ATD/DBwrite3DCrL.m | 41 + ATD/DBwrite3DEL.m | 39 + ATD/DBwriteCrL.m | 38 + ATD/DBwriteEL.m | 65 + ATD/DBwriteLL.m | 25 + ATD/DBwriteMPBEL.m | 73 + ATD/DBwritePCL.m | 75 + ATD/DBwritePCLHR.m | 35 + ATD/DBwritePL.m | 24 + ATD/DBwriteRL.m | 30 + ATD/DBwriteSM.m | 38 + ATD/DBwriteTLH.m | 75 + ATD/DBwriteTLHRH.m | 75 + ATD/DBwriteTuL.m | 45 + ATD/DBwriteWEL.m | 37 + ATD/IDunit.m | 15 + ATD/LastElab.m | 2697 +++++++++ ATD/LastElab_bisAL.m | 45 + ATD/LastElab_bisPCL.m | 45 + ATD/LastElab_bisPCLHR.m | 45 + ATD/LastElab_bisRL.m | 45 + ATD/LastElab_bisTLH.m | Bin 0 -> 1936 bytes ATD/LastElab_bisTLHRH.m | 45 + ATD/LastElab_bisTuL.m | 45 + ATD/MediaDati_2DCrL.m | 28 + ATD/MediaDati_3DCrL.m | 28 + ATD/MediaDati_3DEL.m | 28 + ATD/MediaDati_AL.m | 28 + ATD/MediaDati_CrL.m | 28 + ATD/MediaDati_EL.m | 28 + ATD/MediaDati_LL.m | 25 + ATD/MediaDati_MPBEL.m | 29 + ATD/MediaDati_PCL.m | 34 + ATD/MediaDati_PCLHR.m | 32 + ATD/MediaDati_PL.m | 25 + ATD/MediaDati_RL.m | 34 + ATD/MediaDati_SM.m | 28 + ATD/MediaDati_TLH.m | 34 + ATD/MediaDati_TLHRH.m | 33 + ATD/MediaDati_TuL.m | 53 + ATD/MediaDati_WEL.m | 28 + ATD/NuovaConversione.m | 231 + ATD/Parametri_Installazione.m | 90 + ATD/Recharge.m | 45 + ATD/Report.m | 770 +++ ATD/Report_ASE.m | 252 + ATD/SMS.m | 130 + ATD/SWSearch.m | 123 + ATD/Siren.m | 225 + ATD/Site_Info.m | 60 + ATD/Users_Def.m | 308 + ATD/YesNo.m | 183 + ATD/alert_Levels.m | 305 + ATD/approx_PCL.m | 68 + ATD/approx_RL.m | 49 + ATD/approx_TLH.m | 68 + ATD/approx_TLHRH.m | 69 + ATD/approx_TuL.m | 87 + ATD/calibPCL.m | 8 + ATD/cancellaDB.m | 21 + ATD/cellMaker2DCrL.m | 22 + ATD/cellMaker3DCrL.m | 23 + ATD/cellMaker3DEL.m | 23 + ATD/cellMakerCrL.m | 20 + ATD/cellMakerEL.m | 25 + ATD/cellMakerLL.m | 16 + ATD/cellMakerMPBEL.m | 40 + ATD/cellMakerPCL.m | 30 + ATD/cellMakerPCLHR.m | 31 + ATD/cellMakerPL.m | 16 + ATD/cellMakerRL.m | 26 + ATD/cellMakerSM.m | 20 + ATD/cellMakerTLH.m | 30 + ATD/cellMakerTLHRH.m | 31 + ATD/cellMakerTuL.m | 44 + ATD/cellMakerWEL.m | 21 + ATD/centralina.m | 36 + ATD/centralina_Dati.m | 91 + ATD/checkBattery.m | 125 + ATD/checkGIS.m | 117 + ATD/checkSIM.m | 124 + ATD/checkUnit.m | 113 + ATD/check_RL.m | 67 + ATD/checkdata.m | 124 + ATD/columnlegend.m | 263 + ATD/conv_grezzi2DCrL.m | 104 + ATD/conv_grezzi3DCrL.m | 122 + ATD/conv_grezzi3DEL.m | 114 + ATD/conv_grezziAL.m | 42 + ATD/conv_grezziCrL.m | 101 + ATD/conv_grezziEL.m | 87 + ATD/conv_grezziLL.m | 34 + ATD/conv_grezziMPBEL.m | 69 + ATD/conv_grezziPCL.m | 80 + ATD/conv_grezziPCLHR.m | 33 + ATD/conv_grezziPL.m | 34 + ATD/conv_grezziRL.m | 79 + ATD/conv_grezziRL_Dati.m | 91 + ATD/conv_grezziSM.m | 64 + ATD/conv_grezziTLH.m | 80 + ATD/conv_grezziTLHRH.m | 36 + ATD/conv_grezziTuL.m | 87 + ATD/conv_grezziTuL_Dati.m | 90 + ATD/conv_grezziWEL.m | 77 + ATD/corrTuL.m | 41 + ATD/database_definition.m | 26 + ATD/database_write.m | 452 ++ ATD/datainiziale.m | 44 + ATD/defDati2DCrL.m | 99 + ATD/defDati3DCrL.m | 121 + ATD/defDati3DEL.m | 154 + ATD/defDatiAL.m | 37 + ATD/defDatiCrL.m | 67 + ATD/defDatiEL.m | 70 + ATD/defDatiLL.m | 43 + ATD/defDatiMPBEL.m | 37 + ATD/defDatiPCL.m | 67 + ATD/defDatiPCLHR.m | 141 + ATD/defDatiPL.m | 44 + ATD/defDatiRL.m | 66 + ATD/defDatiSM.m | 67 + ATD/defDatiTLH.m | 69 + ATD/defDatiTLHRH.m | 142 + ATD/defDatiTuL.m | 83 + ATD/defDatiTuL_Dati.m | 93 + ATD/defDatiWEL.m | 70 + ATD/elab2D_PCL.m | 621 ++ ATD/elab2D_PCLHR.m | 421 ++ ATD/elab2D_RL.m | 417 ++ ATD/elab2D_TLH.m | 407 ++ ATD/elab2D_TLHRH.m | 369 ++ ATD/elab2D_TuL.m | 633 ++ ATD/elab2D_TuL_MOD.m | 630 ++ ATD/filtro_PCL.m | 71 + ATD/filtro_RL.m | 98 + ATD/filtro_TLH.m | 71 + ATD/filtro_TLHRH.m | 71 + ATD/filtro_TuL.m | 166 + ATD/info_Sito.m | 665 +++ ATD/lettura.m | 9979 ++++++++++++++++++++++++++++++++ ATD/letturaCal.m | 740 +++ ATD/lettura_Dati.m | 9648 ++++++++++++++++++++++++++++++ ATD/matrici_vuote_PCL.m | 23 + ATD/matrici_vuote_PCLHR.m | 23 + ATD/matrici_vuote_RL.m | 18 + ATD/matrici_vuote_TLH.m | 22 + ATD/matrici_vuote_TLHRH.m | 22 + ATD/matrici_vuote_TuL.m | 25 + ATD/pos_ini_PCL.m | 7 + ATD/pos_ini_PCLHR.m | 7 + ATD/pos_ini_RL.m | 8 + ATD/pos_ini_TuL.m | 24 + ATD/punti_noti_PCL.m | 28 + ATD/punti_noti_PCLHR.m | 22 + ATD/punti_noti_RL.m | 37 + ATD/punti_noti_TuL.m | 34 + ATD/punti_noti_exe_PCL.m | 48 + ATD/punti_noti_exe_PCLHR.m | 39 + ATD/punti_noti_exe_RL.m | 49 + ATD/punti_noti_exe_TuL.m | 66 + ATD/report_2DCrL.m | 442 ++ ATD/report_3DCrL.m | 459 ++ ATD/report_3DCrL_ENG.m | 259 + ATD/report_3DEL.m | 459 ++ ATD/report_3DEL_ENG.m | 260 + ATD/report_AR.m | 925 +++ ATD/report_BL.m | 157 + ATD/report_BL_ENG.m | 96 + ATD/report_CT.m | 200 + ATD/report_CT_ENG.m | 88 + ATD/report_CU.m | 430 ++ ATD/report_CrL.m | 412 ++ ATD/report_CrL_ENG.m | 249 + ATD/report_CrossGraphs.m | 3102 ++++++++++ ATD/report_CrossGraphs_ENG.m | 1499 +++++ ATD/report_EL.m | 420 ++ ATD/report_EL_ENG.m | 239 + ATD/report_IPL.m | 561 ++ ATD/report_IPLHR.m | 379 ++ ATD/report_KL.m | 530 ++ ATD/report_KLHR.m | 283 + ATD/report_KLHR_ENG.m | 149 + ATD/report_KL_ENG.m | 200 + ATD/report_LL.m | 404 ++ ATD/report_LL_ENG.m | 239 + ATD/report_MPBEL.m | 639 ++ ATD/report_MPBEL_ENG.m | 393 ++ ATD/report_PCL.m | 1038 ++++ ATD/report_PCL_ENG.m | 642 ++ ATD/report_PE.m | 440 ++ ATD/report_PL.m | 370 ++ ATD/report_PT100.m | 364 ++ ATD/report_PrL.m | 365 ++ ATD/report_PrL_ENG.m | 217 + ATD/report_RL.m | 213 + ATD/report_RSN.m | 262 + ATD/report_RSNHR.m | 258 + ATD/report_RaL.m | 1036 ++++ ATD/report_RaL_ENG.m | 662 +++ ATD/report_TL.m | 555 ++ ATD/report_ThL.m | 345 ++ ATD/report_TrL.m | 144 + ATD/report_TuL.m | 1014 ++++ ATD/report_TuL_ENG.m | 722 +++ ATD/report_WEL.m | 411 ++ ATD/report_WEL_ENG.m | 206 + ATD/report_WL.m | 419 ++ ATD/report_appendix.m | 4090 +++++++++++++ ATD/report_appendix_ENG.m | 1680 ++++++ ATD/report_ini.m | 56 + ATD/report_table.m | 600 ++ ATD/report_table_ENG.m | 602 ++ ATD/scarico.m | 84 + ATD/schema.m | 17 + ATD/schemaSP.m | 286 + ATD/scrivo.m | 134 + ATD/segnoTuL.m | 69 + ATD/sendReportmail.m | 155 + ATD/soglie.m | 3472 +++++++++++ ATD/star.m | 33 + ATD/template.m | 18 + ATD/template_cover.m | 18 + ATD/tipologiaNodi.m | 505 ++ README.md | 0 RSN/DB_date_time.m | 25 + RSN/DBwriteLL.m | 25 + RSN/DBwriteRSN.m | 27 + RSN/DBwriteRSNHR.m | 26 + RSN/DBwriteSS.m | 25 + RSN/DBwriteTrL.m | 25 + RSN/IDunit.m | 15 + RSN/LastElab.m | 946 +++ RSN/LastElab_bisDL.m | 46 + RSN/LastElab_bisSS.m | 46 + RSN/LastElab_bisTrL.m | 45 + RSN/MediaDati_LL.m | 29 + RSN/MediaDati_RSN.m | 32 + RSN/MediaDati_RSNHR.m | 33 + RSN/NuovaConversione.m | 58 + RSN/Parametri_Installazione.m | 52 + RSN/RSN.m | 375 ++ RSN/SWSearch.m | 54 + RSN/Siren.m | 225 + RSN/Site_Info.m | 60 + RSN/Triggercheck.m | 837 +++ RSN/Users_Def.m | 308 + RSN/YesNo.m | 82 + RSN/alert_Levels.m | 2176 +++++++ RSN/approx.m | 27 + RSN/approx_RSNHR.m | 27 + RSN/azzeramenti.m | 61 + RSN/azzeramenti_RSNHR.m | 68 + RSN/cancellaDB.m | 21 + RSN/cellMakerLL.m | 16 + RSN/cellMakerRSN.m | 21 + RSN/cellMakerRSNHR.m | 22 + RSN/cellMakerSS.m | 18 + RSN/cellMakerTrL.m | 18 + RSN/centralina.m | 40 + RSN/checkBattery.m | 138 + RSN/checkGIS.m | 117 + RSN/checkSIM.m | 124 + RSN/checkUnit.m | 112 + RSN/checkdata.m | 61 + RSN/conv_grezziLL.m | 39 + RSN/conv_grezziRSN.m | 168 + RSN/conv_grezziRSNHR.m | 47 + RSN/database_definition.m | 27 + RSN/database_write.m | 150 + RSN/datainiziale.m | 21 + RSN/defDatiLL.m | 40 + RSN/defDatiRSN.m | 71 + RSN/defDatiRSNHR.m | 124 + RSN/defDatiSS.m | 54 + RSN/defDatiTrL.m | 70 + RSN/elaborazione_RSN.m | 304 + RSN/elaborazione_RSNHR.m | 211 + RSN/lettura.m | 2287 ++++++++ RSN/letturaCal.m | 168 + RSN/loadcell.m | 93 + RSN/matrici_vuote_RSN.m | 14 + RSN/matrici_vuote_RSNHR.m | 15 + RSN/schema.m | 17 + RSN/scrivo.m | 45 + RSN/tipologiaNodi.m | 256 + Tilt/ASSEa.m | 18 + Tilt/ASSEa_HR.m | 19 + Tilt/ASSEb.m | 17 + Tilt/ASSEb_HR.m | 19 + Tilt/ASSEb_HR_OLD.m | 19 + Tilt/AlertReport.m | 429 ++ Tilt/Baro.m | 52 + Tilt/CANCELLA.m | 152 + Tilt/CalcoloBiax_TLH.m | 31 + Tilt/CalcoloBiax_TLHRH.m | 27 + Tilt/CalcoloRain.m | 98 + Tilt/CalcoloSPP.m | 39 + Tilt/CalcoloSnow.m | 101 + Tilt/DB_date_time.m | 25 + Tilt/DB_date_time_RIS.m | 24 + Tilt/DBwriteBL.m | 39 + Tilt/DBwriteHD.m | 109 + Tilt/DBwriteHDVR.m | 109 + Tilt/DBwriteIPL.m | 95 + Tilt/DBwriteIPLHR.m | 96 + Tilt/DBwriteKL.m | 74 + Tilt/DBwriteKLHR.m | 43 + Tilt/DBwriteKL_future.m | 42 + Tilt/DBwriteLL.m | 24 + Tilt/DBwritePE.m | 25 + Tilt/DBwritePL.m | 41 + Tilt/DBwritePT100.m | 24 + Tilt/DBwriteRL.m | 25 + Tilt/DBwriteSL.m | 25 + Tilt/DBwriteSPP.m | 25 + Tilt/DBwriteTL.m | 107 + Tilt/DBwriteTLH.m | 91 + Tilt/DBwriteTLHR.m | 96 + Tilt/DBwriteTLHRH.m | 81 + Tilt/DBwriteThL.m | 24 + Tilt/DBwriteWL.m | 37 + Tilt/Fukuzono.m | 712 +++ Tilt/Fukuzono_Giornaliero.m | 725 +++ Tilt/IDunit.m | 15 + Tilt/Klino.m | 256 + Tilt/KlinoHR.m | 194 + Tilt/LastElab.m | 3044 ++++++++++ Tilt/LastElab_bisIPL.m | 42 + Tilt/LastElab_bisIPLHR.m | 42 + Tilt/LastElab_bisRL.m | 42 + Tilt/LastElab_bisSL.m | 42 + Tilt/LastElab_bisTL.m | 42 + Tilt/LastElab_bisTLH.m | 42 + Tilt/LastElab_bisTLHR.m | 42 + Tilt/LastElab_bisTLHRH.m | 43 + Tilt/MediaDati_BL.m | 32 + Tilt/MediaDati_HD.m | 125 + Tilt/MediaDati_HDVR.m | 127 + Tilt/MediaDati_IPL.m | 137 + Tilt/MediaDati_IPLHR.m | 32 + Tilt/MediaDati_KL.m | 27 + Tilt/MediaDati_KLHR.m | 28 + Tilt/MediaDati_LL.m | 27 + Tilt/MediaDati_PE.m | 24 + Tilt/MediaDati_PL.m | 31 + Tilt/MediaDati_PT100.m | 19 + Tilt/MediaDati_RL.m | 17 + Tilt/MediaDati_TL.m | 131 + Tilt/MediaDati_TLH.m | 88 + Tilt/MediaDati_TLHR.m | 34 + Tilt/MediaDati_TLHRH.m | 32 + Tilt/MediaDati_ThL.m | 24 + Tilt/MediaDati_WL.m | 19 + Tilt/NuovaConversione.m | 240 + Tilt/PT100.m | 134 + Tilt/Parametri_Installazione.m | 169 + Tilt/Piezo.m | 90 + Tilt/QuaternioniASE.m | 175 + Tilt/Report_ASE.m | 249 + Tilt/Report_ASE_bckUp.m | 932 +++ Tilt/SMS.m | 114 + Tilt/SWSearch.m | 286 + Tilt/Siren.m | 219 + Tilt/Site_Info.m | 60 + Tilt/Therm.m | 135 + Tilt/Tilt.m | 1327 +++++ Tilt/Tilt_bck.m | 1040 ++++ Tilt/Time_Of_Failure.m | 1572 +++++ Tilt/Untitled.m | 30 + Tilt/Untitled2.m | 14 + Tilt/Untitled3.m | 45 + Tilt/Untitled3bis.m | 46 + Tilt/Untitled_2.m | 54 + Tilt/Users_Def.m | 118 + Tilt/Users_Def_old.m | 322 ++ Tilt/YesNo.m | 223 + Tilt/alert_Levels.m | 476 ++ Tilt/approx.m | 73 + Tilt/approx_HD.m | 73 + Tilt/approx_IPLHR.m | 71 + Tilt/approx_TLH.m | 59 + Tilt/approx_TLHR.m | 71 + Tilt/approx_TLHRH.m | 59 + Tilt/arot.m | 13 + Tilt/arotHR.m | 15 + Tilt/azzeramenti.m | 51 + Tilt/azzeramenti_TLH.m | 54 + Tilt/azzeramenti_TLHR.m | 56 + Tilt/azzeramenti_TLHRH.m | 55 + Tilt/biax_HD.m | 477 ++ Tilt/biax_HDVR.m | 477 ++ Tilt/biax_IPL.m | 487 ++ Tilt/biax_IPLHR.m | 534 ++ Tilt/biax_TL.m | 501 ++ Tilt/biax_TLH.m | 425 ++ Tilt/biax_TLHR.m | 523 ++ Tilt/biax_TLHRH.m | 390 ++ Tilt/cancellaDB.m | 14 + Tilt/cellMakerBL.m | 18 + Tilt/cellMakerHD.m | 39 + Tilt/cellMakerHDVR.m | 39 + Tilt/cellMakerIPL.m | 36 + Tilt/cellMakerIPLHR.m | 35 + Tilt/cellMakerKL.m | 26 + Tilt/cellMakerKLHR.m | 19 + Tilt/cellMakerLL.m | 16 + Tilt/cellMakerPE.m | 17 + Tilt/cellMakerPL.m | 17 + Tilt/cellMakerPT100.m | 17 + Tilt/cellMakerRL.m | 18 + Tilt/cellMakerSL.m | 18 + Tilt/cellMakerSPP.m | 16 + Tilt/cellMakerTL.m | 34 + Tilt/cellMakerTLH.m | 31 + Tilt/cellMakerTLHR.m | 35 + Tilt/cellMakerTLHRH.m | 30 + Tilt/cellMakerThL.m | 17 + Tilt/cellMakerWL.m | 20 + Tilt/centralina.m | 42 + Tilt/checkBattery.m | 219 + Tilt/checkGIS.m | 117 + Tilt/checkSIM.m | 124 + Tilt/checkUnit.m | 113 + Tilt/checkdata.m | 132 + Tilt/columnlegend.m | 263 + Tilt/conv_grezziBL.m | 32 + Tilt/conv_grezziHD.m | 172 + Tilt/conv_grezziHDVR.m | 109 + Tilt/conv_grezziIPL.m | 221 + Tilt/conv_grezziIPLHR.m | 73 + Tilt/conv_grezziKL.m | 143 + Tilt/conv_grezziKLHR.m | 44 + Tilt/conv_grezziLL.m | 37 + Tilt/conv_grezziPE.m | 23 + Tilt/conv_grezziPL.m | 161 + Tilt/conv_grezziPT100.m | 23 + Tilt/conv_grezziRL.m | 26 + Tilt/conv_grezziTL.m | 207 + Tilt/conv_grezziTLH.m | 103 + Tilt/conv_grezziTLHR.m | 56 + Tilt/conv_grezziTLHRH.m | 55 + Tilt/conv_grezziThL.m | 23 + Tilt/conv_grezziWL.m | 155 + Tilt/database_definition.m | 66 + Tilt/database_write.m | 525 ++ Tilt/datainiziale.m | 21 + Tilt/defDatiBL.m | 45 + Tilt/defDatiHD.m | 104 + Tilt/defDatiHDVR.m | 104 + Tilt/defDatiIPL.m | 108 + Tilt/defDatiIPLHR.m | 195 + Tilt/defDatiKL.m | 102 + Tilt/defDatiKLHR.m | 161 + Tilt/defDatiLL.m | 56 + Tilt/defDatiPE.m | 33 + Tilt/defDatiPL.m | 44 + Tilt/defDatiPT100.m | 34 + Tilt/defDatiRL.m | 34 + Tilt/defDatiTL.m | 157 + Tilt/defDatiTLH.m | 86 + Tilt/defDatiTLHR.m | 185 + Tilt/defDatiTLHRH.m | 165 + Tilt/defDatiThL.m | 37 + Tilt/defDatiWL.m | 35 + Tilt/filtro.m | 92 + Tilt/filtro_TLH.m | 92 + Tilt/fqa.m | 107 + Tilt/info_Sito.m | 665 +++ Tilt/lettura.m | 8583 +++++++++++++++++++++++++++ Tilt/letturaCal.m | 734 +++ Tilt/lettura_Hybrid.m | 7131 +++++++++++++++++++++++ Tilt/loadcell.m | 38 + Tilt/matrici_vuote_BL.m | 12 + Tilt/matrici_vuote_HD.m | 28 + Tilt/matrici_vuote_HDVR.m | 28 + Tilt/matrici_vuote_IPL.m | 31 + Tilt/matrici_vuote_IPLHR.m | 30 + Tilt/matrici_vuote_PL.m | 13 + Tilt/matrici_vuote_TL.m | 28 + Tilt/matrici_vuote_TLH.m | 25 + Tilt/matrici_vuote_TLHR.m | 29 + Tilt/matrici_vuote_TLHRH.m | 23 + Tilt/q_mult2.m | 9 + Tilt/report_2DCrL.m | 441 ++ Tilt/report_3DCrL.m | 459 ++ Tilt/report_3DEL.m | 459 ++ Tilt/report_AR.m | 925 +++ Tilt/report_BL.m | 171 + Tilt/report_CT.m | 200 + Tilt/report_CU.m | 430 ++ Tilt/report_CrL.m | 412 ++ Tilt/report_CrossGraphs.m | 3102 ++++++++++ Tilt/report_EL.m | 420 ++ Tilt/report_IPL.m | 561 ++ Tilt/report_IPLHR.m | 379 ++ Tilt/report_KL.m | 530 ++ Tilt/report_KLHR.m | 283 + Tilt/report_LL.m | 404 ++ Tilt/report_MPBEL.m | 639 ++ Tilt/report_PCL.m | 1038 ++++ Tilt/report_PE.m | 440 ++ Tilt/report_PL.m | 370 ++ Tilt/report_PT100.m | 364 ++ Tilt/report_PrL.m | 365 ++ Tilt/report_RL.m | 213 + Tilt/report_RSN.m | 262 + Tilt/report_RSNHR.m | 258 + Tilt/report_RaL.m | 1036 ++++ Tilt/report_TL.m | 555 ++ Tilt/report_ThL.m | 474 ++ Tilt/report_TrL.m | 144 + Tilt/report_TuL.m | 1014 ++++ Tilt/report_WEL.m | 411 ++ Tilt/report_WL.m | 419 ++ Tilt/report_appendix.m | 4205 ++++++++++++++ Tilt/report_ini.m | 56 + Tilt/report_table.m | 609 ++ Tilt/report_table_ENG.m | 608 ++ Tilt/rotate_v_by_q.m | 7 + Tilt/schema.m | 17 + Tilt/schemaSP.m | 1020 ++++ Tilt/scrivo.m | 177 + Tilt/sendReportmail.m | 155 + Tilt/soglie.m | 2889 +++++++++ Tilt/template.m | 18 + Tilt/template_cover.m | 18 + Tilt/threshold.m | 42 + Tilt/threshold_TiltLinkHD.m | 951 +++ Tilt/tipologiaNodi.m | 696 +++ Tilt/triax_HD.m | 525 ++ Tilt/triax_HDVR.m | 525 ++ Tilt/triax_IPL.m | 548 ++ Tilt/triax_TL.m | 533 ++ checkBattery.m | 215 + main.py | 6 + pyproject.toml | 7 + sync_server_file.sh | 53 + threshold.m | 50 + 553 files changed, 161447 insertions(+) create mode 100644 .gitignore create mode 100644 .python-version create mode 100755 ATD/ATD.m create mode 100755 ATD/ATD_Dati.m create mode 100755 ATD/CANCELLA.m create mode 100755 ATD/CalcoloBiax_PCL.m create mode 100755 ATD/CalcoloBiax_PCLHR.m create mode 100755 ATD/CalcoloBiax_RL.m create mode 100755 ATD/CalcoloBiax_TLH.m create mode 100755 ATD/CalcoloBiax_TLHRH.m create mode 100755 ATD/CalcoloBiax_TuL.m create mode 100755 ATD/CalcoloStar.m create mode 100755 ATD/CalcoloStar_Report.m create mode 100755 ATD/DB_date_time.m create mode 100755 ATD/DBwrite2DCrL.m create mode 100755 ATD/DBwrite3DCrL.m create mode 100755 ATD/DBwrite3DEL.m create mode 100755 ATD/DBwriteCrL.m create mode 100755 ATD/DBwriteEL.m create mode 100755 ATD/DBwriteLL.m create mode 100755 ATD/DBwriteMPBEL.m create mode 100755 ATD/DBwritePCL.m create mode 100755 ATD/DBwritePCLHR.m create mode 100755 ATD/DBwritePL.m create mode 100755 ATD/DBwriteRL.m create mode 100755 ATD/DBwriteSM.m create mode 100755 ATD/DBwriteTLH.m create mode 100755 ATD/DBwriteTLHRH.m create mode 100755 ATD/DBwriteTuL.m create mode 100755 ATD/DBwriteWEL.m create mode 100755 ATD/IDunit.m create mode 100755 ATD/LastElab.m create mode 100755 ATD/LastElab_bisAL.m create mode 100755 ATD/LastElab_bisPCL.m create mode 100755 ATD/LastElab_bisPCLHR.m create mode 100755 ATD/LastElab_bisRL.m create mode 100755 ATD/LastElab_bisTLH.m create mode 100755 ATD/LastElab_bisTLHRH.m create mode 100755 ATD/LastElab_bisTuL.m create mode 100755 ATD/MediaDati_2DCrL.m create mode 100755 ATD/MediaDati_3DCrL.m create mode 100755 ATD/MediaDati_3DEL.m create mode 100755 ATD/MediaDati_AL.m create mode 100755 ATD/MediaDati_CrL.m create mode 100755 ATD/MediaDati_EL.m create mode 100755 ATD/MediaDati_LL.m create mode 100755 ATD/MediaDati_MPBEL.m create mode 100755 ATD/MediaDati_PCL.m create mode 100755 ATD/MediaDati_PCLHR.m create mode 100755 ATD/MediaDati_PL.m create mode 100755 ATD/MediaDati_RL.m create mode 100755 ATD/MediaDati_SM.m create mode 100755 ATD/MediaDati_TLH.m create mode 100755 ATD/MediaDati_TLHRH.m create mode 100755 ATD/MediaDati_TuL.m create mode 100755 ATD/MediaDati_WEL.m create mode 100755 ATD/NuovaConversione.m create mode 100755 ATD/Parametri_Installazione.m create mode 100755 ATD/Recharge.m create mode 100755 ATD/Report.m create mode 100755 ATD/Report_ASE.m create mode 100755 ATD/SMS.m create mode 100755 ATD/SWSearch.m create mode 100755 ATD/Siren.m create mode 100755 ATD/Site_Info.m create mode 100755 ATD/Users_Def.m create mode 100755 ATD/YesNo.m create mode 100755 ATD/alert_Levels.m create mode 100755 ATD/approx_PCL.m create mode 100755 ATD/approx_RL.m create mode 100755 ATD/approx_TLH.m create mode 100755 ATD/approx_TLHRH.m create mode 100755 ATD/approx_TuL.m create mode 100755 ATD/calibPCL.m create mode 100755 ATD/cancellaDB.m create mode 100755 ATD/cellMaker2DCrL.m create mode 100755 ATD/cellMaker3DCrL.m create mode 100755 ATD/cellMaker3DEL.m create mode 100755 ATD/cellMakerCrL.m create mode 100755 ATD/cellMakerEL.m create mode 100755 ATD/cellMakerLL.m create mode 100755 ATD/cellMakerMPBEL.m create mode 100755 ATD/cellMakerPCL.m create mode 100755 ATD/cellMakerPCLHR.m create mode 100755 ATD/cellMakerPL.m create mode 100755 ATD/cellMakerRL.m create mode 100755 ATD/cellMakerSM.m create mode 100755 ATD/cellMakerTLH.m create mode 100755 ATD/cellMakerTLHRH.m create mode 100755 ATD/cellMakerTuL.m create mode 100755 ATD/cellMakerWEL.m create mode 100755 ATD/centralina.m create mode 100755 ATD/centralina_Dati.m create mode 100755 ATD/checkBattery.m create mode 100755 ATD/checkGIS.m create mode 100755 ATD/checkSIM.m create mode 100755 ATD/checkUnit.m create mode 100755 ATD/check_RL.m create mode 100755 ATD/checkdata.m create mode 100755 ATD/columnlegend.m create mode 100755 ATD/conv_grezzi2DCrL.m create mode 100755 ATD/conv_grezzi3DCrL.m create mode 100755 ATD/conv_grezzi3DEL.m create mode 100755 ATD/conv_grezziAL.m create mode 100755 ATD/conv_grezziCrL.m create mode 100755 ATD/conv_grezziEL.m create mode 100755 ATD/conv_grezziLL.m create mode 100755 ATD/conv_grezziMPBEL.m create mode 100755 ATD/conv_grezziPCL.m create mode 100755 ATD/conv_grezziPCLHR.m create mode 100755 ATD/conv_grezziPL.m create mode 100755 ATD/conv_grezziRL.m create mode 100755 ATD/conv_grezziRL_Dati.m create mode 100755 ATD/conv_grezziSM.m create mode 100755 ATD/conv_grezziTLH.m create mode 100755 ATD/conv_grezziTLHRH.m create mode 100755 ATD/conv_grezziTuL.m create mode 100755 ATD/conv_grezziTuL_Dati.m create mode 100755 ATD/conv_grezziWEL.m create mode 100755 ATD/corrTuL.m create mode 100755 ATD/database_definition.m create mode 100755 ATD/database_write.m create mode 100755 ATD/datainiziale.m create mode 100755 ATD/defDati2DCrL.m create mode 100755 ATD/defDati3DCrL.m create mode 100755 ATD/defDati3DEL.m create mode 100755 ATD/defDatiAL.m create mode 100755 ATD/defDatiCrL.m create mode 100755 ATD/defDatiEL.m create mode 100755 ATD/defDatiLL.m create mode 100755 ATD/defDatiMPBEL.m create mode 100755 ATD/defDatiPCL.m create mode 100755 ATD/defDatiPCLHR.m create mode 100755 ATD/defDatiPL.m create mode 100755 ATD/defDatiRL.m create mode 100755 ATD/defDatiSM.m create mode 100755 ATD/defDatiTLH.m create mode 100755 ATD/defDatiTLHRH.m create mode 100755 ATD/defDatiTuL.m create mode 100755 ATD/defDatiTuL_Dati.m create mode 100755 ATD/defDatiWEL.m create mode 100755 ATD/elab2D_PCL.m create mode 100755 ATD/elab2D_PCLHR.m create mode 100755 ATD/elab2D_RL.m create mode 100755 ATD/elab2D_TLH.m create mode 100755 ATD/elab2D_TLHRH.m create mode 100755 ATD/elab2D_TuL.m create mode 100755 ATD/elab2D_TuL_MOD.m create mode 100755 ATD/filtro_PCL.m create mode 100755 ATD/filtro_RL.m create mode 100755 ATD/filtro_TLH.m create mode 100755 ATD/filtro_TLHRH.m create mode 100755 ATD/filtro_TuL.m create mode 100755 ATD/info_Sito.m create mode 100755 ATD/lettura.m create mode 100755 ATD/letturaCal.m create mode 100755 ATD/lettura_Dati.m create mode 100755 ATD/matrici_vuote_PCL.m create mode 100755 ATD/matrici_vuote_PCLHR.m create mode 100755 ATD/matrici_vuote_RL.m create mode 100755 ATD/matrici_vuote_TLH.m create mode 100755 ATD/matrici_vuote_TLHRH.m create mode 100755 ATD/matrici_vuote_TuL.m create mode 100755 ATD/pos_ini_PCL.m create mode 100755 ATD/pos_ini_PCLHR.m create mode 100755 ATD/pos_ini_RL.m create mode 100755 ATD/pos_ini_TuL.m create mode 100755 ATD/punti_noti_PCL.m create mode 100755 ATD/punti_noti_PCLHR.m create mode 100755 ATD/punti_noti_RL.m create mode 100755 ATD/punti_noti_TuL.m create mode 100755 ATD/punti_noti_exe_PCL.m create mode 100755 ATD/punti_noti_exe_PCLHR.m create mode 100755 ATD/punti_noti_exe_RL.m create mode 100755 ATD/punti_noti_exe_TuL.m create mode 100755 ATD/report_2DCrL.m create mode 100755 ATD/report_3DCrL.m create mode 100755 ATD/report_3DCrL_ENG.m create mode 100755 ATD/report_3DEL.m create mode 100755 ATD/report_3DEL_ENG.m create mode 100755 ATD/report_AR.m create mode 100755 ATD/report_BL.m create mode 100755 ATD/report_BL_ENG.m create mode 100755 ATD/report_CT.m create mode 100755 ATD/report_CT_ENG.m create mode 100755 ATD/report_CU.m create mode 100755 ATD/report_CrL.m create mode 100755 ATD/report_CrL_ENG.m create mode 100755 ATD/report_CrossGraphs.m create mode 100755 ATD/report_CrossGraphs_ENG.m create mode 100755 ATD/report_EL.m create mode 100755 ATD/report_EL_ENG.m create mode 100755 ATD/report_IPL.m create mode 100755 ATD/report_IPLHR.m create mode 100755 ATD/report_KL.m create mode 100755 ATD/report_KLHR.m create mode 100755 ATD/report_KLHR_ENG.m create mode 100755 ATD/report_KL_ENG.m create mode 100755 ATD/report_LL.m create mode 100755 ATD/report_LL_ENG.m create mode 100755 ATD/report_MPBEL.m create mode 100755 ATD/report_MPBEL_ENG.m create mode 100755 ATD/report_PCL.m create mode 100755 ATD/report_PCL_ENG.m create mode 100755 ATD/report_PE.m create mode 100755 ATD/report_PL.m create mode 100755 ATD/report_PT100.m create mode 100755 ATD/report_PrL.m create mode 100755 ATD/report_PrL_ENG.m create mode 100755 ATD/report_RL.m create mode 100755 ATD/report_RSN.m create mode 100755 ATD/report_RSNHR.m create mode 100755 ATD/report_RaL.m create mode 100755 ATD/report_RaL_ENG.m create mode 100755 ATD/report_TL.m create mode 100755 ATD/report_ThL.m create mode 100755 ATD/report_TrL.m create mode 100755 ATD/report_TuL.m create mode 100755 ATD/report_TuL_ENG.m create mode 100755 ATD/report_WEL.m create mode 100755 ATD/report_WEL_ENG.m create mode 100755 ATD/report_WL.m create mode 100755 ATD/report_appendix.m create mode 100755 ATD/report_appendix_ENG.m create mode 100755 ATD/report_ini.m create mode 100755 ATD/report_table.m create mode 100755 ATD/report_table_ENG.m create mode 100755 ATD/scarico.m create mode 100755 ATD/schema.m create mode 100755 ATD/schemaSP.m create mode 100755 ATD/scrivo.m create mode 100755 ATD/segnoTuL.m create mode 100755 ATD/sendReportmail.m create mode 100755 ATD/soglie.m create mode 100755 ATD/star.m create mode 100755 ATD/template.m create mode 100755 ATD/template_cover.m create mode 100755 ATD/tipologiaNodi.m create mode 100644 README.md create mode 100755 RSN/DB_date_time.m create mode 100755 RSN/DBwriteLL.m create mode 100755 RSN/DBwriteRSN.m create mode 100755 RSN/DBwriteRSNHR.m create mode 100755 RSN/DBwriteSS.m create mode 100755 RSN/DBwriteTrL.m create mode 100755 RSN/IDunit.m create mode 100755 RSN/LastElab.m create mode 100755 RSN/LastElab_bisDL.m create mode 100755 RSN/LastElab_bisSS.m create mode 100755 RSN/LastElab_bisTrL.m create mode 100755 RSN/MediaDati_LL.m create mode 100755 RSN/MediaDati_RSN.m create mode 100755 RSN/MediaDati_RSNHR.m create mode 100755 RSN/NuovaConversione.m create mode 100755 RSN/Parametri_Installazione.m create mode 100755 RSN/RSN.m create mode 100755 RSN/SWSearch.m create mode 100755 RSN/Siren.m create mode 100755 RSN/Site_Info.m create mode 100755 RSN/Triggercheck.m create mode 100755 RSN/Users_Def.m create mode 100755 RSN/YesNo.m create mode 100755 RSN/alert_Levels.m create mode 100755 RSN/approx.m create mode 100755 RSN/approx_RSNHR.m create mode 100755 RSN/azzeramenti.m create mode 100755 RSN/azzeramenti_RSNHR.m create mode 100755 RSN/cancellaDB.m create mode 100755 RSN/cellMakerLL.m create mode 100755 RSN/cellMakerRSN.m create mode 100755 RSN/cellMakerRSNHR.m create mode 100755 RSN/cellMakerSS.m create mode 100755 RSN/cellMakerTrL.m create mode 100755 RSN/centralina.m create mode 100755 RSN/checkBattery.m create mode 100755 RSN/checkGIS.m create mode 100755 RSN/checkSIM.m create mode 100755 RSN/checkUnit.m create mode 100755 RSN/checkdata.m create mode 100755 RSN/conv_grezziLL.m create mode 100755 RSN/conv_grezziRSN.m create mode 100755 RSN/conv_grezziRSNHR.m create mode 100755 RSN/database_definition.m create mode 100755 RSN/database_write.m create mode 100755 RSN/datainiziale.m create mode 100755 RSN/defDatiLL.m create mode 100755 RSN/defDatiRSN.m create mode 100755 RSN/defDatiRSNHR.m create mode 100755 RSN/defDatiSS.m create mode 100755 RSN/defDatiTrL.m create mode 100755 RSN/elaborazione_RSN.m create mode 100755 RSN/elaborazione_RSNHR.m create mode 100755 RSN/lettura.m create mode 100755 RSN/letturaCal.m create mode 100755 RSN/loadcell.m create mode 100755 RSN/matrici_vuote_RSN.m create mode 100755 RSN/matrici_vuote_RSNHR.m create mode 100755 RSN/schema.m create mode 100755 RSN/scrivo.m create mode 100755 RSN/tipologiaNodi.m create mode 100755 Tilt/ASSEa.m create mode 100755 Tilt/ASSEa_HR.m create mode 100755 Tilt/ASSEb.m create mode 100755 Tilt/ASSEb_HR.m create mode 100755 Tilt/ASSEb_HR_OLD.m create mode 100755 Tilt/AlertReport.m create mode 100755 Tilt/Baro.m create mode 100755 Tilt/CANCELLA.m create mode 100755 Tilt/CalcoloBiax_TLH.m create mode 100755 Tilt/CalcoloBiax_TLHRH.m create mode 100755 Tilt/CalcoloRain.m create mode 100755 Tilt/CalcoloSPP.m create mode 100755 Tilt/CalcoloSnow.m create mode 100755 Tilt/DB_date_time.m create mode 100755 Tilt/DB_date_time_RIS.m create mode 100755 Tilt/DBwriteBL.m create mode 100755 Tilt/DBwriteHD.m create mode 100755 Tilt/DBwriteHDVR.m create mode 100755 Tilt/DBwriteIPL.m create mode 100755 Tilt/DBwriteIPLHR.m create mode 100755 Tilt/DBwriteKL.m create mode 100755 Tilt/DBwriteKLHR.m create mode 100755 Tilt/DBwriteKL_future.m create mode 100755 Tilt/DBwriteLL.m create mode 100755 Tilt/DBwritePE.m create mode 100755 Tilt/DBwritePL.m create mode 100755 Tilt/DBwritePT100.m create mode 100755 Tilt/DBwriteRL.m create mode 100755 Tilt/DBwriteSL.m create mode 100755 Tilt/DBwriteSPP.m create mode 100755 Tilt/DBwriteTL.m create mode 100755 Tilt/DBwriteTLH.m create mode 100755 Tilt/DBwriteTLHR.m create mode 100755 Tilt/DBwriteTLHRH.m create mode 100755 Tilt/DBwriteThL.m create mode 100755 Tilt/DBwriteWL.m create mode 100755 Tilt/Fukuzono.m create mode 100755 Tilt/Fukuzono_Giornaliero.m create mode 100755 Tilt/IDunit.m create mode 100755 Tilt/Klino.m create mode 100755 Tilt/KlinoHR.m create mode 100755 Tilt/LastElab.m create mode 100755 Tilt/LastElab_bisIPL.m create mode 100755 Tilt/LastElab_bisIPLHR.m create mode 100755 Tilt/LastElab_bisRL.m create mode 100755 Tilt/LastElab_bisSL.m create mode 100755 Tilt/LastElab_bisTL.m create mode 100755 Tilt/LastElab_bisTLH.m create mode 100755 Tilt/LastElab_bisTLHR.m create mode 100755 Tilt/LastElab_bisTLHRH.m create mode 100755 Tilt/MediaDati_BL.m create mode 100755 Tilt/MediaDati_HD.m create mode 100755 Tilt/MediaDati_HDVR.m create mode 100755 Tilt/MediaDati_IPL.m create mode 100755 Tilt/MediaDati_IPLHR.m create mode 100755 Tilt/MediaDati_KL.m create mode 100755 Tilt/MediaDati_KLHR.m create mode 100755 Tilt/MediaDati_LL.m create mode 100755 Tilt/MediaDati_PE.m create mode 100755 Tilt/MediaDati_PL.m create mode 100755 Tilt/MediaDati_PT100.m create mode 100755 Tilt/MediaDati_RL.m create mode 100755 Tilt/MediaDati_TL.m create mode 100755 Tilt/MediaDati_TLH.m create mode 100755 Tilt/MediaDati_TLHR.m create mode 100755 Tilt/MediaDati_TLHRH.m create mode 100755 Tilt/MediaDati_ThL.m create mode 100755 Tilt/MediaDati_WL.m create mode 100755 Tilt/NuovaConversione.m create mode 100755 Tilt/PT100.m create mode 100755 Tilt/Parametri_Installazione.m create mode 100755 Tilt/Piezo.m create mode 100755 Tilt/QuaternioniASE.m create mode 100755 Tilt/Report_ASE.m create mode 100755 Tilt/Report_ASE_bckUp.m create mode 100755 Tilt/SMS.m create mode 100755 Tilt/SWSearch.m create mode 100755 Tilt/Siren.m create mode 100755 Tilt/Site_Info.m create mode 100755 Tilt/Therm.m create mode 100755 Tilt/Tilt.m create mode 100755 Tilt/Tilt_bck.m create mode 100755 Tilt/Time_Of_Failure.m create mode 100755 Tilt/Untitled.m create mode 100755 Tilt/Untitled2.m create mode 100755 Tilt/Untitled3.m create mode 100755 Tilt/Untitled3bis.m create mode 100755 Tilt/Untitled_2.m create mode 100755 Tilt/Users_Def.m create mode 100755 Tilt/Users_Def_old.m create mode 100755 Tilt/YesNo.m create mode 100755 Tilt/alert_Levels.m create mode 100755 Tilt/approx.m create mode 100755 Tilt/approx_HD.m create mode 100755 Tilt/approx_IPLHR.m create mode 100755 Tilt/approx_TLH.m create mode 100755 Tilt/approx_TLHR.m create mode 100755 Tilt/approx_TLHRH.m create mode 100755 Tilt/arot.m create mode 100755 Tilt/arotHR.m create mode 100755 Tilt/azzeramenti.m create mode 100755 Tilt/azzeramenti_TLH.m create mode 100755 Tilt/azzeramenti_TLHR.m create mode 100755 Tilt/azzeramenti_TLHRH.m create mode 100755 Tilt/biax_HD.m create mode 100755 Tilt/biax_HDVR.m create mode 100755 Tilt/biax_IPL.m create mode 100755 Tilt/biax_IPLHR.m create mode 100755 Tilt/biax_TL.m create mode 100755 Tilt/biax_TLH.m create mode 100755 Tilt/biax_TLHR.m create mode 100755 Tilt/biax_TLHRH.m create mode 100755 Tilt/cancellaDB.m create mode 100755 Tilt/cellMakerBL.m create mode 100755 Tilt/cellMakerHD.m create mode 100755 Tilt/cellMakerHDVR.m create mode 100755 Tilt/cellMakerIPL.m create mode 100755 Tilt/cellMakerIPLHR.m create mode 100755 Tilt/cellMakerKL.m create mode 100755 Tilt/cellMakerKLHR.m create mode 100755 Tilt/cellMakerLL.m create mode 100755 Tilt/cellMakerPE.m create mode 100755 Tilt/cellMakerPL.m create mode 100755 Tilt/cellMakerPT100.m create mode 100755 Tilt/cellMakerRL.m create mode 100755 Tilt/cellMakerSL.m create mode 100755 Tilt/cellMakerSPP.m create mode 100755 Tilt/cellMakerTL.m create mode 100755 Tilt/cellMakerTLH.m create mode 100755 Tilt/cellMakerTLHR.m create mode 100755 Tilt/cellMakerTLHRH.m create mode 100755 Tilt/cellMakerThL.m create mode 100755 Tilt/cellMakerWL.m create mode 100755 Tilt/centralina.m create mode 100755 Tilt/checkBattery.m create mode 100755 Tilt/checkGIS.m create mode 100755 Tilt/checkSIM.m create mode 100755 Tilt/checkUnit.m create mode 100755 Tilt/checkdata.m create mode 100755 Tilt/columnlegend.m create mode 100755 Tilt/conv_grezziBL.m create mode 100755 Tilt/conv_grezziHD.m create mode 100755 Tilt/conv_grezziHDVR.m create mode 100755 Tilt/conv_grezziIPL.m create mode 100755 Tilt/conv_grezziIPLHR.m create mode 100755 Tilt/conv_grezziKL.m create mode 100755 Tilt/conv_grezziKLHR.m create mode 100755 Tilt/conv_grezziLL.m create mode 100755 Tilt/conv_grezziPE.m create mode 100755 Tilt/conv_grezziPL.m create mode 100755 Tilt/conv_grezziPT100.m create mode 100755 Tilt/conv_grezziRL.m create mode 100755 Tilt/conv_grezziTL.m create mode 100755 Tilt/conv_grezziTLH.m create mode 100755 Tilt/conv_grezziTLHR.m create mode 100755 Tilt/conv_grezziTLHRH.m create mode 100755 Tilt/conv_grezziThL.m create mode 100755 Tilt/conv_grezziWL.m create mode 100755 Tilt/database_definition.m create mode 100755 Tilt/database_write.m create mode 100755 Tilt/datainiziale.m create mode 100755 Tilt/defDatiBL.m create mode 100755 Tilt/defDatiHD.m create mode 100755 Tilt/defDatiHDVR.m create mode 100755 Tilt/defDatiIPL.m create mode 100755 Tilt/defDatiIPLHR.m create mode 100755 Tilt/defDatiKL.m create mode 100755 Tilt/defDatiKLHR.m create mode 100755 Tilt/defDatiLL.m create mode 100755 Tilt/defDatiPE.m create mode 100755 Tilt/defDatiPL.m create mode 100755 Tilt/defDatiPT100.m create mode 100755 Tilt/defDatiRL.m create mode 100755 Tilt/defDatiTL.m create mode 100755 Tilt/defDatiTLH.m create mode 100755 Tilt/defDatiTLHR.m create mode 100755 Tilt/defDatiTLHRH.m create mode 100755 Tilt/defDatiThL.m create mode 100755 Tilt/defDatiWL.m create mode 100755 Tilt/filtro.m create mode 100755 Tilt/filtro_TLH.m create mode 100755 Tilt/fqa.m create mode 100755 Tilt/info_Sito.m create mode 100755 Tilt/lettura.m create mode 100755 Tilt/letturaCal.m create mode 100755 Tilt/lettura_Hybrid.m create mode 100755 Tilt/loadcell.m create mode 100755 Tilt/matrici_vuote_BL.m create mode 100755 Tilt/matrici_vuote_HD.m create mode 100755 Tilt/matrici_vuote_HDVR.m create mode 100755 Tilt/matrici_vuote_IPL.m create mode 100755 Tilt/matrici_vuote_IPLHR.m create mode 100755 Tilt/matrici_vuote_PL.m create mode 100755 Tilt/matrici_vuote_TL.m create mode 100755 Tilt/matrici_vuote_TLH.m create mode 100755 Tilt/matrici_vuote_TLHR.m create mode 100755 Tilt/matrici_vuote_TLHRH.m create mode 100755 Tilt/q_mult2.m create mode 100755 Tilt/report_2DCrL.m create mode 100755 Tilt/report_3DCrL.m create mode 100755 Tilt/report_3DEL.m create mode 100755 Tilt/report_AR.m create mode 100755 Tilt/report_BL.m create mode 100755 Tilt/report_CT.m create mode 100755 Tilt/report_CU.m create mode 100755 Tilt/report_CrL.m create mode 100755 Tilt/report_CrossGraphs.m create mode 100755 Tilt/report_EL.m create mode 100755 Tilt/report_IPL.m create mode 100755 Tilt/report_IPLHR.m create mode 100755 Tilt/report_KL.m create mode 100755 Tilt/report_KLHR.m create mode 100755 Tilt/report_LL.m create mode 100755 Tilt/report_MPBEL.m create mode 100755 Tilt/report_PCL.m create mode 100755 Tilt/report_PE.m create mode 100755 Tilt/report_PL.m create mode 100755 Tilt/report_PT100.m create mode 100755 Tilt/report_PrL.m create mode 100755 Tilt/report_RL.m create mode 100755 Tilt/report_RSN.m create mode 100755 Tilt/report_RSNHR.m create mode 100755 Tilt/report_RaL.m create mode 100755 Tilt/report_TL.m create mode 100755 Tilt/report_ThL.m create mode 100755 Tilt/report_TrL.m create mode 100755 Tilt/report_TuL.m create mode 100755 Tilt/report_WEL.m create mode 100755 Tilt/report_WL.m create mode 100755 Tilt/report_appendix.m create mode 100755 Tilt/report_ini.m create mode 100755 Tilt/report_table.m create mode 100755 Tilt/report_table_ENG.m create mode 100755 Tilt/rotate_v_by_q.m create mode 100755 Tilt/schema.m create mode 100755 Tilt/schemaSP.m create mode 100755 Tilt/scrivo.m create mode 100755 Tilt/sendReportmail.m create mode 100755 Tilt/soglie.m create mode 100755 Tilt/template.m create mode 100755 Tilt/template_cover.m create mode 100755 Tilt/threshold.m create mode 100755 Tilt/threshold_TiltLinkHD.m create mode 100755 Tilt/tipologiaNodi.m create mode 100755 Tilt/triax_HD.m create mode 100755 Tilt/triax_HDVR.m create mode 100755 Tilt/triax_IPL.m create mode 100755 Tilt/triax_TL.m create mode 100755 checkBattery.m create mode 100644 main.py create mode 100644 pyproject.toml create mode 100755 sync_server_file.sh create mode 100755 threshold.m diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..10ec320 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +home/* \ No newline at end of file diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..bd28b9c --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.9 diff --git a/ATD/ATD.m b/ATD/ATD.m new file mode 100755 index 0000000..8a6a59d --- /dev/null +++ b/ATD/ATD.m @@ -0,0 +1,1102 @@ +function RC = ATD(IDcentralina,DTcatena) +%%% Programma per l'elaborazione dei dati di Cir Array, Rad Array, Tilt +%%% Link H, Tilt Link HR H, PreConv Array, PreConv Array HR e strumenti +%%% analogici per gallerie. +%%% Versione 3.4 + +tic + +RC = 1; %#ok +text = ['Elaboration of chain ' DTcatena ' of control unit ' IDcentralina ' started correctly']; +d = datestr(datetime,'yyyy_mm_dd'); +t = datestr(datetime,'HH_MM_SS'); +FileName = ['LogFile-' IDcentralina '-' DTcatena '-' d '-' t '.txt']; +outdat = fopen(FileName,'wt+'); %#ok +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,date_AC,time_AC,Nodo_AC,unitID] = datainiziale(DTcatena,unitID,conn,FileName); + +% funzione che elenca tutti i nodi ed il loro numero presenti per ogni tipo di sensore. +[idTool,NodoTunnelLink,NodoRadialLink,NodoTiltLinkH,... + NodoTiltLinkHRH,NodoPreConvLink,NodoPreConvLinkHR,NodoDistoMTLink,NodoPressureLink,... + NodoLoadLink,NodoExtensometerLink,Nodo3DExtensometerLink,NodoWireExtensometerLink,... + NodoMultiPointRodExtensometer,NodoTiltLinkHR3DH,NodoPreConvLinkHR3D,... + NodoAnalogLink,NodoCrackLink,Nodo3DCrackLink,Nodo2DCrackLink,NodoStressMeter,... + rTuL,rRL,rTLH,rTLHRH,rPCL,rPCLHR,rPrL,rLL,rEL,r3DEL,rWEL,rMPBEL,rAL,rCrL,r3DCrL,... + r2DCrL,rSM,~,~,rDM] = 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 +[yesTuL,yesRL,yesTLH,yesTLHRH,yesTLHR3DH,yesPCL,yesPCLHR,yesPCLHR3D,... + yesPL,yesLL,yesEL,yes3DEL,yesWEL,yesMPBEL,yesAL,yesCrL,yes3DCrL,yes2DCrL,... + yesDM,yesSM] = YesNo(NodoTunnelLink,NodoRadialLink,NodoTiltLinkH,NodoTiltLinkHRH,... + NodoTiltLinkHR3DH,NodoPreConvLink,NodoPreConvLinkHR,NodoPreConvLinkHR3D,... + NodoDistoMTLink,NodoPressureLink,NodoLoadLink,NodoExtensometerLink,... + Nodo3DExtensometerLink,NodoWireExtensometerLink,NodoMultiPointRodExtensometer,... + NodoAnalogLink,NodoCrackLink,Nodo3DCrackLink,Nodo2DCrackLink,NodoStressMeter,FileName); + +% Definisco i parametri di elaborazione di un'installazione +[NdatiMedia,Ndatidespike,MEMS,tolleranzaAcc,Tmax,Tmin,Ndevst,Wdevst,... + Ndevst_HR,Wdevst_HR,NumBasi,elab_option,Calcolo_Carico,Area,Mod_Elastico,... + Carico_Ini] = Parametri_Installazione(idTool,conn,yesTuL,yesRL,... + yesTLH,yesTLHRH,yesPCL,yesPCLHR,yesMPBEL,yesWEL,yesEL,FileName); + +% funzione che ricostruisce segmenti di pertinenza etc +[SpeTuL,SpeRL,SpeTLH,PsTLH,SpeTLHRH,PsTLHRH,SpePCL,SpePCLHR]... + = schemaSP(yesTuL,yesRL,yesTLH,yesTLHRH,yesPCL,yesPCLHR,... + NodoTunnelLink,NodoRadialLink,NodoTiltLinkH,NodoTiltLinkHRH,... + NodoPreConvLink,NodoPreConvLinkHR,rTuL,rRL,rTLH,rTLHRH,rPCL,rPCLHR,catena,FileName); + +% tipologia di centralina +Unit = centralina(IDcentralina,conn,FileName); + +%% Scarico dei dati + +% funzione che carica i dati di calibrazione +[DCalTuLTot,DCalRLTot,DCalTLHTot,DCalTLHRHTot,DCalPCLTot,DCalPCLHRTot,... + DCalPLTot,DCalLLTot,DCalELTot,DCalEL3DTot,DCalWELTot,DCalMPBELTot,... + DCalALTot,DCalCrLTot,DCal3DCrLTot,DCal2DCrLTot,DCalSMTot,yesTuL,yesRL,yesTLH,yesTLHRH,... + yesPCL,yesPCLHR,yesPL,yesLL,yesEL,yes3DEL,yesWEL,yesMPBEL,yesCrL,yes3DCrL,yes2DCrL,... + yesAL,yesSM] = letturaCal(IDcentralina,DTcatena,catena,rTuL,rRL,rTLH,rTLHRH,... + rPCL,rPCLHR,rPrL,rLL,rEL,r3DEL,rWEL,rMPBEL,NumBasi,rAL,rCrL,r3DCrL,r2DCrL,rSM,... + NodoTunnelLink,NodoRadialLink,NodoTiltLinkH,NodoPreConvLink,NodoPressureLink,... + NodoLoadLink,NodoExtensometerLink,Nodo3DExtensometerLink,... + NodoWireExtensometerLink,NodoMultiPointRodExtensometer,NodoAnalogLink,... + NodoCrackLink,Nodo3DCrackLink,Nodo2DCrackLink,NodoStressMeter,yesTuL,yesRL,yesTLH,yesTLHRH,... + yesPCL,yesPCLHR,yesPL,yesLL,yesEL,yes3DEL,yesWEL,yesMPBEL,yesAL,yesCrL,yes3DCrL,yes2DCrL,... + yesSM,conn,FileName); + +if strcmp(Unit,'Nesa evolution') == 0 + + % funzione che scarica i dati da utilizzare come nuovo zero (ultimo dato + % elaborato, con un certo margine + [DatiElabTunnelLink,NuovoZeroTuL,ay_TuL,t_TuL,ay_TuL_AC,t_TuL_AC,... + datainiTuL,tempoiniTuL,data1_AC,DatiElabRadialLink,NuovoZeroRL,datainiRL,tempoiniRL,... + DatiElabTiltLinkH,NuovoZeroTLH,datainiTLH,tempoiniTLH,... + DatiElabTiltLinkHRH,NuovoZeroTLHRH,datainiTLHRH,tempoiniTLHRH,... + DatiElabPreConvLink,NuovoZeroPCL,datainiPCL,tempoiniPCL,... + DatiElabPreConvLinkHR,NuovoZeroPCLHR,datainiPCLHR,tempoiniPCLHR,... + DatiElabDistoMTLink,NuovoZeroDM,datainiDM,tempoiniDM,... + datainiPL,tempoiniPL,NuovoZeroPrL,datainiLL,tempoiniLL,NuovoZeroLL,... + datainiEL,tempoiniEL,Date_Rif_EL,NuovoZeroEL,... + dataini3DEL,tempoini3DEL,Date_Rif_3DEL,NuovoZero3DEL,datainiWEL,tempoiniWEL,NuovoZeroWEL,... + datainiMPBEL,tempoiniMPBEL,NuovoZeroMPBEL,DatiElabAnalogLink,NuovoZeroAL,datainiAL,tempoiniAL,... + datainiCrL,tempoiniCrL,NuovoZeroCrL,dataini3DCrL,tempoini3DCrL,NuovoZero3DCrL,... + dataini2DCrL,tempoini2DCrL,NuovoZero2DCrL, datainiSM,tempoiniSM,Date_Rif_SM,NuovoZeroSM,margine] = ... + LastElab(conn,date,time,IDcentralina,DTcatena,Wdevst,NdatiMedia,Ndatidespike,... + NodoTunnelLink,yesTuL,date_AC,time_AC,Nodo_AC,rTuL,... + NodoRadialLink,yesRL,rRL,NodoTiltLinkH,yesTLH,rTLH,NodoTiltLinkHRH,yesTLHRH,rTLHRH,... + NodoPreConvLink,yesPCL,rPCL,NodoPreConvLinkHR,yesPCLHR,rPCLHR,... + NodoDistoMTLink,yesDM,rDM,NodoPressureLink,yesPL,... + NodoLoadLink,yesLL,NodoExtensometerLink,yesEL,Nodo3DExtensometerLink,... + yes3DEL,NodoWireExtensometerLink,yesWEL,NodoMultiPointRodExtensometer,... + yesMPBEL,NodoAnalogLink,yesAL,rAL,NodoCrackLink,yesCrL,... + Nodo3DCrackLink,yes3DCrL,Nodo2DCrackLink,yes2DCrL,NodoStressMeter,yesSM,FileName); + + % Lettura dati da DB + [Batteria,DatiTunnelLink,ErrTunnelLink,datainiTuL,... + DatiRadialLink,ErrRadialLink,datainiRL,DatiTiltLinkH,ErrTiltLinkH,datainiTLH,... + DatiTiltLinkHRH,ErrTiltLinkHRH,datainiTLHRH,DatiPreConvLink,ErrPreConvLink,datainiPCL,... + DatiPreConvLinkHR,ErrPreConvLinkHR,datainiPCLHR,DatiDistoMTLink,ErrDistoMTLink,datainiDM,... + DatiPressureLink,ErrPressureLink,... + DatiLoadLink,ErrLoadLink,DatiExtensometerLink,DatiExtensometerLink_Rif,... + DatiNTCExtensometerLink,ErrExtensometerLink,Dati3DExtensometerLink,ChEL,EL_NTC,... + Dati3DExtensometerLink_Rif,DatiNTC3DExtensometerLink,Err3DExtensometerLink,ErrNTC3DExtensometerLink,Ch3DEL,EL3D_NTC,... + DatiWireExtensometerLink,DatiNTCWireExtensometerLink,ErrWireExtensometerLink,ChWEL,WEL_NTC,... + DatiMultiPointExtensometer,DatiNTCMultiPointExtensometer,ErrMultiPointExtensometer,ErrNTCMultiPointExtensometer,ChMPBEL,MPBEL_NTC,... + DatiAnalogLink,ErrAnalogLink,datainiAL,~,~,... + DatiCrackLink,DatiNTCCrackLink,ErrCrackLink,ChCrL,CrL_NTC,... + Dati3DCrackLink,DatiNTC3DCrackLink,Err3DCrackLink,ErrNTC3DCrackLink,Ch3DCrL,CrL3D_NTC,... + Dati2DCrackLink,DatiNTC2DCrackLink,Err2DCrackLink,ErrNTC2DCrackLink,Ch2DCrL,CrL2D_NTC,... + DatiStressMeter,DatiStressMeter_Rif,DatiNTCStressMeter,DatiNTCStressMeter_Rif,ErrStressMeter,ChSM,SM_NTC,... + yesTuL,yesRL,yesTLH,yesTLHRH,yesPCL,yesPCLHR,yesPL,yesLL,yesEL,yes3DEL,... + yesWEL,yesMPBEL,yesAL,yesCrL,yes3DCrL,yes2DCrL,yesSM,yesDM] = ... + lettura(IDcentralina,DTcatena,datainiTuL,tempoiniTuL,NodoTunnelLink,NuovoZeroTuL,date_AC,time_AC,Nodo_AC,... + datainiRL,tempoiniRL,NodoRadialLink,NuovoZeroRL,datainiTLH,tempoiniTLH,NodoTiltLinkH,NuovoZeroTLH,... + datainiTLHRH,tempoiniTLHRH,NodoTiltLinkHRH,NuovoZeroTLHRH,datainiPCL,tempoiniPCL,NodoPreConvLink,NuovoZeroPCL,... + datainiPCLHR,tempoiniPCLHR,NodoPreConvLinkHR,NuovoZeroPCLHR,datainiDM,tempoiniDM,NodoDistoMTLink,NuovoZeroDM,... + datainiPL,tempoiniPL,NodoPressureLink,NuovoZeroPrL,datainiLL,tempoiniLL,NodoLoadLink,NuovoZeroLL,... + datainiEL,tempoiniEL,Date_Rif_EL,NodoExtensometerLink,NuovoZeroEL,... + dataini3DEL,tempoini3DEL,Date_Rif_3DEL,Nodo3DExtensometerLink,NuovoZero3DEL,... + datainiWEL,tempoiniWEL,NodoWireExtensometerLink,NuovoZeroWEL,... + datainiMPBEL,tempoiniMPBEL,NodoMultiPointRodExtensometer,NuovoZeroMPBEL,... + datainiAL,tempoiniAL,NodoAnalogLink,NumBasi,NuovoZeroAL,... + datainiCrL,tempoiniCrL,NodoCrackLink,NuovoZeroCrL,dataini3DCrL,tempoini3DCrL,Nodo3DCrackLink,NuovoZero3DCrL,... + dataini2DCrL,tempoini2DCrL,Nodo2DCrackLink,NuovoZero2DCrL,... + datainiSM,tempoiniSM,Date_Rif_SM,NodoStressMeter,NuovoZeroSM,yesTuL,yesRL,yesTLH,... + yesTLHRH,yesPCL,yesPCLHR,yesPL,yesLL,yesEL,yes3DEL,yesWEL,yesMPBEL,yesAL,yesCrL,... + yes3DCrL,yes2DCrL,yesSM,yesDM,rTuL,rRL,rTLH,rTLHRH,rPCL,rPCLHR,rPrL,... + rLL,rEL,r3DEL,rWEL,rMPBEL,rAL,rCrL,r3DCrL,r2DCrL,rSM,rDM,conn,catena,date,time,FileName); + + % Controllo incrociato fra la data iniziale definita da Lettura e la data + % iniziale definita da LastElab + [DatiElabTunnelLink,DatiElabRadialLink,DatiElabTiltLinkH,DatiElabTiltLinkHRH,... + DatiElabPreConvLink,DatiElabPreConvLinkHR,DatiElabAnalogLink,DatiElabDistoMTLink]... + = checkdata(yesTuL,yesRL,yesTLH,yesTLHRH,yesPCL,yesPCLHR,yesAL,yesDM,... + DatiElabTunnelLink,DatiElabRadialLink,DatiElabTiltLinkH,DatiElabTiltLinkHRH,... + DatiElabPreConvLink,DatiElabPreConvLinkHR,DatiElabAnalogLink,DatiElabDistoMTLink,... + datainiTuL,tempoiniTuL,datainiRL,tempoiniRL,datainiTLH,tempoiniTLH,... + datainiTLHRH,tempoiniTLHRH,datainiPCL,tempoiniPCL,datainiPCLHR,tempoiniPCLHR,... + datainiAL,tempoiniAL,datainiDM,tempoiniDM,rTuL,rRL,rTLH,rTLHRH,rPCL,rPCLHR,rAL,rDM,... + NodoTunnelLink,NodoRadialLink,NodoTiltLinkH,NodoTiltLinkHRH,NodoPreConvLink,... + NodoPreConvLinkHR,NodoAnalogLink,NodoDistoMTLink,NuovoZeroTuL,NuovoZeroRL,NuovoZeroTLH,... + NuovoZeroTLHRH,NuovoZeroPCL,NuovoZeroPCLHR,NuovoZeroAL,NuovoZeroDM,... + IDcentralina,DTcatena,conn,FileName); + + %% Parte di definizione dati, conversione in unit� fisiche e calcolo medie + + % --- Tunnel Link --- + if yesTuL == 1 % attiva l'elaborazione dei Tunnel Link + % definizione dei dati + [TimeTuL,accTuL,tempTuL,ay_TuL,ay_TuL_AC,ErrTunnelLink] = defDatiTuL(... + DatiTunnelLink,ay_TuL,ay_TuL_AC,Ndatidespike,rTuL,NuovoZeroTuL,... + ErrTunnelLink,MEMS,FileName); + % Conversione dei dati grezzi + [accTuL,ris_acc_TuL,T_TuL,ay_TuL,ay_TuL_AC] = conv_grezziTuL(... + rTuL,accTuL,tempTuL,DCalTuLTot,ay_TuL,t_TuL,ay_TuL_AC,t_TuL_AC,... + NuovoZeroTuL,MEMS,FileName); + % media mobile dei dati + [ARRAYdate_TuL,accTuL,ACCdefRis_TuL,TempDef_TuL,ay_TuL,ay_TuL_AC] = ... + MediaDati_TuL(accTuL,TimeTuL,ris_acc_TuL,ay_TuL,ay_TuL_AC,NdatiMedia,... + T_TuL,NuovoZeroTuL,FileName); + else + ARRAYdate_TuL = []; + text = 'There are not data to convert for Tunnel Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili non pi� utilizzate + clear DatiTunnelLink + clear tempTuL + clear DCalTuLTot + clear t_TuL + clear t_TuL_AC + clear ris_acc_TuL + clear T_TuL + clear TimeTuL + + % --- Radial Link --- + if yesRL == 1 % attiva l'elaborazione dei Radial Link + % definizione dei dati + [TimeRL,accRL,tempRL,ErrRadialLink] = defDatiRL(DatiRadialLink,... + ErrRadialLink,Ndatidespike,rRL,MEMS,FileName); + % Conversione dei dati grezzi + [accRL,ris_acc_RL,T_RL] = conv_grezziRL(rRL,accRL,tempRL,DCalRLTot,MEMS,FileName); + % media mobile dei dati + [ARRAYdate_RL,accRL,ACCdefRis_RL,TempDef_RL] = MediaDati_RL(accRL,... + TimeRL,ris_acc_RL,NdatiMedia,T_RL,FileName); + else + text = 'There are not data to convert for Radial Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + ARRAYdate_RL = []; + clear text + end + % Pulisco le variabili non pi� utilizzate + clear DatiRadialLink + clear tempRL + clear DCalRLTot + clear ris_acc_RL + clear T_RL + clear TimeRL + + % --- Tilt Link H --- + if yesTLH == 1 % attiva l'elaborazione dei Tilt Link H + % definizione dei dati + [TimeTLH,accTLH,tempTLH,ErrTiltLinkH] = defDatiTLH(... + DatiTiltLinkH,ErrTiltLinkH,Ndatidespike,rTLH,MEMS,FileName); + % conversione dei dati grezzi + [accTLH,ris_acc_TLH,tempTLH,ErrTiltLinkH] = conv_grezziTLH(rTLH,... + accTLH,tempTLH,DCalTLHTot,ErrTiltLinkH,MEMS,FileName); + % media mobile dei dati + [ARRAYdate_TLH,accTLH,ACCdefRis_TLH,TempDef_TLH] = MediaDati_TLH(... + accTLH,TimeTLH,ris_acc_TLH,NdatiMedia,tempTLH,FileName); + else + text = 'There are not data to convert for Tilt Link H'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + ARRAYdate_TLH = []; + clear text + end + % Pulisco le variabili non pi� utilizzate + clear DatiTiltLinkH + clear tempTLH + clear DCalTLHTot + clear ris_acc_TLH + clear T_TLH + clear TimeTLH + + % --- Tilt Link HR H --- + if yesTLHRH == 1 % attiva l'elaborazione dei Tilt Link HR H + % definizione dei dati + [TimeTLHRH,angTLHRH,tempTLHRH,ErrTiltLinkHRH] = defDatiTLHRH(... + DatiTiltLinkHRH,ErrTiltLinkHRH,Ndatidespike,NodoTiltLinkHRH,rTLHRH,... + IDcentralina,DTcatena,FileName); + % conversione dei dati grezzi + [angTLHRH,tempTLHRH] = conv_grezziTLHRH(angTLHRH,tempTLHRH,DCalTLHRHTot,... + rTLHRH,FileName); + % media mobile dei dati + [ARRAYdate_TLHRH,AngDef_TLHRH,TempDef_TLHRH] = MediaDati_TLHRH(angTLHRH,... + TimeTLHRH,NdatiMedia,tempTLHRH,FileName); + else + text = 'There are not data to convert for Tilt Link HR H'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + ARRAYdate_TLHRH = []; + clear text + end + % Pulisco le variabili non pi� utilizzate + clear DatiTiltLinkHRH + clear tempTLHRH + clear DCalTLHRHTot + clear ang_TLHRH + clear TimeTLHRH + + % --- PreConv Link --- + if yesPCL == 1 % attiva l'elaborazione dei PreConv Link + % definizione dei dati + [TimePCL,accPCL,tempPCL,ErrPreConvLink] = defDatiPCL(DatiPreConvLink,... + ErrPreConvLink,Ndatidespike,rPCL,MEMS,FileName); + % conversione dei dati grezzi + [accPCL,ris_acc_PCL,T_PCL] = conv_grezziPCL(rPCL,accPCL,tempPCL,DCalPCLTot,... + MEMS,FileName); + % media mobile dei dati + [ARRAYdate_PCL,accPCL,ACCdefRis_PCL,TempDef_PCL] = MediaDati_PCL(... + accPCL,TimePCL,ris_acc_PCL,NdatiMedia,T_PCL,FileName); + else + text = 'There are not data to convert for PreConv Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + ARRAYdate_PCL = []; + clear text + end + % Pulisco le variabili non pi� utilizzate + clear DatiPreConvLink + clear tempPCL + clear TimePCL + clear DCalPCLTot + clear ris_acc_PCL + clear T_PCL + + % --- PreConv Link HR --- + if yesPCLHR == 1 % attiva l'elaborazione dei PreConv Link HR + % definizione dei dati + [TimePCLHR,angPCLHR,tempPCLHR,ErrPreConvLinkHR] = defDatiPCLHR(... + DatiPreConvLinkHR,ErrPreConvLinkHR,NodoPreConvLinkHR,Ndatidespike,rPCLHR,... + IDcentralina,DTcatena,FileName); + % conversione dei dati grezzi + [angPCLHR,tempPCLHR] = conv_grezziPCLHR(angPCLHR,tempPCLHR,DCalPCLHRTot,... + rPCLHR,FileName); + % media mobile dei dati + [ARRAYdate_PCLHR,AngDef_PCLHR,TempDef_PCLHR] = MediaDati_PCLHR(... + angPCLHR,TimePCLHR,NdatiMedia,tempPCLHR,FileName); + else + text = 'There are not data to convert for PreConv Link HR'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + ARRAYdate_PCLHR = []; + clear text + end + % Pulisco le variabili non pi� utilizzate + clear DatiPreConvLinkHR + clear angPCLHR + clear tempPCLHR + clear DCalPCLHRTot + clear T_PCLHR + clear TimePCLHR + +% % --- DistoMT Link --- +% if yesTuL == 1 % attiva l'elaborazione +% % definizione dei dati +% [TimeTuL,accTuL,tempTuL,ay_TuL,ay_TuL_AC,ErrTunnelLink] = defDatiTuL(... +% DatiTunnelLink,ay_TuL,ay_TuL_AC,Ndatidespike,rTuL,NuovoZeroTuL,... +% ErrTunnelLink,MEMS,FileName); +% % Conversione dei dati grezzi +% [accTuL,ris_acc_TuL,T_TuL,ay_TuL,ay_TuL_AC] = conv_grezziTuL(... +% rTuL,accTuL,tempTuL,DCalTuLTot,ay_TuL,t_TuL,ay_TuL_AC,t_TuL_AC,... +% NuovoZeroTuL,MEMS,FileName); +% % media mobile dei dati +% [ARRAYdate_DL,accTuL,ACCdefRis_TuL,TempDef_TuL,ay_TuL,ay_TuL_AC] = ... +% MediaDati_TuL(accTuL,TimeTuL,ris_acc_TuL,ay_TuL,ay_TuL_AC,NdatiMedia,... +% T_TuL,NuovoZeroTuL,FileName); +% else +% ARRAYdate_DL = []; +% text = 'There are not data to convert for Tunnel Link'; +% fileID = fopen(FileName,'a'); +% fmt = '%s \r'; +% fprintf(fileID,fmt,text); +% fclose(fileID); +% clear text +% end +% % Pulisco le variabili non pi� utilizzate +% clear DatiTunnelLink +% clear tempTuL +% clear DCalTuLTot +% clear t_TuL +% clear t_TuL_AC +% clear ris_acc_TuL +% clear T_TuL +% clear TimeTuL + + % --- Pressure Link --- + if yesPL == 1 % arriva l'elaborazione dei Pressure Link + % definizione dei dati + [TimePL,Pressure,ErrPressureLink] = defDatiPL(DatiPressureLink,... + ErrPressureLink,Ndatidespike,rPrL,FileName); + % conversione dei dati grezzi + DatiPressure = conv_grezziPL(Pressure,DCalPLTot,NodoPressureLink,FileName); + % media mobile dei dati + [ARRAYdate_PL,DatiPressure] = MediaDati_PL(DatiPressure,TimePL,NdatiMedia,FileName); + else + ARRAYdate_PL = []; + DatiPressure = []; + text = 'There are not data to convert for Pressure Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili non pi� utilizzate + clear DatiPressureLink + clear TimePL + clear Pressure + clear DCalPLTot + + % --- Load Link --- + if yesLL == 1 % attiva l'elaborazione dei Load Link + % definizione dei dati + [TimeLL,Load,ErrLoadLink] = defDatiLL(DatiLoadLink,ErrLoadLink,... + Ndatidespike,rLL,FileName); + % Conversione dei dati grezzi + DatiLoad = conv_grezziLL(Load,DCalLLTot,NodoLoadLink,FileName); + % media mobile dei dati + [ARRAYdate_LL,DatiLoad] = MediaDati_LL(DatiLoad,TimeLL,NdatiMedia,FileName); + else + ARRAYdate_LL = []; + DatiLoad = []; + text = 'There are not data to convert for Load Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili non pi� utilizzate + clear DatiLoadLink + clear TimeLL + clear Load + clear DCalLLTot + + % --- Extensometer Link --- + if yesEL == 1 + % definizione dei dati + [TimeEL,Extensometer,NTCExtensometer,ErrExtensometerLink]... + = defDatiEL(DatiExtensometerLink,DatiNTCExtensometerLink,ErrExtensometerLink,... + ChEL,EL_NTC,rEL,Ndatidespike,FileName); + % Conversione dei dati grezzi + [DatiExtensometer,DatiExtensometer_Rif,DatiNTCExtensometer,ErrExtensometerLink,Carico_Sensore]... + = conv_grezziEL(Extensometer,NTCExtensometer,DatiExtensometerLink_Rif,DCalELTot,EL_NTC,... + NodoExtensometerLink,ErrExtensometerLink,Calcolo_Carico,FileName); + % media mobile dei dati + [ARRAYdate_EL,DatiExtensometer] = MediaDati_EL(DatiExtensometer,TimeEL,NdatiMedia,FileName); + else + ARRAYdate_EL = []; + DatiExtensometer = []; + DatiNTCExtensometer = []; + text = 'There are not data to convert for Extensometer Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili non pi� utilizzate + clear DatiExtensometerLink + clear DatiNTCExtensometerLink + clear DatiExtensometerLink_Rif + clear TimeEL + clear Extensometer + clear NTCExtensometer + clear DCalELTot + + % --- 3D Extensometer Link --- + if yes3DEL == 1 + % definizione dei dati + [Time3DEL,Extensometer3D,Extensometer3D_Rif,NTCExtensometer3D,... + Err3DExtensometerLink,ErrNTC3DExtensometerLink] = ... + defDati3DEL(Dati3DExtensometerLink,Dati3DExtensometerLink_Rif,... + DatiNTC3DExtensometerLink,Err3DExtensometerLink,ErrNTC3DExtensometerLink,... + Nodo3DExtensometerLink,r3DEL,Ch3DEL,EL3D_NTC,Ndatidespike,FileName); + % Conversione dei dati grezzi + [DatiExtensometer3D,DatiExtensometer3D_Rif,DatiNTCExtensometer3D,... + Err3DExtensometerLink] = conv_grezzi3DEL(Extensometer3D,NTCExtensometer3D,... + Extensometer3D_Rif,DCalEL3DTot,Nodo3DExtensometerLink,Err3DExtensometerLink,... + r3DEL,EL3D_NTC,FileName); + % media mobile dei dati + [ARRAYdate_3DEL,DatiExtensometer3D] = MediaDati_3DEL(DatiExtensometer3D,Time3DEL,... + NdatiMedia,FileName); + % Sottraggo la misura di riferimento + DatiExtensometer3D = DatiExtensometer3D - DatiExtensometer3D_Rif(1,:); + else + ARRAYdate_3DEL = []; + DatiExtensometer3D = []; + DatiNTCExtensometer3D = []; + text = 'There are not data to convert for 3D Extensometer Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili non pi� utilizzate + clear Dati3DExtensometerLink + clear DatiNTC3DExtensometerLink + clear Dati3DExtensometerLink_Rif + clear Time3DEL + clear Extensometer3D + clear NTCExtensometer3D + clear DCal3DELTot + clear DatiExtensometer3D_Rif + + % --- Wire Extensometer Link --- + if yesWEL == 1 + % definizione dei dati + [TimeWEL,WireExtensometer,NTCWireExtensometer,ErrWireExtensometerLink]... + = defDatiWEL(DatiWireExtensometerLink,DatiNTCWireExtensometerLink,... + ErrWireExtensometerLink,ChWEL,WEL_NTC,rWEL,Ndatidespike,FileName); + % Conversione dei dati grezzi + [DatiWireExtensometer,DatiNTCWireExtensometer,ErrWireExtensometerLink] = conv_grezziWEL(... + WireExtensometer,NTCWireExtensometer,DCalWELTot,NodoWireExtensometerLink,... + ErrWireExtensometerLink,WEL_NTC,rWEL,Tmax,Tmin,FileName); + % media mobile dei dati + [ARRAYdate_WEL,DatiWireExtensometer] = MediaDati_WEL(DatiWireExtensometer,... + TimeWEL,NdatiMedia,FileName); + else + ARRAYdate_WEL = []; + DatiWireExtensometer = []; + DatiNTCWireExtensometer = []; + text = 'There are not data to convert for Wire Extensometer Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili non pi� utilizzate + clear DatiWireExtensometerLink + clear DatiNTCWireExtensometerLink + clear TimeWEL + clear WireExtensometer + clear NTCWireExtensometer + clear DCalWELTot + + % --- MultiPoint Rod Extensometer --- + if yesMPBEL == 1 + % definizione dei dati + [TimeMPBEL,DatiMPBEL,~,ErrMultiPointExtensometer] = ... + defDatiMPBEL(DatiMultiPointExtensometer,DatiNTCMultiPointExtensometer,... + ErrMultiPointExtensometer,FileName); + % Conversione dei dati grezzi + DatiMultiBase = conv_grezziMPBEL(DatiMPBEL,NumBasi,DCalMPBELTot,FileName); + % media mobile dei dati + [ARRAYdate_MPBEL,DatiMultiBase] = MediaDati_MPBEL(DatiMultiBase,TimeMPBEL,NdatiMedia,FileName); + else + ARRAYdate_MPBEL = []; + DatiMultiBase = []; + text = 'There are not data to convert for MultiPoint Borehole Rod Extensometer'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili non pi� utilizzate + clear DatiMultiPointExtensometer + clear DatiNTCMultiPointExtensometer + clear TimeMPBEL + clear DCalMPBELTot + + % --- Analog Link --- + if yesAL == 1 + % definizione dei dati + [TimeAL,ADCAnalog,ErrAnalogLink] = defDatiAL(DatiAnalogLink,ErrAnalogLink,FileName); + % Conversione dei dati grezzi + DatiAnalog = conv_grezziAL(ADCAnalog,DCalALTot,NodoAnalogLink,FileName); + % media mobile dei dati + [ARRAYdate_AL,DatiAnalog] = MediaDati_AL(DatiAnalog,TimeAL,NdatiMedia,FileName); + else + ARRAYdate_AL = []; + DatiAnalog = []; + text = 'There are not data to convert for Analog Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili non pi� utilizzate + clear DatiAnalogLink + clear ADCAnalog + clear TimeAL + clear DCalALTot + + % --- Crack Link --- + if yesCrL == 1 + % definizione dei dati + [TimeCrL,Crack,NTCCrack,ErrCrackLink] = defDatiCrL(DatiCrackLink,... + DatiNTCCrackLink,ErrCrackLink,ChCrL,CrL_NTC,rCrL,Ndatidespike,FileName); + % Conversione dei dati grezzi + [DatiCrack,DatiNTCCrack,ErrCrackLink] = conv_grezziCrL(Crack,NTCCrack,DCalCrLTot,... + NodoCrackLink,ErrCrackLink,CrL_NTC,rCrL,NuovoZeroCrL,IDcentralina,DTcatena,FileName); + % media mobile dei dati + [ARRAYdate_CrL,DatiCrack] = MediaDati_CrL(DatiCrack,TimeCrL,NdatiMedia,FileName); + else + ARRAYdate_CrL = []; + DatiCrack = []; + DatiNTCCrack = []; + text = 'There are not data to convert for Crack Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili non pi� utilizzate + clear DatiCrackLink + clear TimeCrL + clear Crack + clear NTCCrack + clear DCalCrLTot + + % --- 2D Crack Link --- + if yes2DCrL == 1 + % definizione dei dati + [Time2DCrL,Crack2D,NTCCrack2D,Err2DCrackLink,ErrNTC2DCrackLink] = ... + defDati2DCrL(Dati2DCrackLink,DatiNTC2DCrackLink,Err2DCrackLink,ErrNTC2DCrackLink,... + r2DCrL,Nodo2DCrackLink,Ch2DCrL,CrL2D_NTC,Ndatidespike,FileName); + % Conversione dei dati grezzi + [Dati2DCrack,DatiNTCCrack2D,Err2DCrackLink] = conv_grezzi2DCrL(... + Crack2D,NTCCrack2D,DCal2DCrLTot,Nodo2DCrackLink,Err2DCrackLink,CrL2D_NTC,... + r2DCrL,NuovoZero2DCrL,IDcentralina,DTcatena,FileName); + % media mobile dei dati + [ARRAYdate_2DCrL,Dati2DCrack] = MediaDati_2DCrL(Dati2DCrack,Time2DCrL,NdatiMedia,FileName); + else + ARRAYdate_2DCrL = []; + Dati2DCrack = []; + DatiNTCCrack2D = []; + text = 'There are not data to convert for 2D Crack Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + clear Dati2DCrackLink + clear Time2DCrL + clear Crack2D + clear DCal2DCrLTot + clear DatiNTC2DCrackLink + + % --- 3D Crack Link --- + if yes3DCrL == 1 + % definizione dei dati + [Time3DCrL,Crack3D,NTCCrack3D,Err3DCrackLink,ErrNTC3DCrackLink] = ... + defDati3DCrL(Dati3DCrackLink,DatiNTC3DCrackLink,Err3DCrackLink,ErrNTC3DCrackLink,... + r3DCrL,Nodo3DCrackLink,Ch3DCrL,CrL3D_NTC,Ndatidespike,FileName); + % Conversione dei dati grezzi + [Dati3DCrack,DatiNTCCrack3D,Err3DCrackLink] = conv_grezzi3DCrL(... + Crack3D,NTCCrack3D,DCal3DCrLTot,Nodo3DCrackLink,Err3DCrackLink,CrL3D_NTC,... + r3DCrL,NuovoZero3DCrL,IDcentralina,DTcatena,FileName); + % media mobile dei dati + [ARRAYdate_3DCrL,Dati3DCrack] = MediaDati_3DCrL(Dati3DCrack,Time3DCrL,NdatiMedia,FileName); + else + ARRAYdate_3DCrL = []; + Dati3DCrack = []; + DatiNTCCrack3D = []; + text = 'There are not data to convert for 3D Crack Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + clear Dati3DCrackLink + clear Time3DCrL + clear Crack3D + clear DCal3DCrLTot + clear DatiNTC3DCrackLink + + % --- Stress Meter --- + if yesSM == 1 + % definizione dei dati + [TimeSM,Stress,NTCStress,ErrStressMeter] = defDatiSM(DatiStressMeter,... + DatiNTCStressMeter,ErrStressMeter,ChSM,SM_NTC,rSM,Ndatidespike,FileName); + % Conversione dei dati grezzi + [DatiStress,DatiNTCStress,ErrStressMeter] = conv_grezziSM(Stress,NTCStress,... + DatiStressMeter_Rif,DatiNTCStressMeter_Rif,DCalSMTot,NodoStressMeter,ErrStressMeter,... + SM_NTC,rSM,FileName); + % media mobile dei dati + [ARRAYdate_SM,DatiStress] = MediaDati_SM(DatiStress,TimeSM,NdatiMedia,FileName); + else + ARRAYdate_SM = []; + DatiStress = []; + DatiNTCStress = []; + text = 'There are not data to convert for Stress Meter'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili non pi� utilizzate + clear DatiStressMeter + clear DatiNTCStressMeter + clear TimeSM + clear Stress + clear NTCStress + clear DCalSMTot + + %% Parte di Elaborazione + + % --- Analisi Tunnel Link --- + if yesTuL == 1 + [X_TuL,Xstar_TuL,Y_TuL,Z_TuL,Zstar_TuL,Xlocal_TuL,Ylocal_TuL,Zlocal_TuL,... + SegStar,HShift_local_TuL,TempDef_TuL,ARRAYdate_TuL,Area_TuL,Speed_local_TuL,... + Acceleration_local_TuL,ErrTunnelLink] = elab2D_TuL(rTuL,accTuL,ay_TuL,ay_TuL_AC,... + ACCdefRis_TuL,SpeTuL,IDcentralina,DTcatena,DatiElabTunnelLink,NuovoZeroTuL,... + TempDef_TuL,tolleranzaAcc,Ndevst,Wdevst,NdatiMedia,Ndatidespike,ARRAYdate_TuL,... + data1_AC,Nodo_AC,margine,ErrTunnelLink,Tmax,Tmin,datainiTuL,FileName); + else + [X_TuL,Xstar_TuL,Y_TuL,Z_TuL,Zstar_TuL,Xlocal_TuL,Ylocal_TuL,Zlocal_TuL,... + SegStar,HShift_local_TuL,TempDef_TuL,Area_TuL,Speed_local_TuL,... + Acceleration_local_TuL] = matrici_vuote_TuL(FileName); + end + clear DatiElabTunnelLink + clear rTuL + clear accTuL + clear ay_TuL + clear ay_TuL_AC + clear data1_AC + clear ACCdefRis_TuL + clear SpeTuL + clear DatiElabTunnelLink + clear NuovoZeroTuL + clear Nodo_AC + clear data1_AC + % fine elaborazione Tunnel Link + + % --- Analisi Radial Link --- + if yesRL == 1 + [X_RL,Y_RL,Z_RL,Xlocal_RL,Ylocal_RL,Zlocal_RL,TempDef_RL,ARRAYdate_RL,... + ErrRadialLink] = elab2D_RL(rRL,accRL,ACCdefRis_RL,SpeRL,IDcentralina,DTcatena,... + DatiElabRadialLink,NuovoZeroRL,tolleranzaAcc,TempDef_RL,Ndevst,Wdevst,ARRAYdate_RL,... + elab_option,NdatiMedia,Ndatidespike,margine,ErrRadialLink,Tmax,Tmin,datainiRL,FileName); + else + [X_RL,Y_RL,Z_RL,Xlocal_RL,Ylocal_RL,Zlocal_RL,TempDef_RL] = matrici_vuote_RL(FileName); + end + clear DatiElabRadialLink + clear accRL + clear SpeRL + clear ACCdefRis_RL + clear NuovoZeroRL + clear rRL + % fine elaborazione Radial Link + + % --- Tilt Link H --- + if yesTLH == 1 + [Y_TLH,Z_TLH,Ylocal_TLH,Zlocal_TLH,AlfaX_TLH,AlfaY_TLH,TempDef_TLH,... + speed_TLH,speed_local_TLH,acceleration_TLH,acceleration_local_TLH,ARRAYdate_TLH,... + ErrTiltLinkH] = elab2D_TLH(IDcentralina,DTcatena,rTLH,accTLH,ACCdefRis_TLH,... + TempDef_TLH,SpeTLH,PsTLH,tolleranzaAcc,DatiElabTiltLinkH,Ndevst,Wdevst,... + ARRAYdate_TLH,NuovoZeroTLH,NdatiMedia,Ndatidespike,ErrTiltLinkH,margine,... + elab_option,Tmax,Tmin,datainiTLH,FileName); + else + [Y_TLH,Z_TLH,Ylocal_TLH,Zlocal_TLH,AlfaX_TLH,AlfaY_TLH,TempDef_TLH,... + speed_TLH,speed_local_TLH,acceleration_TLH,acceleration_local_TLH] = matrici_vuote_TLH(FileName); + end + clear DatiElabTiltLinkH + clear accTLH + clear ACCdefRis_TLH + clear SpeTLH + clear PsTLH + clear NuovoZeroTLH + % fine elaborazione Tilt Link H + + % --- Tilt Link HR H --- + if yesTLHRH == 1 + [Y_TLHRH,Z_TLHRH,Ylocal_TLHRH,Zlocal_TLHRH,AlfaX_TLHRH,AlfaY_TLHRH,... + TempDef_TLHRH,speed_TLHRH,speed_local_TLHRH,acceleration_TLHRH,acceleration_local_TLHRH,... + ARRAYdate_TLHRH,ErrTiltLinkHRH] = elab2D_TLHRH(rTLHRH,AngDef_TLHRH,TempDef_TLHRH,... + SpeTLHRH,PsTLHRH,DatiElabTiltLinkHRH,Ndevst_HR,Wdevst_HR,ARRAYdate_TLHRH,... + NuovoZeroTLHRH,NdatiMedia,Ndatidespike,ErrTiltLinkHRH,margine,elab_option,... + Tmax,Tmin,datainiTLHRH,FileName); + else + [Y_TLHRH,Z_TLHRH,Ylocal_TLHRH,Zlocal_TLHRH,AlfaX_TLHRH,AlfaY_TLHRH,TempDef_TLHRH,... + speed_TLHRH,speed_local_TLHRH,acceleration_TLHRH,acceleration_local_TLHRH] = matrici_vuote_TLHRH(FileName); + end + clear calotta_base + clear DatiElabTiltLinkHRH + clear AngDef_TLHRH + clear SpeTLHRH + clear PsTLHRH + clear NuovoZeroTLHRH + % fine elaborazione Tilt Link HR H + + % --- PreConv Link --- + if yesPCL == 1 + [Y_PCL,Z_PCL,Ylocal_PCL,Zlocal_PCL,AlfaX_PCL,AlfaY_PCL,TempDef_PCL,... + speed_PCL,speed_local_PCL,acceleration_PCL,acceleration_local_PCL,ARRAYdate_PCL,... + ErrPreConvLink] = elab2D_PCL(IDcentralina,DTcatena,rPCL,accPCL,ACCdefRis_PCL,... + TempDef_PCL,SpePCL,tolleranzaAcc,DatiElabPreConvLink,Ndevst,Wdevst,ARRAYdate_PCL,... + NuovoZeroPCL,NdatiMedia,Ndatidespike,ErrPreConvLink,margine,elab_option,... + Tmax,Tmin,datainiPCL,FileName); + else + [Y_PCL,Z_PCL,Ylocal_PCL,Zlocal_PCL,AlfaX_PCL,AlfaY_PCL,TempDef_PCL,... + speed_PCL,speed_local_PCL,acceleration_PCL,acceleration_local_PCL] = matrici_vuote_PCL(FileName); + end + clear DatiElabPreConvLink + clear accPCL + clear ACCdefRis_PCL + clear SpePCL + clear tolleranzaAcc + clear DatiElabPreConvLink + clear NuovoZeroPCL + clear rPCL + clear Ndevst + clear Wdevst + % fine elaborazione PreConv Link + + % --- PreConv Link HR --- + if yesPCLHR == 1 + [Y_PCLHR,Z_PCLHR,Ylocal_PCLHR,Zlocal_PCLHR,AlfaX_PCLHR,AlfaY_PCLHR,TempDef_PCLHR,... + speed_PCLHR,speed_local_PCLHR,acceleration_PCLHR,acceleration_local_PCLHR,ARRAYdate_PCLHR,... + ErrPreConvLinkHR] = elab2D_PCLHR(IDcentralina,DTcatena,rPCLHR,AngDef_PCLHR,... + TempDef_PCLHR,SpePCLHR,DatiElabPreConvLinkHR,Ndevst_HR,Wdevst_HR,ARRAYdate_PCLHR,... + NuovoZeroPCLHR,NdatiMedia,Ndatidespike,ErrPreConvLinkHR,margine,elab_option,Tmax,Tmin,... + datainiPCLHR,FileName); + else + [Y_PCLHR,Z_PCLHR,Ylocal_PCLHR,Zlocal_PCLHR,AlfaX_PCLHR,AlfaY_PCLHR,TempDef_PCLHR,... + speed_PCLHR,speed_local_PCLHR,acceleration_PCLHR,acceleration_local_PCLHR] = matrici_vuote_PCLHR(FileName); + end + clear DatiElabPreConvLinkHR + clear rPCLHR + clear AngDef_PCLHR + clear SpePCLHR + clear elab_option + clear Ndevst_HR + clear Wdevst_HR + clear NuovoZeroPCLHR + clear NdatiMedia + clear Ndatidespike + clear tolleranzaT + clear margine + clear elab_option + + % --- Extensometer Link --- + if yesEL == 1 + % Sottraggo la misura di riferimento + DatiExtensometer = DatiExtensometer - DatiExtensometer_Rif(1,:); + % Calcolo lo sforzo e il carico assoluto + if Calcolo_Carico == 1 + Epsilon = DatiExtensometer/1000000; + Sforzo = Epsilon.*Mod_Elastico; % MPa + Carico_rel = Area*Sforzo/1000; % kN + Carico_ass = Carico_rel+Carico_Ini+Carico_Sensore'; % kN + Sforzo = Carico_ass*1000/Area; % MPa + else + Carico_ass = []; + Sforzo = []; + end + clear DatiExtensometer_Rif + else + Carico_ass = []; + Sforzo = []; + end + + % --- 3D Extensometer Link --- + % Correzione 3D Extensometer Link + if yes3DEL == 1 + [r,~] = size(Err3DExtensometerLink); + Matrice_err = zeros(r,r3DEL); + for i = 1:r % date + d = 1; + for n = 1:r3DEL % nodi + j = 1; + err = Err3DExtensometerLink(i,d:d+2); + while j <= 3 + if err(1,j) == 1 + Matrice_err(i,n) = 1; + end + j = j+1; + end + d = d+3; + end + end + Err3DExtensometerLink = Matrice_err; + Join = find(ErrNTC3DExtensometerLink); + [rJ,cJ] = size(Join); + for ii = 1:rJ + for jj = 1:cJ + if Err3DExtensometerLink(Join(ii,jj)) == 0 + Err3DExtensometerLink(Join(ii,jj)) = 0.5; + end + end + end + end + clear ErrNTC3DExtensometerLink + + % --- Crack Link --- + if yesCrL == 1 + NomeFile = ['' IDcentralina '-' DTcatena '-RifCrL.csv']; + if NuovoZeroCrL == 0 % prima elaborazione + csvwrite(NomeFile,DatiCrack(1,:)); + DatiCrack = DatiCrack - DatiCrack(1,:); + else % Ci sono gi� dei dati elaborati + RIF = csvread(NomeFile); + DatiCrack = DatiCrack - RIF; + end + end + + % --- 3D Crack Link --- + if yes3DCrL == 1 + [r,~] = size(Err3DCrackLink); + Matrice_err = zeros(r,r3DCrL); + for i = 1:r % date + d = 1; + for n = 1:r3DCrL % nodi + j = 1; + err = Err3DCrackLink(i,d:d+2); + while j <= 3 + if err(1,j) == 1 + Matrice_err(i,n) = 1; + end + j = j+1; + end + d = d+3; + end + end + Err3DCrackLink = Matrice_err; + Join = find(ErrNTC3DCrackLink); + [rJ,cJ] = size(Join); + for ii = 1:rJ + for jj = 1:cJ + if Err3DCrackLink(Join(ii,jj)) == 0 + Err3DCrackLink(Join(ii,jj)) = 0.5; + end + end + end + end + clear ErrNTC3DCrackLink + + % --- 2D Crack Link --- + if yes2DCrL == 1 + [r,~] = size(Err2DCrackLink); + Matrice_err = zeros(r,r2DCrL); + for i = 1:r % date + d = 1; + for n = 1:r2DCrL % nodi + j = 1; + err = Err2DCrackLink(i,d:d+1); + while j <= 2 + if err(1,j) == 1 + Matrice_err(i,n) = 1; + end + j = j+1; + end + d = d+2; + end + end + Err2DCrackLink = Matrice_err; + Join = find(ErrNTC2DCrackLink); + [rJ,cJ] = size(Join); + for ii = 1:rJ + for jj = 1:cJ + if Err2DCrackLink(Join(ii,jj)) == 0 + Err2DCrackLink(Join(ii,jj)) = 0.5; + end + end + end + end + clear ErrNTC2DCrackLink + + % --- MultiPoint Borehole Extensometer Link --- + % Correzione MultiPoint Extensometer + if yesMPBEL == 1 + [r,~] = size(ErrMultiPointExtensometer); + Matrice_err = zeros(r,rMPBEL); + for i = 1:r % date + d = 1; + for n = 1:rMPBEL % nodi + j = 1; + err = ErrMultiPointExtensometer(i,d:d+NumBasi-1); + while j <= NumBasi + if err(1,j) == 1 + Matrice_err(i,n) = 1; + end + j = j+1; + end + d = d+NumBasi; + end + end + ErrMultiPointExtensometer = Matrice_err; + Join = find(ErrNTCMultiPointExtensometer); + [rJ,cJ] = size(Join); + for ii = 1:rJ + for jj = 1:cJ + if ErrMultiPointExtensometer(Join(ii,jj)) == 0 + ErrMultiPointExtensometer(Join(ii,jj)) = 0.5; + end + end + end + end + clear ErrNTCMultiPointExtensometer + + %% Parte di Scrittura su Database + database_write(catena,IDcentralina,DTcatena,X_TuL,Xstar_TuL,Y_TuL,Z_TuL,Zstar_TuL,... + Xlocal_TuL,Ylocal_TuL,Zlocal_TuL,SegStar,HShift_local_TuL,Area_TuL,... + Speed_local_TuL,Acceleration_local_TuL,TempDef_TuL,ARRAYdate_TuL,ErrTunnelLink,... + X_RL,Y_RL,Z_RL,Xlocal_RL,Ylocal_RL,Zlocal_RL,TempDef_RL,ARRAYdate_RL,ErrRadialLink,... + Y_TLH,Z_TLH,Ylocal_TLH,Zlocal_TLH,AlfaX_TLH,AlfaY_TLH,TempDef_TLH,speed_TLH,... + speed_local_TLH,acceleration_TLH,acceleration_local_TLH,ARRAYdate_TLH,ErrTiltLinkH,... + Y_TLHRH,Z_TLHRH,Ylocal_TLHRH,Zlocal_TLHRH,AlfaX_TLHRH,AlfaY_TLHRH,TempDef_TLHRH,speed_TLHRH,... + speed_local_TLHRH,acceleration_TLHRH,acceleration_local_TLHRH,ARRAYdate_TLHRH,ErrTiltLinkHRH,... + Y_PCL,Z_PCL,Ylocal_PCL,Zlocal_PCL,AlfaX_PCL,AlfaY_PCL,TempDef_PCL,speed_PCL,... + speed_local_PCL,acceleration_PCL,acceleration_local_PCL,ARRAYdate_PCL,ErrPreConvLink,... + Y_PCLHR,Z_PCLHR,Ylocal_PCLHR,Zlocal_PCLHR,AlfaX_PCLHR,AlfaY_PCLHR,TempDef_PCLHR,speed_PCLHR,... + speed_local_PCLHR,acceleration_PCLHR,acceleration_local_PCLHR,ARRAYdate_PCLHR,ErrPreConvLinkHR,... + DatiPressure,ARRAYdate_PL,ErrPressureLink,DatiLoad,ARRAYdate_LL,ErrLoadLink,... + DatiExtensometer,DatiNTCExtensometer,ARRAYdate_EL,Carico_ass,Sforzo,Calcolo_Carico,ErrExtensometerLink,ChEL,EL_NTC,... + DatiExtensometer3D,DatiNTCExtensometer3D,ARRAYdate_3DEL,Err3DExtensometerLink,Ch3DEL,EL3D_NTC,... + DatiWireExtensometer,DatiNTCWireExtensometer,ARRAYdate_WEL,ErrWireExtensometerLink,ChWEL,WEL_NTC,... + DatiMultiBase,ARRAYdate_MPBEL,ErrMultiPointExtensometer,NumBasi,... + DatiAnalog,ARRAYdate_AL,ErrAnalogLink,DatiCrack,DatiNTCCrack,ChCrL,CrL_NTC,ARRAYdate_CrL,ErrCrackLink,... + Dati3DCrack,DatiNTCCrack3D,ARRAYdate_3DCrL,Ch3DCrL,CrL3D_NTC,Err3DCrackLink,... + Dati2DCrack,DatiNTCCrack2D,ARRAYdate_2DCrL,Ch2DCrL,CrL2D_NTC,Err2DCrackLink,... + DatiStress,DatiNTCStress,ARRAYdate_SM,ErrStressMeter,ChSM,SM_NTC,... + conn,FileName); + + %% Rilancio software + [yesRSN,yesMusa] = SWSearch(idTool,conn,FileName); + try + if yesRSN == 1 + rilancio = ['/usr/local/matlab_func/run_RSN_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 ' IDcentralina ' ' DTcatena '']; + status = system(rilancio); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,status); + fclose(fileID); + end + 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'; + 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); + end +end + +%% Parte di allertamento + +% Determino gli utenti da utilizzare in tutte le funzioni successive +[Mail,~,~,Users_Report,~,activeEN,... + sms,siteID,NomeSito,ini_CoV] = 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); + +% % Funzione Soglie sperimentale ASE +% [~,unitID,chainID,Chain_Scheme,num_nodi] = soglie(IDcentralina,... +% yesTuL,yesRL,yesTLH,yesTLHRH,yesPCL,yesPCLHR,conn,FileName); + +% Funzione per soglie sito specifiche +alert_Levels(rLL,rCrL,DatiLoad,DatiCrack,ARRAYdate_LL,ARRAYdate_CrL,... + ErrLoadLink,ErrCrackLink,NodoLoadLink,NodoCrackLink,IDcentralina,DTcatena,... + sms,date,time,conn,FileName); + +if strcmp(Unit,'Nesa evolution') == 0 + % Funzione che elabora i Control Tools + alarms = Siren(siteID,yesTuL,yesRL,yesTLH,yesTLHRH,yesPCL,yesPCLHR,... + yesCrL,yes3DCrL,yes2DCrL,yesEL,yes3DEL,yesWEL,yesMPBEL,datainiTuL,tempoiniTuL,... + datainiRL,tempoiniRL,datainiTLH,tempoiniTLH,datainiTLHRH,tempoiniTLHRH,... + datainiPCL,tempoiniPCL,datainiPCLHR,tempoiniPCLHR,datainiCrL,tempoiniCrL,... + dataini3DCrL,tempoini3DCrL,dataini2DCrL,tempoini2DCrL,... + datainiEL,tempoiniEL,dataini3DEL,tempoini3DEL,... + datainiWEL,tempoiniWEL,datainiMPBEL,tempoiniMPBEL,ARRAYdate_TuL,ARRAYdate_RL,... + ARRAYdate_TLH,ARRAYdate_TLHRH,ARRAYdate_PCL,ARRAYdate_PCLHR,ARRAYdate_CrL,... + ARRAYdate_3DCrL,ARRAYdate_2DCrL,ARRAYdate_EL,ARRAYdate_3DEL,ARRAYdate_WEL,ARRAYdate_MPBEL,... + conn,date,time,FileName); +end + +% Controllo del Livello della Batteria +checkBattery(Batteria,IDcentralina,Mail,conn,FileName); + +% Controllo della data di chiusura piattaforma per una determinata centralina +checkUnit(IDcentralina,conn,FileName); + +% Controllo della data di scadenza della SIM +checkSIM(IDcentralina,conn,FileName); + +% Controllo della data di scadenza del GIS +checkGIS(siteID,NomeSito,conn,FileName) + +%% Parte di Report +Report_ASE(IDcentralina,siteID,unitID,chainID,Chain_Scheme,num_nodi,... + alarms,Mail,Users_Report,activeEN,time,conn,FileName); + +toc +text = ['ATD calculation ended in ' num2str(toc) ' seconds.']; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +RC = 0; + +end + \ No newline at end of file diff --git a/ATD/ATD_Dati.m b/ATD/ATD_Dati.m new file mode 100755 index 0000000..eeda646 --- /dev/null +++ b/ATD/ATD_Dati.m @@ -0,0 +1,999 @@ +function RC = ATD_Dati(IDcentralina,DTcatena) +%%% Programma per l'elaborazione dei dati di Cir Array, Rad Array, Tilt +%%% Link H, Tilt Link HR H, PreConv Array, PreConv Array HR e strumenti +%%% analogici per gallerie. +%%% Versione 3.4 + +tic + +RC = 1; %#ok +text = ['Elaboration of chain ' DTcatena ' of control unit ' IDcentralina ' started correctly']; +d = datestr(datetime,'yyyy_mm_dd'); +t = datestr(datetime,'HH_MM_SS'); +FileName = ['LogFile-' IDcentralina '-' DTcatena '-' d '-' t '.txt']; +outdat = fopen(FileName,'wt+'); %#ok +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 = cell2mat(DB{5,1}); +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,date_AC,time_AC,Nodo_AC,unitID] = datainiziale(DTcatena,unitID,conn,FileName); + +% funzione che elenca tutti i nodi ed il loro numero presenti per ogni tipo di sensore. +[idTool,NodoTunnelLink,NodoRadialLink,NodoTiltLinkH,... + NodoTiltLinkHRH,NodoPreConvLink,NodoPreConvLinkHR,NodoPressureLink,... + NodoLoadLink,NodoExtensometerLink,Nodo3DExtensometerLink,NodoWireExtensometerLink,... + NodoMultiPointRodExtensometer,NodoTiltLinkHR3DH,NodoPreConvLinkHR3D,... + NodoAnalogLink,NodoCrackLink,Nodo3DCrackLink,Nodo2DCrackLink,NodoStressMeter,... + rTuL,rRL,rTLH,rTLHRH,rPCL,rPCLHR,rPrL,rLL,rEL,r3DEL,rWEL,rMPBEL,rAL,rCrL,r3DCrL,... + r2DCrL,rSM,~,~] = 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 +[yesTuL,yesRL,yesTLH,yesTLHRH,~,yesPCL,yesPCLHR,~,yesPL,yesLL,... + yesEL,yes3DEL,yesWEL,yesMPBEL,yesAL,yesCrL,yes3DCrL,yes2DCrL,yesSM] = ... + YesNo(NodoTunnelLink,NodoRadialLink,NodoTiltLinkH,NodoTiltLinkHRH,... + NodoTiltLinkHR3DH,NodoPreConvLink,NodoPreConvLinkHR,NodoPreConvLinkHR3D,... + NodoPressureLink,NodoLoadLink,NodoExtensometerLink,Nodo3DExtensometerLink,... + NodoWireExtensometerLink,NodoMultiPointRodExtensometer,NodoAnalogLink,... + NodoCrackLink,Nodo3DCrackLink,Nodo2DCrackLink,NodoStressMeter,FileName); + +% Definisco i parametri di elaborazione di un'installazione +[NdatiMedia,Ndatidespike,MEMS,tolleranzaAcc,Tmax,Tmin,Ndevst,Wdevst,... + Ndevst_HR,Wdevst_HR,NumBasi,elab_option] = Parametri_Installazione(idTool,... + conn,yesTuL,yesRL,yesTLH,yesTLHRH,yesPCL,yesPCLHR,yesMPBEL,yesWEL,FileName); + +% funzione che ricostruisce segmenti di pertinenza etc +[SpeTuL,SpeRL,SpeTLH,PsTLH,SpeTLHRH,PsTLHRH,SpePCL,SpePCLHR]... + = schemaSP(yesTuL,yesRL,yesTLH,yesTLHRH,yesPCL,yesPCLHR,... + NodoTunnelLink,NodoRadialLink,NodoTiltLinkH,NodoTiltLinkHRH,... + NodoPreConvLink,NodoPreConvLinkHR,rTuL,rRL,rTLH,rTLHRH,rPCL,rPCLHR,catena,FileName); + +%% Scarico dei dati + +% funzione che carica i dati di calibrazione +[DCalTuLTot,DCalRLTot,DCalTLHTot,DCalTLHRHTot,DCalPCLTot,DCalPCLHRTot,... + DCalPLTot,DCalLLTot,DCalELTot,DCalEL3DTot,DCalWELTot,DCalMPBELTot,... + DCalALTot,DCalCrLTot,DCal3DCrLTot,DCal2DCrLTot,DCalSMTot,yesTuL,yesRL,yesTLH,yesTLHRH,... + yesPCL,yesPCLHR,yesPL,yesLL,yesEL,yes3DEL,yesWEL,yesMPBEL,yesCrL,yes3DCrL,yes2DCrL,... + yesAL,yesSM] = letturaCal(IDcentralina,DTcatena,catena,rTuL,rRL,rTLH,rTLHRH,... + rPCL,rPCLHR,rPrL,rLL,rEL,r3DEL,rWEL,rMPBEL,NumBasi,rAL,rCrL,r3DCrL,r2DCrL,rSM,... + NodoTunnelLink,NodoRadialLink,NodoTiltLinkH,NodoPreConvLink,NodoPressureLink,... + NodoLoadLink,NodoExtensometerLink,Nodo3DExtensometerLink,... + NodoWireExtensometerLink,NodoMultiPointRodExtensometer,NodoAnalogLink,... + NodoCrackLink,Nodo3DCrackLink,Nodo2DCrackLink,NodoStressMeter,yesTuL,yesRL,yesTLH,yesTLHRH,... + yesPCL,yesPCLHR,yesPL,yesLL,yesEL,yes3DEL,yesWEL,yesMPBEL,yesAL,yesCrL,yes3DCrL,yes2DCrL,... + yesSM,conn,FileName); + + % Reinizializzazione scarico dati +[NuovoZeroTuL,NuovoZeroRL,NuovoZeroTLH,NuovoZeroTLHRH,NuovoZeroPCL,... + NuovoZeroPCLHR,NuovoZeroAL,NuovoZeroPrL,NuovoZeroLL,NuovoZeroEL,NuovoZero3DEL,... + NuovoZeroWEL,NuovoZeroMPBEL,NuovoZeroCrL,NuovoZero2DCrL,NuovoZero3DCrL,NuovoZeroSM,... + DatiElabTunnelLink,DatiElabRadialLink,DatiElabTiltLinkH,DatiElabTiltLinkHRH,... + DatiElabPreConvLink,DatiElabPreConvLinkHR,... + datainiTuL,datainiRL,datainiTLH,datainiTLHRH,datainiPCL,datainiPCLHR,... + tempoiniTuL,tempoiniRL,tempoiniTLH,tempoiniTLHRH,tempoiniPCL,tempoiniPCLHR,... + datainiPL,datainiLL,datainiEL,dataini3DEL,datainiWEL,datainiCrL,dataini2DCrL,... + dataini3DCrL,datainiAL,datainiMPBEL,datainiPrL,datainiSM,tempoiniPL,tempoiniLL,... + tempoiniEL,tempoini3DEL,tempoiniWEL,tempoiniCrL,tempoini2DCrL,tempoini3DCrL,tempoiniAL,... + tempoiniMPBEL,tempoiniPrL,tempoiniSM,DatiElabAnalogLink,Date_Rif_EL,Date_Rif_3DEL,... + Date_Rif_SM,ay_TuL,ay_TuL_AC,t_TuL_AC,t_TuL,data1_AC] = scarico(date,time); + +if strcmp(IDcentralina,'ID0142') == 1 && strcmp(DTcatena,'DT0173') + [DatiTunnelLink,ErrTunnelLink,DatiRadialLink,ErrRadialLink,DatiTiltLinkH,ErrTiltLinkH,datainiTLH,... + DatiTiltLinkHRH,ErrTiltLinkHRH,DatiPreConvLink,ErrPreConvLink,DatiPreConvLinkHR,ErrPreConvLinkHR,... + DatiPressureLink,ErrPressureLink,DatiLoadLink,ErrLoadLink,DatiExtensometerLink,DatiNTCExtensometerLink,... + ErrExtensometerLink,Dati3DExtensometerLink,DatiNTC3DExtensometerLink,Err3DExtensometerLink,... + DatiWireExtensometerLink,DatiNTCWireExtensometerLink,ErrWireExtensometerLink,... + DatiMultiPointExtensometer,DatiNTCMultiPointExtensometer,ErrMultiPointExtensometer,... + DatiAnalogLink,ErrAnalogLink,DatiCrackLink,DatiNTCCrackLink,ErrCrackLink,Dati3DCrackLink,DatiNTC3DCrackLink,... + Err3DCrackLink,Dati2DCrackLink,DatiNTC2DCrackLink,Err2DCrackLink,DatiStressMeter,DatiNTCStressMeter,... + ErrStressMeter,yesTLH,ChEL,EL_NTC,Ch3DEL,EL3D_NTC,ChWEL,WEL_NTC,~,~,~,~,ChCrL,CrL_NTC,... + Ch3DCrL,CrL3D_NTC,Ch2DCrL,CrL2D_NTC,ChSM,SM_NTC,Batteria] = letturaHybrid(IDcentralina,DTcatena,datainiTLH,tempoiniTLH,... + NodoTiltLinkH,NuovoZeroTLH,yesTLH,rTLH,date,time,catena,conn,FileName); +else + % Lettura dati da DB + [Batteria,DatiTunnelLink,ErrTunnelLink,datainiTuL,... + DatiRadialLink,ErrRadialLink,datainiRL,DatiTiltLinkH,ErrTiltLinkH,datainiTLH,... + DatiTiltLinkHRH,ErrTiltLinkHRH,datainiTLHRH,DatiPreConvLink,ErrPreConvLink,datainiPCL,... + DatiPreConvLinkHR,ErrPreConvLinkHR,datainiPCLHR,DatiPressureLink,ErrPressureLink,... + DatiLoadLink,ErrLoadLink,DatiExtensometerLink,DatiExtensometerLink_Rif,... + DatiNTCExtensometerLink,ErrExtensometerLink,Dati3DExtensometerLink,ChEL,EL_NTC,... + Dati3DExtensometerLink_Rif,DatiNTC3DExtensometerLink,Err3DExtensometerLink,ErrNTC3DExtensometerLink,Ch3DEL,EL3D_NTC,... + DatiWireExtensometerLink,DatiNTCWireExtensometerLink,ErrWireExtensometerLink,ChWEL,WEL_NTC,... + DatiMultiPointExtensometer,DatiNTCMultiPointExtensometer,ErrMultiPointExtensometer,ErrNTCMultiPointExtensometer,~,~,... + DatiAnalogLink,ErrAnalogLink,datainiAL,~,~,... + DatiCrackLink,DatiNTCCrackLink,ErrCrackLink,ChCrL,CrL_NTC,... + Dati3DCrackLink,DatiNTC3DCrackLink,Err3DCrackLink,ErrNTC3DCrackLink,Ch3DCrL,CrL3D_NTC,... + Dati2DCrackLink,DatiNTC2DCrackLink,Err2DCrackLink,ErrNTC2DCrackLink,Ch2DCrL,CrL2D_NTC,... + DatiStressMeter,DatiStressMeter_Rif,DatiNTCStressMeter,DatiNTCStressMeter_Rif,ErrStressMeter,ChSM,SM_NTC,... + yesTuL,yesRL,yesTLH,yesTLHRH,yesPCL,yesPCLHR,yesPL,yesLL,yesEL,yes3DEL,... + yesWEL,yesMPBEL,yesAL,yesCrL,yes3DCrL,yes2DCrL,yesSM] = ... + lettura_Dati(IDcentralina,DTcatena,datainiTuL,tempoiniTuL,NodoTunnelLink,NuovoZeroTuL,date_AC,time_AC,Nodo_AC,... + datainiRL,tempoiniRL,NodoRadialLink,NuovoZeroRL,datainiTLH,tempoiniTLH,NodoTiltLinkH,NuovoZeroTLH,... + datainiTLHRH,tempoiniTLHRH,NodoTiltLinkHRH,NuovoZeroTLHRH,datainiPCL,tempoiniPCL,NodoPreConvLink,NuovoZeroPCL,... + datainiPCLHR,tempoiniPCLHR,NodoPreConvLinkHR,NuovoZeroPCLHR,datainiPL,tempoiniPL,NodoPressureLink,NuovoZeroPrL,... + datainiLL,tempoiniLL,NodoLoadLink,NuovoZeroLL,datainiEL,tempoiniEL,Date_Rif_EL,NodoExtensometerLink,NuovoZeroEL,... + dataini3DEL,tempoini3DEL,Date_Rif_3DEL,Nodo3DExtensometerLink,NuovoZero3DEL,... + datainiWEL,tempoiniWEL,NodoWireExtensometerLink,NuovoZeroWEL,... + datainiMPBEL,tempoiniMPBEL,NodoMultiPointRodExtensometer,NuovoZeroMPBEL,... + datainiAL,tempoiniAL,NodoAnalogLink,NumBasi,NuovoZeroAL,... + datainiCrL,tempoiniCrL,NodoCrackLink,NuovoZeroCrL,dataini3DCrL,tempoini3DCrL,Nodo3DCrackLink,NuovoZero3DCrL,... + dataini2DCrL,tempoini2DCrL,Nodo2DCrackLink,NuovoZero2DCrL,... + datainiSM,tempoiniSM,Date_Rif_SM,NodoStressMeter,NuovoZeroSM,yesTuL,yesRL,yesTLH,... + yesTLHRH,yesPCL,yesPCLHR,yesPL,yesLL,yesEL,yes3DEL,yesWEL,yesMPBEL,yesAL,yesCrL,... + yes3DCrL,yes2DCrL,yesSM,rTuL,rRL,rTLH,rTLHRH,rPCL,rPCLHR,rPrL,... + rLL,rEL,r3DEL,rWEL,rMPBEL,rAL,rCrL,r3DCrL,r2DCrL,rSM,conn,catena,date,time,FileName); +end + +% Centralina +[DATA,Tcentralina] = centralina(IDcentralina,DTcatena,catena,datainiTuL,tempoiniTuL,... + datainiRL,tempoiniRL,datainiTLH,tempoiniTLH,datainiTLHRH,tempoiniTLHRH,... + datainiPCL,tempoiniPCL,datainiPCLHR,tempoiniPCLHR,datainiLL,tempoiniLL,datainiPrL,... + tempoiniPrL,datainiEL,tempoiniEL,dataini3DEL,tempoini3DEL,datainiWEL,tempoiniWEL,... + datainiCrL,tempoiniCrL,dataini3DCrL,tempoini3DCrL,datainiMPBEL,tempoiniMPBEL,conn); + +DataLogger = [DATA cell2mat(Batteria(:,3)) cell2mat(Tcentralina(:,3))]; +xlswrite('Dati.xlsx',DataLogger,1); + +%% Parte di definizione dati, conversione in unità fisiche e calcolo medie + +% --- Tunnel Link --- +if yesTuL == 1 % attiva l'elaborazione dei Tunnel Link + % definizione dei dati + [TimeTuL,accTuL,magTuL,tempTuL,ay_TuL,ay_TuL_AC,ErrTunnelLink] = defDatiTuL_Dati(... + DatiTunnelLink,ay_TuL,ay_TuL_AC,Ndatidespike,rTuL,NuovoZeroTuL,ErrTunnelLink,... + MEMS,FileName); + % Conversione dei dati grezzi + [accTuL,ris_acc_TuL,magTuL,ris_mag_TuL,T_TuL,ay_TuL,ay_TuL_AC] = conv_grezziTuL(... + rTuL,accTuL,magTuL,tempTuL,DCalTuLTot,ay_TuL,t_TuL,ay_TuL_AC,t_TuL_AC,... + NuovoZeroTuL,MEMS,FileName); + xlswrite('Dati.xlsx',accTuL,4); + xlswrite('Dati.xlsx',magTuL,5); + xlswrite('Dati.xlsx',ris_acc_TuL,6); + xlswrite('Dati.xlsx',ris_mag_TuL,7); + xlswrite('Dati.xlsx',T_TuL,8); + % media mobile dei dati + [ARRAYdate_TuL,accTuL,ACCdefRis_TuL,TempDef_TuL,ay_TuL,ay_TuL_AC] = ... + MediaDati_TuL(accTuL,TimeTuL,ris_acc_TuL,ay_TuL,ay_TuL_AC,NdatiMedia,... + T_TuL,NuovoZeroTuL,FileName); +else + ARRAYdate_TuL = []; + text = 'There are not data to convert for Tunnel Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text +end +% Pulisco le variabili non più utilizzate +clear DatiTunnelLink +clear tempTuL +clear DCalTuLTot +clear t_TuL +clear t_TuL_AC +clear ris_acc_TuL +clear T_TuL +clear TimeTuL + +% --- Radial Link --- +if yesRL == 1 % attiva l'elaborazione dei Radial Link + % definizione dei dati + [TimeRL,accRL,tempRL,ErrRadialLink] = defDatiRL(DatiRadialLink,... + ErrRadialLink,Ndatidespike,rRL,MEMS,FileName); + xlswrite('Dati.xlsx',accRL,2); + xlswrite('Dati.xlsx',magRL,3); + % Conversione dei dati grezzi + [accRL,ris_acc_RL,T_RL] = conv_grezziRL(rRL,accRL,tempRL,DCalRLTot,MEMS,FileName); + xlswrite('Dati.xlsx',accRL,4); + xlswrite('Dati.xlsx',magRL,5); + xlswrite('Dati.xlsx',ris_acc_RL,6); + xlswrite('Dati.xlsx',ris_mag_RL,7); + xlswrite('Dati.xlsx',T_RL,8); + % media mobile dei dati + [ARRAYdate_RL,accRL,ACCdefRis_RL,TempDef_RL] = MediaDati_RL(accRL,... + TimeRL,ris_acc_RL,NdatiMedia,T_RL,FileName); +else + text = 'There are not data to convert for Radial Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + ARRAYdate_RL = []; + clear text +end +% Pulisco le variabili non più utilizzate +clear DatiRadialLink +clear tempRL +clear DCalRLTot +clear ris_acc_RL +clear T_RL +clear TimeRL + +% --- Tilt Link H --- +if yesTLH == 1 % attiva l'elaborazione dei Tilt Link H + % definizione dei dati + [TimeTLH,accTLH,tempTLH,ErrTiltLinkH] = defDatiTLH(... + DatiTiltLinkH,ErrTiltLinkH,Ndatidespike,rTLH,MEMS,FileName); + xlswrite('Dati.xlsx',accTLH,2); + xlswrite('Dati.xlsx',magTLH,3); + % conversione dei dati grezzi + [accTLH,ris_acc_TLH,tempTLH,ErrTiltLinkH] = conv_grezziTLH(rTLH,... + accTLH,tempTLH,DCalTLHTot,ErrTiltLinkH,MEMS,FileName); + xlswrite('Dati.xlsx',accTLH,4); + xlswrite('Dati.xlsx',magTLH,5); + xlswrite('Dati.xlsx',ris_acc_TLH,6); + xlswrite('Dati.xlsx',ris_mag_TLH,7); + xlswrite('Dati.xlsx',T_TLH,8); + % media mobile dei dati + [ARRAYdate_TLH,accTLH,ACCdefRis_TLH,TempDef_TLH] = MediaDati_TLH(... + accTLH,TimeTLH,ris_acc_TLH,NdatiMedia,tempTLH,FileName); +else + text = 'There are not data to convert for Tilt Link H'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + ARRAYdate_TLH = []; + clear text +end +% Pulisco le variabili non più utilizzate +clear DatiTiltLinkH +clear tempTLH +clear DCalTLHTot +clear ris_acc_TLH +clear T_TLH +clear TimeTLH + +% --- Tilt Link HR H --- +if yesTLHRH == 1 % attiva l'elaborazione dei Tilt Link HR H + % definizione dei dati + [TimeTLHRH,angTLHRH,tempTLHRH,ErrTiltLinkHRH] = defDatiTLHRH(... + DatiTiltLinkHRH,ErrTiltLinkHRH,Ndatidespike,NodoTiltLinkHRH,rTLHRH,... + IDcentralina,DTcatena,FileName); + % conversione dei dati grezzi + [angTLHRH,tempTLHRH] = conv_grezziTLHRH(angTLHRH,tempTLHRH,DCalTLHRHTot,... + rTLHRH,FileName); + % media mobile dei dati + [ARRAYdate_TLHRH,AngDef_TLHRH,TempDef_TLHRH] = MediaDati_TLHRH(angTLHRH,... + TimeTLHRH,NdatiMedia,tempTLHRH,FileName); +else + text = 'There are not data to convert for Tilt Link HR H'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + ARRAYdate_TLHRH = []; + clear text +end +% Pulisco le variabili non più utilizzate +clear DatiTiltLinkHRH +clear tempTLHRH +clear DCalTLHRHTot +clear ang_TLHRH +clear TimeTLHRH + +% --- PreConv Link --- +if yesPCL == 1 % attiva l'elaborazione dei PreConv Link + % definizione dei dati + [TimePCL,accPCL,tempPCL,ErrPreConvLink] = defDatiPCL(DatiPreConvLink,... + ErrPreConvLink,Ndatidespike,rPCL,MEMS,FileName); + xlswrite('Dati.xlsx',accPCL,2); + xlswrite('Dati.xlsx',magPCL,3); + % conversione dei dati grezzi + [accPCL,ris_acc_PCL,T_PCL] = conv_grezziPCL(rPCL,accPCL,tempPCL,DCalPCLTot,... + MEMS,FileName); + xlswrite('Dati.xlsx',accPCL,4); + xlswrite('Dati.xlsx',magPCL,5); + xlswrite('Dati.xlsx',ris_acc_PCL,6); + xlswrite('Dati.xlsx',ris_mag_PCL,7); + xlswrite('Dati.xlsx',T_PCL,8); + % media mobile dei dati + [ARRAYdate_PCL,accPCL,ACCdefRis_PCL,TempDef_PCL] = MediaDati_PCL(... + accPCL,TimePCL,ris_acc_PCL,NdatiMedia,T_PCL,FileName); +else + text = 'There are not data to convert for PreConv Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + ARRAYdate_PCL = []; + clear text +end +% Pulisco le variabili non più utilizzate +clear DatiPreConvLink +clear tempPCL +clear TimePCL +clear DCalPCLTot +clear ris_acc_PCL +clear T_PCL + +% --- PreConv Link HR --- +if yesPCLHR == 1 % attiva l'elaborazione dei PreConv Link HR + % definizione dei dati + [TimePCLHR,angPCLHR,tempPCLHR,ErrPreConvLinkHR] = defDatiPCLHR(... + DatiPreConvLinkHR,ErrPreConvLinkHR,NodoPreConvLinkHR,Ndatidespike,rPCLHR,... + IDcentralina,DTcatena,FileName); + % conversione dei dati grezzi + [angPCLHR,tempPCLHR] = conv_grezziPCLHR(angPCLHR,tempPCLHR,DCalPCLHRTot,... + rPCLHR,FileName); + % media mobile dei dati + [ARRAYdate_PCLHR,AngDef_PCLHR,TempDef_PCLHR] = MediaDati_PCLHR(... + angPCLHR,TimePCLHR,NdatiMedia,tempPCLHR,FileName); +else + text = 'There are not data to convert for PreConv Link HR'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + ARRAYdate_PCLHR = []; + clear text +end +% Pulisco le variabili non più utilizzate +clear DatiPreConvLinkHR +clear angPCLHR +clear tempPCLHR +clear DCalPCLHRTot +clear T_PCLHR +clear TimePCLHR + +% --- Pressure Link --- +if yesPL == 1 % arriva l'elaborazione dei Pressure Link + % definizione dei dati + [TimePL,Pressure,ErrPressureLink] = defDatiPL(DatiPressureLink,... + ErrPressureLink,Ndatidespike,rPrL,FileName); + % conversione dei dati grezzi + DatiPressure = conv_grezziPL(Pressure,DCalPLTot,NodoPressureLink,FileName); + % media mobile dei dati + [ARRAYdate_PL,DatiPressure] = MediaDati_PL(DatiPressure,TimePL,NdatiMedia,FileName); +else + ARRAYdate_PL = []; + DatiPressure = []; + text = 'There are not data to convert for Pressure Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text +end +% Pulisco le variabili non più utilizzate +clear DatiPressureLink +clear TimePL +clear Pressure +clear DCalPLTot + +% --- Load Link --- +if yesLL == 1 % attiva l'elaborazione dei Load Link + % definizione dei dati + [TimeLL,Load,ErrLoadLink] = defDatiLL(DatiLoadLink,ErrLoadLink,... + Ndatidespike,rLL,FileName); + % Conversione dei dati grezzi + DatiLoad = conv_grezziLL(Load,DCalLLTot,NodoLoadLink,FileName); + % media mobile dei dati + [ARRAYdate_LL,DatiLoad] = MediaDati_LL(DatiLoad,TimeLL,NdatiMedia,FileName); +else + ARRAYdate_LL = []; + DatiLoad = []; + text = 'There are not data to convert for Load Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text +end +% Pulisco le variabili non più utilizzate +clear DatiLoadLink +clear TimeLL +clear Load +clear DCalLLTot + +% --- Extensometer Link --- +if yesEL == 1 + % definizione dei dati + [TimeEL,Extensometer,NTCExtensometer,ErrExtensometerLink]... + = defDatiEL(DatiExtensometerLink,DatiNTCExtensometerLink,ErrExtensometerLink,... + ChEL,EL_NTC,rEL,Ndatidespike,FileName); + % Conversione dei dati grezzi + [DatiExtensometer,DatiExtensometer_Rif,DatiNTCExtensometer,ErrExtensometerLink]... + = conv_grezziEL(Extensometer,NTCExtensometer,DatiExtensometerLink_Rif,DCalELTot,EL_NTC,... + NodoExtensometerLink,ErrExtensometerLink,FileName); + % media mobile dei dati + [ARRAYdate_EL,DatiExtensometer] = MediaDati_EL(DatiExtensometer,TimeEL,NdatiMedia,FileName); + % Sottraggo la misura di riferimento + DatiExtensometer = DatiExtensometer - DatiExtensometer_Rif(1,:); +else + ARRAYdate_EL = []; + DatiExtensometer = []; + DatiNTCExtensometer = []; + text = 'There are not data to convert for Extensometer Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text +end +% Pulisco le variabili non più utilizzate +clear DatiExtensometerLink +clear DatiNTCExtensometerLink +clear DatiExtensometerLink_Rif +clear TimeEL +clear Extensometer +clear NTCExtensometer +clear DCalELTot +clear DatiExtensometer_Rif + +% --- 3D Extensometer Link --- +if yes3DEL == 1 + % definizione dei dati + [Time3DEL,Extensometer3D,Extensometer3D_Rif,NTCExtensometer3D,... + Err3DExtensometerLink,ErrNTC3DExtensometerLink] = ... + defDati3DEL(Dati3DExtensometerLink,Dati3DExtensometerLink_Rif,... + DatiNTC3DExtensometerLink,Err3DExtensometerLink,ErrNTC3DExtensometerLink,... + Nodo3DExtensometerLink,r3DEL,Ch3DEL,EL3D_NTC,Ndatidespike,FileName); + % Conversione dei dati grezzi + [DatiExtensometer3D,DatiExtensometer3D_Rif,DatiNTCExtensometer3D,... + Err3DExtensometerLink] = conv_grezzi3DEL(Extensometer3D,NTCExtensometer3D,... + Extensometer3D_Rif,DCalEL3DTot,Nodo3DExtensometerLink,Err3DExtensometerLink,... + r3DEL,EL3D_NTC,FileName); + % media mobile dei dati + [ARRAYdate_3DEL,DatiExtensometer3D] = MediaDati_3DEL(DatiExtensometer3D,Time3DEL,... + NdatiMedia,FileName); + % Sottraggo la misura di riferimento + DatiExtensometer3D = DatiExtensometer3D - DatiExtensometer3D_Rif(1,:); +else + ARRAYdate_3DEL = []; + DatiExtensometer3D = []; + DatiNTCExtensometer3D = []; + text = 'There are not data to convert for 3D Extensometer Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text +end +% Pulisco le variabili non più utilizzate +clear Dati3DExtensometerLink +clear DatiNTC3DExtensometerLink +clear Dati3DExtensometerLink_Rif +clear Time3DEL +clear Extensometer3D +clear NTCExtensometer3D +clear DCal3DELTot +clear DatiExtensometer3D_Rif + +% --- Wire Extensometer Link --- +if yesWEL == 1 + % definizione dei dati + [TimeWEL,WireExtensometer,NTCWireExtensometer,ErrWireExtensometerLink]... + = defDatiWEL(DatiWireExtensometerLink,DatiNTCWireExtensometerLink,... + ErrWireExtensometerLink,ChWEL,WEL_NTC,rWEL,Ndatidespike,FileName); + % Conversione dei dati grezzi + [DatiWireExtensometer,DatiNTCWireExtensometer,ErrWireExtensometerLink] = conv_grezziWEL(... + WireExtensometer,NTCWireExtensometer,DCalWELTot,NodoWireExtensometerLink,... + ErrWireExtensometerLink,WEL_NTC,rWEL,Tmax,Tmin,FileName); + % media mobile dei dati + [ARRAYdate_WEL,DatiWireExtensometer] = MediaDati_WEL(DatiWireExtensometer,... + TimeWEL,NdatiMedia,FileName); +else + ARRAYdate_WEL = []; + DatiWireExtensometer = []; + DatiNTCWireExtensometer = []; + text = 'There are not data to convert for Wire Extensometer Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text +end +% Pulisco le variabili non più utilizzate +clear DatiWireExtensometerLink +clear DatiNTCWireExtensometerLink +clear TimeWEL +clear WireExtensometer +clear NTCWireExtensometer +clear DCalWELTot + +% --- MultiPoint Rod Extensometer --- +if yesMPBEL == 1 + % definizione dei dati + [TimeMPBEL,DatiMPBEL,~,ErrMultiPointExtensometer] = ... + defDatiMPBEL(DatiMultiPointExtensometer,DatiNTCMultiPointExtensometer,... + ErrMultiPointExtensometer,FileName); + % Conversione dei dati grezzi + DatiMultiBase = conv_grezziMPBEL(DatiMPBEL,NumBasi,DCalMPBELTot,FileName); + % media mobile dei dati + [ARRAYdate_MPBEL,DatiMultiBase] = MediaDati_MPBEL(DatiMultiBase,TimeMPBEL,NdatiMedia,FileName); +else + ARRAYdate_MPBEL = []; + DatiMultiBase = []; + text = 'There are not data to convert for MultiPoint Borehole Rod Extensometer'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text +end +% Pulisco le variabili non più utilizzate +clear DatiMultiPointExtensometer +clear DatiNTCMultiPointExtensometer +clear TimeMPBEL +clear DCalMPBELTot + +% --- Analog Link --- +if yesAL == 1 + % definizione dei dati + [TimeAL,ADCAnalog,ErrAnalogLink] = defDatiAL(DatiAnalogLink,ErrAnalogLink,FileName); + % Conversione dei dati grezzi + DatiAnalog = conv_grezziAL(ADCAnalog,DCalALTot,NodoAnalogLink,FileName); + % media mobile dei dati + [ARRAYdate_AL,DatiAnalog] = MediaDati_AL(DatiAnalog,TimeAL,NdatiMedia,FileName); +else + ARRAYdate_AL = []; + DatiAnalog = []; + text = 'There are not data to convert for Analog Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text +end +% Pulisco le variabili non più utilizzate +clear DatiAnalogLink +clear ADCAnalog +clear TimeAL +clear DCalALTot + +% --- Crack Link --- +if yesCrL == 1 + % definizione dei dati + [TimeCrL,Crack,NTCCrack,ErrCrackLink] = defDatiCrL(DatiCrackLink,... + DatiNTCCrackLink,ErrCrackLink,ChCrL,CrL_NTC,rCrL,Ndatidespike,FileName); + % Conversione dei dati grezzi + [DatiCrack,DatiNTCCrack,ErrCrackLink] = conv_grezziCrL(Crack,NTCCrack,DCalCrLTot,... + NodoCrackLink,ErrCrackLink,CrL_NTC,rCrL,NuovoZeroCrL,IDcentralina,DTcatena,FileName); + % media mobile dei dati + [ARRAYdate_CrL,DatiCrack] = MediaDati_CrL(DatiCrack,TimeCrL,NdatiMedia,FileName); +else + ARRAYdate_CrL = []; + DatiCrack = []; + DatiNTCCrack = []; + text = 'There are not data to convert for Crack Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text +end +% Pulisco le variabili non più utilizzate +clear DatiCrackLink +clear TimeCrL +clear Crack +clear NTCCrack +clear DCalCrLTot + +% --- 2D Crack Link --- +if yes2DCrL == 1 + % definizione dei dati + [Time2DCrL,Crack2D,NTCCrack2D,Err2DCrackLink,ErrNTC2DCrackLink] = ... + defDati2DCrL(Dati2DCrackLink,DatiNTC2DCrackLink,Err2DCrackLink,ErrNTC2DCrackLink,... + r2DCrL,Nodo2DCrackLink,Ch2DCrL,CrL2D_NTC,Ndatidespike,FileName); + % Conversione dei dati grezzi + [Dati2DCrack,DatiNTCCrack2D,Err2DCrackLink] = conv_grezzi2DCrL(... + Crack2D,NTCCrack2D,DCal2DCrLTot,Nodo2DCrackLink,Err2DCrackLink,CrL2D_NTC,... + r2DCrL,NuovoZero2DCrL,IDcentralina,DTcatena,FileName); + % media mobile dei dati + [ARRAYdate_2DCrL,Dati2DCrack] = MediaDati_2DCrL(Dati2DCrack,Time2DCrL,NdatiMedia,FileName); +else + ARRAYdate_2DCrL = []; + Dati2DCrack = []; + DatiNTCCrack2D = []; + text = 'There are not data to convert for 2D Crack Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text +end +clear Dati2DCrackLink +clear Time2DCrL +clear Crack2D +clear DCal2DCrLTot +clear DatiNTC2DCrackLink + +% --- 3D Crack Link --- +if yes3DCrL == 1 + % definizione dei dati + [Time3DCrL,Crack3D,NTCCrack3D,Err3DCrackLink,ErrNTC3DCrackLink] = ... + defDati3DCrL(Dati3DCrackLink,DatiNTC3DCrackLink,Err3DCrackLink,ErrNTC3DCrackLink,... + r3DCrL,Nodo3DCrackLink,Ch3DCrL,CrL3D_NTC,Ndatidespike,FileName); + % Conversione dei dati grezzi + [Dati3DCrack,DatiNTCCrack3D,Err3DCrackLink] = conv_grezzi3DCrL(... + Crack3D,NTCCrack3D,DCal3DCrLTot,Nodo3DCrackLink,Err3DCrackLink,CrL3D_NTC,... + r3DCrL,NuovoZero3DCrL,IDcentralina,DTcatena,FileName); + % media mobile dei dati + [ARRAYdate_3DCrL,Dati3DCrack] = MediaDati_3DCrL(Dati3DCrack,Time3DCrL,NdatiMedia,FileName); +else + ARRAYdate_3DCrL = []; + Dati3DCrack = []; + DatiNTCCrack3D = []; + text = 'There are not data to convert for 3D Crack Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text +end +clear Dati3DCrackLink +clear Time3DCrL +clear Crack3D +clear DCal3DCrLTot +clear DatiNTC3DCrackLink + +% --- Stress Meter --- +if yesSM == 1 + % definizione dei dati + [TimeSM,Stress,NTCStress,ErrStressMeter] = defDatiSM(DatiStressMeter,... + DatiNTCStressMeter,ErrStressMeter,ChSM,SM_NTC,rSM,Ndatidespike,FileName); + % Conversione dei dati grezzi + [DatiStress,DatiNTCStress,ErrStressMeter] = conv_grezziSM(Stress,NTCStress,... + DatiStressMeter_Rif,DatiNTCStressMeter_Rif,DCalSMTot,NodoStressMeter,ErrStressMeter,... + SM_NTC,rSM,FileName); + % media mobile dei dati + [ARRAYdate_SM,DatiStress] = MediaDati_SM(DatiStress,TimeSM,NdatiMedia,FileName); +else + ARRAYdate_SM = []; + DatiStress = []; + DatiNTCStress = []; + text = 'There are not data to convert for Stress Meter'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text +end +% Pulisco le variabili non più utilizzate +clear DatiStressMeter +clear DatiNTCStressMeter +clear TimeSM +clear Stress +clear NTCStress +clear DCalSMTot + +%% Parte di Elaborazione + +% --- Analisi Tunnel Link --- +if yesTuL == 1 + margine = 1; % margine di n gg prima + [X_TuL,Xstar_TuL,Y_TuL,Z_TuL,Zstar_TuL,Xlocal_TuL,Ylocal_TuL,Zlocal_TuL,... + SegStar,HShift_local_TuL,TempDef_TuL,ARRAYdate_TuL,Area_TuL,Speed_local_TuL,... + Acceleration_local_TuL,ErrTunnelLink] = elab2D_TuL(rTuL,accTuL,ay_TuL,ay_TuL_AC,... + ACCdefRis_TuL,SpeTuL,IDcentralina,DTcatena,DatiElabTunnelLink,NuovoZeroTuL,... + TempDef_TuL,tolleranzaAcc,Ndevst,Wdevst,NdatiMedia,Ndatidespike,ARRAYdate_TuL,... + data1_AC,Nodo_AC,margine,ErrTunnelLink,Tmax,Tmin,datainiTuL,FileName); + xlswrite('Dati.xlsx',Xlocal_TuL',9); + xlswrite('Dati.xlsx',Ylocal_TuL',10); + xlswrite('Dati.xlsx',Zlocal_TuL',11); + xlswrite('Dati.xlsx',X_TuL',12); + xlswrite('Dati.xlsx',Y_TuL',13); + xlswrite('Dati.xlsx',Z_TuL',14); + xlswrite('Dati.xlsx',SegStar',15); + xlswrite('Dati.xlsx',HShift_local_TuL',16); + xlswrite('Dati.xlsx',TempDef_TuL,17); + xlswrite('Dati.xlsx',ARRAYdate_TuL,18); + xlswrite('Dati.xlsx',Area_TuL',19); + xlswrite('Dati.xlsx',Speed_local_TuL',20); + xlswrite('Dati.xlsx',Acceleration_local_TuL',21); + xlswrite('Dati.xlsx',ErrTunnelLink',22); +else + [X_TuL,Xstar_TuL,Y_TuL,Z_TuL,Zstar_TuL,Xlocal_TuL,Ylocal_TuL,Zlocal_TuL,... + SegStar,HShift_local_TuL,TempDef_TuL,Area_TuL,Speed_local_TuL,... + Acceleration_local_TuL] = matrici_vuote_TuL(FileName); +end +clear DatiElabTunnelLink +clear rTuL +clear accTuL +clear ay_TuL +clear ay_TuL_AC +clear data1_AC +clear ACCdefRis_TuL +clear SpeTuL +clear DatiElabTunnelLink +clear NuovoZeroTuL +clear Nodo_AC +clear data1_AC +% fine elaborazione Tunnel Link + +% --- Analisi Radial Link --- +if yesRL == 1 + [X_RL,Y_RL,Z_RL,Xlocal_RL,Ylocal_RL,Zlocal_RL,TempDef_RL,ARRAYdate_RL,... + ErrRadialLink] = elab2D_RL(rRL,accRL,ACCdefRis_RL,SpeRL,IDcentralina,DTcatena,... + DatiElabRadialLink,NuovoZeroRL,tolleranzaAcc,TempDef_RL,Ndevst,Wdevst,ARRAYdate_RL,... + elab_option,NdatiMedia,Ndatidespike,margine,ErrRadialLink,Tmax,Tmin,datainiRL,FileName); + xlswrite('Dati.xlsx',Xlocal_RL',9); + xlswrite('Dati.xlsx',Ylocal_RL',10); + xlswrite('Dati.xlsx',Zlocal_RL',11); + xlswrite('Dati.xlsx',X_RL',12); + xlswrite('Dati.xlsx',Y_RL',13); + xlswrite('Dati.xlsx',Z_RL',14); + xlswrite('Dati.xlsx',ARRAYdate_RL,15); + xlswrite('Dati.xlsx',ErrRadialLink',16); +else + [X_RL,Y_RL,Z_RL,Xlocal_RL,Ylocal_RL,Zlocal_RL,TempDef_RL] = matrici_vuote_RL(FileName); +end +clear DatiElabRadialLink +clear accRL +clear SpeRL +clear ACCdefRis_RL +clear NuovoZeroRL +clear rRL +% fine elaborazione Radial Link + +% --- Tilt Link H --- +if yesTLH == 1 + if strcmp(IDcentralina,'ID0142') == 1 && strcmp(DTcatena,'DT0173') + [Y_TLH,Z_TLH,Ylocal_TLH,Zlocal_TLH,AlfaX_TLH,AlfaY_TLH,TempDef_TLH,... + speed_TLH,speed_local_TLH,acceleration_TLH,acceleration_local_TLH,ARRAYdate_TLH,... + ErrTiltLinkH] = elab2D_TLH_Hybrid(IDcentralina,DTcatena,rTLH,accTLH,ACCdefRis_TLH,... + TempDef_TLH,SpeTLH,PsTLH,tolleranzaAcc,DatiElabTiltLinkH,Ndevst,Wdevst,... + ARRAYdate_TLH,NuovoZeroTLH,NdatiMedia,Ndatidespike,ErrTiltLinkH,margine,... + Tmax,Tmin,datainiTLH,FileName); + else + [Y_TLH,Z_TLH,Ylocal_TLH,Zlocal_TLH,AlfaX_TLH,AlfaY_TLH,TempDef_TLH,... + speed_TLH,speed_local_TLH,acceleration_TLH,acceleration_local_TLH,ARRAYdate_TLH,... + ErrTiltLinkH] = elab2D_TLH(IDcentralina,DTcatena,rTLH,accTLH,ACCdefRis_TLH,... + TempDef_TLH,SpeTLH,PsTLH,tolleranzaAcc,DatiElabTiltLinkH,Ndevst,Wdevst,... + ARRAYdate_TLH,NuovoZeroTLH,NdatiMedia,Ndatidespike,ErrTiltLinkH,margine,... + elab_option,Tmax,Tmin,datainiTLH,FileName); + end +else + [Y_TLH,Z_TLH,Ylocal_TLH,Zlocal_TLH,AlfaX_TLH,AlfaY_TLH,TempDef_TLH,... + speed_TLH,speed_local_TLH,acceleration_TLH,acceleration_local_TLH] = matrici_vuote_TLH(FileName); +end +clear DatiElabTiltLinkH +clear accTLH +clear ACCdefRis_TLH +clear SpeTLH +clear PsTLH +clear NuovoZeroTLH +% fine elaborazione Tilt Link H + +% --- Tilt Link HR H --- +if yesTLHRH == 1 + [Y_TLHRH,Z_TLHRH,Ylocal_TLHRH,Zlocal_TLHRH,AlfaX_TLHRH,AlfaY_TLHRH,... + TempDef_TLHRH,speed_TLHRH,speed_local_TLHRH,acceleration_TLHRH,acceleration_local_TLHRH,... + ARRAYdate_TLHRH,ErrTiltLinkHRH] = elab2D_TLHRH(rTLHRH,AngDef_TLHRH,TempDef_TLHRH,... + SpeTLHRH,PsTLHRH,DatiElabTiltLinkHRH,Ndevst_HR,Wdevst_HR,ARRAYdate_TLHRH,... + NuovoZeroTLHRH,NdatiMedia,Ndatidespike,ErrTiltLinkHRH,margine,elab_option,... + Tmax,Tmin,datainiTLHRH,FileName); +else + [Y_TLHRH,Z_TLHRH,Ylocal_TLHRH,Zlocal_TLHRH,AlfaX_TLHRH,AlfaY_TLHRH,TempDef_TLHRH,... + speed_TLHRH,speed_local_TLHRH,acceleration_TLHRH,acceleration_local_TLHRH] = matrici_vuote_TLHRH(FileName); +end +clear calotta_base +clear DatiElabTiltLinkHRH +clear AngDef_TLHRH +clear SpeTLHRH +clear PsTLHRH +clear NuovoZeroTLHRH +% fine elaborazione Tilt Link HR H + +% --- PreConv Link --- +if yesPCL == 1 + [Y_PCL,Z_PCL,Ylocal_PCL,Zlocal_PCL,AlfaX_PCL,AlfaY_PCL,TempDef_PCL,... + speed_PCL,speed_local_PCL,acceleration_PCL,acceleration_local_PCL,ARRAYdate_PCL,... + ErrPreConvLink] = elab2D_PCL(IDcentralina,DTcatena,rPCL,accPCL,ACCdefRis_PCL,... + TempDef_PCL,SpePCL,tolleranzaAcc,DatiElabPreConvLink,Ndevst,Wdevst,ARRAYdate_PCL,... + NuovoZeroPCL,NdatiMedia,Ndatidespike,ErrPreConvLink,margine,elab_option,... + Tmax,Tmin,datainiPCL,FileName); +else + [Y_PCL,Z_PCL,Ylocal_PCL,Zlocal_PCL,AlfaX_PCL,AlfaY_PCL,TempDef_PCL,... + speed_PCL,speed_local_PCL,acceleration_PCL,acceleration_local_PCL] = matrici_vuote_PCL(FileName); +end +clear DatiElabPreConvLink +clear accPCL +clear ACCdefRis_PCL +clear SpePCL +clear tolleranzaAcc +clear DatiElabPreConvLink +clear NuovoZeroPCL +clear rPCL +clear Ndevst +clear Wdevst +% fine elaborazione PreConv Link + +% --- PreConv Link HR --- +if yesPCLHR == 1 + [Y_PCLHR,Z_PCLHR,Ylocal_PCLHR,Zlocal_PCLHR,AlfaX_PCLHR,AlfaY_PCLHR,TempDef_PCLHR,... + speed_PCLHR,speed_local_PCLHR,acceleration_PCLHR,acceleration_local_PCLHR,ARRAYdate_PCLHR,... + ErrPreConvLinkHR] = elab2D_PCLHR(IDcentralina,DTcatena,rPCLHR,AngDef_PCLHR,... + TempDef_PCLHR,SpePCLHR,DatiElabPreConvLinkHR,Ndevst_HR,Wdevst_HR,ARRAYdate_PCLHR,... + NuovoZeroPCLHR,NdatiMedia,Ndatidespike,ErrPreConvLinkHR,margine,elab_option,Tmax,Tmin,... + datainiPCLHR,FileName); +else + [Y_PCLHR,Z_PCLHR,Ylocal_PCLHR,Zlocal_PCLHR,AlfaX_PCLHR,AlfaY_PCLHR,TempDef_PCLHR,... + speed_PCLHR,speed_local_PCLHR,acceleration_PCLHR,acceleration_local_PCLHR] = matrici_vuote_PCLHR(FileName); +end +clear DatiElabPreConvLinkHR +clear rPCLHR +clear AngDef_PCLHR +clear SpePCLHR +clear elab_option +clear Ndevst_HR +clear Wdevst_HR +clear NuovoZeroPCLHR +clear NdatiMedia +clear Ndatidespike +clear tolleranzaT +clear margine +clear elab_option + +% --- 3D Extensometer Link --- +% Correzione 3D Extensometer Link +if yes3DEL == 1 + [r,~] = size(Err3DExtensometerLink); + Matrice_err = zeros(r,r3DEL); + for i = 1:r % date + d = 1; + for n = 1:r3DEL % nodi + j = 1; + err = Err3DExtensometerLink(i,d:d+2); + while j <= 3 + if err(1,j) == 1 + Matrice_err(i,n) = 1; + end + j = j+1; + end + d = d+3; + end + end + Err3DExtensometerLink = Matrice_err; + Join = find(ErrNTC3DExtensometerLink); + [rJ,cJ] = size(Join); + for ii = 1:rJ + for jj = 1:cJ + if Err3DExtensometerLink(Join(ii,jj)) == 0 + Err3DExtensometerLink(Join(ii,jj)) = 0.5; + end + end + end +end +clear ErrNTC3DExtensometerLink + +% --- Crack Link --- +if yesCrL == 1 + NomeFile = ['' IDcentralina '-' DTcatena '-RifCrL.csv']; + if NuovoZeroCrL == 0 % prima elaborazione + csvwrite(NomeFile,DatiCrack(1,:)); + DatiCrack = DatiCrack - DatiCrack(1,:); + else % Ci sono già dei dati elaborati + RIF = csvread(NomeFile); + DatiCrack = DatiCrack - RIF; + end +end + +% --- 3D Crack Link --- +if yes3DCrL == 1 + [r,~] = size(Err3DCrackLink); + Matrice_err = zeros(r,r3DCrL); + for i = 1:r % date + d = 1; + for n = 1:r3DCrL % nodi + j = 1; + err = Err3DCrackLink(i,d:d+2); + while j <= 3 + if err(1,j) == 1 + Matrice_err(i,n) = 1; + end + j = j+1; + end + d = d+3; + end + end + Err3DCrackLink = Matrice_err; + Join = find(ErrNTC3DCrackLink); + [rJ,cJ] = size(Join); + for ii = 1:rJ + for jj = 1:cJ + if Err3DCrackLink(Join(ii,jj)) == 0 + Err3DCrackLink(Join(ii,jj)) = 0.5; + end + end + end +end +clear ErrNTC3DCrackLink + +% --- 2D Crack Link --- +if yes2DCrL == 1 + [r,~] = size(Err2DCrackLink); + Matrice_err = zeros(r,r2DCrL); + for i = 1:r % date + d = 1; + for n = 1:r2DCrL % nodi + j = 1; + err = Err2DCrackLink(i,d:d+1); + while j <= 2 + if err(1,j) == 1 + Matrice_err(i,n) = 1; + end + j = j+1; + end + d = d+2; + end + end + Err2DCrackLink = Matrice_err; + Join = find(ErrNTC2DCrackLink); + [rJ,cJ] = size(Join); + for ii = 1:rJ + for jj = 1:cJ + if Err2DCrackLink(Join(ii,jj)) == 0 + Err2DCrackLink(Join(ii,jj)) = 0.5; + end + end + end +end +clear ErrNTC2DCrackLink + +% --- MultiPoint Borehole Extensometer Link --- +% Correzione MultiPoint Extensometer +if yesMPBEL == 1 + [r,~] = size(ErrMultiPointExtensometer); + Matrice_err = zeros(r,rMPBEL); + for i = 1:r % date + d = 1; + for n = 1:rMPBEL % nodi + j = 1; + err = ErrMultiPointExtensometer(i,d:d+NumBasi-1); + while j <= NumBasi + if err(1,j) == 1 + Matrice_err(i,n) = 1; + end + j = j+1; + end + d = d+NumBasi; + end + end + ErrMultiPointExtensometer = Matrice_err; + Join = find(ErrNTCMultiPointExtensometer); + [rJ,cJ] = size(Join); + for ii = 1:rJ + for jj = 1:cJ + if ErrMultiPointExtensometer(Join(ii,jj)) == 0 + ErrMultiPointExtensometer(Join(ii,jj)) = 0.5; + end + end + end +end +clear ErrNTCMultiPointExtensometer + +toc +text = ['ATD calculation ended in ' num2str(toc) ' seconds.']; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +RC = 0; + +end + \ No newline at end of file diff --git a/ATD/CANCELLA.m b/ATD/CANCELLA.m new file mode 100755 index 0000000..b030ce5 --- /dev/null +++ b/ATD/CANCELLA.m @@ -0,0 +1,109 @@ +DTcatena = input('Digitare il nome della catena: ','s'); + +dbname = 'ase_lar'; +username = 'matlab'; +password = 'Ase@2014'; +driver = 'com.mysql.jdbc.Driver'; +dburl = ['jdbc:mysql://160.78.21.55:3306/' dbname]; +tablename = 'ELABDATADISP'; +colnames = {'ToolNameID','NodeNum','EventDate','EventTime','XShift','YShift'}; +% javaclasspath('C:\Program Files\MATLAB\R2008a\java\mysql-connector-java-3.1.14-bin.jar'); +conn = database(dbname, username, password, driver, dburl); + +comando = ['delete from ELABDATADISP where ToolNameID = ''' DTcatena '''']; +curs = exec(conn,comando); +close(conn) + +%% Da una data +dbname = 'ase_lar'; +username = 'matlab'; +password = 'Ase@2014'; +driver = 'com.mysql.jdbc.Driver'; +dburl = ['jdbc:mysql://160.78.30.106:3306/' dbname]; + +conn = database(dbname, username, password, driver, dburl); + +IDcentralina = 'ID0079'; +DTcatena = 'DT0120'; +date = '2021-10-07'; +comando = ['delete from ELABDATADISP where UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and EventDate >= ''' date ''' ']; + +curs = exec(conn,comando); +close(conn) +disp('Fatto') + +%% 1 +dbname = 'ase_lar'; +username = 'matlab'; +password = 'Ase@2014'; +driver = 'com.mysql.jdbc.Driver'; +dburl = ['jdbc:mysql://160.78.30.106:3306/' dbname]; + +conn = database(dbname, username, password, driver, dburl); + +IDcentralina = 'ID0063'; +DTcatena = 'DT0103'; +date = '2021-10-18'; +time = '00:00:01'; + +% comando = ['delete from ELABDATADISP where UnitName = ''' IDcentralina ... +% ''' and ToolNameID = ''' DTcatena ''' and EventDate = ''' date ''' and EventTime > ''' time ''' ']; + +comando = ['delete from ELABDATADISP where UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and EventDate >= ''' date ''' ']; + +curs = exec(conn,comando); +close(conn) + +disp('Fine!') + +%% 2 +dbname = 'ase_lar'; +username = 'matlab'; +password = 'Ase@2014'; +driver = 'com.mysql.jdbc.Driver'; +dburl = ['jdbc:mysql://160.78.30.106:3306/' dbname]; + +conn = database(dbname, username, password, driver, dburl); + +DTcatena = 'DT0046'; +IDcentralina = 'ID0150'; +comando = ['delete from ELABDATADISP where ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina ''' ']; + +curs = exec(conn,comando); +close(conn) + +disp('Fine!') + +%% 3 +dbname = 'ase_lar'; +username = 'matlab'; +password = 'Ase@2014'; +driver = 'com.mysql.jdbc.Driver'; +dburl = ['jdbc:mysql://160.78.21.55:3306/' dbname]; + +conn = database(dbname, username, password, driver, dburl); + +IDcentralina = 'ID0026'; +DTcatena = 'DT0042'; +date1 = '2019-02-20'; +date2 = '2019-05-13'; +comando = ['delete from ELABDATADISP where ToolNameID = ''' DTcatena ''' and Unitname = '''... + IDcentralina ''' and EventDate >= ''' date1 ''' and EventDate < ''' date2 ''' ']; + +curs = exec(conn,comando); +close(conn) + +disp('Fine!') + +%% 4 +INI = 1; +for i = INI:INI+6 + DatiInPlaceLink(1,i) = cellstr(num2str(DatiRaw(end,i+1))); +end + +INI = 1; +for i = INI:INI+5 + DatiInPlaceLinkHR(1,i) = cellstr(num2str(DatiRaw(end,i+1))); +end \ No newline at end of file diff --git a/ATD/CalcoloBiax_PCL.m b/ATD/CalcoloBiax_PCL.m new file mode 100755 index 0000000..859a3b7 --- /dev/null +++ b/ATD/CalcoloBiax_PCL.m @@ -0,0 +1,52 @@ +function [Y_PCL,Z_PCL,asseY_PCL,asseZ_PCL,AlfaX_PCL,AlfaY_PCL] = CalcoloBiax_PCL(SpePCL,... + ii,jj,ax,ay,asseY_PCL,asseZ_PCL,Y_PCL,Z_PCL,... + AlfaX_PCL,AlfaY_PCL,elab_option,rPCL,IDcentralina,DTcatena) + +if elab_option == 1 % Punto fisso a fondo foro + % calcolo il coseno dell'angolo di inclinazione + cosBeta = (1 - ax(ii,jj).^2).^0.5; + Yi = -1*SpePCL(ii)*cosBeta; % -1 per adattare il segno di CosBeta. le progressive sono da fare a ritroso + % Spostamento lungo l'asse Z registrato dal nodo i + Zi = SpePCL(ii)*ax(ii,jj); % -1 per adattare il segno + % Rollio + AlfaX_PCL(ii,jj) = asind(ay(ii,jj)); + % Inclinazione + AlfaY_PCL(ii,jj) = -1*asind(ax(ii,jj)); + % Matrici singoli spostamenti + asseY_PCL(ii,jj) = Yi; + asseZ_PCL(ii,jj) = Zi; + if ii==1 + Y_PCL (ii,jj) = Yi; + Z_PCL (ii,jj) = asseZ_PCL(ii,jj); + else + Y_PCL(ii,jj) = Y_PCL(ii-1,jj) + Yi; + Z_PCL(ii,jj) = Z_PCL(ii-1,jj) + asseZ_PCL(ii,jj); + end +elseif elab_option == -1 % Punto fisso nella sezione + % calcolo il coseno dell'angolo di inclinazione + cosBeta = (1 - ax(rPCL-ii+1,jj).^2).^0.5; + Yi = SpePCL(rPCL-ii+1)*cosBeta; %Le progressive sono da fare ad avanzamento + % Spostamento lungo l'asse Z registrato dal nodo i + if strcmp(IDcentralina,'ID0068') && strcmp(DTcatena,'DT0106') + Zi = SpePCL(rPCL-ii+1)*ax(rPCL-ii+1,jj); + else + Zi = -1*SpePCL(rPCL-ii+1)*ax(rPCL-ii+1,jj); + end + % Rollio + AlfaX_PCL(rPCL-ii+1,jj) = asind(ay(rPCL-ii+1,jj)); + % Inclinazione + AlfaY_PCL(rPCL-ii+1,jj) = -1*asind(ax(rPCL-ii+1,jj)); + % Matrici singoli spostamenti + asseY_PCL(rPCL-ii+1,jj) = Yi; + asseZ_PCL(rPCL-ii+1,jj) = Zi; + + if ii==1 + Y_PCL (rPCL-ii+1,jj) = Yi; + Z_PCL (rPCL-ii+1,jj) = asseZ_PCL(rPCL-ii+1,jj); + else + Y_PCL(rPCL-ii+1,jj) = Y_PCL(rPCL-ii+2,jj) + Yi; + Z_PCL(rPCL-ii+1,jj) = Z_PCL(rPCL-ii+2,jj) + asseZ_PCL(rPCL-ii+1,jj); + end +end + +end diff --git a/ATD/CalcoloBiax_PCLHR.m b/ATD/CalcoloBiax_PCLHR.m new file mode 100755 index 0000000..8dae052 --- /dev/null +++ b/ATD/CalcoloBiax_PCLHR.m @@ -0,0 +1,44 @@ +function [Y_PCLHR,Z_PCLHR,asseY_PCLHR,asseZ_PCLHR,AlfaX_PCLHR,AlfaY_PCLHR] = ... + CalcoloBiax_PCLHR(SpePCLHR,ii,jj,ax,ay,asseY_PCLHR,asseZ_PCLHR,asseY_Rif_PCLHR,... + asseZ_Rif_PCLHR,Y_PCLHR,Z_PCLHR,AlfaX_PCLHR,AlfaY_PCLHR,elab_option,rPCLHR) + +if elab_option == 1 % Punto fisso a fondo foro + % calcolo il coseno dell'angolo di inclinazione + Yi = -1*SpePCLHR(ii)*cos(ax(ii,jj)); % -1 per adattare il segno di CosBeta. le progressive sono da fare a ritroso + % Spostamento lungo l'asse Z registrato dal nodo i + Zi = -1*SpePCLHR(ii)*sin(ax(ii,jj)); % -1 per adattare il segno + % Rollio + AlfaX_PCLHR(ii,jj) = ay(ii,jj)./0.01745329251994329576923690768489; % Ritorno in gradi + % Inclinazione + AlfaY_PCLHR(ii,jj) = ax(ii,jj)./0.01745329251994329576923690768489; + % Matrici singoli spostamenti + asseY_PCLHR(ii,jj) = -asseY_Rif_PCLHR(ii,1)+Yi; + asseZ_PCLHR(ii,jj) = -asseZ_Rif_PCLHR(ii,1)+Zi; + if ii==1 + Y_PCLHR (ii,jj) = Yi; + Z_PCLHR (ii,jj) = asseZ_PCLHR(ii,jj); + else + Y_PCLHR(ii,jj) = Y_PCLHR(ii-1,jj) + Yi; + Z_PCLHR(ii,jj) = Z_PCLHR(ii-1,jj) + asseZ_PCLHR(ii,jj); + end +elseif elab_option == -1 % Punto fisso nella sezione + Yi = SpePCLHR(rPCLHR-ii+1)*cos(ax(ii,jj)); % -1 per adattare il segno di CosBeta. le progressive sono da fare a ritroso + % Spostamento lungo l'asse Z registrato dal nodo i + Zi = SpePCLHR(rPCLHR-ii+1)*sin(ax(ii,jj)); + % Rollio + AlfaX_PCLHR(ii,jj) = ay(ii,jj)./0.01745329251994329576923690768489; % Ritorno in gradi + % Inclinazione + AlfaY_PCLHR(ii,jj) = ax(ii,jj)./0.01745329251994329576923690768489; + % Matrici singoli spostamenti + asseY_PCLHR(rPCLHR-ii+1,jj) = asseY_Rif_PCLHR(rPCLHR-ii+1,1)+Yi; + asseZ_PCLHR(rPCLHR-ii+1,jj) = asseZ_Rif_PCLHR(ii,1)+Zi; + if ii==1 + Y_PCLHR (rPCLHR-ii+1,jj) = Yi; + Z_PCLHR (rPCLHR-ii+1,jj) = asseZ_PCLHR(rPCLHR-ii+1,jj); + else + Y_PCLHR(rPCLHR-ii+1,jj) = Y_PCLHR(rPCLHR-ii+2,jj) + Yi; + Z_PCLHR(rPCLHR-ii+1,jj) = Z_PCLHR(rPCLHR-ii+2,jj) + asseZ_PCLHR(rPCLHR-ii+1,jj); + end +end + +end diff --git a/ATD/CalcoloBiax_RL.m b/ATD/CalcoloBiax_RL.m new file mode 100755 index 0000000..6595849 --- /dev/null +++ b/ATD/CalcoloBiax_RL.m @@ -0,0 +1,49 @@ +function [X_RL,Y_RL,Z_RL,asseX_RL,asseY_RL,asseZ_RL] = CalcoloBiax_RL(SpeRL,... + ii,jj,ax,ay,asseX_RL,asseY_RL,asseZ_RL,X_RL,Y_RL,Z_RL,elab_option) + +%% RAD-Array parete di DESTRA +if elab_option == 1 + % Spostamento lungo l'asse X registrato dal nodo i + Xi = -1*SpeRL(ii,1) * ay(ii,jj); % -1 per adattare il verso (da destra verso sx!) + % calcolo il coseno dell'angolo di inclinazione + cosBetaX = (1 - ay(ii,jj).^2).^0.5; + % Spostamento lungo l'asse Z registrato dal nodo i + Zi = -1*SpeRL(ii)*cosBetaX; % -1 per adattare il segno di CosBeta. Az infatti sarebbe negativo + % Spostamento lungo l'asse Y registrato dal nodo i + if jj==1 + Yi = -1 * Zi * ax(ii,jj); + else + Yi = -1 * asseZ_RL(ii,jj-1) * ax(ii,jj); + end +%% RAD-Array parete di SINISTRA +elseif elab_option == -1 + % Spostamento lungo l'asse X registrato dal nodo i + Xi = SpeRL(ii,1) * ay(ii,jj); + % calcolo il coseno dell'angolo di inclinazione + cosBetaX = (1 - ay(ii,jj).^2).^0.5; + % Spostamento lungo l'asse Z registrato dal nodo i + Zi = -1*SpeRL(ii)*cosBetaX; % -1 per adattare il segno di CosBeta. Az infatti sarebbe negativo + % Spostamento lungo l'asse Y registrato dal nodo i + if jj==1 + Yi = Zi * ax(ii,jj); + else + Yi = asseZ_RL(ii,jj-1) * ax(ii,jj); + end +end + +% Matrici singoli spostamenti +asseX_RL(ii,jj) = Xi; +asseY_RL(ii,jj) = Yi; +asseZ_RL(ii,jj) = Zi; + +if ii==1 + X_RL(ii,jj) = asseX_RL(ii,jj); + Y_RL (ii,jj) = asseY_RL(ii,jj); + Z_RL (ii,jj) = asseZ_RL(ii,jj); +else + X_RL(ii,jj) = X_RL(ii-1,jj) + asseX_RL(ii,jj); % Matrici cumulate + Y_RL(ii,jj) = Y_RL(ii-1,jj) + asseY_RL(ii,jj); + Z_RL(ii,jj) = Z_RL(ii-1,jj) + asseZ_RL(ii,jj); +end + +end diff --git a/ATD/CalcoloBiax_TLH.m b/ATD/CalcoloBiax_TLH.m new file mode 100755 index 0000000..c609388 --- /dev/null +++ b/ATD/CalcoloBiax_TLH.m @@ -0,0 +1,31 @@ +function [Y_TLH,Z_TLH,asseY_TLH,asseZ_TLH,AlfaX_TLH,AlfaY_TLH] = CalcoloBiax_TLH(... + SpeTLH,PsTLH,ii,jj,ax,ay,asseY_TLH,asseZ_TLH,Y_TLH,Z_TLH,... + elab_option,AlfaX_TLH,AlfaY_TLH) + +% calcolo il coseno dell'angolo di inclinazione +cosBeta = (1 - ax(ii,jj).^2).^0.5; +Yi = -1*(SpeTLH(ii)-abs(SpeTLH(ii)*cosBeta)); +% Spostamento lungo l'asse Z registrato dal nodo i +if elab_option == -1 % Arco Rovescio + Zi = SpeTLH(ii)*ax(ii,jj); +elseif elab_option == 1 % Calotta + Zi = -1*SpeTLH(ii)*ax(ii,jj); +end + +% Rollio +AlfaX_TLH(ii,jj) = asind(ay(ii,jj)); +AlfaY_TLH(ii,jj) = asind(ax(ii,jj)); + +% Matrici singoli spostamenti +asseY_TLH(ii,jj) = Yi; +asseZ_TLH(ii,jj) = Zi; + +if ii==1 + Y_TLH (ii,jj) = PsTLH(ii,1) + asseY_TLH(ii,jj); + Z_TLH (ii,jj) = asseZ_TLH(ii,jj); +else + Y_TLH(ii,jj) = PsTLH(ii,1) + asseY_TLH(ii,jj) + Y_TLH(ii-1,jj) - PsTLH(ii-1,1); + Z_TLH(ii,jj) = Z_TLH(ii-1,jj) + asseZ_TLH(ii,jj); +end + +end diff --git a/ATD/CalcoloBiax_TLHRH.m b/ATD/CalcoloBiax_TLHRH.m new file mode 100755 index 0000000..af1db8b --- /dev/null +++ b/ATD/CalcoloBiax_TLHRH.m @@ -0,0 +1,31 @@ +function [Y_TLHRH,Z_TLHRH,asseY_TLHRH,asseZ_TLHRH,AlfaX_TLHRH,AlfaY_TLHRH] = CalcoloBiax_TLHRH(... + SpeTLHRH,PsTLHRH,ii,jj,ax,ay,asseY_TLHRH,asseZ_TLHRH,Y_TLHRH,Z_TLHRH,... + calotta_base,AlfaX_TLHRH,AlfaY_TLHRH) + +% calcolo il coseno dell'angolo di inclinazione +Yi = -1*(SpeTLHRH(ii,1) - SpeTLHRH(ii,1) * cos(ax(ii,jj))); % SP*cos(alfa) +% Spostamento lungo l'asse Z registrato dal nodo i +if calotta_base == -1 % Arco Rovescio + Zi = SpeTLHRH(ii,1) * sin(ax(ii,jj)); % SP*sin(alfa) +elseif calotta_base == 1 % Calotta + Zi = -1*SpeTLHRH(ii)*sin(ax(ii,jj)); +end + +% Rollio +AlfaX_TLHRH(ii,jj) = ay(ii,jj)/0.01745329251994329576923690768489; % Torno in gradi +% Inclinazione +AlfaY_TLHRH(ii,jj) = ax(ii,jj)/0.01745329251994329576923690768489; + +% Matrici singoli spostamenti +asseY_TLHRH(ii,jj) = Yi; +asseZ_TLHRH(ii,jj) = Zi; + +if ii==1 + Y_TLHRH (ii,jj) = PsTLHRH(ii) + asseY_TLHRH(ii,jj); + Z_TLHRH (ii,jj) = asseZ_TLHRH(ii,jj); +else + Y_TLHRH(ii,jj) = PsTLHRH(ii,1) + asseY_TLHRH(ii,jj) + Y_TLHRH(ii-1,jj) - PsTLHRH(ii-1,1); + Z_TLHRH(ii,jj) = Z_TLHRH(ii-1,jj) + asseZ_TLHRH(ii,jj); +end + +end diff --git a/ATD/CalcoloBiax_TuL.m b/ATD/CalcoloBiax_TuL.m new file mode 100755 index 0000000..764ef47 --- /dev/null +++ b/ATD/CalcoloBiax_TuL.m @@ -0,0 +1,56 @@ +function [X_TuL,Y_TuL,Z_TuL,asseX_TuL,asseY_TuL,asseZ_TuL,Xstar_TuL,Ystar_TuL,... + Zstar_TuL,asseXstar_TuL,asseYstar_TuL,asseZstar_TuL] = CalcoloBiax_TuL(SpeTuL,... + ii,jj,ax,ay,az,asseX_TuL,asseY_TuL,asseZ_TuL,X_TuL,Y_TuL,Z_TuL,... + asseXstar_TuL,asseYstar_TuL,asseZstar_TuL,Xstar_TuL,Ystar_TuL,Zstar_TuL,... + Nnodi,PosIniEnd,indiceX,indiceZ,rTuL,FileName) + +%% Calcolo Orario +% Spostamento lungo l'asse X registrato dal nodo i; uso -1 per adattarlo al sistema di riferimento scelto +Xi = SpeTuL(ii,1) * ay(ii,jj); % ay rappresenta il seno dell'angolo % giusto +Zi = -1 * SpeTuL(ii,1) *(ax(ii,jj)); % ax rappresenta il seno dell'angolo di quell'asse rispetto all'orizzontale +if jj==1 + Yi = -1 * Zi * az(ii,jj); +else + Yi = -1 * asseZ_TuL(ii,jj-1) * az(ii,jj); +end + +%% Calcolo antiorario (a partire dall'ultimo nodo!) +XiStar = -1*SpeTuL(Nnodi+1-ii,1) * ay(Nnodi+1-ii,jj); +% XiStar = SpeTuL(Nnodi+1-ii,1) * ay(Nnodi+1-ii,jj); % da canc +ZiStar = SpeTuL(Nnodi+1-ii,1) * ax(Nnodi+1-ii,jj); +% ZiStar = -1*SpeTuL(Nnodi+1-ii,1) * ax(Nnodi+1-ii,jj); % da canc +if jj==1 + YiStar = ZiStar * az(Nnodi+1-ii,jj); +else + YiStar = asseZstar_TuL(ii,jj-1) * az(Nnodi+1-ii,jj); +end + +%% Correzione per nodi con segno sbagliato (montati male) +[Xi,Zi,Yi,XiStar,ZiStar,YiStar] = corrTuL(indiceX,indiceZ,Xi,Zi,Yi,... + XiStar,ZiStar,YiStar,ii,rTuL,FileName); + +% Matrici singoli spostamenti +asseX_TuL(ii,jj) = Xi; +asseY_TuL(ii,jj) = Yi; +asseZ_TuL(ii,jj) = Zi; +asseXstar_TuL(ii,jj) = XiStar; +asseYstar_TuL(ii,jj) = YiStar; +asseZstar_TuL(ii,jj) = ZiStar; + +if ii==1 + X_TuL(ii,jj) = asseX_TuL(ii,jj) + PosIniEnd(1,1); + Y_TuL(ii,jj) = asseY_TuL(ii,jj) + PosIniEnd(1,2); + Z_TuL(ii,jj) = asseZ_TuL(ii,jj) + PosIniEnd(1,3); + Xstar_TuL(ii,jj) = PosIniEnd(2,1) + asseXstar_TuL(ii,jj); + Ystar_TuL(ii,jj) = PosIniEnd(2,2) + asseYstar_TuL(ii,jj); + Zstar_TuL(ii,jj) = PosIniEnd(2,3) + asseZstar_TuL(ii,jj); +else + X_TuL(ii,jj) = X_TuL(ii-1,jj) + asseX_TuL(ii,jj); % Matrici cumulate + Y_TuL(ii,jj) = Y_TuL(ii-1,jj) + asseY_TuL(ii,jj); + Z_TuL(ii,jj) = Z_TuL(ii-1,jj) + asseZ_TuL(ii,jj); + Xstar_TuL(ii,jj) = Xstar_TuL(ii-1,jj) + asseXstar_TuL(ii,jj); % Matrici cumulate antiorarie + Ystar_TuL(ii,jj) = Ystar_TuL(ii-1,jj) + asseYstar_TuL(ii,jj); + Zstar_TuL(ii,jj) = Zstar_TuL(ii-1,jj) + asseZstar_TuL(ii,jj); +end + +end \ No newline at end of file diff --git a/ATD/CalcoloStar.m b/ATD/CalcoloStar.m new file mode 100755 index 0000000..4185b6a --- /dev/null +++ b/ATD/CalcoloStar.m @@ -0,0 +1,88 @@ +%% Funzione che calcola i segmenti della stella +function SegStar = CalcoloStar(X_TuL,Z_TuL,Xstar_TuL,Zstar_TuL,Verso,Segmenti,Peso,jj,SegStar,Nnodi,dim) + +for J = 1:dim + N1 = Segmenti(J,1); % Numero primo punto + N1b = Segmenti(J,2); % Numero primo punto b + C1 = isnan(Segmenti(J,2)); % cerco se la seconda colonna è un NaN + N2 = Segmenti(J,3); % Numero secondo punto + [~,chc] = size(Segmenti); + if chc == 3 % non c'è la quarta colonna + C2 = 1; + else + N2b = Segmenti(J,4); % Numero secondo punto b + C2 = isnan(Segmenti(J,4)); % cerco se la quarta colonna è un NaN + end + X1 = X_TuL; + Xstar1 = Xstar_TuL; + Z1 = Z_TuL; + Zstar1 = Zstar_TuL; + X2 = X_TuL; + Xstar2 = Xstar_TuL; + Z2 = Z_TuL; + Zstar2 = Zstar_TuL; + + if C1 == 0 % uso la media fra due nodi per il punto di inizio + X1(N1,jj) = (X_TuL(N1,jj) + X_TuL(N1b,jj))/2; + Z1(N1,jj) = (Z_TuL(N1,jj) + Z_TuL(N1b,jj))/2; + Xstar1(Nnodi-N1,jj) = (Xstar_TuL(Nnodi-N1,jj) + Xstar_TuL(Nnodi-N1b,jj))/2; + Zstar1(Nnodi-N1,jj) = (Zstar_TuL(Nnodi-N1,jj) + Zstar_TuL(Nnodi-N1b,jj))/2; + end + if C2 == 0 % uso la media fra due nodi per il punto di arrivo + X2(N2,jj) = (X_TuL(N2,jj) + X_TuL(N2b,jj))/2; + Z2(N2,jj) = (Z_TuL(N2,jj) + Z_TuL(N2b,jj))/2; + Xstar2(Nnodi-N2,jj) = (Xstar_TuL(Nnodi-N2,jj) + Xstar_TuL(Nnodi-N2b,jj))/2; + Zstar2(Nnodi-N2,jj) = (Zstar_TuL(Nnodi-N2,jj) + Zstar_TuL(Nnodi-N2b,jj))/2; + end + + if Verso(J,1) == 1 && Verso (J,2) == 1 % Calcolo Orario per entrambi i punti (standard) + if N1==0 + SegStar(J,jj) = real(((0 - X2(N2,jj)).^2+(0-Z2(N2,jj)).^2).^0.5); + elseif N2==0 + SegStar(J,jj) = real((((X1(N1,jj)- 0)).^2+(Z1(N1,jj)-0).^2).^0.5); + else + SegStar(J,jj) = real(((X1(N1,jj)- X2(N2,jj)).^2+(Z1(N1,jj)-Z2(N2,jj)).^2).^0.5); + end + elseif Verso(J,1) == 1 && Verso (J,2) == -1 % Calcolo Orario il primo, antiorario per il secondo punto + SegStar(J,jj) = real(((X1(N1,jj)-Xstar2(Nnodi-N2,jj)).^2+(Z1(N1,jj)-Zstar2(Nnodi-N2,jj)).^2).^0.5); + elseif Verso(J,1) == 1 && Verso (J,2) == 0 % Calcolo Orario il primo, media fra orario e antiorario per il secondo punto + Peso3 = Peso(J,3); + Peso4 = Peso(J,4); + Xmedium2 = (Peso3*X2(N2,jj) + Peso4*Xstar2(Nnodi-N2,jj))/(Peso3+Peso4); + Zmedium2 = (Peso3*Z2(N2,jj) + Peso4*Zstar2(Nnodi-N2,jj))/(Peso3+Peso4); + SegStar(J,jj) = real(((X1(N1,jj)-Xmedium2).^2+(Z1(N1,jj)-Zmedium2).^2).^0.5); + elseif Verso(J,1) == -1 && Verso (J,2) == -1 % Calcolo antiorario per entrambi + SegStar(J,jj) = real(((Xstar1(Nnodi-N1,jj)-Xstar2(Nnodi-N2,jj)).^2+(Zstar1(Nnodi-N1,jj)-Zstar2(Nnodi-N2,jj)).^2).^0.5); + elseif Verso(J,1) == -1 && Verso (J,2) == 1 % Calcolo antiorario per il primo, orario per il secondo + SegStar(J,jj) = real(((X2(N2,jj)-Xstar1(Nnodi-N1,jj)).^2+(Z2(N2,jj)-Zstar1(Nnodi-N1,jj)).^2).^0.5); + elseif Verso(J,1) == -1 && Verso (J,2) == 0 % Calcolo antiorario il primo, media fra orario e antiorario per il secondo punto + Peso3 = Peso(J,3); + Peso4 = Peso(J,4); + Xmedium2 = (Peso3*X2(N2,jj) + Peso4*Xstar2(Nnodi-N2,jj))/(Peso3+Peso4); + Zmedium2 = (Peso3*Z2(N2,jj) + Peso4*Zstar2(Nnodi-N2,jj))/(Peso3+Peso4); + SegStar(J,jj) = real(((Xstar1(Nnodi-N1,jj)-Xmedium2).^2+(Zstar1(Nnodi-N1,jj)-Zmedium2).^2).^0.5); + elseif Verso(J,1) == 0 && Verso (J,2) == 0 % Calcolo media fra orario e antiorario per entrambi + Peso1 = Peso(J,1); + Peso2 = Peso(J,2); + Peso3 = Peso(J,3); + Peso4 = Peso(J,4); + Xmedium1 = (Peso1*X1(N1,jj) + Peso2*Xstar1(Nnodi-N1,jj))/(Peso1+Peso2); + Xmedium2 = (Peso3*X2(N2,jj) + Peso4*Xstar2(Nnodi-N2,jj))/(Peso3+Peso4); + Zmedium1 = (Peso1*Z1(N1,jj) + Peso2*Zstar1(Nnodi-N1,jj))/(Peso1+Peso2); + Zmedium2 = (Peso3*Z2(N2,jj) + Peso4*Zstar2(Nnodi-N2,jj))/(Peso3+Peso4); + SegStar(J,jj) = real(((Xmedium1-Xmedium2).^2+(Zmedium1-Zmedium2).^2).^0.5); + elseif Verso(J,1) == 0 && Verso (J,2) == 1 % Calcolo media fra orario e antiorario per il primo, orario per il secondo + Peso1 = Peso(J,1); + Peso2 = Peso(J,2); + Xmedium1 = (Peso1*X1(N1,jj) + Peso2*Xstar1(Nnodi-N1,jj))/(Peso1+Peso2); + Zmedium1 = (Peso1*Z_TuL(N1,jj) + Peso2*Zstar_TuL(Nnodi-N1,jj))/(Peso1+Peso2); + SegStar(J,jj) = real(((X2(N2,jj)-Xmedium1).^2+(Z2(N1,jj)-Zmedium1).^2).^0.5); + elseif Verso(J,1) == 0 && Verso (J,2) == -1 % Calcolo media fra orario e antiorario per il primo, antiorario per il secondo + Peso1 = Peso(J,1); + Peso2 = Peso(J,2); + Xmedium1 = (Peso1*X1(N1,jj) + Peso2*Xstar1(Nnodi-N1,jj))/(Peso1+Peso2); + Zmedium1 = (Peso1*Z1(N1,jj) + Peso2*Zstar1(Nnodi-N1,jj))/(Peso1+Peso2); + SegStar(J,jj) = real(((Xstar2(Nnodi-N2,jj)-Xmedium1).^2+(Zstar2(Nnodi-N2,jj)-Zmedium1).^2).^0.5); + end +end +end diff --git a/ATD/CalcoloStar_Report.m b/ATD/CalcoloStar_Report.m new file mode 100755 index 0000000..69c46b1 --- /dev/null +++ b/ATD/CalcoloStar_Report.m @@ -0,0 +1,42 @@ +%% Funzione che calcola i segmenti della stella +function SegStar = CalcoloStar_Report(X_TuL,Z_TuL,Verso,Segmenti,SegStar,dim) + +X1 = X_TuL(:,1); +Z1 = Z_TuL(:,1); +X2 = X_TuL(:,1); +Z2 = Z_TuL(:,1); +X1f = X_TuL(:,end); +Z1f = Z_TuL(:,end); +X2f = X_TuL(:,end); +Z2f = Z_TuL(:,end); +for J = 1:dim + N1 = Segmenti(J,1); % Numero primo punto + N1b = Segmenti(J,2); % Numero primo punto b + C1 = isnan(Segmenti(J,2)); % cerco se la seconda colonna è un NaN + N2 = Segmenti(J,3); % Numero secondo punto + [~,chc] = size(Segmenti); + if chc == 3 % non c'è la quarta colonna + C2 = 1; + else + N2b = Segmenti(J,4); % Numero secondo punto b + C2 = isnan(Segmenti(J,4)); % cerco se la quarta colonna è un NaN + end + if C1 == 0 % uso la media fra due nodi per il punto di inizio + X1(N1,1) = (X_TuL(N1,1) + X_TuL(N1b,1))/2; + X1f(N1,end) = (X_TuL(N1,end) + X_TuL(N1b,end))/2; + Z1(N1,1) = (Z_TuL(N1,1) + Z_TuL(N1b,1))/2; + Z1f(N1,end) = (Z_TuL(N1,end) + Z_TuL(N1b,end))/2; + end + if C2 == 0 % uso la media fra due nodi per il punto di arrivo + X2(N2,1) = (X_TuL(N2,1) + X_TuL(N2b,1))/2; + X2f(N2,end) = (X_TuL(N2,end) + X_TuL(N2b,end))/2; + Z2(N2,1) = (Z_TuL(N2,1) + Z_TuL(N2b,1))/2; + Z2f(N2,end) = (Z_TuL(N2,end) + Z_TuL(N2b,end))/2; + end + if Verso(J,1) && Verso (J,2) == 1 % Calcolo Orario per entrambi i punti (standard) + S_fin(J,1) = ((X1f(N1)- X2f(N2)).^2+(Z1f(N1)-Z2f(N2)).^2).^0.5; + S_ini(J,1) = ((X1(N1)- X2(N2)).^2+(Z1(N1)-Z2(N2)).^2).^0.5; + SegStar(J,1) = S_fin(J,1) - S_ini(J,1); + end +end +end diff --git a/ATD/DB_date_time.m b/ATD/DB_date_time.m new file mode 100755 index 0000000..e5c7acd --- /dev/null +++ b/ATD/DB_date_time.m @@ -0,0 +1,25 @@ +function idElabData = DB_date_time(IDcentralina,DTcatena,NodeNum,ListaDate,ARRAYdate,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; +idElabData = zeros(l,1); % Contiene gli id delle date delle quali ho già dati +cc = 1; % contatore +for ii=1:l + dString = datestr(ARRAYdate(ii),'yyyy-mm-dd'); + tString = datestr(ARRAYdate(ii),'HH:MM:SS'); + + comando = ['select idElabData from ELABDATADISP where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' ... + nNodo ''' and EventDate = ''' dString ''' and EventTime = ''' tString ''' order by EventDate']; + curs = exec(conn,comando); + curs = fetch(curs); + idDate = curs.Data; + if strcmp(idDate,'No Data') + idElabData(cc,1) = 0; % 0 indica che il dato non è presente su DB + else + idElabData(cc,1) = cell2mat(idDate); + end + cc = cc+1; +end + +end \ No newline at end of file diff --git a/ATD/DBwrite2DCrL.m b/ATD/DBwrite2DCrL.m new file mode 100755 index 0000000..77ab67e --- /dev/null +++ b/ATD/DBwrite2DCrL.m @@ -0,0 +1,41 @@ +function DBwrite2DCrL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,... + DTcatena,Ch2DCrL,CrL2D_NTC,cont2DCrL,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + tablename = 'ELABDATADISP'; + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + if Ch2DCrL(cont2DCrL) >= 2 && CrL2D_NTC(cont2DCrL) == 1 % scrivo la T + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'XShift','YShift','T_node','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),DATAinsert(ii,7),... + DATAinsert(ii,8),DATAinsert(ii,9)]; + else + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'XShift','YShift','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),DATAinsert(ii,7),... + DATAinsert(ii,9)]; + end + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + if Ch2DCrL(cont2DCrL) >= 2 && CrL2D_NTC(cont2DCrL) == 1 % scrivo la T + colnames = {'XShift','YShift','T_node','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8),... + DATAinsert(ii,9)]; + else + colnames = {'XShift','YShift','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,9)]; + end + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = ''' ... + cell2mat(DATAinsert(ii,4)) ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end \ No newline at end of file diff --git a/ATD/DBwrite3DCrL.m b/ATD/DBwrite3DCrL.m new file mode 100755 index 0000000..5b6117d --- /dev/null +++ b/ATD/DBwrite3DCrL.m @@ -0,0 +1,41 @@ +function DBwrite3DCrL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,... + DTcatena,Ch3DCrL,CrL3D_NTC,cont3DCrL,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + tablename = 'ELABDATADISP'; + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + if Ch3DCrL(cont3DCrL) >= 4 && CrL3D_NTC(cont3DCrL) == 1 % scrivo la T + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'XShift','YShift','ZShift','T_node','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),DATAinsert(ii,7),... + DATAinsert(ii,8),DATAinsert(ii,9),DATAinsert(ii,10)]; + else + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'XShift','YShift','ZShift','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),DATAinsert(ii,7),... + DATAinsert(ii,8),DATAinsert(ii,10)]; + end + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + if Ch3DCrL(cont3DCrL) >= 4 && CrL3D_NTC(cont3DCrL) == 1 % scrivo la T + colnames = {'XShift','YShift','ZShift','T_node','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8),... + DATAinsert(ii,9),DATAinsert(ii,10)]; + else + colnames = {'XShift','YShift','ZShift','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,10)]; + end + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = ''' ... + cell2mat(DATAinsert(ii,4)) ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end \ No newline at end of file diff --git a/ATD/DBwrite3DEL.m b/ATD/DBwrite3DEL.m new file mode 100755 index 0000000..13f069d --- /dev/null +++ b/ATD/DBwrite3DEL.m @@ -0,0 +1,39 @@ +function DBwrite3DEL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,... + DTcatena,Ch3DEL,c3DEL_NTC,EL3D_NTC,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + if Ch3DEL(c3DEL_NTC) == 4 && EL3D_NTC(c3DEL_NTC) == 1 % scrivo la T + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime','XShift','YShift','ZShift','T_node','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),DATAinsert(ii,10)]; + else % NON scrivo la T + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime','XShift','YShift','ZShift','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,10)]; + end + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + if Ch3DEL(c3DEL_NTC) == 4 && EL3D_NTC(c3DEL_NTC) == 1 % scrivo la T + colnames = {'XShift','YShift','ZShift','T_node','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),DATAinsert(ii,10)]; + else % NON scrivo la T + colnames = {'XShift','YShift','ZShift','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,10)]; + end + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = ''' ... + cell2mat(DATAinsert(ii,4)) ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end \ No newline at end of file diff --git a/ATD/DBwriteCrL.m b/ATD/DBwriteCrL.m new file mode 100755 index 0000000..a147e23 --- /dev/null +++ b/ATD/DBwriteCrL.m @@ -0,0 +1,38 @@ +function DBwriteCrL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,... + DTcatena,cCrL,ChCrL,CrL_NTC,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + if ChCrL(cCrL) >= 2 && CrL_NTC(cCrL) == 1 % scrivo la T + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime','XShift','T_node','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8)]; + else + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime','XShift','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),DATAinsert(ii,8)]; + end + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + if ChCrL(cCrL) >= 2 && CrL_NTC(cCrL) == 1 % scrivo la T + colnames = {'XShift','T_node','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8)]; + else + colnames = {'XShift','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,8)]; + end + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = ''' ... + cell2mat(DATAinsert(ii,4)) ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end \ No newline at end of file diff --git a/ATD/DBwriteEL.m b/ATD/DBwriteEL.m new file mode 100755 index 0000000..75e7ada --- /dev/null +++ b/ATD/DBwriteEL.m @@ -0,0 +1,65 @@ +function DBwriteEL(DATAinsert,idElabData,ListaDate,NodeNum,Calcolo_Carico,... + IDcentralina,DTcatena,cEL,ChEL,EL_NTC,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + if ChEL(cEL) >= 2 && EL_NTC(cEL) == 1 % scrivo la T + if Calcolo_Carico == 1 % scrivo sforzo e carico + colnames = {'UnitName','ToolNameID','NodeNum','EventDate',... + 'EventTime','XShift','T_node','calcerr','load_value','pressure'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),DATAinsert(ii,7),... + DATAinsert(ii,8),DATAinsert(ii,9),DATAinsert(ii,10)]; + else + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime','XShift','T_node','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8)]; + end + else % NON scrivo la T + if Calcolo_Carico == 1 % scrivo sforzo e carico + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'XShift','calcerr','load_value','pressure'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),DATAinsert(ii,8),... + DATAinsert(ii,9),DATAinsert(ii,10)]; + else + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'XShift','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),DATAinsert(ii,8)]; + end + end + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + if ChEL(cEL) >= 2 && EL_NTC(cEL) == 1 % scrivo la T + if Calcolo_Carico == 1 + colnames = {'XShift','T_node','calcerr','load_value','pressure'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8),... + DATAinsert(ii,9),DATAinsert(ii,10)]; + else + colnames = {'XShift','T_node','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8)]; + end + else % NON scrivo la T + if Calcolo_Carico == 1 + colnames = {'XShift','calcerr','load_value','pressure'}; + data = [DATAinsert(ii,6),DATAinsert(ii,8),DATAinsert(ii,9),DATAinsert(ii,10)]; + else + colnames = {'XShift','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,8)]; + end + end + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = ''' ... + cell2mat(DATAinsert(ii,4)) ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end \ No newline at end of file diff --git a/ATD/DBwriteLL.m b/ATD/DBwriteLL.m new file mode 100755 index 0000000..7b03964 --- /dev/null +++ b/ATD/DBwriteLL.m @@ -0,0 +1,25 @@ +function DBwriteLL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime','load_value','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),DATAinsert(ii,4),... + DATAinsert(ii,5),DATAinsert(ii,6),DATAinsert(ii,7)]; + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + colnames = {'load_value'}; + data = DATAinsert(ii,6); + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = ''' cell2mat(DATAinsert(ii,4))... + ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end \ No newline at end of file diff --git a/ATD/DBwriteMPBEL.m b/ATD/DBwriteMPBEL.m new file mode 100755 index 0000000..c0f05e6 --- /dev/null +++ b/ATD/DBwriteMPBEL.m @@ -0,0 +1,73 @@ +function DBwriteMPBEL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,... + DTcatena,NumBasi,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + if NumBasi == 1 + colnames = {'UnitName','ToolNameID','NodeNum','EventDate',... + 'EventTime','XShift','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7)]; + elseif NumBasi == 2 + colnames = {'UnitName','ToolNameID','NodeNum','EventDate',... + 'EventTime','XShift','YShift','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8)]; + elseif NumBasi == 3 + colnames = {'UnitName','ToolNameID','NodeNum','EventDate',... + 'EventTime','XShift','YShift','ZShift','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9)]; + elseif NumBasi == 4 + colnames = {'UnitName','ToolNameID','NodeNum','EventDate',... + 'EventTime','XShift','YShift','ZShift','X','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10)]; + elseif NumBasi == 5 + colnames = {'UnitName','ToolNameID','NodeNum','EventDate',... + 'EventTime','XShift','YShift','ZShift','X','Y','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10,DATAinsert(ii,11))]; + end + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + if NumBasi == 1 + colnames = {'XShift','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7)]; + elseif NumBasi == 2 + colnames = {'XShift','YShift','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8)]; + elseif NumBasi == 3 + colnames = {'XShift','YShift','ZShift','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8),... + DATAinsert(ii,9)]; + elseif NumBasi == 4 + colnames = {'XShift','YShift','ZShift','X','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8),... + DATAinsert(ii,9),DATAinsert(ii,10)]; + elseif NumBasi == 5 + colnames = {'XShift','YShift','ZShift','X','Y','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8),... + DATAinsert(ii,9),DATAinsert(ii,10,DATAinsert(ii,11))]; + end + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = ''' ... + cell2mat(DATAinsert(ii,4)) ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end \ No newline at end of file diff --git a/ATD/DBwritePCL.m b/ATD/DBwritePCL.m new file mode 100755 index 0000000..49d4eb3 --- /dev/null +++ b/ATD/DBwritePCL.m @@ -0,0 +1,75 @@ +function DBwritePCL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + checkA = isnan(cell2mat(DATAinsert(ii,15))); + if checkA == 1 % il vettore accelerazione è NaN + checkV = isnan(cell2mat(DATAinsert(ii,13))); + if checkV == 1 % il vettore velocità è NaN + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'Y','Z','YShift','ZShift','AlfaX','AlfaY','T_node','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,17)]; + else % velocità è un numero, accelerazione NaN + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'Y','Z','YShift','ZShift','AlfaX','AlfaY','T_node',... + 'speed','speed_local','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,17)]; + end + else % scrivo tutto + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'Y','Z','YShift','ZShift','AlfaX','AlfaY','T_node','speed',... + 'speed_local','acceleration','acceleration_local','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17)]; + end + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + checkA = isnan(cell2mat(DATAinsert(ii,15))); + if checkA == 1 % il vettore accelerazione è NaN + checkV = isnan(cell2mat(DATAinsert(ii,13))); + if checkV == 1 % il vettore velocità è NaN + colnames = {'Y','Z','YShift','ZShift','AlfaX','AlfaY','T_node','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8),... + DATAinsert(ii,9),DATAinsert(ii,10),DATAinsert(ii,11),... + DATAinsert(ii,12),DATAinsert(ii,17)]; + else % velocità è un numero, accelerazione NaN + colnames = {'Y','Z','YShift','ZShift','AlfaX','AlfaY','T_node',... + 'speed','speed_local','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8),... + DATAinsert(ii,9),DATAinsert(ii,10),DATAinsert(ii,11),... + DATAinsert(ii,12),DATAinsert(ii,13),DATAinsert(ii,14),... + DATAinsert(ii,17)]; + end + else % scrivo tutto + colnames = {'Y','Z','YShift','ZShift','AlfaX','AlfaY','T_node','speed',... + 'speed_local','acceleration','acceleration_local','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8),... + DATAinsert(ii,9),DATAinsert(ii,10),DATAinsert(ii,11),... + DATAinsert(ii,12),DATAinsert(ii,13),DATAinsert(ii,14),... + DATAinsert(ii,15),DATAinsert(ii,16),DATAinsert(ii,17)]; + end + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' ... + nNodo ''' and EventDate = ''' cell2mat(DATAinsert(ii,4)) ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end diff --git a/ATD/DBwritePCLHR.m b/ATD/DBwritePCLHR.m new file mode 100755 index 0000000..ff4281a --- /dev/null +++ b/ATD/DBwritePCLHR.m @@ -0,0 +1,35 @@ +function DBwritePCLHR(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + colnames = {'ToolNameID','NodeNum','EventDate','EventTime','X',... + 'Y','Z','XShift','YShift','ZShift','HShift_local',... + 'T_node','week_shift','week_shift_x','week_shift_y','week_shift_z'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16)]; + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + colnames = {'X','Y','Z','XShift','YShift','ZShift',... + 'HShift_local','T_node','week_shift','week_shift_x','week_shift_y','week_shift_z'}; + data = [DATAinsert(ii,5),DATAinsert(ii,6),DATAinsert(ii,7),... + DATAinsert(ii,8),DATAinsert(ii,9),DATAinsert(ii,10),DATAinsert(ii,11),... + DATAinsert(ii,12), DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16)]; + whereclause = ['WHERE ToolNameID = ''' DTcatena ''' and NodeNum = ''' ... + nNodo ''' and EventDate = ''' cell2mat(DATAinsert(ii,3))... + ''' and EventTime = ''' cell2mat(DATAinsert(ii,4)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end \ No newline at end of file diff --git a/ATD/DBwritePL.m b/ATD/DBwritePL.m new file mode 100755 index 0000000..bf852bb --- /dev/null +++ b/ATD/DBwritePL.m @@ -0,0 +1,24 @@ +function DBwritePL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime','pressure','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),DATAinsert(ii,4),... + DATAinsert(ii,5),DATAinsert(ii,6),DATAinsert(ii,7)]; + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + colnames = {'pressure'}; + data = DATAinsert(ii,6); + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = ''' cell2mat(DATAinsert(ii,4))... + ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end \ No newline at end of file diff --git a/ATD/DBwriteRL.m b/ATD/DBwriteRL.m new file mode 100755 index 0000000..879a968 --- /dev/null +++ b/ATD/DBwriteRL.m @@ -0,0 +1,30 @@ +function DBwriteRL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime','X',... + 'Y','Z','XShift','YShift','ZShift','T_node','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),DATAinsert(ii,13)]; + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + colnames = {'X','Y','Z','XShift','YShift','ZShift','T_node','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),... + DATAinsert(ii,8),DATAinsert(ii,9),DATAinsert(ii,10),DATAinsert(ii,11),... + DATAinsert(ii,12),DATAinsert(ii,13)]; + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = ''' cell2mat(DATAinsert(ii,4))... + ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end \ No newline at end of file diff --git a/ATD/DBwriteSM.m b/ATD/DBwriteSM.m new file mode 100755 index 0000000..c1a4863 --- /dev/null +++ b/ATD/DBwriteSM.m @@ -0,0 +1,38 @@ +function DBwriteSM(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,... + DTcatena,ChSM,SM_NTC,cSM,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + if ChSM(cSM) >= 2 && SM_NTC(cSM) == 1 % scrivo la T + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime','XShift','T_node','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8)]; + else + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime','XShift','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),DATAinsert(ii,8)]; + end + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + if ChSM(cSM) >= 2 && SM_NTC(cSM) == 1 % scrivo la T + colnames = {'XShift','T_node','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8)]; + else + colnames = {'XShift','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,8)]; + end + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = ''' ... + cell2mat(DATAinsert(ii,4)) ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end \ No newline at end of file diff --git a/ATD/DBwriteTLH.m b/ATD/DBwriteTLH.m new file mode 100755 index 0000000..c5fba69 --- /dev/null +++ b/ATD/DBwriteTLH.m @@ -0,0 +1,75 @@ +function DBwriteTLH(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + checkA = isnan(cell2mat(DATAinsert(ii,15))); + if checkA == 1 % il vettore accelerazione è NaN + checkV = isnan(cell2mat(DATAinsert(ii,13))); + if checkV == 1 % il vettore velocità è NaN + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'Y','Z','YShift','ZShift','AlfaX','AlfaY','T_node','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,17)]; + else % velocità è un numero, accelerazione NaN + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'Y','Z','YShift','ZShift','AlfaX','AlfaY','T_node',... + 'speed','speed_local','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,17)]; + end + else % scrivo tutto + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'Y','Z','YShift','ZShift','AlfaX','AlfaY','T_node','speed',... + 'speed_local','acceleration','acceleration_local','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17)]; + end + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + checkA = isnan(cell2mat(DATAinsert(ii,15))); + if checkA == 1 % il vettore accelerazione è NaN + checkV = isnan(cell2mat(DATAinsert(ii,13))); + if checkV == 1 % il vettore velocità è NaN + colnames = {'Y','Z','YShift','ZShift','AlfaX','AlfaY','T_node','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8),... + DATAinsert(ii,9),DATAinsert(ii,10),DATAinsert(ii,11),... + DATAinsert(ii,12),DATAinsert(ii,17)]; + else % velocità è un numero, accelerazione NaN + colnames = {'Y','Z','YShift','ZShift','AlfaX','AlfaY','T_node',... + 'speed','speed_local','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8),... + DATAinsert(ii,9),DATAinsert(ii,10),DATAinsert(ii,11),... + DATAinsert(ii,12),DATAinsert(ii,13),DATAinsert(ii,14),... + DATAinsert(ii,17)]; + end + else % scrivo tutto + colnames = {'Y','Z','YShift','ZShift','AlfaX','AlfaY','T_node','speed',... + 'speed_local','acceleration','acceleration_local','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8),... + DATAinsert(ii,9),DATAinsert(ii,10),DATAinsert(ii,11),... + DATAinsert(ii,12),DATAinsert(ii,13),DATAinsert(ii,14),... + DATAinsert(ii,15),DATAinsert(ii,16),DATAinsert(ii,17)]; + end + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' ... + nNodo ''' and EventDate = ''' cell2mat(DATAinsert(ii,4)) ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end diff --git a/ATD/DBwriteTLHRH.m b/ATD/DBwriteTLHRH.m new file mode 100755 index 0000000..c6bb4af --- /dev/null +++ b/ATD/DBwriteTLHRH.m @@ -0,0 +1,75 @@ +function DBwriteTLHRH(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + checkA = isnan(cell2mat(DATAinsert(ii,15))); + if checkA == 1 % il vettore accelerazione è NaN + checkV = isnan(cell2mat(DATAinsert(ii,13))); + if checkV == 1 % il vettore velocità è NaN + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'Y','Z','YShift','ZShift','AlfaX','AlfaY','T_node','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,17)]; + else % velocità è un numero, accelerazione NaN + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'Y','Z','YShift','ZShift','AlfaX','AlfaY','T_node',... + 'speed','speed_local','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,17)]; + end + else % scrivo tutto + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'Y','Z','YShift','ZShift','AlfaX','AlfaY','T_node','speed',... + 'speed_local','acceleration','acceleration_local','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17)]; + end + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + checkA = isnan(cell2mat(DATAinsert(ii,15))); + if checkA == 1 % il vettore accelerazione è NaN + checkV = isnan(cell2mat(DATAinsert(ii,13))); + if checkV == 1 % il vettore velocità è NaN + colnames = {'Y','Z','YShift','ZShift','AlfaX','AlfaY','T_node','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8),... + DATAinsert(ii,9),DATAinsert(ii,10),DATAinsert(ii,11),... + DATAinsert(ii,12),DATAinsert(ii,17)]; + else % velocità è un numero, accelerazione NaN + colnames = {'Y','Z','YShift','ZShift','AlfaX','AlfaY','T_node',... + 'speed','speed_local','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8),... + DATAinsert(ii,9),DATAinsert(ii,10),DATAinsert(ii,11),... + DATAinsert(ii,12),DATAinsert(ii,13),DATAinsert(ii,14),... + DATAinsert(ii,17)]; + end + else % scrivo tutto + colnames = {'Y','Z','YShift','ZShift','AlfaX','AlfaY','T_node','speed',... + 'speed_local','acceleration','acceleration_local','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8),... + DATAinsert(ii,9),DATAinsert(ii,10),DATAinsert(ii,11),... + DATAinsert(ii,12),DATAinsert(ii,13),DATAinsert(ii,14),... + DATAinsert(ii,15),DATAinsert(ii,16),DATAinsert(ii,17)]; + end + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' ... + nNodo ''' and EventDate = ''' cell2mat(DATAinsert(ii,4)) ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end diff --git a/ATD/DBwriteTuL.m b/ATD/DBwriteTuL.m new file mode 100755 index 0000000..0ac2812 --- /dev/null +++ b/ATD/DBwriteTuL.m @@ -0,0 +1,45 @@ +function DBwriteTuL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime','X','Xstar',... + 'Y','Z','Zstar','XShift','YShift','ZShift','HShift','HShift_local',... + 'T_node','speed_local','acceleration_local','Area','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17),DATAinsert(ii,18),... + DATAinsert(ii,19),DATAinsert(ii,20)]; + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; +% colnames = {'X','Xstar','Y','Z','Zstar','XShift','YShift','ZShift','HShift',... +% 'HShift_local','T_node','speed_local','acceleration_local','Area'}; +% data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8),... +% DATAinsert(ii,9),DATAinsert(ii,10),DATAinsert(ii,11),... +% DATAinsert(ii,12),DATAinsert(ii,13),DATAinsert(ii,14),... +% DATAinsert(ii,15),DATAinsert(ii,16),DATAinsert(ii,17),... +% DATAinsert(ii,18)]; +colnames = {'X','Y','Z','XShift','YShift','ZShift','HShift',... + 'HShift_local','T_node','speed_local','acceleration_local','Area'}; +data = [DATAinsert(ii,6),DATAinsert(ii,8),... + DATAinsert(ii,9),DATAinsert(ii,11),... + DATAinsert(ii,12),DATAinsert(ii,13),DATAinsert(ii,14),... + DATAinsert(ii,15),DATAinsert(ii,16),DATAinsert(ii,17),... + DATAinsert(ii,18)]; + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeNum = ''' ... + nNodo ''' and EventDate = ''' cell2mat(DATAinsert(ii,4))... + ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end \ No newline at end of file diff --git a/ATD/DBwriteWEL.m b/ATD/DBwriteWEL.m new file mode 100755 index 0000000..7fb5ed6 --- /dev/null +++ b/ATD/DBwriteWEL.m @@ -0,0 +1,37 @@ +function DBwriteWEL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,... + cWEL,ChWEL,WEL_NTC,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + if ChWEL(cWEL) >= 2 && WEL_NTC(cWEL) == 1 % scrivo la T + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime','XShift','T_node','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8)]; + else + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime','XShift','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),DATAinsert(ii,8)]; + end + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + if ChWEL(cWEL) >= 2 && WEL_NTC(cWEL) == 1 % scrivo la T + colnames = {'XShift','T_node','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8)]; + else + colnames = {'XShift','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,8)]; + end + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = ''' ... + cell2mat(DATAinsert(ii,4)) ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end \ No newline at end of file diff --git a/ATD/IDunit.m b/ATD/IDunit.m new file mode 100755 index 0000000..c919a90 --- /dev/null +++ b/ATD/IDunit.m @@ -0,0 +1,15 @@ +function unitID = IDunit(IDcentralina,conn,FileName) + +text = 'IDunit function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +comando = ['select id from units where name like ''' IDcentralina ''' ']; +unitID = fetch(conn,comando); + +text = 'Unit ID downloaded correctly, IDunit function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/LastElab.m b/ATD/LastElab.m new file mode 100755 index 0000000..41179c1 --- /dev/null +++ b/ATD/LastElab.m @@ -0,0 +1,2697 @@ +function [DatiElabTunnelLink,NuovoZeroTuL,ay_TuL,t_TuL,ay_TuL_AC,t_TuL_AC,... + datainiTuL,tempoiniTuL,data1_AC,DatiElabRadialLink,NuovoZeroRL,datainiRL,tempoiniRL,... + DatiElabTiltLinkH,NuovoZeroTLH,datainiTLH,tempoiniTLH,... + DatiElabTiltLinkHRH,NuovoZeroTLHRH,datainiTLHRH,tempoiniTLHRH,... + DatiElabPreConvLink,NuovoZeroPCL,datainiPCL,tempoiniPCL,... + DatiElabPreConvLinkHR,NuovoZeroPCLHR,datainiPCLHR,tempoiniPCLHR,... + DatiElabDistoMTLink,NuovoZeroDM,datainiDM,tempoiniDM,... + datainiPL,tempoiniPL,NuovoZeroPrL,datainiLL,tempoiniLL,NuovoZeroLL,... + datainiEL,tempoiniEL,Date_Rif_EL,NuovoZeroEL,... + dataini3DEL,tempoini3DEL,Date_Rif_3DEL,NuovoZero3DEL,datainiWEL,tempoiniWEL,NuovoZeroWEL,... + datainiMPBEL,tempoiniMPBEL,NuovoZeroMPBEL,DatiElabAnalogLink,NuovoZeroAL,datainiAL,tempoiniAL,... + datainiCrL,tempoiniCrL,NuovoZeroCrL,dataini3DCrL,tempoini3DCrL,NuovoZero3DCrL,... + dataini2DCrL,tempoini2DCrL,NuovoZero2DCrL, datainiSM,tempoiniSM,Date_Rif_SM,NuovoZeroSM,margine] = ... + LastElab(conn,date,time,IDcentralina,DTcatena,Wdevst,NdatiMedia,Ndatidespike,... + NodoTunnelLink,yesTuL,date_AC,time_AC,Nodo_AC,rTuL,... + NodoRadialLink,yesRL,rRL,NodoTiltLinkH,yesTLH,rTLH,NodoTiltLinkHRH,yesTLHRH,rTLHRH,... + NodoPreConvLink,yesPCL,rPCL,NodoPreConvLinkHR,yesPCLHR,rPCLHR,... + NodoDistoMTLink,yesDM,rDM,NodoPressureLink,yesPL,... + NodoLoadLink,yesLL,NodoExtensometerLink,yesEL,Nodo3DExtensometerLink,... + yes3DEL,NodoWireExtensometerLink,yesWEL,NodoMultiPointRodExtensometer,... + yesMPBEL,NodoAnalogLink,yesAL,rAL,NodoCrackLink,yesCrL,... + Nodo3DCrackLink,yes3DCrL,Nodo2DCrackLink,yes2DCrL,NodoStressMeter,yesSM,FileName) + +% Apro scrittura file +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'LastElab function started'; +fprintf(fileID,fmt,text); + +Data(1,1) = cellstr(date); +Data(1,2) = cellstr(time); + +%% Tunnel Link +if yesTuL == 1 % Importo ultimo dato elaborato dei Tunnel Link + NodeNumTuL = num2str(cell2mat(NodoTunnelLink(1,2))); % scarico i dati del primo nodo Tunnel Link + NodeType = 'Tunnel Link'; + + % Dati Grezzi + % --- Sezione --- + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and Time >= ''' time ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumTuL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 % Non ci sono dati per la data "date" + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumTuL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + % --- Arco Rovescio --- + if date_AC <= now + comando = ['select Date, Time from RawDataView where Date = ''' ... + date_AC ''' and Time >= ''' time_AC ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' num2str(Nodo_AC) ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini_AC = curs.Data; + [rAC,cAC] = size(D_num_ini_AC); + if rAC == 1 && cAC == 1 % Non ci sono dati per la data "date" + comando = ['select Date, Time from RawDataView where Date > ''' ... + date_AC ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' Nodo_AC ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini_AC = curs.Data; + [rAC,~] = size(D_num_ini_AC); + end + else + rAC = rI; + end + + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + % Dati Elaborati + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumTuL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date_AC = [cell2mat(cellstr((date_AC))) repmat(' ', [1,1]) cell2mat(cellstr(time_AC))]; + data1_AC = Date_AC; + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; % Data definita sul sito + data1a = datenum(Date); % Data definita sul sito + data1b = Data_num_ini(1); % Data del primo dato grezzo + % Nodi standard + if data1b > data1a + data1 = data1b; + else + data1 = data1a; + end + % Arco rovescio + if datenum(data1_AC) < data1 + data1_AC = data1; + end + + if rLE==1 && cLE==1 + datainiTuL = datestr(data1,'yyyy-mm-dd'); + tempoiniTuL = datestr(data1,'HH:MM:SS'); + NuovoZeroTuL = 0; + DatiElabTunnelLink = []; + margine = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; % margine di n gg prima + + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < 6 + cont = 6; + end + [rDS,~] = size(Data_numero); + if cont >= rDS + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); % aggiornare contatori + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiTuL = datestr(data2,'yyyy-mm-dd'); + tempoiniTuL = datestr(data2,'HH:MM:SS'); + NuovoZeroTuL = 1; %1 + else + datainiTuL = datestr(data1,'yyyy-mm-dd'); + tempoiniTuL = datestr(data1,'HH:MM:SS'); + NuovoZeroTuL = 0; + end + end + + if NuovoZeroTuL == 1 % scarico gli ultimi dati elaborati + NAN = 0; + while NAN == 0 + if datenum(datainiTuL) < datenum(date) + datainiTuL = date; + end + NTunnelLink = cell2mat(NodoTunnelLink(:,2)); + ii = 1; % contatore + col = 16; % contatore colonne + ay_TuL = zeros(rTuL,rI); + ay_TuL_AC = zeros(rTuL,rAC); + t_TuL = zeros(rTuL,rI); + t_TuL_AC = zeros(rTuL,rAC); + Condition = 0; + while ii <= rTuL + ini_col = col-15; + nN = num2str(NTunnelLink(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, Xstar, Zstar, HShift, HShift_local, T_node, Area, speed_local, acceleration_local from ElabDataView where EventDate = ''' ... + Data_scarico(1,1:10) ''' and EventTime >= ''' Data_scarico(1,12:end) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTuLd = curs.Data; + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, Xstar, Zstar, HShift, HShift_local, T_node, Area, speed_local, acceleration_local from ElabDataView where EventDate > ''' ... + Data_scarico(1,1:10) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTuL = curs.Data; + [~,c1] = size(DATnodoTuL); + [~,c2] = size(DATnodoTuLd); + if c1 == c2 + DATnodoTuL = [DATnodoTuLd; DATnodoTuL]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoTuL = DATnodoTuLd; + end + [rDAT,cDAT] = size(DATnodoTuL); + if rDAT==1 && cDAT==1 + clear DatiElabTunnelLink + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + Condition = 1; + break + else + if ii > 1 % Nodo successivo al primo + [rDE,~] = size(DatiElabTunnelLink); + if rDE ~= rDAT + clear DatiElabTunnelLink + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + Condition = 1; + break + end + end + DatiElabTunnelLink(:,ini_col:col) = DATnodoTuL(:,:); + end + col = col+16; + + % scarico ay della prima data: mi serve dopo! + % Nodi Standard + if ii < Nodo_AC + data1b = datestr(data1b,'yyyy-mm-dd'); + time1b = time; + comando = ['select Val1, Val6, Date, Time from RawDataView where Date = ''' ... + data1b ''' and Time >= ''' time1b ''' and ToolNameID = ''' ... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoAccY = curs.Data; + [rD,cD] = size(DATnodoAccY); + if cD > 1 + Date = datenum([cell2mat(DATnodoAccY(:,3)) repmat(' ', [rD,1]) cell2mat(DATnodoAccY(:,4))]); + % Elimino eventuali date doppie + a = 2; + while a <= rD + if Date(a,1) == Date(a-1,1) + Date(a,:) = []; + DATnodoAccY(a,:) = []; + rD = rD-1; + else + a = a+1; + end + end + % ay + dato = cellstr(DATnodoAccY(1,1))'; + ay_TuL(ii,:) = str2double(dato); + % T + dato = cellstr(DATnodoAccY(1,2))'; + t_TuL(ii,:) = str2double(dato); + end + else + % Nodi Arco Rovescio + data1c = datestr(date_AC,'yyyy-mm-dd'); + if datenum(data1c) < now + time1c = time_AC; + comando = ['select Val1, Val6, Date, Time from RawDataView where Date = ''' ... + data1c ''' and Time >= ''' time1c ''' and ToolNameID = ''' ... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoAccY = curs.Data; + [rD,cD] = size(DATnodoAccY); + if cD > 1 + Date = datenum([cell2mat(DATnodoAccY(:,3)) repmat(' ', [rD,1]) cell2mat(DATnodoAccY(:,4))]); + % Elimino eventuali date doppie + a = 2; + while a <= rD + if Date(a,1) == Date(a-1,1) + Date(a,:) = []; + DATnodoAccY(a,:) = []; + rD = rD-1; + else + a = a+1; + end + end + % ay + dato = cellstr(DATnodoAccY(:,1))'; + ay_TuL_AC(ii,:) = str2double(dato); + % T + dato = cellstr(DATnodoAccY(:,2))'; + t_TuL_AC(ii,:) = str2double(dato); + end + else + ay_TuL_AC = ay_TuL; + t_TuL_AC = t_TuL; + end + end + ii = ii+1; + end + + if Condition == 1 + datainiTuL = datenum(datainiTuL) - 1; + Data_scarico = datestr(datainiTuL,'yyyy-mm-dd HH:MM:SS'); + datainiTuL = Data_scarico; + fileID = fopen(FileName,'a'); + else + Check = isnan(cell2mat(DatiElabTunnelLink(1,3:16:end))); + for jj = 1:rTuL + if Check == 1 + datainiTuL = datenum(datainiTuL) - 1; + Data_scarico = datestr(datainiTuL,'yyyy-mm-dd HH:MM:SS'); + datainiTuL = Data_scarico; + break + else + NAN = 1; + end + end + end + end + text = 'Tunnel Link executed during LastElab function'; + fprintf(fileID,fmt,text); + else + DatiElabTunnelLink = []; + ay_TuL = []; + ay_TuL_AC = []; + t_TuL = []; + t_TuL_AC = []; + end +else + datainiTuL = []; + tempoiniTuL = []; + data1_AC = []; + DatiElabTunnelLink = []; + ay_TuL = []; + t_TuL = []; + ay_TuL_AC = []; + t_TuL_AC = []; + NuovoZeroTuL = 0; + margine = []; +end + +%% Radial Link +if yesRL == 1 % Importo ultimo dato elaborato dei Radial Link + NodeNumRL = num2str(cell2mat(NodoRadialLink(1,2))); % scarico i dati del primo nodo Radial Link + NodeType = 'Radial Link'; + + % Scarico il primo dato grezzo + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and time >= ''' time ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumRL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 % Non ci sono dati per la data date + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumRL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumRL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiRL = datestr(data1,'yyyy-mm-dd'); + tempoiniRL = datestr(data1,'HH:MM:SS'); + NuovoZeroRL = 0; + DatiElabRadialLink = []; + margine = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; % margine + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < 6 + cont = 6; + end + [rDS,~] = size(Data_numero); + if cont >= rDS + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); % aggiornare contatori + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiRL = datestr(data2,'yyyy-mm-dd'); + tempoiniRL = datestr(data2,'HH:MM:SS'); + NuovoZeroRL = 1; + else + datainiRL = datestr(data1,'yyyy-mm-dd'); + tempoiniRL = datestr(data1,'HH:MM:SS'); + NuovoZeroRL = 0; + end + end + + if NuovoZeroRL == 1 % scarico gli ultimi dati elaborati + NAN = 0; + while NAN == 0 + if datenum(datainiRL) < datenum(date) + datainiRL = date; + end + NRadialLink = cell2mat(NodoRadialLink(:,2)); + ii = 1; % contatore + col = 9; % contatore colonne + Condition = 0; + while ii <= rRL + ini_col = col-8; + nN = num2str(NRadialLink(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, T_node from ElabDataView where EventDate = ''' ... + Data_scarico(1,1:10) ''' and EventTime >= ''' Data_scarico(1,12:end) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRLd = curs.Data; + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, T_node from ElabDataView where EventDate > ''' ... + Data_scarico(1,1:10) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRL = curs.Data; + [~,c1] = size(DATnodoRL); + [~,c2] = size(DATnodoRLd); + if c1 == c2 + DATnodoRL = [DATnodoRLd; DATnodoRL]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoRL = DATnodoRLd; + end + [rDAT,cDAT] = size(DATnodoRL); + if rDAT==1 && cDAT==1 + clear DatiElabRadialLink + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + Condition = 1; + break + else + if ii > 1 % Nodo successivo al primo + [rDE,~] = size(DatiElabRadialLink); + if rDE ~= rDAT + clear DatiElabRadialLink + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + Condition = 1; + break + end + end + DatiElabRadialLink(:,ini_col:col) = DATnodoRL(:,:); + end + ii = ii+1; + col = col+9; + end + if Condition == 1 + datainiRL = datenum(datainiRL) - 1; + Data_scarico = datestr(datainiRL,'yyyy-mm-dd HH:MM:SS'); + datainiRL = Data_scarico; + fileID = fopen(FileName,'a'); + else + Check = isnan(cell2mat(DatiElabRadialLink(1,3:9:end))); + for jj = 1:rRL + if Check == 1 + datainiRL = datenum(datainiRL) - 1; + Data_scarico = datestr(datainiRL,'yyyy-mm-dd HH:MM:SS'); + datainiRL = Data_scarico; + break + else + NAN = 1; + end + end + end + end + text = 'Radial Link executed during LastElab function'; + fprintf(fileID,fmt,text); + else + DatiElabRadialLink = []; + end +else + datainiRL = []; + tempoiniRL = []; + DatiElabRadialLink = []; + NuovoZeroRL = 0; +end + +%% Tilt Link H +if yesTLH == 1 % Importo ultimo dato elaborato dei Tilt Link H + NodeNumTLH = num2str(cell2mat(NodoTiltLinkH(1,2))); % scarico i dati del primo nodo Tilt Link H + NodeType = 'Tilt Link H'; + + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and time >= ''' time ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumTLH ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 % Non ci sono dati per la data date + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumTLH ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumTLH ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiTLH = datestr(data1,'yyyy-mm-dd'); + tempoiniTLH = datestr(data1,'HH:MM:SS'); + NuovoZeroTLH = 0; + DatiElabTiltLinkH = []; + margine = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; % margine + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < 6 + cont = 6; + end + [rDS,~] = size(Data_numero); + if cont >= rDS + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); % aggiornare contatori + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiTLH = datestr(data2,'yyyy-mm-dd'); + tempoiniTLH = datestr(data2,'HH:MM:SS'); + NuovoZeroTLH = 1; + else + datainiTLH = datestr(data1,'yyyy-mm-dd'); + tempoiniTLH = datestr(data1,'HH:MM:SS'); + NuovoZeroTLH = 0; + end + end + + if NuovoZeroTLH == 1 % scarico gli ultimi dati elaborati + NAN = 0; + while NAN == 0 + if datenum(datainiTLH) < datenum(date) + datainiTLH = date; + end + NTiltLinkH = cell2mat(NodoTiltLinkH(:,2)); + ii = 1; % contatore + col = 13; % contatore colonne + Condition = 0; + while ii <= rTLH + ini_col = col-12; + nN = num2str(NTiltLinkH(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, YShift, ZShift, Y, Z, AlfaX, AlfaY, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate = ''' ... + Data_scarico(1,1:10) ''' and EventTime >= ''' Data_scarico(1,12:end) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHd = curs.Data; + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, YShift, ZShift, Y, Z, AlfaX, AlfaY, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate > ''' ... + Data_scarico(1,1:10) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLH = curs.Data; + [~,c1] = size(DATnodoTLH); + [~,c2] = size(DATnodoTLHd); + if c1 == c2 + DATnodoTLH = [DATnodoTLHd; DATnodoTLH]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoTLH = DATnodoTLHd; + end + [rDAT,cDAT] = size(DATnodoTLH); + if rDAT==1 && cDAT==1 + clear DatiElabTiltLinkH + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + Condition = 1; + break + else + if ii > 1 % Nodo successivo al primo + [rDE,~] = size(DatiElabTiltLinkH); + if rDE ~= rDAT + clear DatiElabTiltLinkH + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + Condition = 1; + break + end + end + DatiElabTiltLinkH(:,ini_col:col) = DATnodoTLH(:,:); + end + ii = ii+1; + col = col+13; + end + if Condition == 1 + datainiTLH = datenum(datainiTLH) - 1; + Data_scarico = datestr(datainiTLH,'yyyy-mm-dd HH:MM:SS'); + datainiTLH = Data_scarico; + fileID = fopen(FileName,'a'); + else + Check = isnan(cell2mat(DatiElabTiltLinkH(1,3:13:end))); + for jj = 1:rTLH + if Check == 1 + datainiTLH = datenum(datainiTLH) - 1; + Data_scarico = datestr(datainiTLH,'yyyy-mm-dd HH:MM:SS'); + datainiTLH = Data_scarico; + break + else + NAN = 1; + end + end + end + end + text = 'Tilt Link H executed during LastElab function'; + fprintf(fileID,fmt,text); + else + DatiElabTiltLinkH = []; + end +else + datainiTLH = []; + tempoiniTLH = []; + DatiElabTiltLinkH = []; + NuovoZeroTLH = 0; +end + +%% Tilt Link HR H +if yesTLHRH == 1 % Importo ultimo dato elaborato dei Tilt Link HR H + NodeNumTLHRH = num2str(cell2mat(NodoTiltLinkHRH(1,2))); % scarico i dati del primo nodo Tilt Link HR H + NodeType = 'Tilt Link HR H'; + + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and time >= ''' time ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumTLHRH ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 % Non ci sono dati per la data date + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumTLHRH ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumTLHRH ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiTLHRH = datestr(data1,'yyyy-mm-dd'); + tempoiniTLHRH = datestr(data1,'HH:MM:SS'); + NuovoZeroTLHRH = 0; + DatiElabTiltLinkHRH = []; + margine = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; % margine + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < 6 + cont = 6; + end + [rDS,~] = size(Data_numero); + if cont >= rDS + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); % aggiornare contatori + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiTLHRH = datestr(data2,'yyyy-mm-dd'); + tempoiniTLHRH = datestr(data2,'HH:MM:SS'); + NuovoZeroTLHRH = 1; + else + datainiTLHRH = datestr(data1,'yyyy-mm-dd'); + tempoiniTLHRH = datestr(data1,'HH:MM:SS'); + NuovoZeroTLHRH = 0; + end + end + + if NuovoZeroTLHRH == 1 % scarico gli ultimi dati elaborati + NAN = 0; + while NAN == 0 + if datenum(datainiTLHRH) < datenum(date) + datainiTLHRH = date; + end + NTiltLinkHRH = cell2mat(NodoTiltLinkHRH(:,2)); + ii = 1; % contatore + col = 13; % contatore colonne + Condition = 0; + while ii <= rTLH + ini_col = col-12; + nN = num2str(NTiltLinkHRH(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, YShift, ZShift, Y, Z, AlfaX, AlfaY, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate = ''' ... + Data_scarico(1,1:10) ''' and EventTime >= ''' Data_scarico(1,12:end) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHRHd = curs.Data; + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, YShift, ZShift, Y, Z, AlfaX, AlfaY, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate > ''' ... + Data_scarico(1,1:10) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHRH = curs.Data; + [~,c1] = size(DATnodoTLHRH); + [~,c2] = size(DATnodoTLHRHd); + if c1 == c2 + DATnodoTLHRH = [DATnodoTLHRHd; DATnodoTLHRH]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoTLHRH = DATnodoTLHRHd; + end + [rDAT,cDAT] = size(DATnodoTLHRH); + if rDAT==1 && cDAT==1 + clear DatiElabTiltLinkHR + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + Condition = 1; + break + else + if ii > 1 % Nodo successivo al primo + [rDE,~] = size(DatiElabTiltLinkHR); + if rDE ~= rDAT + clear DatiElabTiltLinkHR + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + Condition = 1; + break + end + end + DatiElabTiltLinkHRH(:,ini_col:col) = DATnodoTLHRH(:,:); + end + ii = ii+1; + col = col+13; + end + if Condition == 1 + datainiTLHRH = datenum(datainiTLHRH) - 1; + Data_scarico = datestr(datainiTLHRH,'yyyy-mm-dd HH:MM:SS'); + datainiTLHRH = Data_scarico; + fileID = fopen(FileName,'a'); + else + Check = isnan(cell2mat(DatiElabTiltLinkHRH(1,3:13:end))); + for jj = 1:rTLHRH + if Check == 1 + datainiTLHRH = datenum(datainiTLHRH) - 1; + Data_scarico = datestr(datainiTLHRH,'yyyy-mm-dd HH:MM:SS'); + datainiTLHRH = Data_scarico; + break + else + NAN = 1; + end + end + end + end + text = 'Tilt Link HR H executed during LastElab function'; + fprintf(fileID,fmt,text); + else + DatiElabTiltLinkHRH = []; + end +else + datainiTLHRH = []; + tempoiniTLHRH = []; + DatiElabTiltLinkHRH = []; + NuovoZeroTLHRH = 0; +end + +%% PreConv Link +if yesPCL == 1 % Importo ultimo dato elaborato dei PreConv Link + NodeNumPCL = num2str(cell2mat(NodoPreConvLink(1,2))); % scarico i dati del primo nodo PreConvLink + NodeType = 'PreConv Link'; + + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and time >= ''' time ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ' NodeNumPCL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 % Non ci sono dati per la data date + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ' NodeNumPCL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' NodeNumPCL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiPCL = datestr(data1,'yyyy-mm-dd'); + tempoiniPCL = datestr(data1,'HH:MM:SS'); + NuovoZeroPCL = 0; + DatiElabPreConvLink = []; + margine = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; % margine + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < 6 + cont = 6; + end + [rDS,~] = size(Data_numero); + if cont >= rDS + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); % aggiornare contatori + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiPCL = datestr(data2,'yyyy-mm-dd'); + tempoiniPCL = datestr(data2,'HH:MM:SS'); + NuovoZeroPCL = 1; + else + datainiPCL = datestr(data1,'yyyy-mm-dd'); + tempoiniPCL = datestr(data1,'HH:MM:SS'); + NuovoZeroPCL = 0; + end + end + + if NuovoZeroPCL == 1 % scarico gli ultimi dati elaborati + NAN = 0; + while NAN == 0 + if datenum(datainiPCL) < datenum(date) + datainiPCL = date; + end + NPreConvLink = cell2mat(NodoPreConvLink(:,2)); + ii = 1; % contatore + col = 13; % contatore colonne + Condition = 0; + while ii <= rPCL + ini_col = col-12; + nN = num2str(NPreConvLink(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, YShift, ZShift, Y, Z, AlfaX, AlfaY, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate = ''' ... + Data_scarico(1,1:10) ''' and EventTime >= ''' Data_scarico(1,12:end) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPCLd = curs.Data; + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, YShift, ZShift, Y, Z, AlfaX, AlfaY, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate > ''' ... + Data_scarico(1,1:10) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPCL = curs.Data; + [~,c1] = size(DATnodoPCL); + [~,c2] = size(DATnodoPCLd); + if c1 == c2 + DATnodoPCL = [DATnodoPCLd; DATnodoPCL]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoPCL = DATnodoPCLd; + end + [rDAT,cDAT] = size(DATnodoPCL); + if rDAT==1 && cDAT==1 + clear DatiElabPreConvLink + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + Condition = 1; + break + else + if ii > 1 % Nodo successivo al primo + [rDE,~] = size(DatiElabPreConvLink); + if rDE ~= rDAT + clear DatiElabPreConvLink + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + Condition = 1; + break + end + end + DatiElabPreConvLink(:,ini_col:col) = DATnodoPCL(:,:); + end + ii = ii+1; + col = col+13; + end + if Condition == 1 + datainiPCL = datenum(datainiPCL) - 1; + Data_scarico = datestr(datainiPCL,'yyyy-mm-dd HH:MM:SS'); + datainiPCL = Data_scarico; + fileID = fopen(FileName,'a'); + else + Check = isnan(cell2mat(DatiElabPreConvLink(1,3:13:end))); + for jj = 1:rPCL + if Check == 1 + datainiPCL = datenum(datainiPCL) - 1; + Data_scarico = datestr(datainiPCL,'yyyy-mm-dd HH:MM:SS'); + datainiPCL = Data_scarico; + break + else + NAN = 1; + end + end + end + end + text = 'PreConv Link executed during LastElab function'; + fprintf(fileID,fmt,text); + else + DatiElabPreConvLink = []; + end +else + datainiPCL = []; + tempoiniPCL = []; + DatiElabPreConvLink = []; + NuovoZeroPCL = 0; +end + +%% PreConv Link HR +if yesPCLHR == 1 % Importo ultimo dato elaborato dei PreConv Link HR + NodeNumPCLHR = num2str(cell2mat(NodoPreConvLinkHR(1,2))); % scarico i dati del primo nodo PreConvLinkHR + NodeType = 'PreConvLink HR'; + + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and time >= ''' time ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumPCLHR ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 % Non ci sono dati per la data date + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumPCLHR ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumPCLHR ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiPCLHR = datestr(data1,'yyyy-mm-dd'); + tempoiniPCLHR = datestr(data1,'HH:MM:SS'); + NuovoZeroPCLHR = 0; + DatiElabPreConvLinkHR = []; + margine = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; % margine + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < 6 + cont = 6; + end + [rDS,~] = size(Data_numero); + if cont >= rDS + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); % aggiornare contatori + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiPCLHR = datestr(data2,'yyyy-mm-dd'); + tempoiniPCLHR = datestr(data2,'HH:MM:SS'); + NuovoZeroPCLHR = 1; + else + datainiPCLHR = datestr(data1,'yyyy-mm-dd'); + tempoiniPCLHR = datestr(data1,'HH:MM:SS'); + NuovoZeroPCLHR = 0; + end + end + + if NuovoZeroPCLHR == 1 % scarico gli ultimi dati elaborati + NAN = 0; + while NAN == 0 + if datenum(datainiPCLHR) < datenum(date) + datainiPCLHR = date; + end + NPreConvLinkHR = cell2mat(NodoPreConvLinkHR(:,2)); + ii = 1; % contatore + col = 13; % contatore colonne + Condition = 0; + while ii <= rPCLHR + ini_col = col-12; + nN = num2str(NPreConvLinkHR(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, YShift, ZShift, Y, Z, AlfaX, AlfaY, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate = ''' ... + Data_scarico(1,1:10) ''' and EventTime >= ''' Data_scarico(1,12:end) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPCLHRd = curs.Data; + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, YShift, ZShift, Y, Z, AlfaX, AlfaY, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate > ''' ... + Data_scarico(1,1:10) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPCLHR = curs.Data; + [~,c1] = size(DATnodoPCLHR); + [~,c2] = size(DATnodoPCLHRd); + if c1 == c2 + DATnodoPCLHR = [DATnodoPCLHRd; DATnodoPCLHR]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoPCLHR = DATnodoPCLHRd; + end + [rDAT,cDAT] = size(DATnodoPCLHR); + if rDAT==1 && cDAT==1 + clear DatiElabPreConvLinkHR + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + Condition = 1; + break + else + if ii > 1 % Nodo successivo al primo + [rDE,~] = size(DatiElabPreConvLinkHR); + if rDE ~= rDAT + clear DatiElabPreConvLinkHR + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + Condition = 1; + break + end + end + DatiElabPreConvLinkHR(:,ini_col:col) = DATnodoPCLHR(:,:); + end + ii = ii+1; + col = col+13; + end + if Condition == 1 + datainiPCLHR = datenum(datainiPCLHR) - 1; + Data_scarico = datestr(datainiPCLHR,'yyyy-mm-dd HH:MM:SS'); + datainiPCLHR = Data_scarico; + fileID = fopen(FileName,'a'); + else + Check = isnan(cell2mat(DatiElabPreConvLinkHR(1,3:13:end))); + for jj = 1:rPCLHR + if Check == 1 + datainiPCLHR = datenum(datainiPCLHR) - 1; + Data_scarico = datestr(datainiPCLHR,'yyyy-mm-dd HH:MM:SS'); + datainiPCLHR = Data_scarico; + break + else + NAN = 1; + end + end + end + end + text = 'PreConv Link HR executed during LastElab function'; + fprintf(fileID,fmt,text); + else + DatiElabPreConvLinkHR = []; + end +else + datainiPCLHR = []; + tempoiniPCLHR = []; + DatiElabPreConvLinkHR = []; + NuovoZeroPCLHR = 0; +end + +%% DistoMT Link +if yesDM == 1 % Importo ultimo dato elaborato dei DistoMT Link + NodeNumDM = num2str(cell2mat(NodoDistoMTLink(1,2))); % scarico i dati del primo nodo di questo tipo + NodeType = 'DistoMT Link'; + + % Dati Grezzi + % --- Sezione --- + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and Time >= ''' time ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType ... + ''' and NodeNum =' NodeNumDM ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 % Non ci sono dati per la data "date" + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumDM ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + % Dati Elaborati + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumDM ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; % Data definita sul sito + data1a = datenum(Date); % Data definita sul sito + data1b = Data_num_ini(1); % Data del primo dato grezzo + % Nodi standard + if data1b > data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiDM = datestr(data1,'yyyy-mm-dd'); + tempoiniDM = datestr(data1,'HH:MM:SS'); + NuovoZeroDM = 0; + DatiElabDistoMTLink = []; + margine = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; % margine di n gg prima + + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < 6 + cont = 6; + end + [rDS,~] = size(Data_numero); + if cont >= rDS + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); % aggiornare contatori + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiDM = datestr(data2,'yyyy-mm-dd'); + tempoiniDM = datestr(data2,'HH:MM:SS'); + NuovoZeroDM = 1; %1 + else + datainiDM = datestr(data1,'yyyy-mm-dd'); + tempoiniDM = datestr(data1,'HH:MM:SS'); + NuovoZeroDM = 0; + end + end + + if NuovoZeroDM == 1 % scarico gli ultimi dati elaborati + NAN = 0; + while NAN == 0 + if datenum(datainiDM) < datenum(date) + datainiDM = date; + end + NDistoMTLink = cell2mat(NodoDistoMTLink(:,2)); + ii = 1; % contatore + col = 12; % contatore colonne + Condition = 0; + while ii <= rDM + ini_col = col-11; + nN = num2str(NDistoMTLink(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, ZShift, X, '... + 'Z, HShift, T_node, speed_local, acceleration_local, AlfaX, AlfaY '... + 'from ElabDataView where EventDate = ''' Data_scarico(1,1:10) ... + ''' and EventTime >= ''' Data_scarico(1,12:end) ''' and UnitName = '''... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoDLd = curs.Data; + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, ZShift, X, '... + 'Z, HShift, T_node, speed_local, acceleration_local, AlfaX, AlfaY '... + 'from ElabDataView where EventDate > ''' Data_scarico(1,1:10) ... + ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoDM = curs.Data; + [~,c1] = size(DATnodoDM); + [~,c2] = size(DATnodoDMd); + if c1 == c2 + DATnodoDM = [DATnodoDMd; DATnodoDM]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoDM = DATnodoDMd; + end + [rDAT,cDAT] = size(DATnodoDM); + if rDAT==1 && cDAT==1 + clear DatiElabDistoMTLink + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + Condition = 1; + break + else + if ii > 1 % Nodo successivo al primo + [rDE,~] = size(DatiElabDistoMTLink); + if rDE ~= rDAT + clear DatiElabDistoMTLink + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + Condition = 1; + break + end + end + DatiElabDistoMTLink(:,ini_col:col) = DATnodoDM(:,:); + end + col = col+12; + ii = ii+1; + end + + if Condition == 1 + datainiDM = datenum(datainiDM) - 1; + Data_scarico = datestr(datainiDM,'yyyy-mm-dd HH:MM:SS'); + datainiDM = Data_scarico; + fileID = fopen(FileName,'a'); + else + Check = isnan(cell2mat(DatiElabDistoMTLink(1,3:16:end))); + for jj = 1:rTuL + if Check == 1 + datainiDM = datenum(datainiDM) - 1; + Data_scarico = datestr(datainiDM,'yyyy-mm-dd HH:MM:SS'); + datainiDM = Data_scarico; + break + else + NAN = 1; + end + end + end + end + text = 'DistoMT Link executed during LastElab function'; + fprintf(fileID,fmt,text); + else + DatiElabDistoMTLink = []; + end +else + datainiDM = []; + tempoiniDM = []; + DatiElabDistoMTLink = []; + NuovoZeroDM = 0; +end + +%% Pressure Link +if yesPL == 1 % Importo ultimo dato elaborato dei Pressure Link + NodeNumPL = num2str(cell2mat(NodoPressureLink(1,2))); % scarico i dati del primo nodo Pressure Link + NodeType = 'Pressure Link'; + + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and time >= ''' time ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumPL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 % Non ci sono dati per la data date + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumPL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumPL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiPL = datestr(data1,'yyyy-mm-dd'); + tempoiniPL = datestr(data1,'HH:MM:SS'); + margine = 0; + NuovoZeroPrL = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; % margine + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < 6 + cont = 6; + end + [rDS,~] = size(Data_numero); + if cont >= rDS + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); % aggiornare contatori + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiPL = datestr(data2,'yyyy-mm-dd'); + tempoiniPL = datestr(data2,'HH:MM:SS'); + else + datainiPL = datestr(data1,'yyyy-mm-dd'); + tempoiniPL = datestr(data1,'HH:MM:SS'); + end + NuovoZeroPrL = 1; + end + text = 'Pressure Link executed during LastElab function'; + fprintf(fileID,fmt,text); +else + datainiPL = []; + tempoiniPL = []; + NuovoZeroPrL = 0; +end + +%% Load Link +if yesLL == 1 % Importo ultimo dato elaborato dei Load Link + NodeNumLL = num2str(cell2mat(NodoLoadLink(1,2))); % scarico i dati del primo nodo Load Link + NodeType = 'Load Link'; + + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and time >= ''' time ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumLL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 % Non ci sono dati per la data date + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumLL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumLL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiLL = datestr(data1,'yyyy-mm-dd'); + tempoiniLL = datestr(data1,'HH:MM:SS'); + margine = 0; + NuovoZeroLL = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; % margine + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < 6 + cont = 6; + end + [rDS,~] = size(Data_numero); + if cont >= rDS + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); % aggiornare contatori + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiLL = datestr(data2,'yyyy-mm-dd'); + tempoiniLL = datestr(data2,'HH:MM:SS'); + else + datainiLL = datestr(data1,'yyyy-mm-dd'); + tempoiniLL = datestr(data1,'HH:MM:SS'); + end + NuovoZeroLL = 1; + end + text = 'Load Link executed during LastElab function'; + fprintf(fileID,fmt,text); +else + datainiLL = []; + tempoiniLL = []; + NuovoZeroLL = 0; +end + +%% Extensometer Link +if yesEL == 1 % Importo ultimo dato elaborato dei Extensometer Link + NodeNumEL = num2str(cell2mat(NodoExtensometerLink(1,2))); % scarico i dati del primo nodo Extensometer Link + NodeType = 'Extensometer Link'; + + % Dati Grezzi + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and Time >= ''' time ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumEL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 % Non ci sono dati per la data "date" + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumEL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + % Dati elaborati + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumEL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + Date_Rif_EL = Data_num_ini(1); + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiEL = datestr(data1,'yyyy-mm-dd'); + tempoiniEL = datestr(data1,'HH:MM:SS'); + margine = 0; + NuovoZeroEL = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; % margine + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < 6 + cont = 6; + end + [rDS,~] = size(Data_numero); + if cont >= rDS + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); % aggiornare contatori + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiEL = datestr(data2,'yyyy-mm-dd'); + tempoiniEL = datestr(data2,'HH:MM:SS'); + else + datainiEL = datestr(data1,'yyyy-mm-dd'); + tempoiniEL = datestr(data2,'HH:MM:SS'); + end + NuovoZeroEL = 1; + end + text = 'Extensometer Link executed during LastElab function'; + fprintf(fileID,fmt,text); +else + datainiEL = []; + tempoiniEL = []; + Date_Rif_EL = []; + NuovoZeroEL = 0; +end + +%% 3D Extensometer Link +if yes3DEL == 1 % Importo ultimo dato elaborato dei 3D Extensometer Link + NodeNum3DEL = num2str(cell2mat(Nodo3DExtensometerLink(1,2))); % scarico i dati del primo nodo 3D Extensometer Link + NodeType = '3D Extensometer Link'; + + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and time >= ''' time ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNum3DEL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 % Non ci sono dati per la data date + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNum3DEL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNum3DEL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + Date_Rif_3DEL = Data_num_ini(1); + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + dataini3DEL = datestr(data1,'yyyy-mm-dd'); + tempoini3DEL = datestr(data1,'HH:MM:SS'); + margine = 0; + NuovoZero3DEL = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; % margine + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < 6 + cont = 6; + end + [rDS,~] = size(Data_numero); + if cont >= rDS + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); % aggiornare contatori + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + dataini3DEL = datestr(data2,'yyyy-mm-dd'); + tempoini3DEL = datestr(data2,'HH:MM:SS'); + else + dataini3DEL = datestr(data1,'yyyy-mm-dd'); + tempoini3DEL = datestr(data1,'HH:MM:SS'); + end + end + text = '3D Extensometer Link executed during LastElab function'; + fprintf(fileID,fmt,text); + NuovoZero3DEL = 1; +else + dataini3DEL = []; + tempoini3DEL = []; + Date_Rif_3DEL = []; + NuovoZero3DEL = 0; +end + +%% Wire Extensometer Link +if yesWEL == 1 % Importo ultimo dato elaborato dei Wire Extensometer Link + NodeNumWEL = num2str(cell2mat(NodoWireExtensometerLink(1,2))); % scarico i dati del primo nodo Wire Extensometer Link + NodeType = 'Wire Extensometer Link'; + + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and time >= ''' time ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumWEL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 % Non ci sono dati per la data date + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumWEL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumWEL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiWEL = datestr(data1,'yyyy-mm-dd'); + tempoiniWEL = datestr(data1,'HH:MM:SS'); + margine = 0; + NuovoZeroWEL = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; % margine + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < 6 + cont = 6; + end + [rDS,~] = size(Data_numero); + if cont >= rDS + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); % aggiornare contatori + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiWEL = datestr(data2,'yyyy-mm-dd'); + tempoiniWEL = datestr(data2,'HH:MM:SS'); + else + datainiWEL = datestr(data1,'yyyy-mm-dd'); + tempoiniWEL = datestr(data1,'HH:MM:SS'); + end + NuovoZeroWEL = 1; + end + text = 'Wire Extensometer Link executed during LastElab function'; + fprintf(fileID,fmt,text); +else + datainiWEL = []; + tempoiniWEL = []; + NuovoZeroWEL = 0; +end + +%% Multi Point Borehole Extensometer Link +if yesMPBEL == 1 % Importo ultimo dato elaborato dei Multi Point Borehole Extensometer Link + NodeNumMPBEL = num2str(cell2mat(NodoMultiPointRodExtensometer(1,2))); % scarico i dati del primo nodo MultiPoint Rod Extensometer + NodeType = 'Multipoint borehole rod extensometer'; + + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and time >= ''' time ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ' NodeNumMPBEL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 % Non ci sono dati per la data date + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ' NodeNumMPBEL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumMPBEL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiMPBEL = datestr(data1,'yyyy-mm-dd'); + tempoiniMPBEL = datestr(data1,'HH:MM:SS'); + margine = 0; + NuovoZeroMPBEL = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; % margine + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < 6 + cont = 6; + end + [rDS,~] = size(Data_numero); + if cont >= rDS + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); % aggiornare contatori + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiMPBEL = datestr(data2,'yyyy-mm-dd'); + tempoiniMPBEL = datestr(data2,'HH:MM:SS'); + else + datainiMPBEL = datestr(data1,'yyyy-mm-dd'); + tempoiniMPBEL = datestr(data1,'HH:MM:SS'); + end + end + NuovoZeroMPBEL = 1; +else + datainiMPBEL = []; + tempoiniMPBEL = []; + NuovoZeroMPBEL = 0; +end + +%% Analog Link +if yesAL == 1 % Importo ultimo dato elaborato dei Analog Link + AnalogCh = cell2mat(NodoAnalogLink(:,5)); + NodeNumAL = num2str(cell2mat(NodoAnalogLink(1,2))); % scarico i dati del primo nodo Analog Link + NodeType = 'Analog Link'; + + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and time >= ''' time ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumAL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 % Non ci sono dati per la data date + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumAL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumAL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiAL = datestr(data1,'yyyy-mm-dd'); + tempoiniAL = datestr(data1,'HH:MM:SS'); + NuovoZeroAL = 0; + DatiElabAnalogLink = []; + margine = 0; + NuovoZeroAL = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; % margine + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < 6 + cont = 6; + end + [rDS,~] = size(Data_numero); + if cont >= rDS + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); % aggiornare contatori + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiAL = datestr(data2,'yyyy-mm-dd'); + tempoiniAL = datestr(data2,'HH:MM:SS'); + NuovoZeroAL = 1; + else + datainiAL = datestr(data1,'yyyy-mm-dd'); + tempoiniAL = datestr(data1,'HH:MM:SS'); + NuovoZeroAL = 0; + end + end + + if NuovoZeroAL == 1 % scarico gli ultimi dati elaborati + NAN = 0; + while NAN == 0 + NAnalogLink = cell2mat(NodoAnalogLink(:,2)); + ii = 1; % contatore + n = 1; + col = 2+AnalogCh(1,1); % contatore colonne + while ii <= rAL + ini_col = col-AnalogCh(n,1)-1; + nN = num2str(NAnalogLink(ii,1)); + if AnalogCh == 1 + comando = ['select EventDate, EventTime, XShift from ElabDataView where EventDate = ''' ... + Data_scarico ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + elseif AnalogCh == 2 + comando = ['select EventDate, EventTime, XShift, YShift from ElabDataView where EventDate = ''' ... + Data_scarico ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + elseif AnalogCh == 3 + comando = ['select EventDate, EventTime, XShift, YShift, ZShift from ElabDataView where EventDate = ''' ... + Data_scarico ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + elseif AnalogCh == 4 + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X from ElabDataView where EventDate = ''' ... + Data_scarico ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + elseif AnalogCh == 5 + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y from ElabDataView where EventDate = ''' ... + Data_scarico ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + elseif AnalogCh == 6 + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z from ElabDataView where EventDate = ''' ... + Data_scarico ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + end + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoAL = curs.Data; + DatiElabAnalogLink(:,ini_col:col) = DATnodoAL(:,:); + ii = ii+1; + if ii < rAL % non è l'ultimo sensore + if AnalogCh(n+1,1) == 1 + col = col+3; + elseif AnalogCh(n+1,1) == 2 + col = col+4; + elseif AnalogCh(n+1,1) == 3 + col = col+5; + elseif AnalogCh(n+1,1) == 4 + col = col+6; + elseif AnalogCh(n+1,1) == 5 + col = col+7; + elseif AnalogCh(n+1,1) == 6 + col = col+8; + end + end + + if AnalogCh(n+1,1) == 1 + Check = isnan(cell2mat(DatiElabTiltLinkHRH(1,3:3:end))); + elseif AnalogCh(n+1,1) == 2 + Check = isnan(cell2mat(DatiElabTiltLinkHRH(1,3:4:end))); + elseif AnalogCh(n+1,1) == 3 + Check = isnan(cell2mat(DatiElabTiltLinkHRH(1,3:5:end))); + elseif AnalogCh(n+1,1) == 4 + Check = isnan(cell2mat(DatiElabTiltLinkHRH(1,3:6:end))); + elseif AnalogCh(n+1,1) == 5 + Check = isnan(cell2mat(DatiElabTiltLinkHRH(1,3:7:end))); + elseif AnalogCh(n+1,1) == 6 + Check = isnan(cell2mat(DatiElabTiltLinkHRH(1,3:8:end))); + end + + for jj = 1:rAL + if Check == 1 + datainiAL = datenum(datainiAL) - 1; + Data_scarico = datestr(datainiAL,'yyyy-mm-dd HH:MM:SS'); + datainiAL = Data_scarico; + break + else + NAN = 1; + end + end + end + end + text = 'Analog Link executed during LastElab function'; + fprintf(fileID,fmt,text); + else + DatiElabAnalogLink = []; + end + else + datainiAL = []; + tempoiniAL = []; + DatiElabAnalogLink = []; + NuovoZeroAL = 0; +end + +%% Crack Link +if yesCrL == 1 % Importo ultimo dato elaborato dei Crack Link + NodeNumCrL = num2str(cell2mat(NodoCrackLink(1,2))); % scarico i dati del primo nodo Crack Link + NodeType = 'Crack Link'; + + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and time >= ''' time ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumCrL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 % Non ci sono dati per la data date + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumCrL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumCrL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiCrL = datestr(data1,'yyyy-mm-dd'); + tempoiniCrL = datestr(data1,'HH:MM:SS'); + NuovoZeroCrL = 0; + margine = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; % margine + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < 6 + cont = 6; + end + [rDS,~] = size(Data_numero); + if cont >= rDS + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); % aggiornare contatori + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiCrL = datestr(data2,'yyyy-mm-dd'); + tempoiniCrL = datestr(data2,'HH:MM:SS'); + else + datainiCrL = datestr(data1,'yyyy-mm-dd'); + tempoiniCrL = datestr(data1,'HH:MM:SS'); + end + NuovoZeroCrL = 1; + end + text = 'Crack Link executed during LastElab function'; + fprintf(fileID,fmt,text); +else + datainiCrL = []; + tempoiniCrL = []; + NuovoZeroCrL = 0; +end + +%% 3D Crack Link +if yes3DCrL == 1 % Importo ultimo dato elaborato dei 3D Crack Link + NodeNum3DCrL = num2str(cell2mat(Nodo3DCrackLink(1,2))); % scarico i dati del primo nodo Crack Link + NodeType = '3D Crack Link'; + + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and time >= ''' time ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNum3DCrL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 % Non ci sono dati per la data date + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNum3DCrL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNum3DCrL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + dataini3DCrL = datestr(data1,'yyyy-mm-dd'); + tempoini3DCrL = datestr(data1,'HH:MM:SS'); + margine = 0; + NuovoZero3DCrL = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; % margine + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < 6 + cont = 6; + end + [rDS,~] = size(Data_numero); + if cont >= rDS + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); % aggiornare contatori + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + dataini3DCrL = datestr(data2,'yyyy-mm-dd'); + tempoini3DCrL = datestr(data2,'HH:MM:SS'); + else + dataini3DCrL = datestr(data1,'yyyy-mm-dd'); + tempoini3DCrL = datestr(data1,'HH:MM:SS'); + end + NuovoZero3DCrL = 1; + end + text = '3D Crack Link executed during LastElab function'; + fprintf(fileID,fmt,text); +else + dataini3DCrL = []; + tempoini3DCrL = []; + NuovoZero3DCrL = 0; +end + +%% 2D Crack Link +if yes2DCrL == 1 % Importo ultimo dato elaborato dei 2D Crack Link + NodeNum2DCrL = num2str(cell2mat(Nodo2DCrackLink(1,2))); % scarico i dati del primo nodo 2D Crack Link + NodeType = '2D Crack Link'; + + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and time >= ''' time ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNum2DCrL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 % Non ci sono dati per la data date + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNum2DCrL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNum2DCrL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + dataini2DCrL = datestr(data1,'yyyy-mm-dd'); + tempoini2DCrL = datestr(data1,'HH:MM:SS'); + margine = 0; + NuovoZero2DCrL = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; % margine + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < 6 + cont = 6; + end + [rDS,~] = size(Data_numero); + if cont >= rDS + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); % aggiornare contatori + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + dataini2DCrL = datestr(data2,'yyyy-mm-dd'); + tempoini2DCrL = datestr(data2,'HH:MM:SS'); + else + dataini2DCrL = datestr(data1,'yyyy-mm-dd'); + tempoini2DCrL = datestr(data1,'HH:MM:SS'); + end + NuovoZero2DCrL = 1; + end + text = '2D Crack Link executed during LastElab function'; + fprintf(fileID,fmt,text); +else + dataini2DCrL = []; + tempoini2DCrL = []; + NuovoZero2DCrL = 0; +end + +%% Stress Meter +if yesSM == 1 % Importo ultimo dato elaborato dei Stress Meter + NodeNumSM = num2str(cell2mat(NodoStressMeter(1,2))); % scarico i dati del primo nodo + NodeType = 'Stress Meter'; + + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and time >= ''' time ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumSM ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 % Non ci sono dati per la data date + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumSM ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + Date_Rif_SM = Data_num_ini(1); + + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumSM ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiSM = datestr(data1,'yyyy-mm-dd'); + tempoiniSM = datestr(data1,'HH:MM:SS'); + margine = 0; + NuovoZeroSM = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; % margine + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < 6 + cont = 6; + end + [rDS,~] = size(Data_numero); + if cont >= rDS + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); % aggiornare contatori + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiSM = datestr(data2,'yyyy-mm-dd'); + tempoiniSM = datestr(data2,'HH:MM:SS'); + else + datainiSM = datestr(data1,'yyyy-mm-dd'); + tempoiniSM = datestr(data1,'HH:MM:SS'); + end + NuovoZeroSM = 1; + end + text = 'Stress Meter executed during LastElab function'; + fprintf(fileID,fmt,text); +else + datainiSM = []; + tempoiniSM = []; + Date_Rif_SM = []; + NuovoZeroSM = 0; +end + +text = 'LastElab function worked correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/LastElab_bisAL.m b/ATD/LastElab_bisAL.m new file mode 100755 index 0000000..c0a6ab2 --- /dev/null +++ b/ATD/LastElab_bisAL.m @@ -0,0 +1,45 @@ +function DatiElabAnalogLink = LastElab_bisAL(conn,NodoAnalogLink,rAL,... + datainiAL,tempoiniAL,IDcentralina,DTcatena,FileName) + +text = 'LastElab_bisAL function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +NAnalogLink = cell2mat(NodoAnalogLink(:,2)); +NodeType = 'Analog Link'; +ii = 1; % contatore +col = 8; % contatore colonne +while ii <= rAL + ini_col = col-7; + nN = num2str(NAnalogLink(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z from ElabDataView where EventDate = ''' ... + datainiAL ''' and EventTime >= ''' tempoiniAL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoALd = curs.Data; + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z from ElabDataView where EventDate > ''' ... + datainiAL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoAL = curs.Data; + [~,c1] = size(DATnodoAL); + [~,c2] = size(DATnodoALd); + if c1 == c2 + DATnodoAL = [DATnodoALd; DATnodoAL]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoAL = DATnodoALd; + end + DatiElabAnalogLink(:,ini_col:col) = DATnodoAL(:,:); + col = col+8; + ii = ii+1; +end + +text = 'LastElab_bisAL function worked correctly for Analog Link'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/LastElab_bisPCL.m b/ATD/LastElab_bisPCL.m new file mode 100755 index 0000000..12d2ce0 --- /dev/null +++ b/ATD/LastElab_bisPCL.m @@ -0,0 +1,45 @@ +function DatiElabPreConvLink = LastElab_bisPCL(conn,NodoPreConvLink,rPCL,... + datainiPCL,tempoiniPCL,IDcentralina,DTcatena,FileName) + +text = 'LastElab_bisPCL function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +NPreConvLink = cell2mat(NodoPreConvLink(:,2)); +NodeType = 'PreConv Link'; +ii = 1; % contatore +col = 13; % contatore colonne +while ii <= rPCL + ini_col = col-12; + nN = num2str(NPreConvLink(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, YShift, ZShift, Y, Z, AlfaX, AlfaY, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate = ''' ... + datainiPCL ''' and EventTime >= ''' tempoiniPCL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPCLd = curs.Data; + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, YShift, ZShift, Y, Z, AlfaX, AlfaY, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate > ''' ... + datainiPCL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPCL = curs.Data; + [~,c1] = size(DATnodoPCL); + [~,c2] = size(DATnodoPCLd); + if c1 == c2 + DATnodoPCL = [DATnodoPCLd; DATnodoPCL]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoPCL = DATnodoPCLd; + end + DatiElabPreConvLink(:,ini_col:col) = DATnodoPCL(:,:); + col = col+13; + ii = ii+1; +end + +text = 'LastElab_bisPCL function worked correctly for PreConv Link'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/LastElab_bisPCLHR.m b/ATD/LastElab_bisPCLHR.m new file mode 100755 index 0000000..dd62f97 --- /dev/null +++ b/ATD/LastElab_bisPCLHR.m @@ -0,0 +1,45 @@ +function DatiElabPreConvLinkHR = LastElab_bisPCLHR(conn,NodoPreConvLinkHR,rPCLHR,... + datainiPCLHR,tempoiniPCLHR,IDcentralina,DTcatena,FileName) + +text = 'LastElab_bisPCLHR function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +NPreConvLinkHR = cell2mat(NodoPreConvLinkHR(:,2)); +NodeType = 'PreConv Link HR'; +ii = 1; % contatore +col = 13; % contatore colonne +while ii <= rPCLHR + ini_col = col-12; + nN = num2str(NPreConvLinkHR(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, YShift, ZShift, Y, Z, AlfaX, AlfaY, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate = ''' ... + datainiPCLHR ''' and EventTime >= ''' tempoiniPCLHR ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPCLHRd = curs.Data; + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, YShift, ZShift, Y, Z, AlfaX, AlfaY, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate > ''' ... + datainiPCLHR ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPCLHR = curs.Data; + [~,c1] = size(DATnodoPCLHR); + [~,c2] = size(DATnodoPCLHRd); + if c1 == c2 + DATnodoPCLHR = [DATnodoPCLHRd; DATnodoPCLHR]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoPCLHR = DATnodoPCLHRd; + end + DatiElabPreConvLinkHR(:,ini_col:col) = DATnodoPCLHR(:,:); + col = col+13; + ii = ii+1; +end + +text = 'LastElab_bisPCLHR function worked correctly for PreConv Link HR'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/LastElab_bisRL.m b/ATD/LastElab_bisRL.m new file mode 100755 index 0000000..504c614 --- /dev/null +++ b/ATD/LastElab_bisRL.m @@ -0,0 +1,45 @@ +function DatiElabRadialLink = LastElab_bisRL(conn,NodoRadialLink,rRL,... + datainiRL,tempoiniRL,IDcentralina,DTcatena,FileName) + +text = 'LastElab_bisRL function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +NRadialLink = cell2mat(NodoRadialLink(:,2)); +NodeType = 'Radial Link'; +ii = 1; % contatore +col = 9; % contatore colonne +while ii <= rRL + ini_col = col-8; + nN = num2str(NRadialLink(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, T_node from ElabDataView where EventDate = ''' ... + datainiRL ''' and EventTime >= ''' tempoiniRL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRLd = curs.Data; + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, T_node from ElabDataView where EventDate > ''' ... + datainiRL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRL = curs.Data; + [~,c1] = size(DATnodoRL); + [~,c2] = size(DATnodoRLd); + if c1 == c2 + DATnodoRL = [DATnodoRLd; DATnodoRL]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoRL = DATnodoRLd; + end + DatiElabRadialLink(:,ini_col:col) = DATnodoRL(:,:); + col = col+9; + ii = ii+1; +end + +text = 'LastElab_bisRL function worked correctly for Radial Link'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/LastElab_bisTLH.m b/ATD/LastElab_bisTLH.m new file mode 100755 index 0000000000000000000000000000000000000000..57972cf8c64f3a8cfef216f53d1868c5168aa329 GIT binary patch literal 1936 zcmeH@&uYUk490gh_#J#HNx%fw-4=SwMhYRP90x;n91wHt;Aqgj{p4;f>z=_niBF&Y z{pL?^2!mHG5WYA#jp(RH|Iw*~>S3d#y`OL!`>r&>dp(3H+)O&MuIsv%LUBw$fF6@Z zc3H!3er%2P6v3ef-Hryxa`KAK4zSot3Mt5*i8mJiR;u}W-$oG0PDLZd%#FvE-E&y2 zFRycS0Y#O{%VpATQ*ZHNUn6>&%bzyQWj^jq$tuNgdxhs2>)d_;D(`+QpY^_~8pY-? z+3{<&>Cn`t5-8QBC5S9OHfpCB5&?y1r7*!I_32J#gA4v4M<$R7WCEE$Ch&*AH?U)O A-T(jq literal 0 HcmV?d00001 diff --git a/ATD/LastElab_bisTLHRH.m b/ATD/LastElab_bisTLHRH.m new file mode 100755 index 0000000..c5b77c8 --- /dev/null +++ b/ATD/LastElab_bisTLHRH.m @@ -0,0 +1,45 @@ +function DatiElabTiltLinkHRH = LastElab_bisTLHRH(conn,NodoTiltLinkHRH,rTLHRH,... + datainiTLHRH,tempoiniTLHRH,IDcentralina,DTcatena,FileName) + +text = 'LastElab_bisTLHRH function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +NTiltLinkHRH = cell2mat(NodoTiltLinkHRH(:,2)); +NodeType = 'Tilt Link HR H'; +ii = 1; % contatore +col = 13; % contatore colonne +while ii <= rTLHRH + ini_col = col-12; + nN = num2str(NTiltLinkHRH(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, YShift, ZShift, Y, Z, AlfaX, AlfaY, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate = ''' ... + datainiTLHRH ''' and EventTime >= ''' tempoiniTLHRH ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHRHd = curs.Data; + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, YShift, ZShift, Y, Z, AlfaX, AlfaY, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate > ''' ... + datainiTLHRH ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHRH = curs.Data; + [~,c1] = size(DATnodoTLHRH); + [~,c2] = size(DATnodoTLHRHd); + if c1 == c2 + DATnodoTLHRH = [DATnodoTLHRHd; DATnodoTLHRH]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoTLHRH = DATnodoTLHRHd; + end + DatiElabTiltLinkHRH(:,ini_col:col) = DATnodoTLHRH(:,:); + col = col+13; + ii = ii+1; +end + +text = 'LastElab_bisTLHRH function worked correctly for Tilt Link HR H'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/LastElab_bisTuL.m b/ATD/LastElab_bisTuL.m new file mode 100755 index 0000000..6af2f82 --- /dev/null +++ b/ATD/LastElab_bisTuL.m @@ -0,0 +1,45 @@ +function DatiElabTunnelLink = LastElab_bisTuL(conn,NodoTunnelLink,rTuL,... + datainiTuL,tempoiniTuL,IDcentralina,DTcatena,FileName) + +text = 'LastElab_bisTuL function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +NTunnelLink = cell2mat(NodoTunnelLink(:,2)); +NodeType = 'Tunnel Link'; +ii = 1; % contatore +col = 16; % contatore colonne +while ii <= rTuL + ini_col = col-15; + nN = num2str(NTunnelLink(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, Xstar, Zstar, HShift, HShift_local, T_node, Area, speed_local, acceleration_local from ElabDataView where EventDate = ''' ... + datainiTuL ''' and EventTime >= ''' tempoiniTuL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTuLd = curs.Data; + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, Xstar, Zstar, HShift, HShift_local, T_node, Area, speed_local, acceleration_local from ElabDataView where EventDate > ''' ... + datainiTuL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTuL = curs.Data; + [~,c1] = size(DATnodoTuL); + [~,c2] = size(DATnodoTuLd); + if c1 == c2 + DATnodoTuL = [DATnodoTuLd; DATnodoTuL]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoTuL = DATnodoTuLd; + end + DatiElabTunnelLink(:,ini_col:col) = DATnodoTuL(:,:); + col = col+16; + ii = ii+1; +end + +text = 'LastElab_bisTuL function worked correctly for Tunnel Link'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/MediaDati_2DCrL.m b/ATD/MediaDati_2DCrL.m new file mode 100755 index 0000000..a6d176f --- /dev/null +++ b/ATD/MediaDati_2DCrL.m @@ -0,0 +1,28 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per i Wire Extensometer Link +% DatiWireExtensometer contiene le medie per l'intervallo definito +% ARRAYdate contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [ARRAYdate_2DCrL,Dati2DCrack] = MediaDati_2DCrL(Dati2DCrack,Time2DCrL,NdatiMedia,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'MediaDati_2DCrL function started'; +fprintf(fileID,fmt,text); + +[r,~]=size(Dati2DCrack); +if NdatiMedia > r + NdatiMedia = r; +end + +%% Matrice date +ARRAYdate_2DCrL = Time2DCrL; + +%% Dati +Dati2DCrack = smoothdata(Dati2DCrack,'gaussian',NdatiMedia); + +text = 'Average values for 2D Crack Link processed. MediaDati_2DCrL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/MediaDati_3DCrL.m b/ATD/MediaDati_3DCrL.m new file mode 100755 index 0000000..e92bdf7 --- /dev/null +++ b/ATD/MediaDati_3DCrL.m @@ -0,0 +1,28 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per i Wire Extensometer Link +% DatiWireExtensometer contiene le medie per l'intervallo definito +% ARRAYdate contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [ARRAYdate_3DCrL,Dati3DCrack] = MediaDati_3DCrL(Dati3DCrack,Time3DCrL,NdatiMedia,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'MediaDati_3DCrL function started'; +fprintf(fileID,fmt,text); + +[r,~]=size(Dati3DCrack); +if NdatiMedia > r + NdatiMedia = r; +end + +%% Matrice date +ARRAYdate_3DCrL = Time3DCrL; + +%% Dati +Dati3DCrack = smoothdata(Dati3DCrack,'gaussian',NdatiMedia); + +text = 'Average values for 3D Crack Link processed. MediaDati_3DCrL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/MediaDati_3DEL.m b/ATD/MediaDati_3DEL.m new file mode 100755 index 0000000..98bd884 --- /dev/null +++ b/ATD/MediaDati_3DEL.m @@ -0,0 +1,28 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per i 3D Extensometer Link +% DatiExtensometer3D contiene le medie per l'intervallo definito +% ARRAYdate contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [ARRAYdate_3DEL,DatiExtensometer3D] = MediaDati_3DEL(DatiExtensometer3D,Time3DEL,NdatiMedia,FileName) + +text = 'MediaDati_3DEL function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +[r,~]=size(DatiExtensometer3D); +if NdatiMedia > r + NdatiMedia = r; +end + +%% Matrice date +ARRAYdate_3DEL = Time3DEL; + +%% Accelerazione +DatiExtensometer3D = smoothdata(DatiExtensometer3D,'gaussian',NdatiMedia); + +text = 'Average values for 3D Extensometer Link have been processed. MediaDati_3DEL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/MediaDati_AL.m b/ATD/MediaDati_AL.m new file mode 100755 index 0000000..52d9157 --- /dev/null +++ b/ATD/MediaDati_AL.m @@ -0,0 +1,28 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per gli Analog Link +% DatiAnalogLink contiene le medie per l'intervallo definito +% ARRAYdate contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [ARRAYdate_AL,DatiAnalog] = MediaDati_AL(DatiAnalog,TimeAL,NdatiMedia,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'MediaDati_AL function started'; +fprintf(fileID,fmt,text); + +[r,~]=size(DatiAnalog); +if NdatiMedia > r + NdatiMedia = r; +end + +%% Dati +DatiAnalog = smoothdata(DatiAnalog,'gaussian',NdatiMedia); + +%% Matrice date +ARRAYdate_AL = TimeAL; + +text = 'Average values for Analog Link processed. MediaDati_AL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/MediaDati_CrL.m b/ATD/MediaDati_CrL.m new file mode 100755 index 0000000..07e4604 --- /dev/null +++ b/ATD/MediaDati_CrL.m @@ -0,0 +1,28 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per i Wire Extensometer Link +% DatiWireExtensometer contiene le medie per l'intervallo definito +% ARRAYdate contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [ARRAYdate_CrL,DatiCrack] = MediaDati_CrL(DatiCrack,TimeCrL,NdatiMedia,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'MediaDati_CrL function started'; +fprintf(fileID,fmt,text); + +[r,~]=size(DatiCrack); +if NdatiMedia > r + NdatiMedia = r; +end + +%% Matrice date +ARRAYdate_CrL = TimeCrL; + +%% Dati +DatiCrack = smoothdata(DatiCrack,'gaussian',NdatiMedia); + +text = 'Average values for Crack Link processed. MediaDati_CrL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/MediaDati_EL.m b/ATD/MediaDati_EL.m new file mode 100755 index 0000000..d9cf1f8 --- /dev/null +++ b/ATD/MediaDati_EL.m @@ -0,0 +1,28 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per gli Extensometer Link +% DatiExtensometer contiene le medie per l'intervallo definito +% ARRAYdate contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [ARRAYdate_EL,DatiExtensometer] = MediaDati_EL(DatiExtensometer,TimeEL,NdatiMedia,FileName) + +text = 'MediaDati_EL function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +[r,~]=size(DatiExtensometer); +if NdatiMedia > r + NdatiMedia = r; +end + +%% Matrice date +ARRAYdate_EL = TimeEL; + +%% Accelerazione +DatiExtensometer = smoothdata(DatiExtensometer,'gaussian',NdatiMedia); + +text = 'Average values for Extensometer Link have been processed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/MediaDati_LL.m b/ATD/MediaDati_LL.m new file mode 100755 index 0000000..ec50e66 --- /dev/null +++ b/ATD/MediaDati_LL.m @@ -0,0 +1,25 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per i LoadLink +% DatiLoad contiene le medie per l'intervallo definito +% ARRAYdate contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [ARRAYdate_LL,DatiLoad] = MediaDati_LL(DatiLoad,TimeLL,NdatiMedia,FileName) + +[r,~]=size(DatiLoad); +if NdatiMedia > r + NdatiMedia = r; +end + +%% Matrice date +ARRAYdate_LL = TimeLL; + +%% Accelerazione +DatiLoad = smoothdata(DatiLoad,'gaussian',NdatiMedia); + +text = 'Average values for Load Link have been processed'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/MediaDati_MPBEL.m b/ATD/MediaDati_MPBEL.m new file mode 100755 index 0000000..b16b857 --- /dev/null +++ b/ATD/MediaDati_MPBEL.m @@ -0,0 +1,29 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per i Multi Point Rod Extensometer Link +% DatiMultiBase contiene le medie per l'intervallo definito +% ARRAYdate contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [ARRAYdate_MPBEL,DatiMultiBase] = MediaDati_MPBEL(DatiMultiBase,TimeMPBEL,NdatiMedia,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'MediaDati_MPBEL function started'; +fprintf(fileID,fmt,text); + +[r,~]=size(DatiMultiBase); +if NdatiMedia > r + NdatiMedia = r; +end + +%% Dati +DatiMultiBase = smoothdata(DatiMultiBase,'gaussian',NdatiMedia); + +%% Matrice date +ARRAYdate_MPBEL = TimeMPBEL; + +text = 'Average values for MultiPoint Borehole Rod Extensometer processed. MediaDati_MPBEL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/MediaDati_PCL.m b/ATD/MediaDati_PCL.m new file mode 100755 index 0000000..f15c6e9 --- /dev/null +++ b/ATD/MediaDati_PCL.m @@ -0,0 +1,34 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per i PreConv Link +% ACCdef_PCL contiene le medie per l'intervallo definito delle accelerazioni +% ARRAYdate_PCL contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [ARRAYdate_PCL,accPCL,ACCdefRis_PCL,TempDef_PCL] = MediaDati_PCL(... + accPCL,TimePCL,ris_acc_PCL,NdatiMedia,T_PCL,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'MediaDati_PCL function started'; +fprintf(fileID,fmt,text); + +%% Accelerazione +[r,~]=size(accPCL); +if NdatiMedia > r + NdatiMedia = r; +end +accPCL = smoothdata(accPCL,'gaussian',NdatiMedia); + +%% Matrice date +ARRAYdate_PCL = TimePCL; + +%% Risultante acc +ACCdefRis_PCL = ris_acc_PCL; % Non faccio la media, mi serve il dato come è per applicare i filtri + +%% Temperatura +TempDef_PCL = T_PCL; % Non faccio la media, mi serve il dato come è per applicare i filtri + +text = 'Average values for PreConv Link have been processed. MediaDati_PCL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/MediaDati_PCLHR.m b/ATD/MediaDati_PCLHR.m new file mode 100755 index 0000000..68941d2 --- /dev/null +++ b/ATD/MediaDati_PCLHR.m @@ -0,0 +1,32 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per i Tilt Link HR H +% AngDef_PCLHR contiene le medie per l'intervallo definito degli angoli +% ARRAYdate contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [ARRAYdate_PCLHR,AngDef_PCLHR,TempDef_PCLHR] = MediaDati_PCLHR(... + angPCLHR,TimePCLHR,NdatiMedia,tempPCLHR,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'MediaDati_PCLHR function started'; +fprintf(fileID,fmt,text); + +[r,~]=size(angPCLHR); +if NdatiMedia > r + NdatiMedia = r; +end + +%% Matrice date +ARRAYdate_PCLHR = TimePCLHR; + +%% Accelerazione +AngDef_PCLHR = smoothdata(angPCLHR,'gaussian',NdatiMedia); + +%% Temperatura +TempDef_PCLHR = tempPCLHR; % Non faccio la media, mi serve il dato come è per applicare i filtri + +text = 'Average values for PreConv Link HR have been processed. MediaDati_PCLHR function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/MediaDati_PL.m b/ATD/MediaDati_PL.m new file mode 100755 index 0000000..2a1d54a --- /dev/null +++ b/ATD/MediaDati_PL.m @@ -0,0 +1,25 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per i PressureLink +% DatiPressure contiene le medie per l'intervallo definito delle accelerazioni +% ARRAYdate contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [ARRAYdate_PL,DatiPressure] = MediaDati_PL(DatiPressure,TimePL,NdatiMedia,FileName) + +[r,~]=size(DatiPressure); +if NdatiMedia > r + NdatiMedia = r; +end + +%% Matrice date +ARRAYdate_PL = TimePL; + +%% Accelerazione +DatiPressure = smoothdata(DatiPressure,'gaussian',NdatiMedia); + +text = 'Average values for Pressure Link have been processed'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/MediaDati_RL.m b/ATD/MediaDati_RL.m new file mode 100755 index 0000000..6f2a825 --- /dev/null +++ b/ATD/MediaDati_RL.m @@ -0,0 +1,34 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per i TiltLink +% ACCdef contiene le medie per l'intervallo definito delle accelerazioni +% ARRAYdate contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [ARRAYdate_RL,accRL,ACCdefRis_RL,TempDef_RL] = MediaDati_RL(accRL,... + TimeRL,ris_acc_RL,NdatiMedia,T_RL,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'MediaDati_RL function started'; +fprintf(fileID,fmt,text); + +%% Accelerazione +[r,~]=size(accRL); +if NdatiMedia > r + NdatiMedia = r; +end +accRL = smoothdata(accRL,'gaussian',NdatiMedia); + +%% Matrice date +ARRAYdate_RL = TimeRL; + +%% Risultante acc +ACCdefRis_RL = ris_acc_RL; % Non faccio la media, mi serve il dato come è per applicare i filtri + +%% Temperatura +TempDef_RL = T_RL; % Non faccio la media, mi serve il dato come è per applicare i filtri + +text = 'Average values for Radial Link have been processed. MediaDati_RL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/MediaDati_SM.m b/ATD/MediaDati_SM.m new file mode 100755 index 0000000..e46b044 --- /dev/null +++ b/ATD/MediaDati_SM.m @@ -0,0 +1,28 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per i Wire Extensometer Link +% DatiWireExtensometer contiene le medie per l'intervallo definito +% ARRAYdate contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [ARRAYdate_SM,DatiStress] = MediaDati_SM(DatiStress,TimeSM,NdatiMedia,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'MediaDati_SM function started'; +fprintf(fileID,fmt,text); + +[r,~]=size(DatiStress); +if NdatiMedia > r + NdatiMedia = r; +end + +%% Matrice date +ARRAYdate_SM = TimeSM; + +%% Dati +DatiStress = smoothdata(DatiStress,'gaussian',NdatiMedia); + +text = 'Average values for Stress Meter processed. MediaDati_SM function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/MediaDati_TLH.m b/ATD/MediaDati_TLH.m new file mode 100755 index 0000000..0a97fc7 --- /dev/null +++ b/ATD/MediaDati_TLH.m @@ -0,0 +1,34 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per i Tilt Link H +% ACCdef_TLH contiene le medie per l'intervallo definito delle accelerazioni +% ARRAYdate_TLH contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [ARRAYdate_TLH,accTLH,ACCdefRis_TLH,TempDef_TLH] = MediaDati_TLH(... + accTLH,TimeTLH,ris_acc_TLH,NdatiMedia,tempTLH,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'MediaDati_TLH function started'; +fprintf(fileID,fmt,text); + +%% Accelerazione +[r,~]=size(accTLH); +if NdatiMedia > r + NdatiMedia = r; +end +accTLH = smoothdata(accTLH,'gaussian',NdatiMedia); + +%% Matrice date +ARRAYdate_TLH = TimeTLH; + +%% Risultante acc +ACCdefRis_TLH = ris_acc_TLH; % Non faccio la media, mi serve il dato come è per applicare i filtri + +%% Temperatura +TempDef_TLH = tempTLH; % Non faccio la media, mi serve il dato come è per applicare i filtri +text = 'Average values for Tilt Link H have been processed. MediaDati_TLH function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/MediaDati_TLHRH.m b/ATD/MediaDati_TLHRH.m new file mode 100755 index 0000000..bef25a7 --- /dev/null +++ b/ATD/MediaDati_TLHRH.m @@ -0,0 +1,33 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per i Tilt Link HR H +% AngDef_TLHR contiene le medie per l'intervallo definito delle accelerazioni +% ARRAYdate contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [ARRAYdate_TLHRH,AngDef_TLHRH,TempDef_TLHRH] = ... + MediaDati_TLHRH(angTLHRH,TimeTLHRH,NdatiMedia,tempTLHRH,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'MediaDati_TLHRH function started'; +fprintf(fileID,fmt,text); + +[r,~]=size(angTLHRH); +if NdatiMedia > r + NdatiMedia = r; +end + +%% Matrice date +ARRAYdate_TLHRH = TimeTLHRH; + +%% Angoli +AngDef_TLHRH = smoothdata(angTLHRH,'gaussian',NdatiMedia); + +%% Temperatura +TempDef_TLHRH = tempTLHRH; % Non faccio la media, mi serve il dato come è per applicare i filtri + +text = 'Average values for Tilt Link HR H have been processed. MediaDati_TLHRH function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/MediaDati_TuL.m b/ATD/MediaDati_TuL.m new file mode 100755 index 0000000..a68a7ae --- /dev/null +++ b/ATD/MediaDati_TuL.m @@ -0,0 +1,53 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per i Tunnel Link +% ACCdef contiene le medie per l'intervallo definito delle accelerazioni +% ARRAYdate contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [ARRAYdate_TuL,accTuL,ACCdefRis_TuL,TempDef_TuL,ay_TuL,ay_TuL_AC] = ... + MediaDati_TuL(accTuL,TimeTuL,ris_acc_TuL,ay_TuL,ay_TuL_AC,NdatiMedia,... + T_TuL,NuovoZeroTuL,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'MediaDati_TuL function started'; +fprintf(fileID,fmt,text); + +%% Accelerazione +[r,~]=size(accTuL); +if NdatiMedia > r + NdatiMedia = r; +end +accTuL = smoothdata(accTuL,'gaussian',NdatiMedia); + +%% Matrice date +ARRAYdate_TuL = TimeTuL; + +%% Risultante acc +ACCdefRis_TuL = ris_acc_TuL; % Non faccio la media, mi serve il dato come è per applicare i filtri + +%% Temperatura +TempDef_TuL = T_TuL; % Non faccio la media, mi serve il dato come è per applicare i filtri + +%% Dati di riferimento ay +if NuovoZeroTuL == 1 + [r,~] = size(ay_TuL); + if r > NdatiMedia + ay_TuL = smoothdata(ay_TuL,'gaussian',NdatiMedia); + else + ay_TuL = smoothdata(ay_TuL,'gaussian',r); + end + +%% Dati di riferimento ay Arco rovescio + [r,~] = size(ay_TuL_AC); + if r > NdatiMedia + ay_TuL_AC = smoothdata(ay_TuL_AC,'gaussian',NdatiMedia); + else + ay_TuL_AC = smoothdata(ay_TuL_AC,'gaussian',r); + end +end + +text = 'Average values for Tunnel Link have been processed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/MediaDati_WEL.m b/ATD/MediaDati_WEL.m new file mode 100755 index 0000000..58b2d1c --- /dev/null +++ b/ATD/MediaDati_WEL.m @@ -0,0 +1,28 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per i Wire Extensometer Link +% DatiWireExtensometer contiene le medie per l'intervallo definito +% ARRAYdate contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [ARRAYdate_WEL,DatiWireExtensometer] = MediaDati_WEL(DatiWireExtensometer,TimeWEL,NdatiMedia,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'MediaDati_WEL function started'; +fprintf(fileID,fmt,text); + +[r,~]=size(DatiWireExtensometer); +if NdatiMedia > r + NdatiMedia = r; +end + +%% Matrice date +ARRAYdate_WEL = TimeWEL; + +%% Dati +DatiWireExtensometer = smoothdata(DatiWireExtensometer,'gaussian',NdatiMedia); + +text = 'Average values for Wire Extensometer Link processed. MediaDati_WEL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/NuovaConversione.m b/ATD/NuovaConversione.m new file mode 100755 index 0000000..3b4e0f2 --- /dev/null +++ b/ATD/NuovaConversione.m @@ -0,0 +1,231 @@ +function [DCalTuLTot,DCalRLTot,DCalTLHTot,DCalTLHRHTot,DCalPCLTot,DCalPCLHRTot,... + DCalPLTot,DCalLLTot,DCalELTot,DCalEL3DTot,DCalWELTot,DCalMPBELTot,DCalALTot,... + DCalCrLTot,DCal3DCrLTot,DCal2DCrLTot] = NuovaConversione(DCalTuLTot,yesTuL,DCalRLTot,yesRL,... + DCalTLHTot,yesTLH,DCalTLHRHTot,yesTLHRH,DCalPCLTot,yesPCL,DCalPCLHRTot,yesPCLHR,... + DCalPLTot,yesPL,DCalLLTot,yesLL,DCalELTot,yesEL,DCalEL3DTot,yes3DEL,DCalWELTot,yesWEL,... + DCalMPBELTot,yesMPBEL,DCalALTot,yesAL,DCalCrLTot,yesCrL,DCal3DCrLTot,yes3DCrL,... + DCal2DCrLTot,yes2DCrL,FileName) + +% Conversione del formato dati che usiamo con il database Ase_New + +%% Tunnel Link +[r,c] = size(DCalTuLTot); +MATconv = zeros(r,c); +if yesTuL==0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalTuLTot{ii,jj}; + end + end + DCalTuLTot = MATconv; +end + +%% Radial Link +[r,c] = size(DCalRLTot); +MATconv = zeros(r,c); +if yesRL==0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalRLTot{ii,jj}; + end + end + DCalRLTot = MATconv; +end + +%% Tilt Link H +[r,c] = size(DCalTLHTot); +MATconv = zeros(r,c); +if yesTLH==0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalTLHTot{ii,jj}; + end + end + DCalTLHTot = MATconv; +end + +%% Tilt Link HR H +[r,c] = size(DCalTLHRHTot); +MATconv = zeros(r,c); +if yesTLHRH==0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalTLHRHTot{ii,jj}; + end + end + DCalTLHRHTot = MATconv; +end + +%% PreConv Link +[r,c] = size(DCalPCLTot); +MATconv = zeros(r,c); +if yesPCL==0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalPCLTot{ii,jj}; + end + end + DCalPCLTot = MATconv; +end + +%% PreConv Link HR +[r,c] = size(DCalPCLHRTot); +MATconv = zeros(r,c); +if yesPCLHR==0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalPCLHRTot{ii,jj}; + end + end + DCalPCLHRTot = MATconv; +end + +%% Pressure Link +[r,c] = size(DCalPLTot); +MATconv = zeros(r,c); +if yesPL==0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalPLTot{ii,jj}; + end + end + DCalPLTot = MATconv; +end + +%% Load Link +[r,c] = size(DCalLLTot); +MATconv = zeros(r,c); +if yesLL==0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + if DCalLLTot{ii,jj} == [] + MATconv(ii,jj) = []; + else + MATconv(ii,jj) = DCalLLTot{ii,jj}; + end + end + end + DCalLLTot = MATconv; +end + +%% Extensometer Link +[r,c] = size(DCalELTot); +MATconv = zeros(r,c); +if yesEL==0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalELTot{ii,jj}; + end + end + DCalELTot = MATconv; +end + +%% 3D Extensometer Link +[r,c] = size(DCalEL3DTot); +MATconv = zeros(r,c); +if yes3DEL==0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalEL3DTot{ii,jj}; + end + end + DCalEL3DTot = MATconv; +end + +%% Wire Extensometer Link +[r,c] = size(DCalWELTot); +MATconv = zeros(r,c); +if yesWEL==0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalWELTot{ii,jj}; + end + end + DCalWELTot = MATconv; +end + +%% Multi Point Borehole Extensometer Link +[r,c] = size(DCalMPBELTot); +MATconv = zeros(r,c); +if yesMPBEL==0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalMPBELTot{ii,jj}; + end + end + DCalMPBELTot = MATconv; +end + +%% Analog Link +[r,c] = size(DCalALTot); +MATconv = zeros(r,c); +if yesAL==0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalALTot{ii,jj}; + end + end + DCalALTot = MATconv; +end + +%% Crack Link +[r,c] = size(DCalCrLTot); +MATconv = zeros(r,c); +if yesCrL==0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalCrLTot{ii,jj}; + end + end + DCalCrLTot = MATconv; +end + +%% 3D Crack Link +[r,c] = size(DCal3DCrLTot); +MATconv = zeros(r,c); +if yes3DCrL==0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCal3DCrLTot{ii,jj}; + end + end + DCal3DCrLTot = MATconv; +end + +%% 2D Crack Link +[r,c] = size(DCal2DCrLTot); +MATconv = zeros(r,c); +if yes2DCrL==0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCal2DCrLTot{ii,jj}; + end + end + DCal2DCrLTot = MATconv; +end +% Apro file di testo +fileID = fopen(FileName,'a'); +fmt = '%s \r'; + +text = 'NuovaConversione function worked correctly'; +fprintf(fileID,fmt,text); + +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/Parametri_Installazione.m b/ATD/Parametri_Installazione.m new file mode 100755 index 0000000..7eace42 --- /dev/null +++ b/ATD/Parametri_Installazione.m @@ -0,0 +1,90 @@ +%% Funzione che definisce i parametri specifici di elaborazione + +function [NdatiMedia,Ndatidespike,MEMS,tolleranzaAcc,Tmax,Tmin,Ndevst,Wdevst,... + Ndevst_HR,Wdevst_HR,NumBasi,elab_option,Calcolo_Carico,Area,Mod_Elastico,... + Carico_Ini] = Parametri_Installazione(idTool,conn,yesTuL,yesRL,... + yesTLH,yesTLHRH,yesPCL,yesPCLHR,yesMPBEL,yesWEL,yesEL,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'Parametri_Installazione function started'; +fprintf(fileID,fmt,text); + +comando = ['select avg, despike from software where tool_id like ''' idTool ''' ']; +Dati = fetch(conn,comando); +NdatiMedia = cell2mat(Dati(1)); +Ndatidespike = cell2mat(Dati(2)); + +%% MEMS +if yesTuL == 1 || yesTLH == 1 || yesRL == 1 || yesPCL == 1 + comando = ['select mems, toll_Acc, num_Ds, win_Ds from software where tool_id like ''' idTool ''' ']; + Dati = fetch(conn,comando); + MEMS = cell2mat(Dati(1)); + tolleranzaAcc = cell2mat(Dati(2)); + Ndevst = cell2mat(Dati(3)); + Wdevst = cell2mat(Dati(4)); +else + MEMS = []; + tolleranzaAcc = []; + Ndevst = []; + Wdevst = []; +end + +%% Elettrolitici +if yesTLHRH == 1 || yesPCLHR == 1 + comando = ['select num_Ds_HR, win_Ds_HR from software where tool_id like ''' idTool ''' ']; + Dati = fetch(conn,comando); + Ndevst_HR = cell2mat(Dati(1)); + Wdevst_HR = cell2mat(Dati(2)); +else + Ndevst_HR = []; + Wdevst_HR = []; +end + +if yesTuL == 1 || yesTLH == 1 || yesRL == 1 || yesPCL == 1 || yesTLHRH == 1 || yesPCLHR == 1 || ... + yesWEL == 1 + comando = ['select max_temp, min_temp from software where tool_id like ''' idTool ''' ']; + Dati = fetch(conn,comando); + Tmax = cell2mat(Dati(1)); + Tmin = cell2mat(Dati(2)); +else + Tmax = []; + Tmin = []; +end + +if yesRL == 1 || yesTLH == 1 || yesPCL == 1 + comando = ['select orientation from software where tool_id like ''' idTool ''' ']; + Dati = fetch(conn,comando); + elab_option = cell2mat(Dati(1)); +else + elab_option = []; +end + +if yesEL == 1 + comando = ['select calcolo_carico, area, mod_elastico, carico_iniziale '... + 'from software where tool_id like ''' idTool ''' ']; + Dati = fetch(conn,comando); + Calcolo_Carico = cell2mat(Dati(1)); + Area = cell2mat(Dati(2)); + Mod_Elastico = cell2mat(Dati(3)); + Carico_Ini = cell2mat(Dati(4)); +else + Calcolo_Carico = []; + Area = []; + Mod_Elastico = []; + Carico_Ini = []; +end + +if yesMPBEL == 1 + comando = ['select base_num from software where tool_id like ''' idTool ''' ']; + Dati = fetch(conn,comando); + NumBasi = cell2mat(Dati(1)); +else + NumBasi = []; +end + +text = 'Chain parameters defined correctly and Parametri_Installazione function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/Recharge.m b/ATD/Recharge.m new file mode 100755 index 0000000..8db85ea --- /dev/null +++ b/ATD/Recharge.m @@ -0,0 +1,45 @@ +Dati = xlsread('Pasteur.xlsx',4); +[r,c] = size(Dati); +d = r/5; +t = 1; +n = 1; +cont = 1; +ARRAYdate_TuL = zeros(d,1); +Xlocal_TuL = zeros(5,d); +Ylocal_TuL = zeros(5,d); +Zlocal_TuL = zeros(5,d); +X_TuL = zeros(5,d); +Y_TuL = zeros(5,d); +Z_TuL = zeros(5,d); +SegStar = zeros(5,d); +HShift_local_TuL = zeros(5,d); +Area_TuL = zeros(1,d); +Speed_local_TuL = zeros(5,d); +Acceleration_local_TuL = zeros(5,d); +TempDef_TuL = zeros(d,5); +ErrTunnelLink = zeros(5,d); +for i=1:r + Xlocal_TuL(t,cont) = Dati(i,6); + Ylocal_TuL(t,cont) = Dati(i,7); + Zlocal_TuL(t,cont) = Dati(i,8); + X_TuL(t,cont) = Dati(i,9); + Y_TuL(t,cont) = Dati(i,10); + Z_TuL(t,cont) = Dati(i,11); + SegStar(t,cont) = Dati(i,12); + HShift_local_TuL(t,cont) = Dati(i,14); + Speed_local_TuL(t,cont) = Dati(i,16); + Acceleration_local_TuL(t,cont) = Dati(i,18); + TempDef_TuL(cont,t) = Dati(i,19); + ErrTunnelLink(t,cont) = Dati(i,25); + if t == 1 + ARRAYdate_TuL(n,1) = Dati(i,2)+693960; + n = n+1; + end + t = t+1; + if t == 6 + t = 1; + cont = cont+1; + end +end +Xstar_TuL = X_TuL; +Zstar_TuL = Z_TuL; \ No newline at end of file diff --git a/ATD/Report.m b/ATD/Report.m new file mode 100755 index 0000000..9246259 --- /dev/null +++ b/ATD/Report.m @@ -0,0 +1,770 @@ +function Report(Mail,siteID,unitID,chainID,alarms,Chain_Scheme,... + time,conn,num_nodi,meseadesso,adesso,datainvio,numgiorni,activeEN,... + Users_Report,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'Report Software started'; +fprintf(fileID,fmt,text); +fclose(fileID); + + + +recipients_ASE{1,1} = 'alessandro.valletta@aseltd.eu'; +recipients_ASE{2,1} = 'andrea.carri@aseltd.eu'; +recipients_ASE{3,1} = 'roberto.savi@aseltd.eu'; +Mail_ASE = 1; + +if Mail_ASE == 1 || Mail == 1 + + % Importo librerie Matlab Report Generator e creo report + import mlreportgen.dom.* + import mlreportgen.report.* + + FIG = 1; % Contatore Figure + FIG_ENG = 1; + NomeReport = (['Report_ASE_' siteID]); + rpt = Report(NomeReport, 'pdf'); % Crea report + NomeReport_ENG = (['Report_ASE_' siteID '_ENG']); + rpt_ENG = Report(NomeReport_ENG, 'pdf'); % Crea report + Section.number(rpt,false); % elimina numerazione capitoli + Section.number(rpt_ENG,false); % elimina numerazione capitoli + Font_caption = '8.5pt'; + Font_table = '9pt'; + Font_section = '14pt'; + Font_tools = '12pt'; + Font_Chapter = '16pt'; + + %% Ricavo info sul sito + + % Uso il siteID per identificare il nome del sito + comando = ['select name from sites where id like ''' siteID ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + NomeSito = num2str(cell2mat(curs.Data)); + + [arraysito,arraysitoENG,controlsito,yesTL,yesTLHR,yesTLH,yesTLHRH,yesPL,yesBL,yesLL,... + yesRL,yesKL,yesKLHR,yesThL,yesPT100,yesIPL,yesIPLHR,yesTuL,yesRaL,yesPCL,yesPCLHR,... + yesPrL,yesEL,yes3DEL,yesWEL,yesMPBEL,yesCrL,yes3DCrL,yesBML,yesHL,... + yesLuxL,yesCO2,yesRSN,yesRSNHR,yesTrL,yesSM,yes2DCrL,yesPE,yesWL,yesGF,yesGS,... + rTL,rTLHR,rTLH,rTLHRH,rPL,rBL,rLL,rRL,rKL,rKLHR,rThL,rPT100,rIPL,rIPLHR,rTuL,rRaL,... + rPCL,rPCLHR,rPrL,rEL,r3DEL,rWEL,rMPBEL,rCrL,r3DCrL,rBML,rHL,rLuxL,rCO2,rRSN,rRSNHR,... + rTrL,rSM,r2DCrL,rPE,rWL,rGF,rGS,nCT,... + NodoTiltLink,NodoTiltLinkHR,NodoTiltLinkH,NodoTiltLinkHRH,NodoPiezoLink,NodoBaroLink,... + NodoLoadLink,NodoRainLink,NodoKlinoLink,NodoKlinoLinkHR,NodoThermLink,NodoPT100Link,... + NodoInPlaceLink,NodoInPlaceLinkHR,NodoTunnelLink,NodoRadialLink,NodoPreConvLink,... + NodoPreConvLinkHR,NodoPressureLink,NodoExtensometerLink,Nodo3DExtensometerLink,... + NodoWireExtensometerLink,NodoMultiPointExtensometerLink,NodoCrackLink,Nodo3DCrackLink,... + NodoBaroMusaLink,NodoHumidityLink,NodoLuxLink,NodoCO2Link,NodoRSNLink,NodoRSNHRLink,... + NodoTriggerLink,NodoStressMeter,Nodo2DCrackLink,NodoPendulum,NodoWeirLink,NodoGflowLink,... + NodoGshockLink,tipoarray,tipoalarms,nVMS,nTL,nCAM,nAL] = info_Sito(chainID,alarms,... + Chain_Scheme,conn,num_nodi,FileName); + + info_sito = [chainID(:,2) chainID(:,4)]; + + %% Pagina titolo ITA + template_cover(rpt); + tp = TitlePage; + Titolo = Paragraph(['Report di monitoraggio del sito: ' NomeSito]); + Titolo.Style = {HAlign('center'),Bold(1), FontSize('32pt'),OuterMargin('0in','0in','3in','0.2in')}; + tp.Title = (Titolo); + sottotitolo = Paragraph('Report automatico - Versione Beta Test'); + sottotitolo.Style = {FontSize('12pt'),Bold(1),HAlign('center')}; + tp.Subtitle = sottotitolo; + tp.Author = ' '; + datapub = Paragraph(datestr(today,'dd-mm-yyyy')); + datapub.Style = {FontSize('12pt'),HAlign('center')}; + tp.PubDate = datapub; + add(rpt,tp); + + if activeEN == 1 + %% Pagina titolo ENG + template_cover(rpt_ENG); + tp_ENG = TitlePage; + Titolo = Paragraph('Monitoring activity report '); + Titolo.Style = {HAlign('center'),Bold(1), FontSize('32pt'),OuterMargin('0in','0in','3in','0in')}; + tp_ENG.Title = (Titolo); + sottotitolo = Paragraph(NomeSito); + sottotitolo.Style = {HAlign('center'),Bold(1), FontSize('32pt'),OuterMargin('0in','0in','0in','0.2in')}; + tp_ENG.Subtitle = sottotitolo; + report = Paragraph('Automatic report - Alpha test version'); + report.Style = {FontSize('12pt'),Bold(1),HAlign('center'),OuterMargin('0in','0in','0.4in','0.2in')}; + tp_ENG.Author = report; + datapub = Paragraph(datestr(today,'dd-mm-yyyy')); + datapub.Style = {FontSize('12pt'),HAlign('center')}; + tp_ENG.PubDate = datapub; + add(rpt_ENG,tp_ENG); + end + + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'Title page created'; + fprintf(fileID,fmt,text); + + %% Pagina sommario + % Add a default table of contents object to the report + template(rpt); + TOC = TableOfContents(); + TOC.Layout.PageNumberFormat = 'I'; + add(rpt,TOC); + if activeEN == 1 + template(rpt_ENG); + TOC_ENG = TableOfContents(); + TOC_ENG.Layout.PageNumberFormat = 'I'; + add(rpt_ENG,TOC_ENG); + end + text = 'Summary page created'; + fprintf(fileID,fmt,text); + + %% Disclaimer iniziale + disclaimer = Chapter; + dis = Heading1('Disclaimer'); + dis.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + disclaimer.Title = dis; + text = Paragraph(['Il presente report ' char(232) ' un documento generato automaticamente '... + 'dal software proprietario sviluppato da ASE S.r.l. Il suo obiettivo ' char(232) ' quello '... + 'di riassumere i principali risultati ottenuti dalla strumentazione installata '... + 'in un determinato sito del cliente, nel corso di un periodo temporale di riferimento. '... + 'Il report riporta le principali informazioni relative al sito monitorato: queste includono '... + 'numero e tipologia degli Array presenti, data di installazione, data di riferimento '... + 'per i calcoli successivi, principali caratteristiche dei sensori utilizzati, etc. ']); + text2 = Paragraph(['Il report viene creato automaticamente il primo giorno di ogni mese e '... + 'contiene i dati di monitoraggio elaborati a partire dal mese precedente (o dal mese '... + 'della redazione dell''ultimo report, nel caso di Array inattivo), fornendo una panoramica generale '... + 'del livello di attivit' char(224) ' del sito durante il periodo temporale di riferimento. '... + 'Inoltre, nel caso in cui gli strumenti lo consentano, sono riportati grafici che '... + 'integrano i dati raccolti da diverse tipologie di sensori, con l''obiettivo di '... + 'evidenziare eventuali correlazioni tra le grandezze monitorate.']); + Link = Paragraph(ExternalLink('https://www2.aseltd.eu','cliccando qui.')); + text3 = Paragraph(['Si vuole sottolineare che questo documento ' char(232) ' generato completamente in automatico '... + 'e non contiene pertanto alcuna valutazione o validazione di carattere tecnico '... + 'relativamente ai risultati ottenuti dalla strumentazione installata. '... + 'Si ricorda inoltre che quanto riportato nel report ' char(232) ' inteso come un riassunto dei risultati '... + 'dell''attivit' char(224) ' di monitoraggio. Per la consultazione completa di tutti i dati '... + 'relativi al sito in esame, ' char(232) ' possibile accedere con le proprie credenziali '... + 'alla piattaforma interattiva web-based']); + text4 = Paragraph('ASE - Advanced Slope Engineering S.r.l.'); + text5 = Paragraph('Via Robert Koch 53/A, 43123 Fraz. Pilastrello, Parma - Italy'); + text6 = Paragraph('Tel: +39 0521 1404292'); + text7 = Paragraph('REA n. 258983 - Cod Fis. e P.IVA 02687890349'); + text8 = Paragraph('info@aseltd.eu - www.aseltd.eu'); + text.HAlign = 'justify'; + text2.HAlign = 'justify'; + text3.HAlign = 'justify'; + text4.Style = {Bold(1),HAlign('left')}; + text5.Style = {HAlign('left'),OuterMargin('0in','0in','0in','0in'),FontSize('8pt')}; + text6.Style = {HAlign('left'),OuterMargin('0in','0in','0in','0in'),FontSize('8pt')}; + text7.Style = {HAlign('left'),OuterMargin('0in','0in','0in','0in'),FontSize('8pt')}; + text8.Style = {HAlign('left'),OuterMargin('0in','0in','0in','0in'),FontSize('8pt')}; + + logo = Image('aselogo.jpeg'); + logo.Style = {Height('9cm'),HAlign('left')}; + + add(disclaimer,text); + add(disclaimer,text2); + add(disclaimer,text3); + Link.Style = {OuterMargin('0in','0in','0in','0in')}; + add(disclaimer,Link); + add(disclaimer,logo); + add(disclaimer,text4); + add(disclaimer,text5); + add(disclaimer,text6); + add(disclaimer,text7); + add(disclaimer,text8); + br = PageBreak(); + add(disclaimer,br); + add(rpt,disclaimer); + + if activeEN == 1 + disclaimer_ENG = Chapter; + dis_ENG = Heading1('Disclaimer'); + dis_ENG.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + disclaimer_ENG.Title = dis_ENG; + % Disclaimer ENG + text = Paragraph(['This report consists of a document automatically generated by ASE proprietary software. Its objective is '... + 'to summarize the main monitoring results recorded during a specific time interval by the instrumentation installed on-site. Moreover, '... + 'this document presents all the key information concerning the monitored site, including Arrays number and typology, installation date, '... + 'reference date, installed sensors features, etc. The report is generated automatically on the first day of each month, and it contains '... + 'monitoring data elaborated from the beginning of the previous month, in order to provide a general overview of the site activity '... + 'during the reference time period. For specific typologies of sensors, the report also includes graphs composed of different physical quantities, '... + 'in order to highlight any correlation between data sampled by these sensors.']); + Link = Paragraph(ExternalLink('https://www2.aseltd.eu','this link.')); + text2 = Paragraph(['We would like to remind that the report generation is completely automated, therefore it does not contain '... + 'any technical evaluation or validation concerning the results obtained by the instrumentation installed on-site. '... + 'Moreover, the report is intended as a resume of the main outcomes resulting from the monitoring activity. The user can access complete datasets '... + 'and information concerning the monitored site by logging into the interactive web-based platform developed by ASE S.r.l., available at']); + text7 = Paragraph('REA n. 258983 - VAT ID 02687890349'); + text.HAlign = 'justify'; + text2.HAlign = 'justify'; + text7.Style = {HAlign('left'),OuterMargin('0in','0in','0in','0in'),FontSize('8pt')}; + + add(disclaimer_ENG,text); + add(disclaimer_ENG,text2); + Link.Style = {OuterMargin('0in','0in','0in','0in')}; + add(disclaimer_ENG,Link); + add(disclaimer_ENG,logo); + add(disclaimer_ENG,text4); + add(disclaimer_ENG,text5); + add(disclaimer_ENG,text6); + add(disclaimer_ENG,text7); + add(disclaimer_ENG,text8); + br = PageBreak(); + add(disclaimer_ENG,br); + add(rpt_ENG,disclaimer_ENG); + end + + text = 'Disclaimer page created'; + fprintf(fileID,fmt,text); + fileID = fopen(FileName,'a'); + + %% Capitolo 1 - sistema MUMS + sys = Chapter; + app = Heading1('Sistema MUMS'); + app.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + sys.Title = app; + testo = Paragraph(['Il monitoraggio ' char(232) ' svolto mediante sistema MUMS '... + '(Modular Underground Monitoring System), progettato per il controllo multiparametrico dei movimenti '... + 'orizzontali o verticali del terreno, delle deformazioni di strutture civili '... + 'e/o geotecniche, di barriere paramassi o debris flow. In ogni nodo possono essere collocati sensori per monitorare '... + 'grandezze fisiche di varia natura come spostamenti, inclinazioni, pressione interstiziale, temperatura, etc.']); + testo2 = Paragraph(['In particolare, il sito ' char(232) ' caratterizzato dalla presenza di ' arraysito ' e relativo sistema'... + ' di acquisizione automatico, completato da batteria tampone ed adeguato sistema di ricarica.']); + if controlsito ~= 0 + [rTA,~] = size(tipoalarms); + aVMS = 0; + aCAM = 0; + aAL = 0; + aTL = 0; + for mm = 1:rTA + if strcmp(char(tipoalarms(mm)),'Variable Message System') + aVMS = 1; + elseif strcmp(char(tipoalarms(mm)),'Traffic Lights') + aCAM = 1; + elseif strcmp(char(tipoalarms(mm)),'Alarms') + aAL = 1; + elseif strcmp(char(tipoalarms(mm)),'Camera') + aCAM = 1; + end + end + testo2prep = []; + spazio = ''; + if aAL > 0 + if nAL == 1 + testo2prep = [num2str(nAL) ' allarme acustico-visivo']; + else + testo2prep = [num2str(nAL) ' allarmi acustico-visivi']; + end + spazio = ', '; + end + if aTL > 0 + if nTL == 1 + testo2prep = [testo2prep spazio num2str(nTL) ' impianto semaforico']; + else + testo2prep = [testo2prep spazio num2str(nTL) ' impianti semaforici']; + end + spazio = ', '; + end + if aVMS > 0 + if nVMS == 1 + testo2prep = [testo2prep spazio num2str(nVMS) ' pannello a messaggio variabile']; + else + testo2prep = [testo2prep spazio num2str(nVMS) ' pannelli a messaggio variabile']; + end + spazio = ', '; + end + if aCAM > 0 + if nCAM == 1 + testo2prep = [testo2prep spazio num2str(nCAM) ' videocamera']; + else + testo2prep = [testo2prep spazio num2str(nCAM) ' videocamere']; + end + end + testo2bis = Paragraph(['Il sistema inoltre include un dispositivo di allertamento composto da ' testo2prep '.']); + else + testo2bis = []; + end + testo3 = Paragraph(['I dati grezzi (punti elettrici) sono salvati su apposito supporto' ... + ' di memoria locale (scheda SD) ed inviati al centro di elaborazione secondo la frequenza impostata. '... + 'Una volta ricevute le informazioni, il dato viene salvato su un Database con backup giornaliero automatico, '... + 'elaborato mediante software con algoritmi proprietari e reso disponibile su piattaforma web ad accesso '... + 'controllato in pochi secondi.']); + testo4 = Paragraph(['Il funzionamento completo del sisema MUMS ' char(232) ' schematizzato nella figura seguente.']); + ionh = Image(('ionh.png')); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + testo3.HAlign = 'justify'; + testo4.HAlign = 'justify'; + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + testo3.HAlign = 'justify'; + testo4.HAlign = 'justify'; + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Struttura del sistema di monitoraggio']); + FIG = FIG + 1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + ionh.Style = {Height('8cm'),HAlign('center')}; + add(sys,testo); + add(sys,testo2); + if controlsito ~= 0 + add(sys,testo2bis); + end + add(sys,testo3); + add(sys,testo4); + add(sys,ionh); + add(sys,ionhcaption); + add(rpt,sys); + template(rpt); + + if activeEN == 1 + sys_ENG = Chapter; + app_ENG = Heading1('MUMS System'); + app_ENG.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + sys_ENG.Title = app_ENG; + testo = Paragraph(['The monitoring activity is performed with MUMS '... + '(Modular Underground Monitoring System) technology, specifically developed for the '... + 'multi-parametric monitoring of slopes, civil and/or geotechnical structures, rockfall and '... + 'debris flow barriers. Each node of the Array can equip sensors able to measure different '... + 'physical quantities like displacements, tilts, pressure, temperatures, etc.']); + testo2 = Paragraph(['In particular, the monitoring system installed on-site includes ' arraysitoENG... + ', the automatic data acquisition '... + 'system and a battery, with dedicated recharge apparatus.']); + if controlsito ~= 0 + testo2prep = []; + spazio = ''; + if aAL > 0 + if aAL == 1 + testo2prep = [num2str(nAL) ' visual-acoustic alarm']; + else + testo2prep = [num2str(nAL) ' visual-acoustic alarms']; + end + spazio = ', '; + end + if aTL > 0 + if aTL == 1 + testo2prep = [testo2prep spazio num2str(nTL) ' traffic light']; + else + testo2prep = [testo2prep spazio num2str(nTL) ' traffic lights']; + end + spazio = ', '; + end + if aVMS > 0 + if aVMS == 1 + testo2prep = [testo2prep spazio num2str(nVMS) ' variable message panel (VMP)']; + else + testo2prep = [testo2prep spazio num2str(nVMS) ' variable message panels (VMPs)']; + end + spazio = ', '; + end + if aCAM > 0 + if aCAM == 1 + testo2prep = [testo2prep spazio num2str(nCAM) ' camera']; + else + testo2prep = [testo2prep spazio num2str(nCAM) ' cameras']; + end + end + testo2bis = Paragraph(['Moreover, the following devices are included for early warning purposes: ' testo2prep '.']); + end + testo3 = Paragraph(['The datalogger saves raw data (electrical signals) on a volatile memory (SD card) and then transmits them '... + 'to the elaboration centre, according to a predefined frequency. Upon arrival on central server, a proprietary '... + 'software routine automatically elaborates raw data and converts them into physical units. '... + 'Results are stored in a "parallel" database from which they can be accessed and analysed '... + 'thanks to a dedicated web-based platform with private access.']); + testo4 = Paragraph('The following image describes the structure of the MUMS-based system.'); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + testo3.HAlign = 'justify'; + testo4.HAlign = 'justify'; + ionhcaption = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Structure of the monitoring system']); + FIG_ENG = FIG_ENG + 1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + ionh.Style = {Height('9cm'),HAlign('center')}; + add(sys_ENG,testo); + add(sys_ENG,testo2); + if controlsito ~= 0 + add(sys_ENG,testo2bis); + end + add(sys_ENG,testo3); + add(sys_ENG,testo4); + add(sys_ENG,ionh); + add(sys_ENG,ionhcaption); + add(rpt_ENG,sys_ENG); + template(rpt_ENG); + end + + text = 'MUMS system defined'; + fprintf(fileID,fmt,text); + fileID = fopen(FileName,'a'); + fclose(fileID); + + %% Capitolo 2 - Geografia e composizione + geoloc = Chapter; + app = Heading1('Caratteristiche del sito'); + app.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + geoloc.Title = app; + + testo = Paragraph(['Le principali caratteristiche della strumentazione installata nel sito '... + 'in esame sono riportate nella seguente tabella. Le figure sottostanti presentano la localizzazione '... + 'geografica degli Array e del relativo sistema di acquisizione (immagini '... + 'tratte da Mappe di Bing).']); + + comando = ['select lat, lon from sites where id like ''' siteID ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Coordinate = (cell2mat(curs.Data))'; + latNS = 'N'; + lonEO = 'E'; + if Coordinate(1) < 0 + latNS = 'S'; + end + if Coordinate(2) < 0 + lonEO = 'O'; + end + testo.HAlign = 'justify'; + + testo2 = Paragraph(['In particolare, il sito in esame si trova '... + 'alle seguenti coordinate geografiche: Latitudine ' num2str(abs(Coordinate(1))) ... + ' ' latNS ', Longitudine ' num2str(abs(Coordinate(2,:))) ' ' lonEO '.']); + testo2.HAlign = 'justify'; + + %--- IMMAGINI GEOGRAFICHE ---% + mapsito = ['sito' siteID '.png']; + geo = Image((mapsito)); + geo.Style = [geo.Style {ScaleToFit}]; + geo_cap = Paragraph(['Fig. ' num2str(FIG) ' - Localizzazione geografica della strumentazione installata e del sistema di acquisizione dati']); + FIG = FIG+1; + geo_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + mapcatene = ['sito' siteID 'det.png']; + sito = Image((mapcatene)); + sito.Style = [sito.Style {ScaleToFit}]; + sito_cap = Paragraph(['Fig. ' num2str(FIG) ' - Posizione in sito delle centraline e degli strumenti installati']); + FIG = FIG+1; + sito_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + %--- TABELLA SITO MONITORATO ---% + [status,firstdata_num,datasample,colonna1,colonna2,colonna2bis,colonna3,... + colonna4,colonna5,colonna6,colonna6_short,colonna7,yesKLHR3D,c1trigger,c6trigger,cA] = ... + report_table(info_sito,controlsito,tipoarray,tipoalarms,alarms,chainID,Chain_Scheme,... + yesTL,yesTLHR,yesTLH,yesTLHRH,yesPL,yesBL,yesLL,yesRL,yesKL,yesKLHR,yesThL,... + yesPT100,yesIPL,yesIPLHR,yesTuL,yesRaL,yesPCL,yesPCLHR,yesPrL,yesEL,yes3DEL,... + yesWEL,yesMPBEL,yesCrL,yes3DCrL,yesBML,yesHL,yesLuxL,yesCO2,yesRSN,yesRSNHR,yesTrL,... + yesPE,yesWL,yes2DCrL,yesGF,yesGS,rTL,rTLHR,rTLH,rTLHRH,rKL,rKLHR,rIPL,rIPLHR,nCT,... + num_nodi,time,conn,FileName) ; + + % Controllo che Colonna 5 (lunghezza Array) abbia dei dati, + % altrimenti la elimino + [rC5,~] = size(colonna5); + C5 = 0; + for c = 2:rC5 + if strcmp(char(colonna5(c)),'-') == 0 % Esiste almeno un valore di lunghezza + C5 = 1; + break + end + end + + if C5 == 1 + tab = FormalTable([colonna1,colonna2,colonna2bis,colonna3,colonna4,colonna5,colonna6_short,colonna7]); + else + tab = FormalTable([colonna1,colonna2,colonna2bis,colonna3,colonna4,colonna6,colonna7]); + end + + % formattazione tabella + tab.TableEntriesStyle = {HAlign('center'),VAlign('middle'),FontSize(Font_table),InnerMargin('0.5mm')}; + tab.Style = {ResizeToFitContents(true),Width("100%"),RowSep('solid','black','1px'),... + ColSep('solid','black','1px'),Hyphenation(false),BackgroundColor('#E0F1FF')}; + tab.Border = 'single'; + tabCaption = Paragraph('Tab. 1 - Tipologia e caratteristiche della strumentazione installata in sito'); + tabCaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + bodyFirstRow = tab.Body.Children(1); + bodyFirstRow.Style = [bodyFirstRow.Style {Bold()}]; + if C5 == 0 + grps(1) = TableColSpecGroup; + grps(1).Span = 7; + specs(1) = TableColSpec; + specs(1).Span = 1; + specs(1).Style = {Width("7.5%")}; + specs(2) = TableColSpec; + specs(2).Span = 3; + specs(2).Style = {Width("15%")}; + specs(3) = TableColSpec; + specs(3).Span = 1; + specs(3).Style = {Width("10%")}; + specs(4) = TableColSpec; + specs(4).Span = 1; + specs(5) = TableColSpec; + specs(5).Span = 1; + specs(5).Style = {Width("12%")}; + grps(1).ColSpecs = specs; + tab.ColSpecGroups = grps; + end + + % Installazione + testo3 = Paragraph(['La prima lettura disponibile, riportata in Tab. 1, si riferisce '... + 'alla data di inizio monitoraggio. Va sottolineato come i primissimi dati '... + 'rilevati da uno strumento possano essere influenzati dagli assestamenti occorsi in '... + 'seguito all''installazione o dall''adattamento del sensore in sito. Per questo motivo '... + 'viene definita la lettura di riferimento come data in cui i dati raccolti non mostrano '... + 'pi' char(249) ' i caratteri tipici dell''adattamento strumentale in sito (per maggiori informazioni '... + 'consigliamo di fare riferimento agli standard ISO 18674-1:2015).']); + testo3.HAlign = 'justify'; + + add(geoloc,testo); + add(geoloc,testo2); + add(geoloc,testo3); + add(geoloc,tabCaption); + add(geoloc,tab); + add(geoloc,br); + add(geoloc,geo); + add(geoloc,geo_cap); + add(geoloc,sito); + add(geoloc,sito_cap); + add(rpt,geoloc); + template(rpt); + + if activeEN == 1 + geoloc_ENG = Chapter; + app_ENG = Heading1('Site features'); + app_ENG.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + geoloc_ENG.Title = app_ENG; + + testo = Paragraph(['The table reported below summarizes the main characteristics of the instrumentation installed on-site. '... + 'Moreover, following images display the geographical position of the monitoring system, including the location of Arrays '... + 'and acquisition devices (source: Bing Maps).']); + + if Coordinate(2) < 0 + lonEO = 'W'; + end + testo.HAlign = 'justify'; + + testo2 = Paragraph(['Geographical coordinates of the monitored site are: '... + 'Latitude ' num2str(abs(Coordinate(1))) ... + ' ' latNS ', Longitude ' num2str(abs(Coordinate(2,:))) ' ' lonEO '.']); + testo2.HAlign = 'justify'; + + %--- IMMAGINI GEOGRAFICHE ---% + geo_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Geographical position of the monitored site']); + FIG_ENG = FIG_ENG+1; + geo_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + sito_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - On-site location of monitoring devices']); + FIG_ENG = FIG_ENG+1; + sito_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + %--- TABELLA SITO MONITORATO ---% + [status,firstdata_num,datasample,colonna1,colonna2,colonna2bis,colonna3,... + colonna4,colonna5,colonna6,colonna6_short,colonna7,yesKLHR3D,c1trigger,c6trigger,cA]... + = report_table_ENG(info_sito,controlsito,tipoarray,tipoalarms,alarms,chainID,Chain_Scheme,... + yesTL,yesTLHR,yesTLH,yesTLHRH,yesPL,yesBL,yesLL,yesRL,yesKL,yesKLHR,yesThL,... + yesPT100,yesIPL,yesIPLHR,yesTuL,yesRaL,yesPCL,yesPCLHR,yesPrL,yesEL,yes3DEL,... + yesWEL,yesMPBEL,yesCrL,yes3DCrL,yesBML,yesHL,yesLuxL,yesCO2,yesRSN,yesRSNHR,yesTrL,... + yesPE,yesWL,yes2DCrL,yesGF,yesGS,rTL,rTLHR,rTLH,rTLHRH,rKL,rKLHR,rIPL,rIPLHR,nCT,... + num_nodi,time,conn,FileName); + + % Controllo che Colonna 5 (lunghezza Array) abbia dei dati, + % altrimenti la elimino + [rC5,~] = size(colonna5); + C5 = 0; + for c = 2:rC5 + if strcmp(char(colonna5(c)),'-') == 0 % Esiste almeno un valore di lunghezza + C5 = 1; + break + end + end + + if C5 == 1 + tab = FormalTable([colonna1,colonna2,colonna2bis,colonna3,colonna4,colonna5,colonna6_short,colonna7]); + else + tab = FormalTable([colonna1,colonna2,colonna2bis,colonna3,colonna4,colonna6,colonna7]); + end + + % formattazione tabella + tab.TableEntriesStyle = {HAlign('center'),VAlign('middle'),FontSize(Font_table),InnerMargin('0.5mm')}; + tab.Style = {ResizeToFitContents(true),Width("100%"),RowSep('solid','black','1px'),... + ColSep('solid','black','1px'),Hyphenation(false),BackgroundColor('#E0F1FF')}; + tab.Border = 'single'; + tabCaption = Paragraph('Tab. 1 - Instrumentation typologies and features'); + tabCaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + bodyFirstRow = tab.Body.Children(1); + bodyFirstRow.Style = [bodyFirstRow.Style {Bold()}]; + if C5 == 0 + grps(1) = TableColSpecGroup; + grps(1).Span = 7; + specs(1) = TableColSpec; + specs(1).Span = 1; + specs(1).Style = {Width("7.5%")}; + specs(2) = TableColSpec; + specs(2).Span = 3; + specs(2).Style = {Width("15%")}; + specs(3) = TableColSpec; + specs(3).Span = 1; + specs(3).Style = {Width("10%")}; + specs(4) = TableColSpec; + specs(4).Span = 1; + specs(5) = TableColSpec; + specs(5).Span = 1; + specs(5).Style = {Width("12%")}; + grps(1).ColSpecs = specs; + tab.ColSpecGroups = grps; + end + + % Installazione + testo3 = Paragraph(['The first available reading date, reported in Tab. 1, '... + 'refers to the beginning of the monitoring activity. '... + 'It should be taken into account that the very first monitoring data '... + 'are usually influenced by stabilization phenomena, which are a '... + 'natural consequence of the tool installation on-site. For this reason, '... + 'a reference reading date is defined, representing a time reference '... + 'where the device can be considered fully operational since no more '... + 'stabilization movements are observed from sampled data '... + '(we suggest to refer to the International Standard EN ISO 18674-1:2015 '... + 'documentation for further information on this matter).']); + testo3.HAlign = 'justify'; + + add(geoloc_ENG,testo); + add(geoloc_ENG,testo2); + add(geoloc_ENG,testo3); + add(geoloc_ENG,tabCaption); + add(geoloc_ENG,tab); + add(geoloc_ENG,br); + add(geoloc_ENG,geo); + add(geoloc_ENG,geo_cap); + add(geoloc_ENG,sito); + add(geoloc_ENG,sito_cap); + add(rpt_ENG,geoloc_ENG); + template(rpt_ENG); + end + + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'Site information defined'; + fprintf(fileID,fmt,text); + fileID = fopen(FileName,'a'); + fclose(fileID); + + %% Capitolo 3 - Centraline + % --- Analisi centraline e catene --- + + datalogger = Chapter; + app = Heading1('Risultati - Dati delle centraline'); + app.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + datalogger.Title = app; + + datalogger_ENG = Chapter; + if activeEN == 1 + app_ENG = Heading1('Results - Control units'); + app_ENG.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + datalogger_ENG.Title = app_ENG; + end + + [FIG,FIG_ENG,datarif,contunit,IDscaduta] = report_CU(unitID,chainID,adesso,datainvio,numgiorni,... + datasample,tipoarray,firstdata_num,siteID,datalogger,datalogger_ENG,FIG,FIG_ENG,rpt,rpt_ENG,... + Font_caption,Font_section,activeEN,conn,FileName); + + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'Control units information defined'; + fprintf(fileID,fmt,text); + fileID = fopen(FileName,'a'); + fclose(fileID); + + %% Capitolo 4 - Catene + + MUMS = Chapter; + app = Heading1('Risultati - Dati della strumentazione installata'); + app.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter)}; + MUMS.Title = app; + + if activeEN == 1 + MUMS_ENG = Chapter; + app_ENG = Heading1('Results - Monitoring tools'); + app_ENG.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter)}; + MUMS_ENG.Title = app_ENG; + else + MUMS_ENG = []; + end + + [PL_A,PL_D,FIG,FIG_ENG] = report_AR(chainID,unitID,tipoarray,contunit,... + siteID,FIG,FIG_ENG,rpt,rpt_ENG,Font_caption,Font_Chapter,Font_section,... + Font_tools,datarif,yesKLHR3D,rTL,rTLHR,rTLH,rTLHRH,rPL,rBL,rLL,rRL,rKL,... + rKLHR,rThL,rPT100,rIPL,rIPLHR,rTuL,rRaL,rPCL,rPCLHR,rPrL,rEL,r3DEL,rWEL,rMPBEL,... + rCrL,r2DCrL,r3DCrL,rBML,rHL,rLuxL,rCO2,rRSN,rRSNHR,rTrL,rPE,rWL,rGF,rGS,... + NodoTiltLink,NodoTiltLinkH,NodoPiezoLink,NodoBaroLink,NodoLoadLink,... + NodoRainLink,NodoKlinoLink,NodoKlinoLinkHR,NodoThermLink,NodoPT100Link,... + NodoInPlaceLink,NodoInPlaceLinkHR,NodoTunnelLink,NodoRadialLink,NodoPreConvLink,... + NodoPressureLink,NodoExtensometerLink,Nodo3DExtensometerLink,... + NodoWireExtensometerLink,NodoMultiPointExtensometerLink,NodoCrackLink,... + Nodo2DCrackLink,Nodo3DCrackLink,NodoBaroMusaLink,NodoHumidityLink,NodoLuxLink,... + NodoCO2Link,NodoRSNLink,NodoRSNHRLink,NodoTriggerLink,NodoStressMeter,NodoWeirLink,... + NodoPendulum,MUMS,MUMS_ENG,colonna2,colonna2bis,colonna4,firstdata_num,activeEN,IDscaduta,... + status,br,conn,FileName); + + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'Arrays information defined'; + fprintf(fileID,fmt,text); + fileID = fopen(FileName,'a'); + fclose(fileID); + + %% Capitolo 5 - Control Tools + if cA > 1 % Significa che ci sono CT + CT = Chapter; + app = Heading1('Risultati - Attivazioni dei Control Tools'); + app.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter)}; + CT.Title = app; + + if activeEN == 1 + CT_ENG = Chapter; + app_ENG = Heading1('Results - Control Tools activations'); + app_ENG.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter)}; + CT_ENG.Title = app_ENG; + else + CT_ENG = []; + end + + [FIG,FIG_ENG] = report_CT(c1trigger,c6trigger,alarms,nCT,rpt,Font_caption,... + Font_table,Font_section,datarif,CT,CT_ENG,FIG,FIG_ENG,activeEN,conn,FileName); + + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'Control tools information defined'; + fprintf(fileID,fmt,text); + fileID = fopen(FileName,'a'); + fclose(fileID); + end + + %% Appendice + [dim,~]= size(colonna6); + appendice = Chapter; + app = Heading1('Appendice'); + app.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + appendice.Title = app; + + if activeEN == 1 + appendice_ENG = Chapter; + app_ENG = Heading1('Appendix'); + app_ENG.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + appendice_ENG.Title = app_ENG; + else + appendice_ENG = []; + end + + report_appendix(yesTL,yesIPL,yesIPLHR,yesTLH,yesPCL,yesTLHR,yesTLHRH,yesPCLHR,... + yesPL,yesBL,yesTuL,yesRaL,yesThL,yesKL,yesKLHR,yesRL,yesLL,yesPrL,yesPT100,... + yesCrL,yes3DCrL,yesEL,yes3DEL,yesWEL,yesMPBEL,yesTrL,nCAM,yesWL,yesPE,PL_A,PL_D,... + Font_section,Font_caption,Font_tools,FIG,FIG_ENG,dim,appendice,appendice_ENG,... + colonna4,colonna6,rpt,rpt_ENG,activeEN,FileName); + + % Chiudi report + close(rpt); + close(rpt_ENG); + + %% ---Email--- + [rU,cU] = size(Users_Report); + sendReportmail(NomeSito,Coordinate,meseadesso,NomeReport,NomeReport_ENG,... + Users_Report,recipients_ASE,Mail,Mail_ASE,activeEN,rU,cU,FileName); +end + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'Report Software ended correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/Report_ASE.m b/ATD/Report_ASE.m new file mode 100755 index 0000000..8787c2b --- /dev/null +++ b/ATD/Report_ASE.m @@ -0,0 +1,252 @@ +function Report_ASE(IDcentralina,siteID,unitID,chainID,Chain_Scheme,num_nodi,... + alarms,Mail,Users_Report,activeEN,time,conn,FileName) +% Software per la generazione automatica di report sull'attività di +% monitoraggio ASE + +try + diary on + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'report_ASE function started'; + fprintf(fileID,fmt,text); + fclose(fileID); + + RPT_ON = 0; % parametro che regola la creazione o meno del report + NomeFile = strcat('Report',siteID,'.txt'); + meseadesso = str2double(datestr(today,'mm')); + if isfile(NomeFile) == 1 % Esiste + + % Scarico la frequenza del report + comando = ['select freq_report from sites where id like ''' siteID ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Freq = cell2mat(curs.Data); + numgiorni = Freq; + + Filetesto = importdata(NomeFile); + [rTXT,~] = size(Filetesto); + if rTXT > 1 + datainvio = Filetesto(1,1); % mese di invio OPPURE data di ultimo invio + attivaReport = Filetesto(2,1); + else % file txt vuoto + if numgiorni == 30 + datainvio = str2double(datestr(today,'mm'))+1; % mese successivo + else + datainvio = now; + end + attivaReport = 1; % report disattivato + end + + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = ['Report frequency:' num2str(numgiorni) ' days']; + fprintf(fileID,fmt,text); + fclose(fileID); + + if numgiorni == 30 + adesso = str2double(datestr(today,'mm')); + if datainvio == adesso + RPT_ON = 1; + end + else + adesso = now; + if adesso >= datainvio + numgiorni + RPT_ON = 1; + end + end + + if RPT_ON == 1 && attivaReport == 0 + try + attivaReport = 1; + outdat = fopen(NomeFile,'wt+'); + fopen(NomeFile,'wt'); + fmt = '%d \r'; + fileID = fopen(NomeFile,'a'); + fprintf(fileID,fmt,meseadesso); + fprintf(fileID,fmt,attivaReport); + fclose(fileID); + + % salvo variabili da caricare in Report + nomevar = ['variabili_RPT' siteID '.mat']; + save(nomevar, 'unitID', 'chainID', 'alarms', 'Chain_Scheme', 'num_nodi', 'Users_Report', 'Mail', ... + 'time', 'meseadesso', 'adesso', 'datainvio', 'numgiorni', 'activeEN', 'FileName'); + + rilancio = ['/usr/local/matlab_func/run_Report_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 '... + siteID '']; + + status = system(rilancio); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,status); + catch err + FileErr = ['ErrorFile-Report-' siteID '-' datestr(today) '-' datestr(now,'hhMMss')]; + fid = fopen(FileErr,'a+'); + fprintf(fid, '%s', err.getReport('extended','hyperlinks','off')); + fclose(fid); + + %% 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 + + % Uso il siteID per identificare il nome del sito + comando = ['select name from sites where id like ''' siteID ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + NomeSito = num2str(cell2mat(curs.Data)); + + subject_ITA = ('CRASH funzione Report'); + testo = cellstr('Ciao Andrea e Alessandro,'); + testobis = cellstr(''); + testo2 = cellstr(['Il mostro biblico della funzione Report ha al proprio interno qualche minchiata '... + 'per cui il SW crasha nel realizzare il report di ' NomeSito '. Vi prego di correggermi '... + 'o continuer' char(243) ' a crashare e ad assillarvi con questa mail. BUAHAHAH! Troverete l''errore in allegato.']); + message_ITA = [testo; testobis; testo2]; + message = cellstr('Tanti Blip e Blop a voi, '); + message2 = cellstr('Software ATD'); + message_ITA = [message_ITA; message; message2]; + + recipients_ASE{1,1} = 'alessandro.valletta@aseltd.eu'; + recipients_ASE{2,1} = 'andrea.carri@aseltd.eu'; + + allegato = FileErr; + + sendmail(recipients_ASE, subject_ITA, message_ITA, allegato) + + end +% Report(attivaReport,Mail,siteID,unitID,chainID,alarms,Chain_Scheme,... +% time,conn,num_nodi,meseadesso,adesso,datainvio,numgiorni,activeEN,Users_Report,... +% NomeFile,FileName); + end + else + datainvio = meseadesso+1; + if datainvio > 12 + datainvio = datainvio-12; + end + end + %% --- Modifica file di testo --- %%% + if numgiorni == 30 + if datainvio == 12 + nuovofile = 1; + elseif datainvio == 13 + nuovofile = 13; + else + nuovofile = adesso+1; + end + else + nuovofile = datainvio + numgiorni; + end + attivaReport = 0; + outdat = fopen(NomeFile,'wt+'); + fopen(NomeFile,'wt'); + fmt = '%d \r'; + fileID = fopen(NomeFile,'a'); + fprintf(fileID,fmt,nuovofile); + fprintf(fileID,fmt,attivaReport); + fclose(fileID); + +catch err + FileErr = ['ErrorFile-' IDcentralina '-' datestr(today) '-' datestr(now,'hhMMss') '.txt']; + fid = fopen(FileErr,'a+'); + fprintf(fid, '%s', err.getReport('extended','hyperlinks','off')); + fclose(fid); + + % Scarico la frequenza del report + comando = ['select freq_report from sites where id like ''' siteID ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Freq = cell2mat(curs.Data); + numgiorni = Freq; + meseadesso = str2double(datestr(today,'mm')); + + NomeFile = strcat('Report',siteID,'.txt'); + + if isfile(NomeFile) == 1 % Esiste + Filetesto = importdata(NomeFile); + [rTXT,~] = size(Filetesto); + if rTXT >1 + datainvio = Filetesto(1,1); % mese di invio OPPURE data di ultimo invio + else % file txt vuoto + if numgiorni == 30 + datainvio = meseadesso; + else + datainvio = now; + end + end + else + datainvio = meseadesso+1; + if datainvio > 12 + datainvio = datainvio-12; + end + end + + attivaReport = 0; + outdat = fopen(NomeFile,'wt+'); + fopen(NomeFile,'wt'); + fmt = '%d \r'; + fileID = fopen(NomeFile,'a'); + if numgiorni == 30 + if datainvio == 12 + nuovofile = 12; + elseif datainvio == 13 + nuovofile = 13; + else + nuovofile = meseadesso; + end + else + nuovofile = datainvio; + end + fprintf(fileID,fmt,nuovofile); + fprintf(fileID,fmt,attivaReport); + fclose(fileID); + + %% 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 + +% Uso il siteID per identificare il nome del sito + comando = ['select name from sites where id like ''' siteID ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + NomeSito = num2str(cell2mat(curs.Data)); + + subject_ITA = (['CRASH del Report Automatico - ' NomeSito '']); + testo = cellstr('Ciao Andrea e Alessandro,'); + testobis = cellstr(''); + testo2 = cellstr(['Nella funzione Report_ASE avete scritto qualche minchiata per cui il SW crasha. Vi prego di correggermi '... + 'o continuer' char(243) ' a crashare e ad assillarvi con questa mail. Sono talmente stupido che non sono nemmeno '... + 'riuscito a lanciare il software esterno Report =( .Troverete l''errore in allegato.']); + message_ITA = [testo; testobis; testo2; testobis]; + message = cellstr('Tanti Blip e Blop a te, '); + message2 = cellstr('Software ATD'); + message_ITA = [message_ITA; message; message2]; + + recipients_ASE{1,1} = 'alessandro.valletta@aseltd.eu'; + recipients_ASE{2,1} = 'andrea.carri@aseltd.eu'; + + allegato = FileErr; + + sendmail(recipients_ASE, subject_ITA, message_ITA, allegato) + +end + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_ASE function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); +diary off + + +end \ No newline at end of file diff --git a/ATD/SMS.m b/ATD/SMS.m new file mode 100755 index 0000000..80e6b91 --- /dev/null +++ b/ATD/SMS.m @@ -0,0 +1,130 @@ +function SMS(IDcentralina,DTcatena,Sito,Users_SMS,Criterio,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; + +[rU,cU] = size(Users_SMS); +NumTel = cell(1); +Language = cell(1); +j = 1; +if cU > 1 + for i = 1:rU + if isempty(Users_SMS{i,6}) == 0 % l'utente ha un numero di telefono + NumTel(j,1) = Users_SMS(i,6); + Language(j,1) = Users_SMS(i,4); + j = j+1; + end + end +end + +%% ------ INVIO SMS TRAMITE MAIL-TO-SMS SKEBBY ------- + +% Settaggio Email mittente +setpref('Internet','E_mail','aseparma@gmail.com'); +setpref('Internet','SMTP_Server','smtp.gmail.com'); +setpref('Internet','SMTP_Username','aseparma@gmail.com'); +setpref('Internet','SMTP_Password','Mums@2016'); +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 + +if strcmp(Criterio,'Fukuzono') + sms = 1; +elseif strcmp(Criterio,'FIFA') + sms = 2; +elseif strcmp(Criterio,'Soglie') + sms = 3; +end + +% --- Invio sms di allertamento utenti --- +[r,~]=size(NumTel); +Condizione = cell2mat(NumTel); + +if isempty(Condizione) == 0 % almeno un utente da avvisare + for k=1:r + check = char(NumTel(k,1)); + [~,cC] = size(check); + if cC >= 1 + if Language{k,1} == 2 %ITA + if sms == 1 + testosms = (['ALLARME - Criterio Inverso della Velocità attivato per la Centralina ' IDcentralina... + ', Catena ' DTcatena ' nel sito di ' Sito '. Controllare l''email per maggiori dettagli.']); %testo sms + elseif sms == 2 + testosms = (['ALLARME - Criterio FIFA attivato per la Centralina ' IDcentralina... + ', Catena ' DTcatena ' nel sito di ' Sito '. Controllare l''email per maggiori dettagli.']); %testo sms + elseif sms == 3 + testosms = (['ALLARME - Soglie superate per la Centralina ' IDcentralina... + ', Catena ' DTcatena ' nel sito di ' Sito '. Controllare l''email per maggiori dettagli.']); %testo sms + end + else %ENG + if sms == 1 + testosms = (['ALARM - Inverse of Velocity Criterion Activated for Datalogger ' IDcentralina ', Array ' DTcatena ', Site: ' Sito... + '. Check the email for further details. ''']); %testo sms + elseif sms == 2 + testosms = (['ALARM - FIFA Criterion Activated for Datalogger ' IDcentralina ', Array ' DTcatena ', Site: ' Sito... + '. Check the email for further details. ''']); %testo sms + elseif sms == 3 + testosms = (['ALARM - Thresholds activated for Datalogger ' IDcentralina ', Array ' DTcatena ', Site: ' Sito... + '. Check the email for further details. ''']); %testo sms + end + end + NUMERO_TEL = num2str(cell2mat(NumTel(k,1))); % numero telefono + soggetto = 'ASE: Allarme Fukuzono!'; + utente = [NUMERO_TEL '@classic.skebby.com']; + sendmail(utente,soggetto,testosms) + if sms == 1 + text = ['Alert of Level #5 SMS sent to ' NUMERO_TEL '!']; + elseif sms == 2 + text = ['Alert of Red Code SMS sent to ' NUMERO_TEL '!']; + elseif sms == 3 + text = ['Alert SMS sent to ' NUMERO_TEL ' for the thresholds overcoming!']; + end + fprintf(fileID,fmt,text); + end + end + % scrivo invio sms a utenti autorizzati nel logfile + text = 'Alarm activated, email-to-sms process completed - Alert sent to authorized users!'; + fprintf(fileID,fmt,text); +end + +% --- Invio sms a destinatari ASE --- +recipients_ITA{1,1} = '+393482453680'; % Alessandro Valletta +recipients_ITA{2,1} = '+393493048545'; % Andrea Carri +recipients_ITA{3,1} = '+393406654863'; % Roberto Savi +recipients_ITA{4,1} = '+393485113211'; % Andrea Segalini +[rASE,~]=size(recipients_ITA); + +for z = 1:rASE + if sms == 1 + smsASE = (['ALLARME di livello massimo - Criterio di Fukuzono Attivato per la Centralina' IDcentralina... + ', Catena ' DTcatena ' nel sito di ' Sito '. Controllare l''email per maggiori dettagli.']); + soggettoASE = 'ASE: Allarme Fukuzono!'; + elseif sms == 2 + smsASE = (['ALLARME - Criterio FIFA Attivato per la Centralina' IDcentralina... + ', Catena ' DTcatena ' nel sito di ' Sito '. Controllare l''email per maggiori dettagli.']); + soggettoASE = 'ASE: Allarme FIFA!'; + elseif sms == 3 + smsASE = (['ALLARME - Soglie superate per la Centralina' IDcentralina... + ', Catena ' DTcatena ' nel sito di ' Sito '. Controllare l''email per maggiori dettagli.']); + soggettoASE = 'ASE: Allarme Soglie!'; + end + Num_ASE = num2str(cell2mat(recipients_ITA(z,1))); % numero telefono ASE + utenteASE = [Num_ASE '@classic.skebby.com']; + sendmail(utenteASE,soggettoASE,smsASE) + % scrivo invio sms a utenti autorizzati nel logfile + if sms == 1 + text = ['Alert of Level #5 SMS sent to ' Num_ASE '!']; + elseif sms == 2 + text = ['Alert of Red Code SMS sent to ' Num_ASE '!']; + elseif sms == 3 + text = ['Alert SMS sent to ' NUMERO_TEL ' for the thresholds overcoming!']; + end + fprintf(fileID,fmt,text); +end + +text = 'Alarm activated, email-to-sms process completed - Alert sent to ASE users!'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/SWSearch.m b/ATD/SWSearch.m new file mode 100755 index 0000000..76820e7 --- /dev/null +++ b/ATD/SWSearch.m @@ -0,0 +1,123 @@ +function [yesRSN,yesMusa] = SWSearch(idTool,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'SWSearch function started'; +fprintf(fileID,fmt,text); + +yesRSN = 0; +yesMusa = 0; + +%% Baro Musa Link +comando = ['select num, depth from nodes where tool_id = ''' idTool ''' and nodetype_id = 41 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesMusa = 1; + text = 'Baro Musa Links identified, Musa relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% Humidity link +comando = ['select num, depth from nodes where tool_id = ''' idTool ''' and nodetype_id = 35 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesMusa = 1; + text = 'Humidity Links identified, Musa relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% CO2 Link +comando = ['select num, depth from nodes where tool_id = ''' idTool ''' and nodetype_id = 33 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesMusa = 1; + text = 'CO2 Links identified, Musa relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% Lux Link +comando = ['select num, depth from nodes where tool_id = ''' idTool ''' and nodetype_id = 34 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesMusa = 1; + text = 'Lux Links identified, Musa relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% RSN Link +comando = ['select num, depth from nodes where tool_id = ''' idTool ''' and nodetype_id = 38 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesRSN = 1; + text = 'RSN Links identified, RSN relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% RSN Link HR +comando = ['select num, depth from nodes where tool_id = ''' idTool ''' and nodetype_id = 39 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesRSN = 1; + text = 'RSN Links HR identified, RSN relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% Trigger Link +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 40 order by num']; +curs = exec(conn,comando); +curs = fetch(curs); +Leggo = curs.Data; +[~,cL] = size(Leggo); +if cL > 1 + yesRSN = 1; + text = 'Trigger Links identified, RSN relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% G-Flow Link +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 48 order by num']; +curs = exec(conn,comando); +curs = fetch(curs); +Leggo = curs.Data; +[~,cL] = size(Leggo); +if cL > 1 + yesRSN = 1; + text = 'G-Flow Links identified, RSN relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% G-Shock Link +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 50 order by num']; +curs = exec(conn,comando); +curs = fetch(curs); +Leggo = curs.Data; +[~,cL] = size(Leggo); +if cL > 1 + yesRSN = 1; + text = 'G-Shock Links identified, RSN relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% Debris Link +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 49 order by num']; +curs = exec(conn,comando); +curs = fetch(curs); +Leggo = curs.Data; +[~,cL] = size(Leggo); +if cL > 1 + yesRSN = 1; + text = 'Debris Links identified, RSN relaunch activated'; + fprintf(fileID,fmt,text); +end + +text = 'SWScheme function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/ATD/Siren.m b/ATD/Siren.m new file mode 100755 index 0000000..eb5d0cc --- /dev/null +++ b/ATD/Siren.m @@ -0,0 +1,225 @@ +function alarms = Siren(siteID,yesTuL,yesRL,yesTLH,yesTLHRH,yesPCL,yesPCLHR,... + yesCrL,yes3DCrL,yes2DCrL,yesEL,yes3DEL,yesWEL,yesMPBEL,datainiTuL,tempoiniTuL,... + datainiRL,tempoiniRL,datainiTLH,tempoiniTLH,datainiTLHRH,tempoiniTLHRH,... + datainiPCL,tempoiniPCL,datainiPCLHR,tempoiniPCLHR,datainiCrL,tempoiniCrL,... + dataini3DCrL,tempoini3DCrL,dataini2DCrL,tempoini2DCrL,... + datainiEL,tempoiniEL,dataini3DEL,tempoini3DEL,... + datainiWEL,tempoiniWEL,datainiMPBEL,tempoiniMPBEL,ARRAYdate_TuL,ARRAYdate_RL,... + ARRAYdate_TLH,ARRAYdate_TLHRH,ARRAYdate_PCL,ARRAYdate_PCLHR,ARRAYdate_CrL,... + ARRAYdate_3DCrL,ARRAYdate_2DCrL,ARRAYdate_EL,ARRAYdate_3DEL,ARRAYdate_WEL,ARRAYdate_MPBEL,... + conn,date,time,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; + +text = 'Siren function started'; +fprintf(fileID,fmt,text); + +% Scarico l'allarme relativo al sito +comando = ['select id, name, ctrltype_id from ctrltools where site_id = ''' siteID ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +alarms = curs.Data; +[rA,cA] = size(alarms); + +sirena = 0; +if rA > 0 && cA > 1 + for aa = 1:rA + if cell2mat(alarms(aa,3)) == 1 + sirena = 1; + break + end + end +end + +if cA ~= 1 && sirena == 1 + if yesTuL == 1 + ARRAYdateAL = ARRAYdate_TuL; + elseif yesRL == 1 + ARRAYdateAL = ARRAYdate_RL; + elseif yesTLH == 1 + ARRAYdateAL = ARRAYdate_TLH; + elseif yesTLHRH == 1 + ARRAYdateAL = ARRAYdate_TLHRH; + elseif yesPCL == 1 + ARRAYdateAL = ARRAYdate_PCL; + elseif yesPCLHR == 1 + ARRAYdateAL = ARRAYdate_PCLHR; + elseif yesCrL == 1 + ARRAYdateAL = ARRAYdate_CrL; + elseif yes3DCrL == 1 + ARRAYdateAL = ARRAYdate_3DCrL; + elseif yes2DCrL == 1 + ARRAYdateAL = ARRAYdate_2DCrL; + elseif yesEL == 1 + ARRAYdateAL = ARRAYdate_EL; + elseif yes3DEL == 1 + ARRAYdateAL = ARRAYdate_3DEL; + elseif yesWEL == 1 + ARRAYdateAL = ARRAYdate_WEL; + elseif yesMPBEL == 1 + ARRAYdateAL = ARRAYdate_MPBEL; + end + [ListaDate,~] = size(ARRAYdateAL); + val_AL = zeros(ListaDate,rA); + StoricoAllarmi = zeros(ListaDate,rA); + % Attivazione della Sirena al superamento di una determinata soglia + + if yesTuL == 1 + dataini = datainiTuL; + tempoini = tempoiniTuL; + elseif yesRL == 1 + dataini = datainiRL; + tempoini = tempoiniRL; + elseif yesTLH == 1 + dataini = datainiTLH; + tempoini = tempoiniTLH; + elseif yesTLHRH == 1 + dataini = datainiTLHRH; + tempoini = tempoiniTLHRH; + elseif yesPCL == 1 + dataini = datainiPCL; + tempoini = tempoiniPCL; + elseif yesPCLHR == 1 + dataini = datainiPCLHR; + tempoini = tempoiniPCLHR; + elseif yesCrL == 1 + dataini = datainiCrL; + tempoini = tempoiniCrL; + elseif yes3DCrL == 1 + dataini = dataini3DCrL; + tempoini = tempoini3DCrL; + elseif yes2DCrL == 1 + dataini = dataini2DCrL; + tempoini = tempoini2DCrL; + elseif yesEL == 1 + dataini = datainiEL; + tempoini = tempoiniEL; + elseif yes3DEL == 1 + dataini = dataini3DEL; + tempoini = tempoini3DEL; + elseif yesWEL == 1 + dataini = datainiWEL; + tempoini = tempoiniWEL; + elseif yesMPBEL == 1 + dataini = datainiMPBEL; + tempoini = tempoiniMPBEL; + end + dateCheck = [date ' ' time]; + if dataini < datenum(dateCheck) + dataini = date; + tempoini = time; + else + dataini = datestr(dataini,'yyyy-mm-dd HH:MM:SS'); + end + + Control = 1; + while Control == 1 + for nn = 1:rA + % Scarico i dati storici di attivazione dell'allarme + comando = ['select EventDate, EventTime, X from ELABDATACTRL where EventDate = ''' ... + dataini ''' and EventTime >= ''' tempoini ''' and CtrlToolName = '''... + char(alarms(nn,2)) ''' and NodeNum = 1 ']; + curs = exec(conn,comando); + curs = fetch(curs); + AlarmTot_1 = curs.Data; % numero cumulato di attivazioni prima della lettura in elaborazione + + comando = ['select EventDate, EventTime, X from ELABDATACTRL where EventDate > ''' ... + dataini ''' and CtrlToolName = ''' char(alarms(nn,2)) ''' and NodeNum = 1 ']; + curs = exec(conn,comando); + curs = fetch(curs); + AlarmTot_2 = curs.Data; % numero cumulato di attivazioni prima della lettura in elaborazione + + [r1,c1] = size(AlarmTot_1); + [r2,c2] = size(AlarmTot_2); + if r1 == 1 && c1 == 1 + if r2 == 1 && c2 == 1 + if datenum(dataini) < datenum(dateCheck) + AlarmTot(1,1) = cellstr(date); + AlarmTot(1,2) = cellstr(time); + AlarmTot(1,3) = num2cell(0); + Control = 0; + else + dataini = dataini-1; + break + end + else + AlarmTot = AlarmTot_2; + Control = 0; + end + else + Control = 0; + if r2 == 1 && c2 == 1 + AlarmTot = AlarmTot_1; + else + AlarmTot = [AlarmTot_1; AlarmTot_2]; + end + end + [rA,~] = size(AlarmTot); + Data = [cell2mat(AlarmTot(:,1)) repmat(' ', [rA,1]) cell2mat(AlarmTot(:,2))]; + Data = datenum(Data); + Var = find(Data < datenum(ARRAYdateAL(1,1))); + if isempty(Var) == 1 + StoricoAllarmi(:,nn) = cumsum(val_AL); + else + StoricoAllarmi(:,nn) = cumsum(val_AL)+cell2mat(AlarmTot(Var(end),3)); + end + + DATAinsert = cell(ListaDate,6); + % Creo i dati da scrivere + for ii=1:ListaDate + DATAinsert{ii,1} = alarms(nn,2); + DATAinsert{ii,2} = datestr(ARRAYdateAL(ii),'yyyy-mm-dd'); + DATAinsert{ii,3} = datestr(ARRAYdateAL(ii),'HH:MM:SS'); + DATAinsert{ii,4} = val_AL(ii,nn); + DATAinsert{ii,5} = StoricoAllarmi(ii,nn); + DATAinsert{ii,6} = 1; + end + idElabData = zeros(ListaDate,1); % Contiene gli id delle date delle quali ho già dati + cc = 1; % contatore + % Cerco su DB se i dati sono da aggiornare o scrivere + for ii=1:ListaDate + dString = datestr(ARRAYdateAL(ii),'yyyy-mm-dd'); + tString = datestr(ARRAYdateAL(ii),'HH:MM:SS'); + + comando = ['select idElabDataCtrl from ELABDATACTRL where CtrlToolName = '''... + char(alarms(nn,2)) ''' and NodeNum = 1 and EventDate = ''' ... + dString ''' and EventTime = ''' tString ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + idDate = curs.Data; + if strcmp(idDate,'No Data') + idElabData(cc,1) = 0; % 0 indica che il dato non è presente su DB + else + idElabData(cc,1) = cell2mat(idDate); + end + cc = cc+1; + % Scrivo o Aggiorno i dati + idData = idElabData(ii,1); + tablename = 'ELABDATACTRL'; + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + colnames = {'CtrlToolName','EventDate','EventTime','XShift','X','NodeNum',}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6)]; + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + colnames = {'XShift','X'}; + data = [DATAinsert(ii,4),DATAinsert(ii,5)]; + whereclause = ['WHERE CtrlToolName = ''' char(alarms(nn,2)) ... + ''' and NodeNum = 1 and EventDate = ''' cell2mat(DATAinsert(ii,2))... + ''' and EventTime = ''' cell2mat(DATAinsert(ii,3)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end + end + text = ['Data of Control Tools ' char(alarms(nn,2)) ' uploaded in the DB correctly']; + fprintf(fileID,fmt,text); + end + end +end + +text = 'Siren function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); +end + + \ No newline at end of file diff --git a/ATD/Site_Info.m b/ATD/Site_Info.m new file mode 100755 index 0000000..4a7ca82 --- /dev/null +++ b/ATD/Site_Info.m @@ -0,0 +1,60 @@ +function [unitID,chainID,Chain_Scheme,num_nodi,alarms] = Site_Info(siteID,conn,FileName) + +text = 'Site_Info function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +% Scarico tutte le centraline presenti in sito +comando = ['select id, name from units where site_id = ''' siteID ''' order by name']; % il rapporto centralina sito è di 1 a 1 +curs = exec(conn,comando); +curs = fetch(curs); +unitID = curs.Data; + +col = size(unitID); +chainID = cell(1,4); +ini = 1; +for c = 1:col(1,1) + % dalle centraline presenti, risalgo alle catene disponibili + comando = ['select id, name from tools where unit_id = ''' num2str(cell2mat(unitID(c,1))) ''' order by name']; + curs = exec(conn,comando); + curs = fetch(curs); + chainID_down = curs.Data; % id tool, nome tool + [fin,~] = size(chainID_down); + fin = fin+ini-1; + chainID(ini:fin,3:4) = chainID_down; + for j = ini:fin + chainID(j,1:2) = unitID(c,1:2); % Id centralina, nome centralina, id tool, nome tool + end + ini = fin+1; +end + +% Scarico gli schemi delle catene +[col,~] = size(chainID); % Numero di Array +Chain_Scheme = cell(1,3); +num_nodi = zeros(col,1); +ini = 1; +cont = 1; +for c = 1:col(1,1) + comando = ['select nodetype_id, depth, num from nodes where tool_id = ''' num2str(cell2mat(chainID(c,3))) ''' order by num']; + curs = exec(conn,comando); + curs = fetch(curs); + scheme_down = curs.Data; % id nodo, profondità, numero + [fin,~] = size(scheme_down); + num_nodi(cont) = fin; + Chain_Scheme(1:fin,ini:ini+2) = scheme_down; + ini = ini+3; + cont = cont+1; +end + +% Scarico l'allarme relativo al sito +comando = ['select id, name, ctrltype_id, alarm_phone, conn_usr, conn_pwd, duedate from ctrltools where site_id = ''' siteID ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +alarms = curs.Data; + +text = 'Site_Info function worked correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/Users_Def.m b/ATD/Users_Def.m new file mode 100755 index 0000000..11e5191 --- /dev/null +++ b/ATD/Users_Def.m @@ -0,0 +1,308 @@ +function [Mail,Users_Alert,Users_SMS,Users_Report,activeIT,activeEN,... + sms,siteID,NomeSito,ini_CoV] = Users_Def(IDcentralina,conn,FileName) + +text = 'Users function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +% A partire dalla centralina, risalgo al site ID +comando = ['select site_id from units where name like ''' IDcentralina ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +siteID = num2str(cell2mat(curs.Data)); + +% --- Cerco gli utenti --- + +% - Definisco gli Users +% A partire dal site ID, risalgo al company ID +comando = ['select company_id, name, lat, lon, alarm_email from sites where id like ''' siteID ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +Site = curs.Data; +Company_id = num2str(cell2mat(Site(1,1))); +Email_Alarm_Site = Site(1,5); +NomeSito = Site(1,2); + +% A partire dal company ID, mi scarico le info relative a Send Email Alarm +comando = ['select send_alarm from companies where id like ''' Company_id ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +Mail = cell2mat(curs.Data); + +if Mail == 1 % Significa che invio Mail alla Company del Sito + % La Mail la mando SOLO alla mail indicata nel campo del Sito (per quanto riguarda la company cliente) + if isempty(cell2mat(Email_Alarm_Site)) == 0 + if strcmp(char(Email_Alarm_Site),'null') == 0 + US = Email_Alarm_Site; + check = cell2mat(strfind(US,',')); + if isempty(check)==1 + % A partire dal company ID, risalgo agli utenti e alla loro mail di + % quella company che sono admin + comando = ['select fname, lname, language_id, info, phone, sms_alarm, report, report_cov, '... + 'allertamento from users where email like '''... + char(US) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Info = curs.Data; % Cerco la lingua dell'unico destinatario + [~,cC] = size(Info); + if cC > 1 + Users = Info(1:2); + Users(3) = US; + Users(4:5) = Info(3:4); + Users(6) = Info(5); + Users(7:10) = Info(6:9); + else + Users = []; + end + else + [~,cC] = size(check); + Users = cell(cC+1,6); + u = 1; + ini = 1; + for i=1:cC+1 + utente = char(US); + % A partire dal company ID, risalgo agli utenti e alla loro mail di + % quella company che sono admin + if i == cC+1 + comando = ['select fname, lname, language_id, info, phone, sms_alarm, report, report_cov, '... + 'allertamento, email from users where email like ''' utente(ini:end) ''' ']; + else + comando = ['select fname, lname, language_id, info, phone, sms_alarm, report, report_cov, '... + 'allertamento, email from users where email like ''' utente(ini:check(i)-1) ''' ']; + end + curs = exec(conn,comando); + curs = fetch(curs); + Info = curs.Data; % Cerco la lingua dell'unico destinatario + [~,cI] = size(Info); + if cI ~= 1 + Users(u,1:2) = Info(1:2); + Users(u,3) = Info(10); + Users(u,4:5) = Info(3:4); + Users(u,6) = Info(5); + Users(u,7:10) = Info(6:9); + u = u+1; + end + if i ~= cC+1 + ini = check(i)+1; + end + end + Users = Users(1:u-1,:); + end + else + % Company Manager + Role = ' 2 '; + % A partire dal company ID, risalgo agli utenti e alla loro mail di + % quella company che sono admin + comando = ['select fname, lname, email, language_id, info, phone, sms_alarm, report, report_cov, '... + 'allertamento from users where company_id like ''' Company_id ''' and role_id = ''' Role ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Users = curs.Data; + end + else + % Company Manager + Role = ' 2 '; + % A partire dal company ID, risalgo agli utenti e alla loro mail di + % quella company che sono admin + comando = ['select fname, lname, email, language_id, info, phone, sms_alarm, report, report_cov, '... + 'allertamento from users where company_id like ''' Company_id ''' and role_id = ''' Role ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Users = curs.Data; + end +else + Users = []; +end + +% Elimino gli utenti che non possono essere allertati +[rU,cU] = size(Users); +al = 1; +sms = 1; +rpt = 1; +Users_Alert = cell(1,1); +Users_SMS = cell(1,1); +Users_Report = cell(1,1); +if cU > 1 + for u = 1:rU + if cell2mat(Users(u,10)) == 1 + [rUA,cUA] = size(Users_Alert); + if rUA == 1 && cUA == 1 + clear Users_Alert + end + Users_Alert(al,:) = Users(u,:); + al = al+1; + if cell2mat(Users(u,7)) == 1 + [rUA,cUA] = size(Users_SMS); + if rUA == 1 && cUA == 1 + clear Users_SMS + end + Users_SMS(sms,:) = Users(u,:); + sms = sms+1; + end + end + if cell2mat(Users(u,8)) == 1 + [rUA,cUA] = size(Users_Report); + if rUA == 1 && cUA == 1 + clear Users_Report + end + Users_Report(rpt,:) = Users(u,:); + rpt = rpt+1; + end + end +end +ini_CoV = al; + +% Cerco se allertare o meno i Cone of Visions +comando = ['select conn_path from units where name like ''' IDcentralina ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +Auth = curs.Data; % Se pari a 1 autorizzo i Cone of Visions, altrimenti no + +if strcmp(char(Auth),'Yes') + Mail = 1; + % Cone of vision + % A partire dal site ID, risalgo al USER ID degli utenti nel + % cone-of-vision per quel sito + comando = ['select user_id from coneofvisions where site_id like ''' siteID ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + CoV = cell2mat(curs.Data); + + % A partire dal USER ID, risalgo agli utenti e alla loro email se sono company manager + [rC, ~] = size(CoV); + if strcmp(char(CoV(1,:)),'No Data') % almeno un utente da cercare nel database + Users_CoV = []; + else + ii = 1; + for i=1:rC + Utente = num2str(CoV(i,1)); + Role = ' 2 '; + comando = ['select fname, lname, email, language_id, info, phone, sms_alarm, report, report_cov, '... + 'allertamento from users where id = ''' Utente ''' and role_id = ''' Role ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + UC = curs.Data; + [~,cUC] = size(UC); + if cUC ~= 1 + Users_CoV(ii,:) = UC; + ii = ii+1; + end + end + end + [rUC,cUC] = size(Users_CoV); + [rUA,cUA] = size(Users_Alert); + if cUC > 1 + for u = 1:rUC + if cell2mat(Users_CoV(u,10)) == 1 && cell2mat(Users_CoV(u,9)) == 1 + salta = 0; + for cov = 1:rUA + if cUA > 1 + A = strfind(char(Users_CoV(u,3)),char(Users_Alert(cov,3))); + if A == 1 + salta = 1; + break + end + end + end + if salta == 0 + if cUA > 1 + Users_Alert(al,:) = Users_CoV(u,:); + else + Users_Alert = Users_CoV(u,:); + end + al = al+1; + if cell2mat(Users_CoV(u,7)) == 1 + Users_SMS(sms,:) = Users_CoV(u,:); + sms = sms+1; + end + end + end + if cell2mat(Users_CoV(u,9)) == 1 + salta = 0; + for cov = 1:rUA + if cUA > 1 + A = strfind(char(Users_CoV(u,3)),char(Users_Alert(cov,3))); + if A == 1 + salta = 1; + break + end + end + end + if salta == 0 + [rUA,cUA] = size(Users_Report); + if rUA == 1 && cUA == 1 + clear Users_Report + end + Users_Report(rpt,:) = Users_CoV(u,:); + rpt = rpt+1; + end + end + end + end +else + Users_CoV = []; +end + +[rU,cU] = size(Users); +[rC,cC] = size(Users_CoV); +if cC > 1 && rC > 0 && cU > 1 % comando ha trovato informazioni e le ha scritte in Users + Users(rU+1:rU+rC,1:10) = Users_CoV; +elseif cC > 1 && rC > 0 && cU == 0 + Users = Users_CoV; +end + +[rU,~] = size(Users); +if rU == 0 + Mail = 0; +end +% Controllo che la centralina non sia scaduta +comando = ['select duedate from units where name = ''' IDcentralina ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +Date = curs.Data; +Check = cell2mat(Date); +if strcmp(Check,'null') || strcmp(Check,'No Data') + % La data di scadenza centralina non è impostata + sms = 1; +else + if datenum(Date) < now % Centralina scaduta + sms = 0; + Users_Alert = []; + Users_SMS = []; + Users_Report = []; + else + sms = 1; + end +end + +% A chi mando la mail +activeIT = 0; +activeEN = 0; +[~,c1] = size(Users_Alert); +[~,c2] = size(Users_Report); +if c1 == 1 && c2 == 1 + Users_Lang = []; +elseif c1 == 1 + Users_Lang = Users_Report; +elseif c2 == 1 + Users_Lang = Users_Alert; +else + Users_Lang = [Users_Alert; Users_Report]; +end +[rU,cU] = size(Users_Lang); +if cU >1 % sono presenti utenti a cui inviare la mail + for i = 1:rU + if Users_Lang{i,4} == 2 + activeIT = 1; + else + activeEN = 1; + end + end +end + +text = 'Users function worked correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/YesNo.m b/ATD/YesNo.m new file mode 100755 index 0000000..821d4d8 --- /dev/null +++ b/ATD/YesNo.m @@ -0,0 +1,183 @@ +%% funzione che attiva/disattiva l'elaborazione per una determinata tipologia di nodo +% Ad esempio se la matrice Tilt Link è vuota i Tilt Link non sono presenti +% e si scrive yesTL = 0, altrimenti se ci sono dei dati, yesTL = 1 e ne +% viene attivata l'elaborazione nelle fasi successive + +function [yesTuL,yesRL,yesTLH,yesTLHRH,yesTLHR3DH,yesPCL,yesPCLHR,yesPCLHR3D,... + yesPL,yesLL,yesEL,yes3DEL,yesWEL,yesMPBEL,yesAL,yesCrL,yes3DCrL,yes2DCrL,... + yesDM,yesSM] = YesNo(NodoTunnelLink,NodoRadialLink,NodoTiltLinkH,NodoTiltLinkHRH,... + NodoTiltLinkHR3DH,NodoPreConvLink,NodoPreConvLinkHR,NodoPreConvLinkHR3D,... + NodoDistoMTLink,NodoPressureLink,NodoLoadLink,NodoExtensometerLink,... + Nodo3DExtensometerLink,NodoWireExtensometerLink,NodoMultiPointRodExtensometer,... + NodoAnalogLink,NodoCrackLink,Nodo3DCrackLink,Nodo2DCrackLink,NodoStressMeter,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'YesNo function started'; +fprintf(fileID,fmt,text); + +%% Tunnel Link +[rTuL,cTuL] = size(NodoTunnelLink); +if rTuL==0 && cTuL==0 + yesTuL = 0; % Non elaboro i Tunnel Link +else + yesTuL = 1; % attiva l'elaborazione dei Tunnel Link +end + +%% Radial Link +[rRL,cRL] = size(NodoRadialLink); +if rRL==0 && cRL==0 + yesRL = 0; % Non elaboro i Radial Link +else + yesRL = 1; % attiva l'elaborazione dei Radial Link +end + +%% Tilt Link H +[rTLH,cTLH] = size(NodoTiltLinkH); +if rTLH==0 && cTLH==0 + yesTLH = 0; % Non elaboro i Tilt Link H +else + yesTLH = 1; % attiva l'elaborazione dei Tilt Link H +end + +%% Tilt Link HR H +[rTLHRH,cTLHRH] = size(NodoTiltLinkHRH); +if rTLHRH==0 && cTLHRH==0 + yesTLHRH = 0; % Non elaboro i Tilt Link HR H +else + yesTLHRH = 1; % attiva l'elaborazione dei Tilt Link HR H +end + +%% Tilt Link HR 3D H +[rTLHR3DH,cTLHR3DH] = size(NodoTiltLinkHR3DH); +if rTLHR3DH==0 && cTLHR3DH==0 + yesTLHR3DH = 0; % Non elaboro i Tilt Link HR 3D H +else + yesTLHR3DH = 1; % attiva l'elaborazione dei Tilt Link HR 3D H +end + +%% Pre Conv Link +[rPCL,cPCL] = size(NodoPreConvLink); +if rPCL==0 && cPCL==0 + yesPCL = 0; % Non elaboro i PreConv Link +else + yesPCL = 1; % attiva l'elaborazione dei PreConv Link +end + +%% Pre Conv Link H +[rPCLHR,cPCLhr] = size(NodoPreConvLinkHR); +if rPCLHR==0 && cPCLhr==0 + yesPCLHR = 0; % Non elaboro i Pre Conv Link HR +else + yesPCLHR = 1; % attiva l'elaborazione dei Pre Conv Link HR +end + +%% PreConv Link HR 3D +[rPCLHR3D,cPCLHR3D] = size(NodoPreConvLinkHR3D); +if rPCLHR3D==0 && cPCLHR3D==0 + yesPCLHR3D = 0; % Non elaboro i PreConv Link HR 3D +else + yesPCLHR3D = 1; % attiva l'elaborazione dei PreConv Link HR 3D +end + +%% DistoMT Link +[rDM,cDM] = size(NodoDistoMTLink); +if rDM==0 && cDM==0 + yesDM = 0; % Non elaboro i DistoMT Link +else + yesDM = 1; % attiva l'elaborazione dei DistoMT Link +end + +%% Pressure Link +[rPL,cPL] = size(NodoPressureLink); +if rPL==0 && cPL==0 + yesPL = 0; % Non elaboro i Pressure Link +else + yesPL = 1; % attiva l'elaborazione dei Pressure Link +end + +%% Load Link +[rLL,cLL] = size(NodoLoadLink); +if rLL==0 && cLL==0 + yesLL = 0; % Non elaboro i Load Link +else + yesLL = 1; % attiva l'elaborazione dei Load Link +end + +%% Extensometer Link +[rEL,cEL] = size(NodoExtensometerLink); +if rEL==0 && cEL==0 + yesEL = 0; % Non elaboro gli Extensometer Link +else + yesEL = 1; % attiva l'elaborazione degli Extensometer Link +end + +%% 3D extensometer Link +[r3DEL,c3DEL] = size(Nodo3DExtensometerLink); +if r3DEL==0 && c3DEL==0 + yes3DEL = 0; % Non elaboro i 3D extensometer Link +else + yes3DEL = 1; % attiva l'elaborazione dei 3D extensometer Link +end + +%% Wire Extensometer Link +[rWEL,cWEL] = size(NodoWireExtensometerLink); +if rWEL==0 && cWEL==0 + yesWEL = 0; % Non elaboro i Wire Extensometer Link +else + yesWEL = 1; % attiva l'elaborazione dei Wire Extensometer Link +end + +%% Multi Point Bore Rod Extensometer +[rMPBEL,cMPBEL] = size(NodoMultiPointRodExtensometer); +if rMPBEL==0 && cMPBEL==0 + yesMPBEL = 0; % Non elaboro i Multi Point Bore Rod Extensometer +else + yesMPBEL = 1; % attiva l'elaborazione dei Multi Point Bore Rod Extensometer +end + +%% Analog Link +[rAL,cAL] = size(NodoAnalogLink); +if rAL==0 && cAL==0 + yesAL = 0; % Non elaboro gli Analog Link +else + yesAL = 1; % attiva l'elaborazione degli Analog Link +end + +%% Crack Link +[rCrL,cCrL] = size(NodoCrackLink); +if rCrL==0 && cCrL==0 + yesCrL = 0; % Non elaboro i Crack Link +else + yesCrL = 1; % attiva l'elaborazione dei Crack Link +end + +%% 3D Crack Link +[r3DCrL,c3DCrL] = size(Nodo3DCrackLink); +if r3DCrL==0 && c3DCrL==0 + yes3DCrL = 0; % Non elaboro i 3D Crack Link +else + yes3DCrL = 1; % attiva l'elaborazione dei 3D Crack Link +end + +%% 2D Crack Link +[r2DCrL,c2DCrL] = size(Nodo2DCrackLink); +if r2DCrL==0 && c2DCrL==0 + yes2DCrL = 0; % Non elaboro i 3D Crack Link +else + yes2DCrL = 1; % attiva l'elaborazione dei 3D Crack Link +end + +%% Stress Meter +[rSM,cSM] = size(NodoStressMeter); +if rSM==0 && cSM==0 + yesSM = 0; % Non elaboro i Stress Meter +else + yesSM = 1; % attiva l'elaborazione dei Stress Meter +end + +text = 'Activation parameters for the elaboration defined correctly, YesNo function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/alert_Levels.m b/ATD/alert_Levels.m new file mode 100755 index 0000000..1eb8197 --- /dev/null +++ b/ATD/alert_Levels.m @@ -0,0 +1,305 @@ +function alert_Levels(rLL,rCrL,DatiLoad,DatiCrack,ARRAYdate_LL,ARRAYdate_CrL,... + ErrLoadLink,~,NodoLoadLink,NodoCrackLink,IDcentralina,DTcatena,... + sms,date,time,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'alert_Levels function started'; +fprintf(fileID,fmt,text); +fclose(fileID); + +alert = 0; +alarm = 0; +if strcmp(IDcentralina,'ID0081') && strcmp(DTcatena,'DT0009') % Varazze - Casanova - Via Fossello + [numDate,~] = size(ARRAYdate_LL); + indexALA = zeros(1,2); + indexALE = zeros(1,2); + cI = 1; + cI2 = 1; + for s = 1:rLL + for n = 1:numDate + if DatiLoad(n,s) > 588.4 % kN + if ErrLoadLink(n,s) == 0 || ErrLoadLink(n,s) == 0.5 % Il nodo non è in errore + alarm = 1; + indexALA(cI,1) = n; % Data + indexALA(cI,2) = s; % sensore + cI = cI+1; + end +% elseif DatiLoad(n,s)-DatiLoad(n-1,s) > 0.3 % mm +% if ErrLoadLink(n,s) == 0 || ErrLoadLink(n,s) == 0.5 % Il nodo non è in errore +% alert = 1; +% indexALE(cI2,1) = n; % Data +% indexALE(cI2,2) = s; % fessurimetro +% cI2 = cI2+1; +% end + end + end + end +elseif strcmp(IDcentralina,'ID0082') && strcmp(DTcatena,'DT0010') % Riva di Tures + [numDate,~] = size(ARRAYdate_CrL); + indexALA = zeros(1,2); + indexALE = zeros(1,2); + cI = 1; + cI2 = 1; + fuoriSoglia1 = zeros(numDate,rCrL); % Sensore 1 > 50 mm + fuoriSoglia2 = zeros(numDate,rCrL); % Sensore 2 > 5 mm + fuoriSoglia3 = zeros(numDate,rCrL); % Sensore 1 > 20 mm per 10 letture + fuoriSoglia4 = zeros(numDate,rCrL); % Sensore 1 > 10 mm per 10 letture + RIF = zeros(1,rCrL); + for s = 1:rCrL + NodeNumCrL = num2str(cell2mat(NodoCrackLink(s,2))); % scarico i dati del primo nodo Crack Link + comando = ['select XShift from ElabDataView where EventDate = ''' ... + date ''' and EventTime >= ''' time ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ' NodeNumCrL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + RIF(1,s) = cell2mat(Data_LastElab(1,1)); + for n = 1:numDate + if DatiCrack(n,s) - RIF(1,s) > 50 % mm + fuoriSoglia1(n,s) = 1; + end + if DatiCrack(n,s) - RIF(1,s) > 5 % mm + fuoriSoglia2(n,s) = 1; + end + if n >= 10 + cont = 0; + cont2 = 0; + for aa = n-9:n + if DatiCrack(aa,s) - RIF(1,s) > 20 % mm + cont = cont+1; + end + if DatiCrack(aa,s) - RIF(1,s) > 10 % mm + cont2 = cont2+1; + end + end + if cont >= 10 + fuoriSoglia3(n,s) = 1; + end + if cont2 >= 10 + fuoriSoglia4(n,s) = 1; + end + end + end + end + for s = 1:rCrL + for n = 10:numDate + if fuoriSoglia1(n,s) == 1 + if fuoriSoglia3(n,s) == 1 + if s == 1 + if fuoriSoglia2(n,2) == 1 || fuoriSoglia2(n,3) == 1 || fuoriSoglia2(n,4) == 1 + alarm = 1; + indexALA(cI,1) = n; % Data + indexALA(cI,2) = s; % sensore + cI = cI+1; + end + elseif s == 2 + if fuoriSoglia2(n,1) == 1 || fuoriSoglia2(n,3) == 1 || fuoriSoglia2(n,4) == 1 + alarm = 1; + indexALA(cI,1) = n; % Data + indexALA(cI,2) = s; % sensore + cI = cI+1; + end + elseif s == 3 + if fuoriSoglia2(n,1) == 1 || fuoriSoglia2(n,2) == 1 || fuoriSoglia2(n,4) == 1 + alarm = 1; + indexALA(cI,1) = n; % Data + indexALA(cI,2) = s; % sensore + cI = cI+1; + end + elseif s == 4 + if fuoriSoglia2(n,1) == 1 || fuoriSoglia2(n,2) == 1 || fuoriSoglia2(n,3) == 1 + alarm = 1; + indexALA(cI,1) = n; % Data + indexALA(cI,2) = s; % sensore + cI = cI+1; + end + end + end + end + if fuoriSoglia4(n,s) == 1 + alert = 1; + indexALE(cI2,1) = n; % Data + indexALE(cI2,2) = s; % sensore + cI2 = cI2+1; + end + end + end +end + +if alert == 1 || alarm == 1 + + %% Controllo la data + if alarm == 1 + if strcmp(IDcentralina,'ID0081') && strcmp(DTcatena,'DT0009') % Varazze - Casanova - Via Fossello + dateALA = ARRAYdate_LL(indexALA(:,1)); + nodeALA = NodoLoadLink(indexALA(:,2),2); + valALA = round(DatiLoad(indexALA(:,1),indexALA(:,2)),2); + desc = 'kN'; + sms = 1; + elseif strcmp(IDcentralina,'ID0082') && strcmp(DTcatena,'DT0010') % Riva di Tures + dateALA = ARRAYdate_CrL(indexALA(:,1)); + nodeALA = NodoCrackLink(indexALA(:,2),2); + valALA = round(DatiCrack(indexALA(:,1),indexALA(:,2)),2); + desc = 'mm'; + sms = 1; + end + DataALA = dateALA(end); + end + if alert == 1 + if strcmp(IDcentralina,'ID0081') && strcmp(DTcatena,'DT0009') % Varazze - Casanova - Via Fossello + dateALE = ARRAYdate_LL(indexALE(:,1)); + nodeALE = NodoLoadLink(indexALE(:,2),2); + valALE = round(DatiLoad(indexALA(:,1),indexALA(:,2)),2); + desc = 'kN'; + sms = 0; + elseif strcmp(IDcentralina,'ID0082') && strcmp(DTcatena,'DT0010') % Riva di Tures + dateALE = ARRAYdate_CrL(indexALE(:,1)); + nodeALE = NodoCrackLink(indexALE(:,2),2); + valALE = round(DatiCrack(indexALA(:,1),indexALA(:,2)),2); + desc = 'mm'; + sms = 0; + end + DataALE = dateALE(end); + end + + FileNameALA = ['' IDcentralina '-' DTcatena '-Alarm.txt']; + if isfile(FileNameALA) == 1 + A = importdata(FileNameALA); + [rA,~] = size(A); + if rA == 0 + DataRifALE = 0; + DataRifALA = 0; + elseif rA == 1 + DataRifALA = A(1,1); + DataRifALE = 0; + else + DataRifALA = A(1,1); + DataRifALE = A(2,1); + end + else + DataRifALE = 0; + DataRifALA = 0; + end + DATA_rif = max(DataRifALA,DataRifALE); % Data della mail + + if alert == 1 || alarm == 1 + if alert == 1 && alarm == 1 + DATA = max(DataALA,DataALE); + DataWriteALA = DataALA; + DataWriteALE = DataALE; + elseif alert == 1 + DATA = DataALE; + DataWriteALE = DataALE; + DataWriteALA = DataRifALA; + elseif alarm == 1 + DATA = DataALA; + DataWriteALA = DataALA; + DataWriteALE = DataRifALE; + end + + if DATA_rif >= DATA % Mail già inviata + Mail = 0; + else + Mail = 1; + end + else + DataWriteALA = DataRifALA; + DataWriteALE = DataRifALE; + end + + if Mail == 1 + allarme = 0; + DATAinsert = cell(1,9); + AL = 1; + for ii = 1:cI-1 % numero di allarmi + if DATA_rif < dateALA(ii) % Allarme non ancora uscito + Data = datestr(dateALA(ii),'yyyy-mm-dd HH:MM:SS'); + Valore = valALA(ii); + Nodo = cell2mat(nodeALA(ii)); + Livello = 2; + DATAinsert{AL,1} = 3; % Soglie tradizionali + DATAinsert{AL,2} = IDcentralina; + DATAinsert{AL,3} = DTcatena; + DATAinsert{AL,4} = Nodo; + DATAinsert{AL,5} = Data; + DATAinsert{AL,6} = Valore; + DATAinsert{AL,7} = Livello; + DATAinsert{AL,8} = sms; + DATAinsert{AL,9} = desc; + allarme = 1; + AL = AL+1; + end + end + for ii = 1:cI2-1 % numero di allerte + if DATA_rif < dateALE(ii) % Allerta non ancora uscita + Data = datestr(dateALE(ii),'yyyy-mm-dd HH:MM:SS'); + Valore = valALE(ii); + Nodo = cell2mat(nodeALE(ii)); + Livello = 1; + DATAinsert{AL,1} = 3; % Soglie tradizionali + DATAinsert{AL,2} = IDcentralina; + DATAinsert{AL,3} = DTcatena; + DATAinsert{AL,4} = Nodo; + DATAinsert{AL,5} = Data; + DATAinsert{AL,6} = Valore; + DATAinsert{AL,7} = Livello; + DATAinsert{AL,8} = sms; + DATAinsert{AL,9} = desc; + allarme = 1; + AL = AL+1; + end + end + + if allarme == 1 + AL = AL-1; % Numero totale di allarmi + for a = 1:AL + % Cerco se il dato è già presente + Data = DATAinsert{a,5}; + nNodo = num2str(DATAinsert{a,4}); % Numero nodo + type = num2str(DATAinsert{a,1}); % tipologia + level = num2str(DATAinsert{a,7}); % livello allarme + value = num2str(DATAinsert{a,6}); % Valore + desc = DATAinsert{a,9}; % Descrizione + comando = ['select id, type_id, date_time from alarms where unit_name = ''' ... + IDcentralina ''' and tool_name = ''' DTcatena ''' and node_num = ''' ... + nNodo ''' and date_time = ''' Data ''' and type_id = ''' type ... + ''' and alarm_level = ''' level ''' and registered_value = ''' value ... + ''' and description like ''' desc ''' order by date_time']; + curs = exec(conn,comando); + curs = fetch(curs); + idDate = curs.Data; + if idDate == 0 || strcmp(idDate,'No Data') == 1 + idElabData = 0; % 0 indica che il dato non è presente su DB + else + idElabData = cell2mat(idDate(:,1)); + end + tablename = 'alarms'; + colnames = {'type_id','unit_name','tool_name','node_num','date_time',... + 'registered_value','alarm_level','send_sms','description'}; + data = [DATAinsert(a,1),DATAinsert(a,2),DATAinsert(a,3),DATAinsert(a,4),... + DATAinsert(a,5),DATAinsert(a,6),DATAinsert(a,7),DATAinsert(a,8),DATAinsert(a,9)]; + if idElabData == 0 % Scrivo + fastinsert(conn,tablename,colnames,data); + end + end + end + + fileID = fopen(FileNameALA,'a'); + outdat = fopen(FileNameALA,'wt+'); + fmt = '%.10f \r'; + fprintf(fileID,fmt,DataWriteALA); + fmt = '%.10f \r'; + fprintf(fileID,fmt,DataWriteALE); + fclose(fileID); + + end +end + +text = ('alert_Levels function worked correctly'); +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/ATD/approx_PCL.m b/ATD/approx_PCL.m new file mode 100755 index 0000000..3a5532a --- /dev/null +++ b/ATD/approx_PCL.m @@ -0,0 +1,68 @@ +% Funzione che approssima il dato alla quarta cifra decimale (decimi di +% millimetri) +function [Y_PCL,Z_PCL,Ylocal_PCL,Zlocal_PCL,TempDef_PCL,speed_PCL,... + speed_local_PCL,acceleration_PCL,acceleration_local_PCL,AlfaX_PCL,AlfaY_PCL] = ... + approx_PCL(Y_PCL,Z_PCL,Ylocal_PCL,Zlocal_PCL,TempDef_PCL,speed_PCL,speed_local_PCL,... + acceleration_PCL,acceleration_local_PCL,AlfaX_PCL,AlfaY_PCL,FileName) + +text = 'approx_PCL function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +% Y +conv = Y_PCL*10000; +conv = round(conv); +Y_PCL = conv/10000; + +% Y local +conv = Ylocal_PCL*10000; +conv = round(conv); +Ylocal_PCL = conv/10000; + +% Z +conv = Z_PCL*10000; +conv = round(conv); +Z_PCL = conv/10000; + +% Z local +conv = Zlocal_PCL*10000; +conv = round(conv); +Zlocal_PCL = conv/10000; + +% TempDef +conv = TempDef_PCL*10; +conv = round(conv); +TempDef_PCL = conv/10; + +% Accelerazione +conv = acceleration_local_PCL*10000; +conv = round(conv); +acceleration_local_PCL = conv/10000; + +conv = acceleration_PCL*10000; +conv = round(conv); +acceleration_PCL = conv/10000; + +% Velocità +conv = speed_local_PCL*10000; +conv = round(conv); +speed_local_PCL = conv/10000; + +conv = speed_PCL*10000; +conv = round(conv); +speed_PCL = conv/10000; + +% Angoli +conv = AlfaY_PCL*10000; +conv = round(conv); +AlfaY_PCL = conv/10000; + +conv = AlfaY_PCL*10000; +conv = round(conv); +AlfaY_PCL = conv/10000; + +text = 'approx_PCL function executed correctly. approx_PCL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end diff --git a/ATD/approx_RL.m b/ATD/approx_RL.m new file mode 100755 index 0000000..3012a1e --- /dev/null +++ b/ATD/approx_RL.m @@ -0,0 +1,49 @@ +% Funzione che approssima il dato alla quarta cifra decimale (decimi di +% millimetri) +function [X_RL,Y_RL,Z_RL,Xlocal_RL,Ylocal_RL,Zlocal_RL,TempDef_RL] = ... + approx_RL(X_RL,Y_RL,Z_RL,Xlocal_RL,Ylocal_RL,Zlocal_RL,TempDef_RL,FileName) + +text = 'approx_RL function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +% X +conv = X_RL*10000; +conv = round(conv); +X_RL = conv/10000; + +% X local +conv = Xlocal_RL*10000; +conv = round(conv); +Xlocal_RL = conv/10000; + +% Y +conv = Y_RL*10000; +conv = round(conv); +Y_RL = conv/10000; + +% Y local +conv = Ylocal_RL*10000; +conv = round(conv); +Ylocal_RL = conv/10000; + +% Z +conv = Z_RL*10000; +conv = round(conv); +Z_RL = conv/10000; + +% Z local +conv = Zlocal_RL*10000; +conv = round(conv); +Zlocal_RL = conv/10000; + +% TempDef +conv = TempDef_RL*10; +conv = round(conv); +TempDef_RL = conv/10; + +text = 'approx_RL function worked correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); +end diff --git a/ATD/approx_TLH.m b/ATD/approx_TLH.m new file mode 100755 index 0000000..b7a39e5 --- /dev/null +++ b/ATD/approx_TLH.m @@ -0,0 +1,68 @@ +% Funzione che approssima il dato alla quarta cifra decimale (decimi di +% millimetri) +function [Y_TLH,Z_TLH,Ylocal_TLH,Zlocal_TLH,TempDef_TLH,speed_TLH,... + speed_local_TLH,acceleration_TLH,acceleration_local_TLH,AlfaX_TLH,AlfaY_TLH] = ... + approx_TLH(Y_TLH,Z_TLH,Ylocal_TLH,Zlocal_TLH,TempDef_TLH,speed_TLH,speed_local_TLH,... + acceleration_TLH,acceleration_local_TLH,AlfaX_TLH,AlfaY_TLH,FileName) + +text = 'approx_TLH function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +% Y +conv = Y_TLH*10000; +conv = round(conv); +Y_TLH = conv/10000; + +% Y local +conv = Ylocal_TLH*10000; +conv = round(conv); +Ylocal_TLH = conv/10000; + +% Z +conv = Z_TLH*10000; +conv = round(conv); +Z_TLH = conv/10000; + +% Z local +conv = Zlocal_TLH*10000; +conv = round(conv); +Zlocal_TLH = conv/10000; + +% TempDef +conv = TempDef_TLH*10; +conv = round(conv); +TempDef_TLH = conv/10; + +% Accelerazione +conv = acceleration_local_TLH*10000; +conv = round(conv); +acceleration_local_TLH = conv/10000; + +conv = acceleration_TLH*10000; +conv = round(conv); +acceleration_TLH = conv/10000; + +% Velocità +conv = speed_local_TLH*10000; +conv = round(conv); +speed_local_TLH = conv/10000; + +conv = speed_TLH*10000; +conv = round(conv); +speed_TLH = conv/10000; + +% Angoli +conv = AlfaY_TLH*10000; +conv = round(conv); +AlfaY_TLH = conv/10000; + +conv = AlfaY_TLH*10000; +conv = round(conv); +AlfaY_TLH = conv/10000; + +text = 'approx_TLH function executed correctly. approx_TLH function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end diff --git a/ATD/approx_TLHRH.m b/ATD/approx_TLHRH.m new file mode 100755 index 0000000..13dfe60 --- /dev/null +++ b/ATD/approx_TLHRH.m @@ -0,0 +1,69 @@ +% Funzione che approssima il dato alla quarta cifra decimale (decimi di +% millimetri) +function [Y_TLHRH,Z_TLHRH,Ylocal_TLHRH,Zlocal_TLHRH,TempDef_TLHRH,speed_TLHRH,... + speed_local_TLHRH,acceleration_TLHRH,acceleration_local_TLHRH,AlfaX_TLHRH,... + AlfaY_TLHRH] = approx_TLHRH(Y_TLHRH,Z_TLHRH,Ylocal_TLHRH,Zlocal_TLHRH,... + TempDef_TLHRH,speed_TLHRH,speed_local_TLHRH,acceleration_TLHRH,... + acceleration_local_TLHRH,AlfaX_TLHRH,AlfaY_TLHRH,FileName) + +text = 'approx_TLHRH function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +% Y +conv = Y_TLHRH*10000; +conv = round(conv); +Y_TLHRH = conv/10000; + +% Y local +conv = Ylocal_TLHRH*10000; +conv = round(conv); +Ylocal_TLHRH = conv/10000; + +% Z +conv = Z_TLHRH*10000; +conv = round(conv); +Z_TLHRH = conv/10000; + +% Z local +conv = Zlocal_TLHRH*10000; +conv = round(conv); +Zlocal_TLHRH = conv/10000; + +% TempDef +conv = TempDef_TLHRH*10; +conv = round(conv); +TempDef_TLHRH = conv/10; + +% Accelerazione +conv = acceleration_local_TLHRH*10000; +conv = round(conv); +acceleration_local_TLHRH = conv/10000; + +conv = acceleration_TLHRH*10000; +conv = round(conv); +acceleration_TLHRH = conv/10000; + +% Velocità +conv = speed_local_TLHRH*10000; +conv = round(conv); +speed_local_TLHRH = conv/10000; + +conv = speed_TLHRH*10000; +conv = round(conv); +speed_TLHRH = conv/10000; + +% Angoli +conv = AlfaY_TLHRH*10000; +conv = round(conv); +AlfaY_TLHRH = conv/10000; + +conv = AlfaY_TLHRH*10000; +conv = round(conv); +AlfaY_TLHRH = conv/10000; + +text = 'approx_TLHRH function executed correctly. approx_TLHRH function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end diff --git a/ATD/approx_TuL.m b/ATD/approx_TuL.m new file mode 100755 index 0000000..9f9343f --- /dev/null +++ b/ATD/approx_TuL.m @@ -0,0 +1,87 @@ +% Funzione che approssima il dato alla quarta cifra decimale (decimi di +% millimetri) +function [X_TuL,Y_TuL,Z_TuL,Xlocal_TuL,Ylocal_TuL,Zlocal_TuL,Xstar_TuL,Zstar_TuL,HShift_local_TuL,... + SegStar,TempDef_TuL,Speed_local_TuL,Acceleration_local_TuL,Area_TuL] = approx_TuL(X_TuL,... + Y_TuL,Z_TuL,Xlocal_TuL,Ylocal_TuL,Zlocal_TuL,Xstar_TuL,Zstar_TuL,HShift_local_TuL,... + SegStar,TempDef_TuL,Speed_local_TuL,Acceleration_local_TuL,Area_TuL,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'approx_TuL function started'; +fprintf(fileID,fmt,text); + +% X +conv = X_TuL*10000; +conv = round(conv); +X_TuL = conv/10000; + +% X star +conv = Xstar_TuL*10000; +conv = round(conv); +Xstar_TuL = conv/10000; + +% X local +conv = Xlocal_TuL*10000; +conv = round(conv); +Xlocal_TuL = conv/10000; + +% Y +conv = Y_TuL*10000; +conv = round(conv); +Y_TuL = conv/10000; + +% Y local +conv = Ylocal_TuL*10000; +conv = round(conv); +Ylocal_TuL = conv/10000; + +% Z +conv = Z_TuL*10000; +conv = round(conv); +Z_TuL = conv/10000; + +% Zstar +conv = Zstar_TuL*10000; +conv = round(conv); +Zstar_TuL = conv/10000; + +% Z local +conv = Zlocal_TuL*10000; +conv = round(conv); +Zlocal_TuL = conv/10000; + +% H Shift local +conv = HShift_local_TuL*10000; +conv = round(conv); +HShift_local_TuL = conv/10000; + +% SegStar +conv = SegStar*10000; +conv = round(conv); +SegStar = conv/10000; + +% TempDef +conv = TempDef_TuL*10; +conv = round(conv); +TempDef_TuL = conv/10; + +% Speed +conv = Speed_local_TuL*10000; +conv = round(conv); +Speed_local_TuL = conv/10000; + +% Acceleration +conv = Acceleration_local_TuL*10000; +conv = round(conv); +Acceleration_local_TuL = conv/10000; + +% Area +conv = Area_TuL*10000; +conv = round(conv); +Area_TuL = conv/10000; + +text = 'approx_TuL function worked correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/ATD/calibPCL.m b/ATD/calibPCL.m new file mode 100755 index 0000000..6e0fbd8 --- /dev/null +++ b/ATD/calibPCL.m @@ -0,0 +1,8 @@ +function scarti = calibPCL(x,Temp,i,j,Parametro1,off,Zlocal,TempMod) + +TempMod(Parametro1+off:j,i) = x(1)*Temp(Parametro1+off:j,i)+x(2); +sc = (TempMod(Parametro1+off:j,i)-Zlocal(Parametro1+off:j,i)).^2; +scarti = sum(sc); + +end + diff --git a/ATD/cancellaDB.m b/ATD/cancellaDB.m new file mode 100755 index 0000000..935189e --- /dev/null +++ b/ATD/cancellaDB.m @@ -0,0 +1,21 @@ +function cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'cancellaDB function started'; +fprintf(fileID,fmt,text); + +comando = ['delete from ELABDATADISP where UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and EventDate >= ''' Data_scarico ''' ']; + +curs = exec(conn,comando); + +text = strcat('Elaborated Data of Unit ', IDcentralina, ' Chain ',... + DTcatena,' deleted starting from date ',Data_scarico,' during the execution of LastElab function.'); +fprintf(fileID,fmt,text); + +text = 'cancellaDB function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/cellMaker2DCrL.m b/ATD/cellMaker2DCrL.m new file mode 100755 index 0000000..897602d --- /dev/null +++ b/ATD/cellMaker2DCrL.m @@ -0,0 +1,22 @@ +function DATAinsert = cellMaker2DCrL(IDcentralina,DTcatena,NodeNum,c2DCrL,ListaDate,... + ARRAYdate_2DCrL,Dati2DCrack,DatiNTCCrack2D,Err2DCrackLink,... + Ch2DCrL,CrL2D_NTC,cont2DCrL) + +DATAinsert = cell(ListaDate,9); +for ii=1:ListaDate + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdate_2DCrL(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdate_2DCrL(ii),'HH:MM:SS'); + DATAinsert{ii,6} = Dati2DCrack(ii,c2DCrL); + DATAinsert{ii,7} = Dati2DCrack(ii,c2DCrL+1); + if Ch2DCrL(cont2DCrL) >= 3 + if CrL2D_NTC(cont2DCrL) == 1 + DATAinsert{ii,8} = DatiNTCCrack2D(ii,cont2DCrL); + end + end + DATAinsert{ii,9} = Err2DCrackLink(ii,cont2DCrL); +end + +end diff --git a/ATD/cellMaker3DCrL.m b/ATD/cellMaker3DCrL.m new file mode 100755 index 0000000..24fe360 --- /dev/null +++ b/ATD/cellMaker3DCrL.m @@ -0,0 +1,23 @@ +function DATAinsert = cellMaker3DCrL(IDcentralina,DTcatena,NodeNum,c3DCrL,ListaDate,... + ARRAYdate_3DCrL,Dati3DCrack,DatiNTCCrack3D,Err3DCrackLink,... + Ch3DCrL,CrL3D_NTC,cont3DCrL) + +DATAinsert = cell(ListaDate,10); +for ii=1:ListaDate + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdate_3DCrL(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdate_3DCrL(ii),'HH:MM:SS'); + DATAinsert{ii,6} = Dati3DCrack(ii,c3DCrL); + DATAinsert{ii,7} = Dati3DCrack(ii,c3DCrL+1); + DATAinsert{ii,8} = Dati3DCrack(ii,c3DCrL+2); + if Ch3DCrL(cont3DCrL) >= 4 + if CrL3D_NTC(cont3DCrL) == 1 + DATAinsert{ii,9} = DatiNTCCrack3D(ii,cont3DCrL); + end + end + DATAinsert{ii,10} = Err3DCrackLink(ii,cont3DCrL); +end + +end diff --git a/ATD/cellMaker3DEL.m b/ATD/cellMaker3DEL.m new file mode 100755 index 0000000..7847207 --- /dev/null +++ b/ATD/cellMaker3DEL.m @@ -0,0 +1,23 @@ +function DATAinsert = cellMaker3DEL(IDcentralina,DTcatena,NodeNum,c3DEL,c3DEL_NTC,ListaDate,ARRAYdate_3DEL,... + DatiExtensometer3D,DatiNTCExtensometer3D,Err3DExtensometerLink,Ch3DEL,EL3D_NTC) + +l = ListaDate; +DATAinsert = cell(l,10); +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdate_3DEL(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdate_3DEL(ii),'HH:MM:SS'); + DATAinsert{ii,6} = DatiExtensometer3D(ii,c3DEL); + DATAinsert{ii,7} = DatiExtensometer3D(ii,c3DEL+1); + DATAinsert{ii,8} = DatiExtensometer3D(ii,c3DEL+2); + if Ch3DEL(c3DEL_NTC) == 4 + if EL3D_NTC(c3DEL_NTC) == 1 + DATAinsert{ii,9} = DatiNTCExtensometer3D(ii,c3DEL_NTC); + end + end + DATAinsert{ii,10} = Err3DExtensometerLink(ii,c3DEL_NTC); +end + +end diff --git a/ATD/cellMakerCrL.m b/ATD/cellMakerCrL.m new file mode 100755 index 0000000..7bc488c --- /dev/null +++ b/ATD/cellMakerCrL.m @@ -0,0 +1,20 @@ +function DATAinsert = cellMakerCrL(IDcentralina,DTcatena,NodeNum,cCrL,ListaDate,... + ARRAYdate_CrL,DatiCrack,DatiNTCCrack,ChCrL,CrL_NTC,ErrCrackLink) + +DATAinsert = cell(ListaDate,8); +for ii=1:ListaDate + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdate_CrL(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdate_CrL(ii),'HH:MM:SS'); + DATAinsert{ii,6} = DatiCrack(ii,cCrL); + if ChCrL(cCrL) >= 2 + if CrL_NTC(cCrL) == 1 + DATAinsert{ii,7} = DatiNTCCrack(ii,cCrL); + end + end + DATAinsert{ii,8} = ErrCrackLink(ii,cCrL); +end + +end diff --git a/ATD/cellMakerEL.m b/ATD/cellMakerEL.m new file mode 100755 index 0000000..90dc2e8 --- /dev/null +++ b/ATD/cellMakerEL.m @@ -0,0 +1,25 @@ +function DATAinsert = cellMakerEL(IDcentralina,DTcatena,NodeNum,cEL,ListaDate,ARRAYdate_EL,... + DatiExtensometer,DatiNTCExtensometer,Carico_ass,Sforzo,Calcolo_Carico,ErrExtensometerLink,ChEL,EL_NTC) + +l = ListaDate; +DATAinsert = cell(l,8); +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdate_EL(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdate_EL(ii),'HH:MM:SS'); + DATAinsert{ii,6} = DatiExtensometer(ii,cEL); + if ChEL(cEL) >= 2 + if EL_NTC(cEL) == 1 + DATAinsert{ii,7} = DatiNTCExtensometer(ii,cEL); + end + end + DATAinsert{ii,8} = ErrExtensometerLink(ii,cEL); + if Calcolo_Carico == 1 + DATAinsert{ii,9} = Carico_ass(ii,cEL); + DATAinsert{ii,10} = Sforzo(ii,cEL); + end +end + +end diff --git a/ATD/cellMakerLL.m b/ATD/cellMakerLL.m new file mode 100755 index 0000000..d9340aa --- /dev/null +++ b/ATD/cellMakerLL.m @@ -0,0 +1,16 @@ +function DATAinsert = cellMakerLL(IDcentralina,DTcatena,NodeNum,... + cLL,ListaDate,ARRAYdateLL,DatiLoad,ErrLoadLink) + +l = ListaDate; +DATAinsert = cell(l,7); +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdateLL(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdateLL(ii),'HH:MM:SS'); + DATAinsert{ii,6} = DatiLoad(ii,cLL); + DATAinsert{ii,7} = ErrLoadLink(ii,cLL); +end + +end \ No newline at end of file diff --git a/ATD/cellMakerMPBEL.m b/ATD/cellMakerMPBEL.m new file mode 100755 index 0000000..b39d637 --- /dev/null +++ b/ATD/cellMakerMPBEL.m @@ -0,0 +1,40 @@ +function DATAinsert = cellMakerMPBEL(IDcentralina,DTcatena,NodeNum,cMPBEL,contMPBEL,... + ListaDate,ARRAYdate_MPBEL,DatiMultiBase,NumBasi,ErrMultiPointExtensometer) + +l = ListaDate; +DATAinsert = cell(l,11); +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdate_MPBEL(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdate_MPBEL(ii),'HH:MM:SS'); + if NumBasi == 1 + DATAinsert{ii,6} = DatiMultiBase(ii,cMPBEL); + DATAinsert{ii,7} = ErrMultiPointExtensometer(ii,contMPBEL); + elseif NumBasi == 2 + DATAinsert{ii,6} = DatiMultiBase(ii,cMPBEL); + DATAinsert{ii,7} = DatiMultiBase(ii,cMPBEL+1); + DATAinsert{ii,8} = ErrMultiPointExtensometer(ii,contMPBEL); + elseif NumBasi == 3 + DATAinsert{ii,6} = DatiMultiBase(ii,cMPBEL); + DATAinsert{ii,7} = DatiMultiBase(ii,cMPBEL+1); + DATAinsert{ii,8} = DatiMultiBase(ii,cMPBEL+2); + DATAinsert{ii,9} = ErrMultiPointExtensometer(ii,contMPBEL); + elseif NumBasi == 4 + DATAinsert{ii,6} = DatiMultiBase(ii,cMPBEL); + DATAinsert{ii,7} = DatiMultiBase(ii,cMPBEL+1); + DATAinsert{ii,8} = DatiMultiBase(ii,cMPBEL+2); + DATAinsert{ii,9} = DatiMultiBase(ii,cMPBEL+3); + DATAinsert{ii,10} = ErrMultiPointExtensometer(ii,contMPBEL); + elseif NumBasi == 5 + DATAinsert{ii,6} = DatiMultiBase(ii,cMPBEL); + DATAinsert{ii,7} = DatiMultiBase(ii,cMPBEL+1); + DATAinsert{ii,8} = DatiMultiBase(ii,cMPBEL+2); + DATAinsert{ii,9} = DatiMultiBase(ii,cMPBEL+3); + DATAinsert{ii,10} = DatiMultiBase(ii,cMPBEL+4); + DATAinsert{ii,11} = ErrMultiPointExtensometer(ii,contMPBEL); + end +end + +end diff --git a/ATD/cellMakerPCL.m b/ATD/cellMakerPCL.m new file mode 100755 index 0000000..bf7837e --- /dev/null +++ b/ATD/cellMakerPCL.m @@ -0,0 +1,30 @@ +% Creo la matrice che scriverò su DB +function DATAinsert = cellMakerPCL(IDcentralina,DTcatena,NodeNum,cPCL,ListaDate,... + Y_PCL,Z_PCL,Ylocal_PCL,Zlocal_PCL,AlfaX_PCL,AlfaY_PCL,TempDef_PCL,speed_PCL,... + speed_local_PCL,acceleration_PCL,acceleration_local_PCL,ErrPreConvLink,ARRAYdate_PCL) + +TempDef_PCL = TempDef_PCL'; +l = ListaDate; +DATAinsert = cell(l,17); + +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdate_PCL(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdate_PCL(ii),'HH:MM:SS'); + DATAinsert{ii,6} = Y_PCL(cPCL,ii); + DATAinsert{ii,7} = Z_PCL(cPCL,ii); + DATAinsert{ii,8} = Ylocal_PCL(cPCL,ii); + DATAinsert{ii,9} = Zlocal_PCL(cPCL,ii); + DATAinsert{ii,10} = AlfaX_PCL(cPCL,ii); + DATAinsert{ii,11} = AlfaY_PCL(cPCL,ii); + DATAinsert{ii,12} = TempDef_PCL(cPCL,ii); + DATAinsert{ii,13} = speed_PCL(cPCL,ii); + DATAinsert{ii,14} = speed_local_PCL(cPCL,ii); + DATAinsert{ii,15} = acceleration_PCL(cPCL,ii); + DATAinsert{ii,16} = acceleration_local_PCL(cPCL,ii); + DATAinsert{ii,17} = ErrPreConvLink(cPCL,ii); +end + +end diff --git a/ATD/cellMakerPCLHR.m b/ATD/cellMakerPCLHR.m new file mode 100755 index 0000000..a785947 --- /dev/null +++ b/ATD/cellMakerPCLHR.m @@ -0,0 +1,31 @@ +% Creo la matrice che scriverò su DB +function DATAinsert = cellMakerPCLHR(IDcentralina,DTcatena,NodeNum,cPCLHR,ListaDate,... + Y_PCLHR,Z_PCLHR,Ylocal_PCLHR,Zlocal_PCLHR,AlfaX_PCLHR,AlfaY_PCLHR,TempDef_PCLHR,... + speed_PCLHR,speed_local_PCLHR,acceleration_PCLHR,acceleration_local_PCLHR,... + ErrPreConvLinkHR,ARRAYdate_PCLHR) + +TempDef_PCLHR = TempDef_PCLHR'; +l = ListaDate; +DATAinsert = cell(l,17); + +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdate_PCLHR(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdate_PCLHR(ii),'HH:MM:SS'); + DATAinsert{ii,6} = Y_PCLHR(cPCLHR,ii); + DATAinsert{ii,7} = Z_PCLHR(cPCLHR,ii); + DATAinsert{ii,8} = Ylocal_PCLHR(cPCLHR,ii); + DATAinsert{ii,9} = Zlocal_PCLHR(cPCLHR,ii); + DATAinsert{ii,10} = AlfaX_PCLHR(cPCLHR,ii); + DATAinsert{ii,11} = AlfaY_PCLHR(cPCLHR,ii); + DATAinsert{ii,12} = TempDef_PCLHR(cPCLHR,ii); + DATAinsert{ii,13} = speed_PCLHR(cPCLHR,ii); + DATAinsert{ii,14} = speed_local_PCLHR(cPCLHR,ii); + DATAinsert{ii,15} = acceleration_PCLHR(cPCLHR,ii); + DATAinsert{ii,16} = acceleration_local_PCLHR(cPCLHR,ii); + DATAinsert{ii,17} = ErrPreConvLinkHR(cPCLHR,ii); +end + +end diff --git a/ATD/cellMakerPL.m b/ATD/cellMakerPL.m new file mode 100755 index 0000000..71292d5 --- /dev/null +++ b/ATD/cellMakerPL.m @@ -0,0 +1,16 @@ +function DATAinsert = cellMakerPL(IDcentralina,DTcatena,NodeNum,cPL,ListaDate,... + ARRAYdate_PL,DatiPressure,ErrPressureLink) + +l = ListaDate; +DATAinsert = cell(l,7); +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdate_PL(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdate_PL(ii),'HH:MM:SS'); + DATAinsert{ii,6} = DatiPressure(ii,cPL); + DATAinsert{ii,7} = ErrPressureLink(ii,cPL); +end + +end diff --git a/ATD/cellMakerRL.m b/ATD/cellMakerRL.m new file mode 100755 index 0000000..e6e651b --- /dev/null +++ b/ATD/cellMakerRL.m @@ -0,0 +1,26 @@ +% Creo la matrice che scriverò su DB +function DATAinsert = cellMakerRL(IDcentralina,DTcatena,NodeNum,cRL,ListaDate,ARRAYdate_RL,... + X_RL,Y_RL,Z_RL,Xlocal_RL,Ylocal_RL,Zlocal_RL,TempDef_RL,ErrRadialLink) + +TempDef_RL = TempDef_RL'; + +l = ListaDate; +DATAinsert = cell(l,13); + +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdate_RL(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdate_RL(ii),'HH:MM:SS'); + DATAinsert{ii,6} = X_RL(cRL,ii); + DATAinsert{ii,7} = Y_RL(cRL,ii); + DATAinsert{ii,8} = Z_RL(cRL,ii); + DATAinsert{ii,9} = Xlocal_RL(cRL,ii); + DATAinsert{ii,10} = Ylocal_RL(cRL,ii); + DATAinsert{ii,11} = Zlocal_RL(cRL,ii); + DATAinsert{ii,12} = TempDef_RL(cRL,ii); + DATAinsert{ii,13} = ErrRadialLink(cRL,ii); +end + +end \ No newline at end of file diff --git a/ATD/cellMakerSM.m b/ATD/cellMakerSM.m new file mode 100755 index 0000000..cf86d2a --- /dev/null +++ b/ATD/cellMakerSM.m @@ -0,0 +1,20 @@ +function DATAinsert = cellMakerSM(IDcentralina,DTcatena,NodeNum,cSM,ListaDate,... + ARRAYdate_SM,DatiStress,DatiNTCStress,ChSM,SM_NTC,ErrStressMeter) + +DATAinsert = cell(ListaDate,8); +for ii=1:ListaDate + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdate_SM(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdate_SM(ii),'HH:MM:SS'); + DATAinsert{ii,6} = DatiStress(ii,cSM); + if ChSM(cSM) >= 2 + if SM_NTC(cSM) == 1 + DATAinsert{ii,7} = DatiNTCStress(ii,cSM); + end + end + DATAinsert{ii,8} = ErrStressMeter(ii,cSM); +end + +end diff --git a/ATD/cellMakerTLH.m b/ATD/cellMakerTLH.m new file mode 100755 index 0000000..ec01e3f --- /dev/null +++ b/ATD/cellMakerTLH.m @@ -0,0 +1,30 @@ +% Creo la matrice che scriverò su DB +function DATAinsert = cellMakerTLH(IDcentralina,DTcatena,NodeNum,cTLH,ListaDate,... + Y_TLH,Z_TLH,Ylocal_TLH,Zlocal_TLH,AlfaX_TLH,AlfaY_TLH,TempDef_TLH,speed_TLH,... + speed_local_TLH,acceleration_TLH,acceleration_local_TLH,ErrTiltLinkH,ARRAYdate_TLH) + +TempDef_TLH = TempDef_TLH'; +l = ListaDate; +DATAinsert = cell(l,17); + +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdate_TLH(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdate_TLH(ii),'HH:MM:SS'); + DATAinsert{ii,6} = Y_TLH(cTLH,ii); + DATAinsert{ii,7} = Z_TLH(cTLH,ii); + DATAinsert{ii,8} = Ylocal_TLH(cTLH,ii); + DATAinsert{ii,9} = Zlocal_TLH(cTLH,ii); + DATAinsert{ii,10} = AlfaX_TLH(cTLH,ii); + DATAinsert{ii,11} = AlfaY_TLH(cTLH,ii); + DATAinsert{ii,12} = TempDef_TLH(cTLH,ii); + DATAinsert{ii,13} = speed_TLH(cTLH,ii); + DATAinsert{ii,14} = speed_local_TLH(cTLH,ii); + DATAinsert{ii,15} = acceleration_TLH(cTLH,ii); + DATAinsert{ii,16} = acceleration_local_TLH(cTLH,ii); + DATAinsert{ii,17} = ErrTiltLinkH(cTLH,ii); +end + +end diff --git a/ATD/cellMakerTLHRH.m b/ATD/cellMakerTLHRH.m new file mode 100755 index 0000000..6689ec9 --- /dev/null +++ b/ATD/cellMakerTLHRH.m @@ -0,0 +1,31 @@ +% Creo la matrice che scriverò su DB +function DATAinsert = cellMakerTLHRH(IDcentralina,DTcatena,NodeNum,cTLHRH,ListaDate,... + Y_TLHRH,Z_TLHRH,Ylocal_TLHRH,Zlocal_TLHRH,AlfaX_TLHRH,AlfaY_TLHRH,TempDef_TLHRH,... + speed_TLHRH,speed_local_TLHRH,acceleration_TLHRH,acceleration_local_TLHRH,... + ErrTiltLinkHRH,ARRAYdate_TLHRH) + +TempDef_TLHRH = TempDef_TLHRH'; +l = ListaDate; +DATAinsert = cell(l,17); + +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdate_TLHRH(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdate_TLHRH(ii),'HH:MM:SS'); + DATAinsert{ii,6} = Y_TLHRH(cTLHRH,ii); + DATAinsert{ii,7} = Z_TLHRH(cTLHRH,ii); + DATAinsert{ii,8} = Ylocal_TLHRH(cTLHRH,ii); + DATAinsert{ii,9} = Zlocal_TLHRH(cTLHRH,ii); + DATAinsert{ii,10} = AlfaX_TLHRH(cTLHRH,ii); + DATAinsert{ii,11} = AlfaY_TLHRH(cTLHRH,ii); + DATAinsert{ii,12} = TempDef_TLHRH(cTLHRH,ii); + DATAinsert{ii,13} = speed_TLHRH(cTLHRH,ii); + DATAinsert{ii,14} = speed_local_TLHRH(cTLHRH,ii); + DATAinsert{ii,15} = acceleration_TLHRH(cTLHRH,ii); + DATAinsert{ii,16} = acceleration_local_TLHRH(cTLHRH,ii); + DATAinsert{ii,17} = ErrTiltLinkHRH(cTLHRH,ii); +end + +end diff --git a/ATD/cellMakerTuL.m b/ATD/cellMakerTuL.m new file mode 100755 index 0000000..d111eb6 --- /dev/null +++ b/ATD/cellMakerTuL.m @@ -0,0 +1,44 @@ +% Creo la matrice che scriverò su DB +function DATAinsert = cellMakerTuL(IDcentralina,DTcatena,NodeNum,cTuL,... + ListaDate,ARRAYdate_TuL,X_TuL,Xstar_TuL,Y_TuL,Z_TuL,Zstar_TuL,Xlocal_TuL,... + Ylocal_TuL,Zlocal_TuL,SegStar,HShift_local_TuL,TempDef_TuL,Area_TuL,... + Speed_local_TuL,Acceleration_local_TuL,ErrTunnelLink) + +TempDef_TuL = TempDef_TuL'; + +l = ListaDate; +[r,~] = size(SegStar); + +ini = 1; +DATAinsert = cell(l,20); + +jj = 1; +for ii=ini:l + DATAinsert{jj,1} = IDcentralina; + DATAinsert{jj,2} = DTcatena; + DATAinsert{jj,3} = NodeNum; + DATAinsert{jj,4} = datestr(ARRAYdate_TuL(ii),'yyyy-mm-dd'); + DATAinsert{jj,5} = datestr(ARRAYdate_TuL(ii),'HH:MM:SS'); + DATAinsert{jj,6} = X_TuL(cTuL,ii); + DATAinsert{jj,7} = Xstar_TuL(cTuL,ii); + DATAinsert{jj,8} = Y_TuL(cTuL,ii); + DATAinsert{jj,9} = Z_TuL(cTuL,ii); + DATAinsert{jj,10} = Zstar_TuL(cTuL,ii); + DATAinsert{jj,11} = Xlocal_TuL(cTuL,ii); + DATAinsert{jj,12} = Ylocal_TuL(cTuL,ii); + DATAinsert{jj,13} = Zlocal_TuL(cTuL,ii); + if cTuL > r % sono finiti i segmenti della stella + DATAinsert{jj,14} = 0; + else + DATAinsert{jj,14} = SegStar(cTuL,ii); + end + DATAinsert{jj,15} = HShift_local_TuL(cTuL,ii); + DATAinsert{jj,16} = TempDef_TuL(cTuL,ii); + DATAinsert{jj,17} = Speed_local_TuL(cTuL,ii); + DATAinsert{jj,18} = Acceleration_local_TuL(cTuL,ii); + DATAinsert{jj,19} = Area_TuL(1,ii); + DATAinsert{jj,20} = ErrTunnelLink(cTuL,ii); + jj = jj+1; +end + +end \ No newline at end of file diff --git a/ATD/cellMakerWEL.m b/ATD/cellMakerWEL.m new file mode 100755 index 0000000..0bd7fe1 --- /dev/null +++ b/ATD/cellMakerWEL.m @@ -0,0 +1,21 @@ +function DATAinsert = cellMakerWEL(IDcentralina,DTcatena,NodeNum,cWEL,ListaDate,... + ARRAYdate_WEL,DatiWireExtensometer,DatiNTCWireExtensometer,ChWEL,WEL_NTC,... + ErrWireExtensometerLink) + +DATAinsert = cell(ListaDate,8); +for ii=1:ListaDate + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdate_WEL(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdate_WEL(ii),'HH:MM:SS'); + DATAinsert{ii,6} = DatiWireExtensometer(ii,cWEL); + if ChWEL(cWEL) >= 2 + if WEL_NTC(cWEL) == 1 + DATAinsert{ii,7} = DatiNTCWireExtensometer(ii,cWEL); + end + end + DATAinsert{ii,8} = ErrWireExtensometerLink(ii,cWEL); +end + +end diff --git a/ATD/centralina.m b/ATD/centralina.m new file mode 100755 index 0000000..ab6cdd5 --- /dev/null +++ b/ATD/centralina.m @@ -0,0 +1,36 @@ +function Unit = centralina(IDcentralina,conn,FileName) + +text = 'centralina function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +comando = ['select type_id from units where name = ''' IDcentralina ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +Type = cell2mat(curs.Data); +if Type == 1 + Unit = 'G801'; +elseif Type == 2 + Unit = 'G802'; +elseif Type == 3 + Unit = 'G201'; +elseif Type == 4 + Unit = 'G301'; +elseif Type == 5 + Unit = 'D2W'; +elseif Type == 6 + Unit = 'GFLOW'; +elseif Type == 7 + Unit = 'Nesa'; +elseif Type == 8 + Unit = 'MUSA'; +elseif Type == 9 + Unit = 'Nesa evolution'; +elseif Type == 10 + Unit = 'CRX1000'; +end + +text = 'centralina function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); \ No newline at end of file diff --git a/ATD/centralina_Dati.m b/ATD/centralina_Dati.m new file mode 100755 index 0000000..7f5cf8c --- /dev/null +++ b/ATD/centralina_Dati.m @@ -0,0 +1,91 @@ +function [DATA,Tcentralina] = centralina(IDcentralina,DTcatena,catena,datainiTuL,tempoiniTuL,... + datainiRL,tempoiniRL,datainiTLH,tempoiniTLH,datainiTLHRH,tempoiniTLHRH,... + datainiPCL,tempoiniPCL,datainiPCLHR,tempoiniPCLHR,datainiLL,tempoiniLL,datainiPrL,... + tempoiniPrL,datainiEL,tempoiniEL,dataini3DEL,tempoini3DEL,datainiWEL,tempoiniWEL,... + datainiCrL,tempoiniCrL,dataini3DCrL,tempoini3DCrL,datainiMPBEL,tempoiniMPBEL,conn) + +%% Temperatura +% cerco la temperatura nel primo nodo +i = 1; +z = 0; +while z==0 + if cell2mat(catena(i,3)) == 1 + z = 1; + else + i = i+1; % nodo numero 1 + end +end +i = cell2mat(catena(i,1)); +if i == 17 + dataini = datainiTuL; + tempoini = tempoiniTuL; +elseif i == 21 + dataini = datainiPrL; + tempoini = tempoiniPrL; +elseif i == 16 + dataini = datainiEL; + tempoini = tempoiniEL; +elseif i == 19 + dataini = dataini3DEL; + tempoini = tempoini3DEL; +elseif i == 23 + dataini = datainiPCL; + tempoini = tempoiniPCL; +elseif i == 18 + dataini = datainiRL; + tempoini = tempoiniRL; +elseif i == 11 + dataini = datainiTLH; + tempoini = tempoiniTLH; +elseif i == 12 + dataini = datainiTLHRH; + tempoini = tempoiniTLHRH; +elseif i == 15 + dataini = datainiLL; + tempoini = tempoiniLL; +elseif i == 24 + dataini = datainiPCLHR; + tempoini = tempoiniPCLHR; +elseif i == 22 + dataini = datainiWEL; + tempoini = tempoiniWEL; +elseif i == 36 + dataini = datainiCrL; + tempoini = tempoiniCrL; +elseif i == 37 + dataini = dataini3DCrL; + tempoini = tempoini3DCrL; +elseif i == 25 + dataini = datainiMPBEL; + tempoini = tempoiniMPBEL; +end + +NodeNum = '1'; +comando = ['select Date, Time, Temperature from RawDataView where Date = ''' ... + dataini ''' and Time >= ''' tempoini ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum = ''' NodeNum ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +BatTempo = curs.Data; +comando = ['select Date, Time, Temperature from RawDataView where Date > ''' ... + dataini ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum = ''' NodeNum ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +BatData = curs.Data; +if strcmp(char(BatData(1)),'No Data') + Tcentralina = BatTempo; +elseif strcmp(char(BatTempo(1)),'No Data') + Tcentralina = BatData; +else + Tcentralina = [BatTempo;BatData]; +end +% Modifico il formato di data e ora in DATini. +DAT = [BatTempo(:,1:2); BatData(:,1:2)]; +[rD,~] = size(DAT); +T = [cell2mat(DAT(:,1)) repmat(' ', [rD,1]) cell2mat(DAT(:,2))]; +T = datenum(T); +% Converto da Cell Array a Matrice. +DATA = T; + +end \ No newline at end of file diff --git a/ATD/checkBattery.m b/ATD/checkBattery.m new file mode 100755 index 0000000..39535f5 --- /dev/null +++ b/ATD/checkBattery.m @@ -0,0 +1,125 @@ +function checkBattery(Batteria,IDcentralina,Mail,conn,FileName) + +text = 'checkBattery function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +comando = ['select type_id from units where name = ''' IDcentralina ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +Type = cell2mat(curs.Data); +if Type == 1 || Type == 2 || Type == 3 || Type == 4 % G801, G802, G201, G301 + Batt = 12; + Threshold = 11; + Dato = cellstr('12 V'); +elseif Type == 5 % D2W + Batt = 6; + Threshold = 5.6; + Dato = cellstr('6 V'); +elseif Type == 7 % NESA + Batt = 3.4; + Threshold = 3; + Dato = cellstr('3.4 V'); +end + +FileNameBattery = strcat(IDcentralina,'-Batteria.txt'); +if isfile(FileNameBattery) == 0 % NON Esiste + outdat = fopen(FileNameBattery,'wt+'); + fileID_site = fopen(FileNameBattery,'a'); + fmt = '%f \r'; + fprintf(fileID_site,fmt,Batt); + fmt = '%.10f \r'; + text = now; + fprintf(fileID_site,fmt,text); + fclose(fileID_site); +end + +% Scarico dati di riferimento +FileNameBattery = ['' IDcentralina '-Batteria.txt']; +Dati = importdata(FileNameBattery); +[rA,~] = size(Dati); +if rA == 0 + Livello_Rif = 0; + Data_Rif = 0; +elseif rA == 1 + Livello_Rif = Dati(1,1); + Data_Rif = 0; +else + Livello_Rif = Dati(1,1); + Data_Rif = Dati(2,1); +end + +Level = cell2mat(Batteria(end,3)); +activate = 0; + +if Level < Threshold + if now-Data_Rif > 1 || Level < Livello_Rif + Data_Rif = now; + activate = 1; + end +end + +if activate == 0 + Mail = 0; +end + +if Mail == 1 + + DATAinsert = cell(1,6); + sms = 0; + desc = Dato; + Data = datestr(strjoin([Batteria(end,1) Batteria(end,2)]),'yyyy-mm-dd HH:MM:SS'); + Livello = cell2mat(Batteria(end,3)); + DATAinsert{1,1} = 2; % Allarme tipologia batteria + DATAinsert{1,2} = IDcentralina; + DATAinsert{1,3} = Data; + DATAinsert{1,4} = Livello; + DATAinsert{1,5} = sms; + DATAinsert{1,6} = desc; + + % Cerco se il dato è già presente + comando = ['select id, type_id, date_time from alarms where unit_name = ''' ... + IDcentralina ''' and date_time = ''' Data ''' and type_id = ''' DATAinsert{1,1} ... + ''' and registered_value = ''' Livello ''' and description like ''' desc ''' order by date_time']; + curs = exec(conn,comando); + curs = fetch(curs); + idDate = curs.Data; + [~,cI] = size(idDate); + if cI == 1 + idElabData = 0; % 0 indica che il dato non è presente su DB + else + idElabData = cell2mat(idDate(:,1)); + end + tablename = 'alarms'; + colnames = {'type_id','unit_name','date_time','battery_level','send_sms','description'}; + data = [DATAinsert(1,1),DATAinsert(1,2),DATAinsert(1,3),DATAinsert(1,4),... + DATAinsert(1,5),DATAinsert(1,6)]; + if idElabData == 0 % Scrivo + fastinsert(conn,tablename,colnames,data); + text = ['ALERT was written in the DB by checkBattery function for date: ''' Data ''' ']; + end + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); +end + +outdat = fopen(FileNameBattery,'wt+'); +fileID_site = fopen(FileNameBattery,'a'); +text_B = cell2mat(Batteria(end,3)); +fmt = '%f \r'; +fprintf(fileID_site,fmt,text_B); +fmt = '%.10f \r'; +text = Data_Rif; +fprintf(fileID_site,fmt,text); +fclose(fileID_site); + +text = 'checkBattery function worked correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/checkGIS.m b/ATD/checkGIS.m new file mode 100755 index 0000000..91ed94e --- /dev/null +++ b/ATD/checkGIS.m @@ -0,0 +1,117 @@ +function checkGIS(siteID,NomeSito,conn,FileName) + +text = 'checkGIS function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +comando = ['select gis_enable, gis_duedate from sites where id like ''' siteID ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +GIS = curs.Data; +if cell2mat(GIS(1)) == 1 % GIS attivato + if strcmp(char(GIS(2)),'null') == 0 + FileNameGIS = ['GIS' siteID '-Deadline.txt']; + if isfile(FileNameGIS) == 0 % NON Esiste + outdat = fopen(FileNameGIS,'wt+'); + fileID_site = fopen(FileNameGIS,'a'); + text = now; + fmt = '%f \r'; + fprintf(fileID_site,fmt,text); + fclose(fileID_site); + end + + % Scarico dati di riferimento + Data_Rif = importdata(FileNameGIS); + [rA,~] = size(Data_Rif); + if rA == 0 + Data_Rif = 0; + end + + % Controllo la data di scadenza del GIS + G = cell2mat(GIS(2)); + [lS] = length(G); + date = G(1:10); + time = G(12:lS); + Date = [date ' ' time]; + + Info = 0; + if now <= datenum(Date) && datenum(Date) < now+30 % fra 1 giorno e 1 Mese + if datenum(Data_Rif) > datenum(Date)-30 + mail = 0; % la mail è già stata inviata + else + mail = 1; + end + elseif now > datenum(Date) && datenum(Data_Rif) < datenum(Date) % GIS scaduto + mail = 1; + Info = 1; + desc = 'Scaduto'; + else + mail = 0; + end + + if mail == 1 + DATAinsert = cell(1,5); + sms = 0; + Data = datestr(now,'yyyy-mm-dd HH:MM:SS'); + DATAinsert{1,1} = 8; % Allarme scadenza GIS + DATAinsert{1,2} = cellstr(['GIS|' char(NomeSito)]); + DATAinsert{1,3} = Data; + DATAinsert{1,4} = sms; + if Info == 1 + DATAinsert{1,5} = desc; + end + + % Cerco se il dato è già presente + if Info == 1 + comando = ['select id, type_id, date_time from alarms where tool_name = ''' ... + NomeSito ''' and date_time = ''' Data ''' and type_id = ''' DATAinsert{1,1} ... + ''' and description like ''' desc ''' order by date_time']; + else + comando = ['select id, type_id, date_time from alarms where tool_name = ''' ... + NomeSito ''' and date_time = ''' Data ''' and type_id = ''' DATAinsert{1,1} ... + ''' order by date_time']; + end + curs = exec(conn,comando); + curs = fetch(curs); + idDate = curs.Data; + [~,cI] = size(idDate); + if cI == 1 + idElabData = 0; % 0 indica che il dato non è presente su DB + else + idElabData = cell2mat(idDate(:,1)); + end + tablename = 'alarms'; + if Info == 1 + colnames = {'type_id','tool_name','date_time','send_sms','description'}; + data = [DATAinsert(1,1),DATAinsert(1,2),DATAinsert(1,3),DATAinsert(1,4),DATAinsert(1,5)]; + else + colnames = {'type_id','tool_name','date_time','send_sms'}; + data = [DATAinsert(1,1),DATAinsert(1,2),DATAinsert(1,3),DATAinsert(1,4)]; + end + if idElabData == 0 % Scrivo + fastinsert(conn,tablename,colnames,data); + text = ['ALERT was written in the DB by checkGIS function for date: ''' Data ''' ']; + end + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + end + outdat = fopen(FileNameGIS,'wt+'); + fileID_site = fopen(FileNameGIS,'a'); + text = now; + fmt = '%f \r'; + fprintf(fileID_site,fmt,text); + fclose(fileID_site); + end +end + +text = 'checkGIS function worked correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/checkSIM.m b/ATD/checkSIM.m new file mode 100755 index 0000000..f6b736f --- /dev/null +++ b/ATD/checkSIM.m @@ -0,0 +1,124 @@ +function checkSIM(IDcentralina,conn,FileName) + +text = 'checkSIM function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +comando = ['select sim_card_id from units where name = ''' IDcentralina ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +sim_ID = cell2mat(curs.Data); + +if isnan(sim_ID) == 0 + if sim_ID ~= 0 + comando = ['select name, duedate from sim_cards where id = ''' num2str(sim_ID) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + SIM = curs.Data; + Nome = char(SIM(1)); + + FileNameSIM = ['' Nome '-Deadline.txt']; + if isfile(FileNameSIM) == 0 % NON Esiste + outdat = fopen(FileNameSIM,'wt+'); + fileID_site = fopen(FileNameSIM,'a'); + text = now; + fmt = '%f \r'; + fprintf(fileID_site,fmt,text); + fclose(fileID_site); + end + + % Scarico dati di riferimento + FileNameSIM = ['' IDcentralina '-Deadline.txt']; + Data_Rif = importdata(FileNameSIM); + [rA,~] = size(Data_Rif); + if rA == 0 + Data_Rif = 0; + end + + % Controllo la data di scadenza della SIM + Date = SIM(2); + Check = cell2mat(Date); + Info = 0; + if strcmp(Check,'null') == 1|| strcmp(Check,'No Data') == 1 + else + if now <= datenum(Date) && datenum(Date) < now+30 % fra 1 giorno e 1 Mese + if datenum(Data_Rif) > datenum(Date)-30 + mail = 0; % la mail è già stata inviata + else + mail = 1; + end + elseif now > datenum(Date) && datenum(Data_Rif) < datenum(Date) % sim scaduta + mail = 1; + Info = 1; + desc = 'Scaduto'; + else + mail = 0; + end + + if mail == 1 + DATAinsert = cell(1,6); + sms = 0; + Data = datestr(now,'yyyy-mm-dd HH:MM:SS'); + DATAinsert{1,1} = 7; % Allarme scadenza SIM + DATAinsert{1,2} = Nome; + DATAinsert{1,3} = Data; + DATAinsert{1,4} = sms; + if Info == 1 + DATAinsert{1,5} = desc; + end + + % Cerco se il dato è già presente + if Info == 1 + comando = ['select id, type_id, date_time from alarms where tool_name = ''' ... + Nome ''' and date_time = ''' Data ''' and type_id = ''' DATAinsert{1,1} ... + ''' and description like ''' desc ''' order by date_time']; + else + comando = ['select id, type_id, date_time from alarms where tool_name = ''' ... + Nome ''' and date_time = ''' Data ''' and type_id = ''' DATAinsert{1,1} ... + ''' order by date_time']; + end + curs = exec(conn,comando); + curs = fetch(curs); + idDate = curs.Data; + [~,cI] = size(idDate); + if cI == 1 + idElabData = 0; % 0 indica che il dato non è presente su DB + else + idElabData = cell2mat(idDate(:,1)); + end + tablename = 'alarms'; + if Info == 1 + colnames = {'type_id','tool_name','date_time','send_sms','description'}; + data = [DATAinsert(1,1),DATAinsert(1,2),DATAinsert(1,3),DATAinsert(1,4),DATAinsert(1,5)]; + else + colnames = {'type_id','tool_name','date_time','send_sms'}; + data = [DATAinsert(1,1),DATAinsert(1,2),DATAinsert(1,3),DATAinsert(1,4)]; + end + if idElabData == 0 % Scrivo + fastinsert(conn,tablename,colnames,data); + text = ['ALERT was written in the DB by checkSIM function for date: ''' Data ''' ']; + end + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + end + outdat = fopen(FileNameSIM,'wt+'); + fileID_site = fopen(FileNameSIM,'a'); + text = now; + fmt = '%f \r'; + fprintf(fileID_site,fmt,text); + fclose(fileID_site); + end + end +end + +text = 'checkSIM function worked correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/checkUnit.m b/ATD/checkUnit.m new file mode 100755 index 0000000..615a543 --- /dev/null +++ b/ATD/checkUnit.m @@ -0,0 +1,113 @@ +function checkUnit(IDcentralina,conn,FileName) + +text = 'checkUnit function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +FileNameUnit = ['' IDcentralina '-Deadline.txt']; +if isfile(FileNameUnit) == 0 % NON Esiste + outdat = fopen(FileNameUnit,'wt+'); + fileID_site = fopen(FileNameUnit,'a'); + text = now; + fmt = '%f \r'; + fprintf(fileID_site,fmt,text); + fclose(fileID_site); +end + +% Scarico dati di riferimento +FileNameUnit = ['' IDcentralina '-Deadline.txt']; +Data_Rif = importdata(FileNameUnit); +[rA,~] = size(Data_Rif); +if rA == 0 + Data_Rif = 0; +end + +% Cerco la data di scadenza della centralina +comando = ['select duedate from units where name = ''' IDcentralina ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +Date = curs.Data; +Check = cell2mat(Date); +Info = 0; +if strcmp(Check,'null') == 1|| strcmp(Check,'No Data') == 1 +else + if now <= datenum(Date) && datenum(Date) < now+30 % fra 1 giorno e 1 Mese + if datenum(Data_Rif) > datenum(Date)-30 + mail = 0; % la mail è già stata inviata + else + mail = 1; + end + elseif now > datenum(Date) && datenum(Data_Rif) < datenum(Date) % centralina scaduta + mail = 1; + Info = 1; + desc = 'Scaduto'; + else + mail = 0; + end + + if mail == 1 + DATAinsert = cell(1,6); + sms = 0; + Data = datestr(now,'yyyy-mm-dd HH:MM:SS'); + DATAinsert{1,1} = 5; % Allarme scadenza centralina + DATAinsert{1,2} = IDcentralina; + DATAinsert{1,3} = Data; + DATAinsert{1,4} = sms; + if Info == 1 + DATAinsert{1,5} = desc; + end + + % Cerco se il dato è già presente + if Info == 1 + comando = ['select id, type_id, date_time from alarms where unit_name = ''' ... + IDcentralina ''' and date_time = ''' Data ''' and type_id = ''' DATAinsert{1,1} ... + ''' and description like ''' desc ''' order by date_time']; + else + comando = ['select id, type_id, date_time from alarms where unit_name = ''' ... + IDcentralina ''' and date_time = ''' Data ''' and type_id = ''' DATAinsert{1,1} ... + ''' order by date_time']; + end + curs = exec(conn,comando); + curs = fetch(curs); + idDate = curs.Data; + [~,cI] = size(idDate); + if cI == 1 + idElabData = 0; % 0 indica che il dato non è presente su DB + else + idElabData = cell2mat(idDate(:,1)); + end + tablename = 'alarms'; + if Info == 1 + colnames = {'type_id','unit_name','date_time','send_sms','description'}; + data = [DATAinsert(1,1),DATAinsert(1,2),DATAinsert(1,3),DATAinsert(1,4),DATAinsert(1,5)]; + else + colnames = {'type_id','unit_name','date_time','send_sms'}; + data = [DATAinsert(1,1),DATAinsert(1,2),DATAinsert(1,3),DATAinsert(1,4)]; + end + if idElabData == 0 % Scrivo + fastinsert(conn,tablename,colnames,data); + text = ['ALERT was written in the DB by checkUnit function for date: ''' Data ''' ']; + end + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + end + + outdat = fopen(FileNameUnit,'wt+'); + fileID_site = fopen(FileNameUnit,'a'); + text = now; + fmt = '%f \r'; + fprintf(fileID_site,fmt,text); + fclose(fileID_site); +end + +text = 'checkUnit function worked correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/check_RL.m b/ATD/check_RL.m new file mode 100755 index 0000000..f6fe79c --- /dev/null +++ b/ATD/check_RL.m @@ -0,0 +1,67 @@ +function [ax,ay,az] = check_RL(ax,ay,az,rRL,IDcentralina,DTcatena,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; + +incliX = ax; +incliY = ay; +incliZ = az; + +switchXY = zeros(rRL,1); +switchYZ = zeros(rRL,1); +switch_signXY = zeros(rRL,1); + +instAx = ax(:,1); +instAy = ay(:,1); + +for i = 1:rRL + if instAy(i,1) < 0 && abs(instAx(i,1)) < sin(pi/6) % il nodo è sottosopra, devo cambiare i segni di X e Y + switch_signXY(i,1) = 1; + end + if instAx(i,1) > sin(pi/6) || instAx(i,1) < sin(-pi/6) % uso Z anzichè Y + if instAx(i,1) > sin(pi/4) + switchXY(i,1) = 1; + elseif instAx(i,1) < sin(-pi/4) % uso X anzichè Y + switchXY(i,1) = -1; + else + switchYZ(i,1) = 1; + end + end + if switch_signXY(i,1) == 1 + ax(i,:) = -incliX(i,:); + ay(i,:) = -incliY(i,:); + text = ['ax and ay signs changed during the execution of check_RL function of Radial Link node number ' num2str(i)]; + fprintf(fileID,fmt,text); + end + if switchXY(i,1) == 1 + ax(i,:) = incliY(i,:); + ay(i,:) = incliX(i,:); + text = ['ax and ay switched during the execution of check_RL function of Radial Link node number ' num2str(i)]; + fprintf(fileID,fmt,text); + elseif switchXY(i,1) == -1 + ax(i,:) = -incliY(i,:); + ay(i,:) = -incliX(i,:); + text = ['ax and ay switched and signs changed during the execution of check_RL function of Radial Link node number ' num2str(i)]; + fprintf(fileID,fmt,text); + end + if switchYZ(i,1) == 1 + az(i,:) = -incliY(i,:); + ay(i,:) = -incliZ(i,:); + text = ['ay and az switched and signs changed during the execution of check_RL function of Radial Link node number ' num2str(i)]; + fprintf(fileID,fmt,text); + end +end + +nameXY = strcat([IDcentralina,'-',DTcatena,'-','switchXY']); +name_switchXY = strcat([IDcentralina,'-',DTcatena,'-','switch_signXY']); +nameYZ = strcat([IDcentralina,'-',DTcatena,'-','switchYZ']); +save(nameXY,'switchXY') +save(nameYZ,'switchYZ') +save(name_switchXY,'switch_signXY') + + +text = 'check_RL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); +end + diff --git a/ATD/checkdata.m b/ATD/checkdata.m new file mode 100755 index 0000000..b720bba --- /dev/null +++ b/ATD/checkdata.m @@ -0,0 +1,124 @@ +function [DatiElabTunnelLink,DatiElabRadialLink,DatiElabTiltLinkH,DatiElabTiltLinkHRH,... + DatiElabPreConvLink,DatiElabPreConvLinkHR,DatiElabAnalogLink,DatiElabDistoMTLink]... + = checkdata(yesTuL,yesRL,yesTLH,yesTLHRH,yesPCL,yesPCLHR,yesAL,yesDM,... + DatiElabTunnelLink,DatiElabRadialLink,DatiElabTiltLinkH,DatiElabTiltLinkHRH,... + DatiElabPreConvLink,DatiElabPreConvLinkHR,DatiElabAnalogLink,DatiElabDistoMTLink,... + datainiTuL,tempoiniTuL,datainiRL,tempoiniRL,datainiTLH,tempoiniTLH,... + datainiTLHRH,tempoiniTLHRH,datainiPCL,tempoiniPCL,datainiPCLHR,tempoiniPCLHR,... + datainiAL,tempoiniAL,datainiDM,tempoiniDM,rTuL,rRL,rTLH,rTLHRH,rPCL,rPCLHR,rAL,rDM,... + NodoTunnelLink,NodoRadialLink,NodoTiltLinkH,NodoTiltLinkHRH,NodoPreConvLink,... + NodoPreConvLinkHR,NodoAnalogLink,NodoDistoMTLink,NuovoZeroTuL,NuovoZeroRL,NuovoZeroTLH,... + NuovoZeroTLHRH,NuovoZeroPCL,NuovoZeroPCLHR,NuovoZeroAL,NuovoZeroDM,... + IDcentralina,DTcatena,conn,FileName) + +text = 'checkdata function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +%% Tunnel Link +if yesTuL == 1 + if NuovoZeroTuL == 1 + data1 = datenum([char(DatiElabTunnelLink(1,1)) ' ' char(DatiElabTunnelLink(1,2))]); % Prima data elaborata + data2 = datenum([datainiTuL(1,1:10),' ',tempoiniTuL]); % Prima data grezza + if data2 ~= data1 % devo riscaricare l'ultimo dato elaborato a partire da dataini + datainiTuL = datestr(data2,'yyyy-mm-dd'); + tempoiniTuL = datestr(data2,'HH:MM:SS'); + DatiElabTunnelLink = LastElab_bisTuL(conn,NodoTunnelLink,rTuL,... + datainiTuL,tempoiniTuL,IDcentralina,DTcatena,FileName); + end + end +end + +%% Radial Link +if yesRL == 1 + if NuovoZeroRL == 1 + data1 = datenum([char(DatiElabRadialLink(1,1)) ' ' char(DatiElabRadialLink(1,2))]); % Prima data elaborata + data2 = datenum([datainiRL(1,1:10),' ',tempoiniRL]); % Prima data grezza + if data2 ~= data1 % devo riscaricare l'ultimo dato elaborato a partire da dataini + datainiRL = datestr(data2,'yyyy-mm-dd'); + tempoiniRL = datestr(data2,'HH:MM:SS'); + DatiElabRadialLink = LastElab_bisRL(conn,NodoRadialLink,rRL,... + datainiRL,tempoiniRL,IDcentralina,DTcatena,FileName); + end + end +end + +%% Tilt Link H +if yesTLH == 1 + if NuovoZeroTLH == 1 + data1 = datenum([char(DatiElabTiltLinkH(1,1)) ' ' char(DatiElabTiltLinkH(1,2))]); % Prima data elaborata + data2 = datenum([datainiTLH(1,1:10),' ',tempoiniTLH]); % Prima data grezza + if data2 ~= data1 % devo riscaricare l'ultimo dato elaborato a partire da dataini + datainiTLH = datestr(data2,'yyyy-mm-dd'); + tempoiniTLH = datestr(data2,'HH:MM:SS'); + DatiElabTiltLinkH = LastElab_bisTLH(conn,NodoTiltLinkH,rTLH,... + datainiTLH,tempoiniTLH,IDcentralina,DTcatena,FileName); + end + end +end + +%% Tilt Link HR H +if yesTLHRH == 1 + if NuovoZeroTLHRH == 1 + data1 = datenum([char(DatiElabTiltLinkHRH(1,1)) ' ' char(DatiElabTiltLinkHRH(1,2))]); % Prima data elaborata + data2 = datenum([datainiTLHRH(1,1:10),' ',tempoiniTLHRH]); % Prima data grezza + if data2 ~= data1 % devo riscaricare l'ultimo dato elaborato a partire da dataini + datainiTLHRH = datestr(data2,'yyyy-mm-dd'); + tempoiniTLHRH = datestr(data2,'HH:MM:SS'); + DatiElabTiltLinkHRH = LastElab_bisTLHRH(conn,NodoTiltLinkHRH,rTLHRH,... + datainiTLHRH,tempoiniTLHRH,IDcentralina,DTcatena,FileName); + end + end +end + +%% PreConv Link +if yesPCL == 1 + if NuovoZeroPCL == 1 + data1 = datenum([char(DatiElabPreConvLink(1,1)) ' ' char(DatiElabPreConvLink(1,2))]); % Prima data elaborata + data2 = datenum([datainiPCL(1,1:10),' ',tempoiniPCL]); % Prima data grezza + if data2 ~= data1 % devo riscaricare l'ultimo dato elaborato a partire da dataini + datainiPCL = datestr(data2,'yyyy-mm-dd'); + tempoiniPCL = datestr(data2,'HH:MM:SS'); + DatiElabPreConvLink = LastElab_bisPCL(conn,NodoPreConvLink,rPCL,... + datainiPCL,tempoiniPCL,IDcentralina,DTcatena,FileName); + end + end +end + +%% PreConv Link HR +if yesPCLHR == 1 + if NuovoZeroPCLHR == 1 + data1 = datenum([char(DatiElabPreConvLinkHR(1,1)) ' ' char(DatiElabPreConvLinkHR(1,2))]); % Prima data elaborata + data2 = datenum([datainiPCLHR(1,1:10),' ',tempoiniPCLHR]); % Prima data grezza + if data2 ~= data1 % devo riscaricare l'ultimo dato elaborato a partire da dataini + datainiPCLHR = datestr(data2,'yyyy-mm-dd'); + tempoiniPCLHR = datestr(data2,'HH:MM:SS'); + DatiElabPreConvLinkHR = LastElab_bisPCLHR(conn,NodoPreConvLinkHR,rPCLHR,... + datainiPCLHR,tempoiniPCLHR,IDcentralina,DTcatena,FileName); + end + end +end + +%% Analog Link +if yesAL == 1 + if NuovoZeroAL == 1 + data1 = datenum([char(DatiElabAnalogLink(1,1)) ' ' char(DatiElabAnalogLink(1,2))]); % Prima data elaborata + data2 = datenum([datainiAL(1,1:10),' ',tempoiniAL]); % Prima data grezza + if data2 ~= data1 % devo riscaricare l'ultimo dato elaborato a partire da dataini + datainiAL = datestr(data2,'yyyy-mm-dd'); + tempoiniAL = datestr(data2,'HH:MM:SS'); + DatiElabAnalogLink = LastElab_bisAL(conn,NodoAnalogLink,rAL,... + datainiAL,tempoiniAL,IDcentralina,DTcatena,FileName); + end + end +end + +text = 'checkdata function worked correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/columnlegend.m b/ATD/columnlegend.m new file mode 100755 index 0000000..89ee2e8 --- /dev/null +++ b/ATD/columnlegend.m @@ -0,0 +1,263 @@ +function [legend_h,object_h,plot_h,text_strings] = columnlegend(numcolumns, str, varargin) +% +% columnlegend creates a legend with a specified number of columns. +% +% columnlegend(numcolumns, str, varargin) +% numcolumns - number of columns in the legend +% str - cell array of strings for the legend +% +% Additional Input Options: +% columnlegend(..., 'location', loc) +% loc - location variable for legend, default is 'NorthEast' +% possible values: 'NorthWest', 'NorthEast', 'SouthEast', 'SouthWest', +% 'NorthOutside', 'SouthOutside', +% 'NortheastOutside', 'SoutheastOutside' +% +% columnlegend(numcolumns, str, 'padding', 0.5); % add 50% vertical padding between legend entries (relative to original height) +% +% columnlegend(..., 'boxon') +% columnlegend(..., 'boxoff') +% set legend bounding box on/off +% +% example: +% plot(bsxfun(@times, [0:9]',[1:10])); +% columnlegend(3, cellstr(num2str([1:10]')), 'location','northwest'); +% +% +% Author: Simon Henin +% +% 4/09/2013 - Fixed bug with 3 entries / 3 columns +% 4/09/2013 - Added bounding box option as per @Durga Lal Shrestha (fileexchage) +% 11 May 2010 - 1.2 Add instructions for printing figure with columns +% 08 Feb 2011 - 1.4 Added functionality when using markers. +% 31 Oct 2015 - Updates for compatibility with 2015a, Adds minor improvements as per user suggestions +% 07 Nov 2016 - Bug fixes, added functionality for bar plots, added all valid legend locations +% 07 Jun 2017 - Added a quick padding feature that creates additional +% vertical space between legend entries. +location = 'NorthEast'; +boxon = false; legend_h = false; padding = 0; extravars = []; +for i=1:2:length(varargin) + switch lower(varargin{i}) + case 'location' + location = varargin{i+1}; + i=i+2; + case 'boxon' + boxon = true; + case 'boxoff' + boxon = false; + case 'legend' + legend_h = varargin{i+1}; + i=i+2; + case 'object' + object_h = varargin{i+1}; + i=i+2; + case 'padding' + padding = varargin{i+1}; + i=i+2; + otherwise + extravars{end+1} = varargin{i}; + extravars{end+1} = varargin{i+1}; + end +end +if legend_h == false + %create the legend + if ~isempty(extravars) + [legend_h,object_h,plot_h,text_strings] = legend(str, extravars{:}); + else + [legend_h,object_h,plot_h,text_strings] = legend(str); + end +end +%some variables +numlines = length(str); +numpercolumn = ceil(numlines/numcolumns); +%get old width, new width and scale factor +set(legend_h, 'units', 'normalized'); +set(gca, 'units', 'normalized'); +pos = get(legend_h, 'position'); +width = numcolumns*pos(3); +newheight = (pos(4)/numlines)*numpercolumn; +rescale = pos(3)/width; +%get some old values so we can scale everything later +type = get(object_h(numlines+1), 'type'); +switch type + case {'line'} + xdata = get(object_h(numlines+1), 'xdata'); + ydata1 = get(object_h(numlines+1), 'ydata'); + ydata2 = get(object_h(numlines+3), 'ydata'); + + %we'll use these later to align things appropriately + sheight = ydata1(1)-ydata2(1) + (ydata1(1)-ydata2(1))*padding; % height between data lines + height = ydata1(1) + (ydata1(1)-ydata2(1))*padding*2; % height of the box. Used to top margin offset + line_width = (xdata(2)-xdata(1))*rescale; % rescaled linewidth to match original + spacer = xdata(1)*rescale; % rescaled spacer used for margins + case {'hggroup'} + text_pos = get(object_h(1), 'position'); + child = get(object_h(numlines+1), 'children'); + % determine if bar or errorbar + subtype = get(child, 'Type'); + if strcmpi(subtype, 'patch') % bar + vertices_1 = get(child, 'vertices'); + child = get(object_h(numlines+2), 'children'); + vertices_2 = get(child, 'vertices'); + sheight = vertices_1(2,2)-vertices_1(1,2); + height = vertices_1(2,2); + line_width = (vertices_1(3,1)-vertices_1(1,1))*rescale; % rescaled linewidth to match original + spacer = vertices_1(1,2)-vertices_2(2,2); % rescaled spacer used for margins + text_space = (text_pos(1)-vertices_1(4,1))./numcolumns; + elseif strcmpi(subtype, 'hggroup') % errorbar + child1 = get(get(object_h(numlines+1), 'children'), 'children'); + child1 = child1(2); + child2 = get(get(object_h(numlines+2), 'children'), 'children'); + child2 = child2(2); + xdata = get(child1, 'xdata'); + ydata1 = get(child1, 'ydata'); + ydata2 = get(child2, 'ydata'); + %we'll use these later to align things appropriately + sheight = ydata1(1)-ydata2(1) + (ydata1(1)-ydata2(1))*padding; % height between data lines + height = ydata1(1) + (ydata1(1)-ydata2(1))*padding*2; % height of the box. Used to top margin offset + line_width = (xdata(2)-xdata(1))*rescale; % rescaled linewidth to match original + spacer = xdata(1)*rescale; % rescaled spacer used for margins + end +end +%put the legend on the upper left corner to make initial adjustments easier +% set(gca, 'units', 'pixels'); +loci = get(gca, 'position'); +set(legend_h, 'position', [loci(1) pos(2) width pos(4)]); +col = -1; +for i=1:numlines + if (mod(i,numpercolumn)==1 || (numpercolumn == 1)) + col = col+1; + end + + if i==1 + linenum = i+numlines; + else + if strcmp(type, 'line') + linenum = linenum+2; + else + linenum = linenum+1; + end + end + labelnum = i; + + position = mod(i,numpercolumn); + if position == 0 + position = numpercolumn; + end + + switch type, + case {'line'} + %realign the labels + set(object_h(linenum), 'ydata', [(height-(position-1)*sheight) (height-(position-1)*sheight)]); + set(object_h(linenum), 'xdata', [col/numcolumns+spacer col/numcolumns+spacer+line_width]); + + set(object_h(linenum+1), 'ydata', [height-(position-1)*sheight height-(position-1)*sheight]); + set(object_h(linenum+1), 'xdata', [col/numcolumns+spacer*3.5 col/numcolumns+spacer*3.5]); + + set(object_h(labelnum), 'position', [col/numcolumns+spacer*2+line_width height-(position-1)*sheight]); + case {'hggroup'}, + if exist('subtype', 'var')&strcmpi(subtype, 'patch'), + child = get(object_h(linenum), 'children'); + v = get(child, 'vertices'); + %x-positions + v([1:2 5],1) = col/numcolumns+spacer; + v(3:4,1) = col/numcolumns+spacer+line_width; + % y-positions + v([1 4 5],2) = (height-(position-1)*sheight-(position-1)*spacer); + v([2 3], 2) = v(1,2)+sheight; + set(child, 'vertices', v); + set(object_h(labelnum), 'position', [v(3,1)+text_space v(1,2)+(v(2,2)-v(1,2))/2 v(3,1)-v(1,1)]); + else + child = get(get(object_h(linenum), 'children'), 'children'); + set(child(2), 'ydata', [(height-(position-1)*sheight) (height-(position-1)*sheight)]); + set(child(2), 'xdata', [col/numcolumns+spacer col/numcolumns+spacer+line_width]); + +% set(object_h(linenum+1), 'ydata', [height-(position-1)*sheight height-(position-1)*sheight]); +% set(object_h(linenum+1), 'xdata', [col/numcolumns+spacer*3.5 col/numcolumns+spacer*3.5]); + + set(object_h(labelnum), 'position', [col/numcolumns+spacer*2+line_width height-(position-1)*sheight]); + end + end + +end +%unfortunately, it is not possible to force the box to be smaller than the +%original height, therefore, turn it off and set background color to none +%so that it no longer appears +set(legend_h, 'Color', 'None', 'Box', 'off'); +%let's put it where you want it +fig_pos = get(gca, 'position'); +pos = get(legend_h, 'position'); +padding = 0.01; % padding, in normalized units +% if location is some variation on south, then we need to take into account +% the new height +if strfind(location, 'south'), + h_diff = pos(4)-newheight; + pos(4) = newheight; +end +switch lower(location), + case {'northeast'} + set(legend_h, 'position', [pos(1)+fig_pos(3)-pos(3)-padding pos(2) pos(3) pos(4)]); + case {'northwest'} + set(legend_h, 'position', [pos(1)+padding pos(2) pos(3) pos(4)]); + case {'southeast'} + pos(4) = newheight; + set(legend_h, 'position', [pos(1)+fig_pos(3)-pos(3)-padding fig_pos(2)-pos(4)/2+pos(4)/4 pos(3) pos(4)]); + case {'southwest'} + set(legend_h, 'position', [fig_pos(1)+padding fig_pos(2)-pos(4)/2+pos(4)/4 pos(3) pos(4)]); + case {'northeastoutside'} + % need to resize axes to allow legend to fit in figure window + set(gca, 'position', [fig_pos]-[0 0 pos(3) 0]); + set(legend_h, 'position', [pos(1)+fig_pos(3)-pos(3) pos(2) pos(3) pos(4)]); + case {'northwestoutside'} + % need to resize axes to allow legend to fit in figure window + set(gca, 'position', [fig_pos]+[pos(3) 0 -pos(3) 0]); + set(legend_h, 'position', [fig_pos(1)-fig_pos(3)*.1 pos(2) pos(3) pos(4)]); % -10% figurewidth to account for axis labels + case {'north'} + % need to resize axes to allow legend to fit in figure window + set(legend_h, 'position', [fig_pos(1)+fig_pos(3)/2-pos(3)/2 fig_pos(2)+(fig_pos(4)-pos(4))-padding pos(3) pos(4)]); + case {'northoutside'} + % need to resize axes to allow legend to fit in figure window + set(gca, 'position', [fig_pos]-[0 0 0 pos(4)]); +% set(legend_h, 'position', [fig_pos(1)+fig_pos(3)/2-pos(3)/2 fig_pos(2)+(fig_pos(4)-pos(4)) pos(3) pos(4)]); + set(legend_h, 'position', [fig_pos(1)+fig_pos(3)/2-pos(3)/2 fig_pos(2)+fig_pos(4)-pos(4) pos(3) pos(4)]); + case {'south'} + y_pos = fig_pos(2)-h_diff+pos(4); + set(legend_h, 'position', [fig_pos(1)+fig_pos(3)/2-pos(3)/2 y_pos pos(3) pos(4)]); + case {'southoutside'} + % need to resize axes to allow legend to fit in figure window + set(gca, 'position', [fig_pos]-[0 -pos(4) 0 pos(4)]); +% set(legend_h, 'position', [fig_pos(1)+fig_pos(3)/2-pos(3)/2 fig_pos(2)-pos(4)-pos(3)*0.1 pos(3) pos(4)]); + set(legend_h, 'position', [fig_pos(1)+fig_pos(3)/2-pos(3)/2 0 pos(3) pos(4)]); + case {'eastoutside'} + % need to resize axes to allow legend to fit in figure window + set(gca, 'position', [fig_pos]-[0 0 pos(3) 0]); + set(legend_h, 'position', [pos(1)+fig_pos(3)-pos(3) fig_pos(2)+fig_pos(4)/2-pos(4)/2 pos(3) pos(4)]); + case {'southeastoutside'} + % need to resize axes to allow legend to fit in figure window + set(gca, 'position', [fig_pos]-[0 0 pos(3) 0]); + set(legend_h, 'position', [pos(1)+fig_pos(3)-pos(3) fig_pos(2)-pos(4)/4 pos(3) pos(4)]); + case {'westoutside'} + % need to resize axes to allow legend to fit in figure window + set(gca, 'position', [fig_pos]+[pos(3) 0 -pos(3) 0]); + set(legend_h, 'position', [fig_pos(1)-fig_pos(3)*.1 fig_pos(2)+fig_pos(4)/2-pos(4)/2 pos(3) pos(4)]); % -10% figurewidth to account for axis labels + case {'southwestoutside'} + % need to resize axes to allow legend to fit in figure window + set(gca, 'position', [fig_pos]+[pos(3) 0 -pos(3) 0]); + set(legend_h, 'position', [fig_pos(1)-fig_pos(3)*.1 fig_pos(2)-pos(4)/4 pos(3) pos(4)]); % -10% figurewidth to account for axis labels +end +% display box around legend +if boxon + drawnow; % make sure everyhting is drawn in place first. +% set(legend_h, 'units', 'normalized'); + pos = get(legend_h, 'position'); + orgHeight = pos(4); + pos(4) = (orgHeight/numlines)*numpercolumn; + pos(2)=pos(2) + orgHeight-pos(4) - pos(4)*0.05; + pos(1) = pos(1)+pos(1)*0.01; + annotation('rectangle',pos, 'linewidth', 1) +end +% re-set to normalized so that things scale properly +set(legend_h, 'units', 'normalized'); +set(gca, 'units', 'normalized'); + +end \ No newline at end of file diff --git a/ATD/conv_grezzi2DCrL.m b/ATD/conv_grezzi2DCrL.m new file mode 100755 index 0000000..9f79764 --- /dev/null +++ b/ATD/conv_grezzi2DCrL.m @@ -0,0 +1,104 @@ +% Funzione che converte i dati del fessurimetro 2D + +function [Dati2DCrack,DatiNTCCrack2D,Err2DCrackLink] = conv_grezzi2DCrL(... + Crack2D,NTCCrack2D,DCal2DCrLTot,Nodo2DCrackLink,Err2DCrackLink,CrL2D_NTC,... + r2DCrL,NuovoZero2DCrL,IDcentralina,DTcatena,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'conv_grezzi2DCrL function started'; +fprintf(fileID,fmt,text); + +[rA,cA] = size(Crack2D); +Dati2DCrack = zeros(rA,cA); +DatiNTCCrack2D = zeros(rA,cA/2); +scrivo = 0; +cx_rif = zeros(r2DCrL,1); +cy_rif = zeros(r2DCrL,1); +RIF = zeros(r2DCrL,2); +ii = 1; +for e = 1:r2DCrL % numero di 2D Crack Link + if strcmp(Nodo2DCrackLink(e,3),'4-20 mA') + %% Conversione da mA a mm + % Spacchetto i parametri di calibrazione + ax = DCal2DCrLTot(e,1); + bx = DCal2DCrLTot(e,2); + cx = DCal2DCrLTot(e,3); + ay = DCal2DCrLTot(e,4); + by = DCal2DCrLTot(e,5); + cy = DCal2DCrLTot(e,6); + Dati2DCrack(:,ii) = ax*(Crack2D(:,ii).^2)+bx*Crack2D(:,ii)+cx; % conversione X + Dati2DCrack(:,ii+1) = ay*(Crack2D(:,ii+1).^2)+by*Crack2D(:,ii+1)+cy; % conversione Y + ii = ii+2; + elseif strcmp(Nodo2DCrackLink(e,3),'mV/V') + %% Conversione da mV/V a mm + % Spacchetto i parametri di calibrazione + ax = DCal2DCrLTot(e,1); + bx = DCal2DCrLTot(e,2); + ay = DCal2DCrLTot(e,3); + by = DCal2DCrLTot(e,4); + Dati2DCrack(:,ii) = ax*Crack2D(:,ii)+bx; % conversione x + Dati2DCrack(:,ii+1) = ay*Crack2D(:,ii+1)+by; % conversione y + ii = ii+2; + elseif strcmp(Nodo2DCrackLink(e,3),'Hz') + %% Conversione da mA a mm + % Spacchetto i parametri di calibrazione + ax = DCal2DCrLTot(e,1); + bx = DCal2DCrLTot(e,2); + cx = DCal2DCrLTot(e,3); + ay = DCal2DCrLTot(e,4); + by = DCal2DCrLTot(e,5); + cy = DCal2DCrLTot(e,6); + digitX = (Crack2D(:,ii).^2)/1000; + digitY = (Crack2D(:,ii+1).^2)/1000; + if cx == 0 && cy == 0 % Sensori Geosense + NomeFile = ['' IDcentralina '-' DTcatena '-Rif2DCrL.csv']; + if NuovoZero2DCrL == 0 % Prima elaborazione + scrivo = 1; + cx = -ax*digitX(1,e).^2-bx*digitX(1,e); + cx_rif(e,1) = cx; + cy = -ay*digitY(1,e).^2-by*digitY(1,e); + cy_rif(e,1) = cy; + RIF(e,1:2) = [cx_rif(e,1) cy_rif(e,1)]; + else + RIF = csvread(NomeFile); + cx = RIF(e,1); + cy = RIF(e,2); + end + end + Dati2DCrack(:,ii) = ax*(digitX.^2)+bx*digitX+cx; % conversione + Dati2DCrack(:,ii+1) = ay*(digitY.^2)+by*digitY+cy; % conversione + ii = ii+2; + end + A = 1.4051*10^(-3); + B = 2.369*10^(-4); + C = 1.019*10^(-7); + if CrL2D_NTC(e,1)==1 % è presente il termometro + R = NTCCrack2D(:,e); + [rN,~] = size(R); + for n = 1:rN + if R(n) <= 0 + if n > 1 + R(n) = R(n-1); + else + R(n) = 5000; + end + if Err2DCrackLink(n,ii) == 0 + Err2DCrackLink(n,ii) = 0.5; + end + end + end + L = reallog(R); + DatiNTCCrack2D(:,e) = (1./(A + B*L + C*(L.^3))) -273.2; % conversione in gradi centigradi + end +end +if scrivo == 1 + csvwrite(NomeFile,RIF); +end + +text = 'Calibrations of 2D Crack Link defined correctly. conv_grezzi2DCrL function closed'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/conv_grezzi3DCrL.m b/ATD/conv_grezzi3DCrL.m new file mode 100755 index 0000000..eb18918 --- /dev/null +++ b/ATD/conv_grezzi3DCrL.m @@ -0,0 +1,122 @@ +% Funzione che converte i dati della cella di carico in dati di +% forza mediante i valori di calibrazione. +% Il risultato è la matrico DatiLoad + +function [Dati3DCrack,DatiNTCCrack3D,Err3DCrackLink] = conv_grezzi3DCrL(... + Crack3D,NTCCrack3D,DCal3DCrLTot,Nodo3DCrackLink,Err3DCrackLink,CrL3D_NTC,... + r3DCrL,NuovoZero3DCrL,IDcentralina,DTcatena,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'conv_grezzi3DCrL function started'; +fprintf(fileID,fmt,text); + +[rA,cA] = size(Crack3D); +Dati3DCrack = zeros(rA,cA); +DatiNTCCrack3D = zeros(rA,cA/3); +scrivo = 0; +cx_rif = zeros(r3DCrL,1); +cy_rif = zeros(r3DCrL,1); +cz_rif = zeros(r3DCrL,1); +RIF = zeros(r3DCrL,3); +ii = 1; +for e = 1:r3DCrL % numero di 3D Crack Link + if strcmp(Nodo3DCrackLink(e,3),'4-20 mA') + %% Conversione da mA a mm + % Spacchetto i parametri di calibrazione + ax = DCal3DCrLTot(e,1); + bx = DCal3DCrLTot(e,2); + cx = DCal3DCrLTot(e,3); + ay = DCal3DCrLTot(e,4); + by = DCal3DCrLTot(e,5); + cy = DCal3DCrLTot(e,6); + az = DCal3DCrLTot(e,7); + bz = DCal3DCrLTot(e,8); + cz = DCal3DCrLTot(e,9); + Dati3DCrack(:,ii) = ax*(Crack3D(:,ii).^2)+bx*Crack3D(:,ii)+cx; % conversione X + Dati3DCrack(:,ii+1) = ay*(Crack3D(:,ii+1).^2)+by*Crack3D(:,ii+1)+cy; % conversione Y + Dati3DCrack(:,ii+2) = az*(Crack3D(:,ii+2).^2)+bz*Crack3D(:,ii+2)+cz; % conversione Z + ii = ii+3; + elseif strcmp(Nodo3DCrackLink(e,3),'mV/V') + %% Conversione da mV/V a mm + % Spacchetto i parametri di calibrazione + ax = DCal3DCrLTot(e,1); + bx = DCal3DCrLTot(e,2); + ay = DCal3DCrLTot(e,3); + by = DCal3DCrLTot(e,4); + az = DCal3DCrLTot(e,5); + bz = DCal3DCrLTot(e,6); + Dati3DCrack(:,ii) = ax*Crack3D(:,ii)+bx; % conversione x + Dati3DCrack(:,ii+1) = ay*Crack3D(:,ii+1)+by; % conversione y + Dati3DCrack(:,ii+2) = az*Crack3D(:,ii+2)+bz; % conversione z + ii = ii+3; + elseif strcmp(Nodo3DCrackLink(e,3),'Hz') + %% Conversione da mA a mm + % Spacchetto i parametri di calibrazione + ax = DCal3DCrLTot(e,1); + bx = DCal3DCrLTot(e,2); + cx = DCal3DCrLTot(e,3); + ay = DCal3DCrLTot(e,4); + by = DCal3DCrLTot(e,5); + cy = DCal3DCrLTot(e,6); + az = DCal3DCrLTot(e,7); + bz = DCal3DCrLTot(e,8); + cz = DCal3DCrLTot(e,9); + digitX = (Crack3D(:,ii).^2)/1000; + digitY = (Crack3D(:,ii+1).^2)/1000; + digitZ = (Crack3D(:,ii+2).^2)/1000; + if cx == 0 && cy == 0 && cz == 0 % Sensori Geosense + NomeFile = ['' IDcentralina '-' DTcatena '-Rif3DCrL.csv']; + if NuovoZero3DCrL == 0 % Prima elaborazione + scrivo = 1; + cx = -ax*digitX(1).^2-bx*digitX(1); + cx_rif(e,1) = cx; + cy = -ay*digitY(1).^2-by*digitY(1); + cy_rif(e,1) = cy; + cz = -az*digitZ(1).^2-bz*digitZ(1); + cz_rif(e,1) = cz; + RIF(e,1:3) = [cx_rif(e,1) cy_rif(e,1) cz_rif(e,1)]; + else + RIF = csvread(NomeFile); + cx = RIF(e,1); + cy = RIF(e,2); + cz = RIF(e,3); + end + end + Dati3DCrack(:,ii) = ax*(digitX.^2)+bx*digitX+cx; % conversione + Dati3DCrack(:,ii+1) = ay*(digitY.^2)+by*digitY+cy; % conversione + Dati3DCrack(:,ii+2) = az*(digitZ.^2)+bz*digitZ+cz; % conversione + ii = ii+3; + end + A = 1.4051*10^(-3); + B = 2.369*10^(-4); + C = 1.019*10^(-7); + if CrL3D_NTC(e,1)==1 % è presente il termometro + R = NTCCrack3D(:,e); + [rN,~] = size(R); + for n = 1:rN + if R(n) <= 0 + if n > 1 + R(n) = R(n-1); + else + R(n) = 5000; + end + if Err3DCrackLink(n,ii) == 0 + Err3DCrackLink(n,ii) = 0.5; + end + end + end + L = reallog(R); + DatiNTCCrack3D(:,e) = (1./(A + B*L + C*(L.^3))) -273.2; % conversione in gradi centigradi + end +end +if scrivo == 1 + csvwrite(NomeFile,RIF); +end + +text = 'Calibrations of 3D Crack Link defined correctly. conv_grezzi3DCrL function closed'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/conv_grezzi3DEL.m b/ATD/conv_grezzi3DEL.m new file mode 100755 index 0000000..54bbcbe --- /dev/null +++ b/ATD/conv_grezzi3DEL.m @@ -0,0 +1,114 @@ +% Funzione che converte i dati in Hz in dati di allungamento adimensionale +% mediante i valori di calibrazione. +% Il risultato è la matrico DatiExtensometer + +function [DatiExtensometer3D,DatiExtensometer3D_Rif,DatiNTCExtensometer3D,... + Err3DExtensometerLink] = conv_grezzi3DEL(Extensometer3D,NTCExtensometer3D,... + Extensometer3D_Rif,DCalEL3DTot,Nodo3DExtensometerLink,Err3DExtensometerLink,... + r3DEL,EL3D_NTC,FileName) + +text = 'conv_grezzi3DEL function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +[rA,cA] = size(Extensometer3D); +DatiExtensometer3D = zeros(rA,cA); +DatiExtensometer3D_Rif = zeros(1,cA); +DatiNTCExtensometer3D = zeros(rA,cA/3); +s = 1; +ii = 1; +for e=1:r3DEL % numero di Extensometer Link + if strcmp(Nodo3DExtensometerLink(e,3),'Hz') + % Spacchetto i parametri di calibrazione + GFx = DCalEL3DTot(e,1); + BFx = DCalEL3DTot(e,2); + GFy = DCalEL3DTot(e,3); + BFy = DCalEL3DTot(e,4); + GFz = DCalEL3DTot(e,5); + BFz = DCalEL3DTot(e,6); + % Lettura di riferimento + digit_Rif_x = (Extensometer3D_Rif(1,ii).^2)*0.001; % Freq. ^2 *E-3 + DatiExtensometer3D_Rif(1,ii) = GFx*BFx*digit_Rif_x; % conversione in microEpsilon + digit_Rif_y = (Extensometer3D_Rif(1,ii+1).^2)*0.001; % Freq. ^2 *E-3 + DatiExtensometer3D_Rif(1,ii+1) = GFy*BFy*digit_Rif_y; % conversione in microEpsilon + digit_Rif_z = (Extensometer3D_Rif(1,ii+2).^2)*0.001; % Freq. ^2 *E-3 + DatiExtensometer3D_Rif(1,ii+2) = GFz*BFz*digit_Rif_z; % conversione in microEpsilon + % Dati successivi + digit_x = (Extensometer3D(:,ii).^2)*0.001; % Freq. ^2 *E-3 + DatiExtensometer3D(:,ii) = GFx*BFx*digit_x(:,1); % conversione in microEpsilon + digit_y = (Extensometer3D(:,ii+1).^2)*0.001; % Freq. ^2 *E-3 + DatiExtensometer3D(:,ii+1) = GFy*BFy*digit_y(:,1); % conversione in microEpsilon + digit_z = (Extensometer3D(:,ii+2).^2)*0.001; % Freq. ^2 *E-3 + DatiExtensometer3D(:,ii+2) = GFz*BFz*digit_z(:,1); % conversione in microEpsilon + elseif strcmp(Nodo3DExtensometerLink(e,3),'4-20 mA') + % Spacchetto i parametri di calibrazione + ax = DCalEL3DTot(e,1); + bx = DCalEL3DTot(e,2); + cx = DCalEL3DTot(e,3); + ay = DCalEL3DTot(e,4); + by = DCalEL3DTot(e,5); + cy = DCalEL3DTot(e,6); + az = DCalEL3DTot(e,7); + bz = DCalEL3DTot(e,8); + cz = DCalEL3DTot(e,9); + % Lettura di Riferimento + Rif_X = (str2double(cell2mat(Extensometer3D_Rif(1,ii)))); + DatiExtensometer3D_Rif(1,ii) = ax*Rif_X.^2 + bx*Rif_X+cx; % conversione in microEpsilon + Rif_Y = (str2double(cell2mat(Extensometer3D_Rif(1,ii+1)))); + DatiExtensometer3D_Rif(1,ii+1) = ay*Rif_Y.^2 + by*Rif_Y+cy; % conversione in microEpsilon + Rif_Z = (str2double(cell2mat(Extensometer3D_Rif(1,ii+2)))); + DatiExtensometer3D_Rif(1,ii+2) = az*Rif_Z.^2 + bz*Rif_Z+cz; % conversione in microEpsilon + % Dati successivi + DatiExtensometer3D(1,ii) = ax*Extensometer3D(1,ii).^2 + bx*Extensometer3D(1,ii) +cx; % conversione in microEpsilon + DatiExtensometer3D(1,ii+1) = ay*Extensometer3D(1,ii+1).^2 + by*Extensometer3D(1,ii+1) +cy; % conversione in microEpsilon + DatiExtensometer3D(1,ii+2) = az*Extensometer3D(1,ii+2).^2 + bz*Extensometer3D(1,ii+2) +cz; % conversione in microEpsilon + elseif strcmp(Nodo3DExtensometerLink(e,3),'mV/V') + gainx = DCalEL3DTot(:,1); + intx = DCalEL3DTot(:,2); + gainy = DCalEL3DTot(:,3); + inty = DCalEL3DTot(:,4); + gainz = DCalEL3DTot(:,5); + intz = DCalEL3DTot(:,6); + % Lettura di Riferimento + Rif_X = (str2double(cell2mat(Extensometer3D_Rif(1,ii)))); + DatiExtensometer3D_Rif(1,ii) = gainx*Rif_X + intx; % conversione in microEpsilon + Rif_Y = (str2double(cell2mat(Extensometer3D_Rif(1,ii+1)))); + DatiExtensometer3D_Rif(1,ii+1) = gainy*Rif_Y + inty; % conversione in microEpsilon + Rif_Z = (str2double(cell2mat(Extensometer3D_Rif(1,ii+2)))); + DatiExtensometer3D_Rif(1,ii) = gainz*Rif_Z + intz; % conversione in microEpsilon + % Dati successivi + DatiExtensometer3D(:,ii) = gainx*Extensometer3D(:,ii) + intx; % conversione in microEpsilon + DatiExtensometer3D(:,ii+1) = gainy*Extensometer3D(:,ii+1) + inty; % conversione in microEpsilon + DatiExtensometer3D(:,ii+2) = gainz*Extensometer3D(:,ii+2) + intz; % conversione in microEpsilon + end + ii = ii+3; + A = 1.4051*10^(-3); + B = 2.369*10^(-4); + C = 1.019*10^(-7); + if EL3D_NTC(s,1)==1 % è presente il termometro + R = NTCExtensometer3D(:,s); + [rN,~] = size(R); + for n = 1:rN + if R(n) <= 0 + if n > 1 + R(n) = R(n-1); + else + R(n) = 5000; + end + if Err3DExtensometerLink(n,ii) == 0 + Err3DExtensometerLink(n,ii) = 0.5; + end + end + end + L = reallog(R); + DatiNTCExtensometer3D(:,s) = (1./(A + B*L + C*(L.^3))) -273.2; % conversione in gradi centigradi + end + s = s+1; +end + +text = 'Calibrations convertion of 3D Extensometer Link defined correctly. conv_grezzi3DEL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/conv_grezziAL.m b/ATD/conv_grezziAL.m new file mode 100755 index 0000000..cd3d248 --- /dev/null +++ b/ATD/conv_grezziAL.m @@ -0,0 +1,42 @@ +% Funzione che converte i dati in mV/V della cella di carico in dati di +% forza mediante i valori di calibrazione. +% Il risultato è la matrico DatiLoad + +function DatiAnalog = conv_grezziAL(ADCAnalog,DCalALTot,NodoAnalogLink,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'conv_grezziAL function started'; +fprintf(fileID,fmt,text); + +numAL = size(NodoAnalogLink); % numero di Analog Link +[rA,cA] = size(ADCAnalog); +DatiAnalog = zeros(rA,cA); + +for jj=1:numAL + if strcmp(NodoAnalogLink(jj,3),'4-20 mA') + %% Conversione da 4-20 mA parabolica + % Spacchetto i parametri di calibrazione + a = DCalALTot(:,1); + b = DCalALTot(:,2); + c = DCalALTot(:,3); + DatiAnalog(:,jj) = a(jj,1)*(ADCAnalog(:,jj).^2)+b(jj,1)*ADCAnalog(:,jj)+c(jj,1); % conversione + elseif strcmp(NodoAnalogLink(jj,3),'mV/V') + %% Conversione da mV/V lineare + % Spacchetto i parametri di calibrazione + a = DCalALTot(:,1); + DatiAnalog(:,jj) = a(jj,1)*ADCAnalog(:,jj); % conversione + elseif strcmp(NodoAnalogLink(jj,3),'Hertz') + %% Conversione da Hertz lineare + % Spacchetto i parametri di calibrazione + GF = DCalALTot(:,1); + BF = DCalALTot(:,2); + digit = (ADCAnalog(:,jj).^2)*0.001; % Freq. ^2 *E-3 + DatiAnalog(:,jj) = GF(jj,1)*BF(jj,1)*digit(:,1); % conversione in microEpsilon + end +end + +text29 = 'Calibrations of Analog Link defined correctly. conv_grezziAL function closed'; +fprintf(fileID,fmt,text29); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/conv_grezziCrL.m b/ATD/conv_grezziCrL.m new file mode 100755 index 0000000..decd5eb --- /dev/null +++ b/ATD/conv_grezziCrL.m @@ -0,0 +1,101 @@ +% Funzione che converte i dati della cella di carico in dati di +% forza mediante i valori di calibrazione. +% Il risultato è la matrico DatiLoad + +function [DatiCrack,DatiNTCCrack,ErrCrackLink] = conv_grezziCrL(Crack,NTCCrack,DCalCrLTot,... + NodoCrackLink,ErrCrackLink,CrL_NTC,rCrL,NuovoZeroCrL,IDcentralina,DTcatena,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'conv_grezziCrL function started'; +fprintf(fileID,fmt,text); + +[rA,cA] = size(Crack); +DatiCrack = zeros(rA,cA); +DatiNTCCrack = zeros(rA,cA); +scrivo = 0; +RIF = zeros(rCrL,1); +for e = 1:rCrL + if strcmp(NodoCrackLink(e,3),'4-20 mA') + %% Conversione da mA a mm + % Spacchetto i parametri di calibrazione + a = DCalCrLTot(e,1); + b = DCalCrLTot(e,2); + c = DCalCrLTot(e,3); + DatiCrack(:,e) = a*(Crack(:,e).^2)+b*Crack(:,e)+c; % conversione + elseif strcmp(NodoCrackLink(e,3),'mV/V') + %% Conversione da mV/V a mm + % Spacchetto i parametri di calibrazione + a = DCalCrLTot(e,1); + b = DCalCrLTot(e,2); + DatiCrack(:,e) = a*Crack(:,e)+b; % conversione + elseif strcmp(NodoCrackLink(e,3),'Hz') + %% Conversione da Hz a digit a mm + % Spacchetto i parametri di calibrazione + a = DCalCrLTot(e,1); + b = DCalCrLTot(e,2); + c = DCalCrLTot(e,3); + digit = (Crack(:,e).^2)*0.001; % Freq. ^2 *E-3 + if c == 0 % Sensori Geosense + NomeFile = ['' IDcentralina '-' DTcatena '-RifCrL_Geo.csv']; + if NuovoZeroCrL == 0 % Prima elaborazione + scrivo = 1; + c = -a*digit(1).^2-b*digit(1); + RIF(e,1) = c; + else + RIF = csvread(NomeFile); + c = RIF(e,1); + end + end + DatiCrack(:,e) = a*digit.^2+b*digit+c; % conversione in mm + elseif strcmp(NodoCrackLink(e,3),'Hz mm') + %% Conversione da Hz a mm + % Spacchetto i parametri di calibrazione + a = DCalCrLTot(e,1); + b = DCalCrLTot(e,2); + c = DCalCrLTot(e,3); + DatiCrack(:,e) = a*(Crack(:,e).^2)+b*Crack(:,e)+c; % conversione + end + A = 1.4051*10^(-3); + B = 2.369*10^(-4); + C = 1.019*10^(-7); + if CrL_NTC(e,1)==1 % è presente il termometro + R = NTCCrack(:,e); + [rN,~] = size(R); + for n = 1:rN + if R(n) <= 0 + if n > 1 + R(n) = R(n-1); + else + R(n) = 5000; + end + if ErrCrackLink(n,e) == 0 + ErrCrackLink(n,e) = 0.5; + end + end + end + L = reallog(R); + DatiNTCCrack(:,e) = (1./(A + B*L + C*(L.^3))) -273.2; % conversione in gradi centigradi + [rT,~] = size(DatiNTCCrack); + for T = 1:rT + if DatiNTCCrack(T,e) > 70 || DatiNTCCrack(T,e) < -20 + if T == 1 + DatiNTCCrack(T,e) = DatiNTCCrack(T+1,e); + else + DatiNTCCrack(T,e) = DatiNTCCrack(T-1,e); + end + if ErrCrackLink(T,e) == 0 + ErrCrackLink(T,e) = 0.5; + end + end + end + end +end +if scrivo == 1 + csvwrite(NomeFile,RIF); +end + +text = 'Calibrations of Crack Link defined correctly. conv_grezziCrL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/conv_grezziEL.m b/ATD/conv_grezziEL.m new file mode 100755 index 0000000..b745472 --- /dev/null +++ b/ATD/conv_grezziEL.m @@ -0,0 +1,87 @@ +% Funzione che converte i dati in Hz in dati di allungamento adimensionale +% mediante i valori di calibrazione. +% Il risultato è la matrico DatiExtensometer + +function [DatiExtensometer,DatiExtensometer_Rif,DatiNTCExtensometer,ErrExtensometerLink,Carico_Sensore]... + = conv_grezziEL(Extensometer,NTCExtensometer,DatiExtensometerLink_Rif,DCalELTot,EL_NTC,... + NodoExtensometerLink,ErrExtensometerLink,Calcolo_Carico,FileName) + +text = 'conv_grezziEL function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +%% Conversione +[rA,cA] = size(Extensometer); +DatiExtensometer = zeros(rA,cA); +DatiExtensometer_Rif = zeros(1,cA); +DatiNTCExtensometer = zeros(rA,cA); +for ii=1:cA % numero di Extensometer Link + if strcmp(NodoExtensometerLink(ii,3),'Hz') + % Spacchetto i parametri di calibrazione + GF = DCalELTot(ii,1); + BF = DCalELTot(ii,2); + A = 1.4051*10^(-3); + B = 2.369*10^(-4); + C = 1.019*10^(-7); + % Lettura di Riferimento + digit_Rif = (str2double(cell2mat(DatiExtensometerLink_Rif(1,ii))).^2)*0.001; % Freq. ^2 *E-3 + DatiExtensometer_Rif(1,ii) = GF*BF*digit_Rif; % conversione in microEpsilon + % Dati successivi + digit = (Extensometer(:,ii).^2)*0.001; % Freq. ^2 *E-3 + DatiExtensometer(:,ii) = GF*BF*digit(:,1); % conversione in microEpsilon + elseif strcmp(NodoExtensometerLink(ii,3),'4-20 mA') + % Spacchetto i parametri di calibrazione + a = DCalELTot(ii,1); + b = DCalELTot(ii,2); + c = DCalELTot(ii,3); + A = 1.4051*10^(-3); + B = 2.369*10^(-4); + C = 1.019*10^(-7); + % Lettura di Riferimento + Rif = (str2double(cell2mat(DatiExtensometerLink_Rif(1,ii)))); + DatiExtensometer_Rif(1,ii) = a*Rif(1,ii).^2 + b*Rif(1,ii) +c; % conversione in microEpsilon + % Dati successivi + DatiExtensometer(:,ii) = a*Extensometer(:,ii).^2 + b*Extensometer(:,ii) +c; % conversione in microEpsilon + elseif strcmp(NodoExtensometerLink(ii,3),'mV/V') + A = 1.4051*10^(-3); + B = 2.369*10^(-4); + C = 1.019*10^(-7); + gain = DCalELTot(:,1); + int = DCalELTot(:,2); + % Lettura di Riferimento + Rif = (str2double(cell2mat(DatiExtensometerLink_Rif(1,ii)))); + DatiExtensometer_Rif(1,ii) = gain*Rif(1,ii) + int; % conversione in microEpsilon + % Dati successivi + DatiExtensometer(:,ii) = gain*Extensometer(:,ii) + int; % conversione in microEpsilon + end + if EL_NTC(ii,1)==1 % è presente il termometro + R = NTCExtensometer(:,ii); + [rN,~] = size(R); + for n = 1:rN + if R(n) <= 0 + if n > 1 + R(n) = R(n-1); + else + R(n) = 5000; + end + if ErrExtensometerLink(n,ii) == 0 + ErrExtensometerLink(n,ii) = 0.5; + end + end + end + L = reallog(R); + DatiNTCExtensometer(:,ii) = (1./(A + B*L + C*(L.^3))) -273.2; % conversione in gradi centigradi + end +end +if Calcolo_Carico == 1 + Carico_Sensore = DCalELTot(:,end); +else + Carico_Sensore = []; +end + +text = 'Calibration convertion of Extensometer Link defined correctly. conv_grezziEL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/conv_grezziLL.m b/ATD/conv_grezziLL.m new file mode 100755 index 0000000..d3a76a6 --- /dev/null +++ b/ATD/conv_grezziLL.m @@ -0,0 +1,34 @@ +% Funzione che converte i dati in mV/V della cella di carico in dati di +% forza mediante i valori di calibrazione. +% Il risultato è la matrico DatiLoad + +function DatiLoad = conv_grezziLL(Load,DCalLLTot,NodoLoadLink,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'conv_grezziLL function started'; +fprintf(fileID,fmt,text); + +[rA,cA] = size(Load); +DatiLoad = zeros(rA,cA); +for ii=1:cA % numero di Pressure Link + if strcmp(NodoLoadLink(ii,3),'4-20 mA') + %% Conversione da mA a kN + % Spacchetto i parametri di calibrazione + a = DCalLLTot(ii,1); + b = DCalLLTot(ii,2); + c = DCalLLTot(ii,3); + DatiLoad(:,ii) = a*(Load(:,ii).^2)+b*Load(:,ii)+c; % conversione + elseif strcmp(NodoLoadLink(ii,3),'mV/V') + %% Conversione da mV/V a kN + % Spacchetto i parametri di calibrazione + a = DCalLLTot(ii,1); + b = DCalLLTot(ii,2); + DatiLoad(:,ii) = a*Load(:,ii)+b; % conversione + end +end + +text = 'Raw Data of Load Link converted into physycal units correctly. conv_grezziLL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/conv_grezziMPBEL.m b/ATD/conv_grezziMPBEL.m new file mode 100755 index 0000000..4518fa1 --- /dev/null +++ b/ATD/conv_grezziMPBEL.m @@ -0,0 +1,69 @@ +% Funzione che converte i dati in mV/V della cella di carico in dati di +% forza mediante i valori di calibrazione. +% Il risultato è la matrico DatiLoad + +function DatiMultiBase = conv_grezziMPBEL(DatiMPBEL,NumBasi,DCalMPBELTot,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'conv_grezziMPBEL function started'; +fprintf(fileID,fmt,text); + +[rA,cA] = size(DatiMPBEL); +DatiMultiBase = zeros(rA,cA); + +%% Conversione da mV/V a mm +% Spacchetto i parametri di calibrazione +gain = DCalMPBELTot; + +% contatori +ii = 1; +num = 1; + +while ii <= cA + if NumBasi == 1 + DatiMultiBase(:,ii) = (1/gain(num,1))*DatiMPBEL(:,ii); % conversione + ii = ii+1; + num = num+1; + elseif NumBasi == 2 + DatiMultiBase(:,ii) = 1/(gain(num,1))*DatiMPBEL(:,ii); % conversione + DatiMultiBase(:,ii+1) = 1/(gain(num,2))*DatiMPBEL(:,ii+1); % conversione + ii = ii+2; + num = num+1; + elseif NumBasi == 3 + DatiMultiBase(:,ii) = 1/(gain(num,1))*DatiMPBEL(:,ii); % conversione + DatiMultiBase(:,ii+1) = 1/(gain(num,2))*DatiMPBEL(:,ii+1); % conversione + DatiMultiBase(:,ii+2) = 1/(gain(num,3))*DatiMPBEL(:,ii+2); % conversione + ii = ii+3; + num = num+1; + elseif NumBasi == 4 + DatiMultiBase(:,ii) = 1/(gain(num,1))*DatiMPBEL(:,ii); % conversione + DatiMultiBase(:,ii+1) = 1/(gain(num,2))*DatiMPBEL(:,ii+1); % conversione + DatiMultiBase(:,ii+2) = 1/(gain(num,3))*DatiMPBEL(:,ii+2); % conversione + DatiMultiBase(:,ii+3) = 1/(gain(num,4))*DatiMPBEL(:,ii+3); % conversione + ii = ii+4; + num = num+1; + elseif NumBasi == 5 + DatiMultiBase(:,ii) = 1/(gain(num,1))*DatiMPBEL(:,ii); % conversione + DatiMultiBase(:,ii+1) = 1/(gain(num,2))*DatiMPBEL(:,ii+1); % conversione + DatiMultiBase(:,ii+2) = 1/(gain(num,3))*DatiMPBEL(:,ii+2); % conversione + DatiMultiBase(:,ii+3) = 1/(gain(num,4))*DatiMPBEL(:,ii+3); % conversione + DatiMultiBase(:,ii+4) = 1/(gain(num,5))*DatiMPBEL(:,ii+4); % conversione + ii = ii+5; + num = num+1; + elseif NumBasi == 6 + DatiMultiBase(:,ii) = 1/(gain(num,1))*DatiMPBEL(:,ii); % conversione + DatiMultiBase(:,ii+1) = 1/(gain(num,2))*DatiMPBEL(:,ii+1); % conversione + DatiMultiBase(:,ii+2) = 1/(gain(num,3))*DatiMPBEL(:,ii+2); % conversione + DatiMultiBase(:,ii+3) = 1/(gain(num,4))*DatiMPBEL(:,ii+3); % conversione + DatiMultiBase(:,ii+4) = 1/(gain(num,5))*DatiMPBEL(:,ii+4); % conversione + DatiMultiBase(:,ii+5) = 1/(gain(num,6))*DatiMPBEL(:,ii+5); % conversione + ii = ii+6; + num = num+1; + end +end + +text = 'Calibrations of MultiPoint Borehole Rod Extensometer defined correctly. conv_grezziMPBEL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/conv_grezziPCL.m b/ATD/conv_grezziPCL.m new file mode 100755 index 0000000..b357081 --- /dev/null +++ b/ATD/conv_grezziPCL.m @@ -0,0 +1,80 @@ +% Funzione che converte i dati grezzi in dati di accelerazione usando i +% valori delle calibrazioni per i PreConv Link +% accPCL raccoglie le accelerazioni +% magPCL raccoglie i dati di campo magnetico +% ris_acc_PCL raccoglie le risultanti delle accelerazioni +% ris_mag_PCL raccoglie le risultanti dei campi magnetici +% T_PCL raccoglie i dati di temperatura + +function [accPCL,ris_acc_PCL,T_PCL] = conv_grezziPCL(rPCL,accPCL,tempPCL,DCalPCLTot,MEMS,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'conv_grezziPCL function started'; +fprintf(fileID,fmt,text); + +if MEMS == 2 + % Spacchetto + caX_PCL = DCalPCLTot(:,1); + caY_PCL = DCalPCLTot(:,4); + caZ_PCL = DCalPCLTot(:,7); + pIntX_PCL = DCalPCLTot(:,2); + pIntY_PCL = DCalPCLTot(:,5); + pIntZ_PCL = DCalPCLTot(:,8); + iIntX_PCL = DCalPCLTot(:,3); + iIntY_PCL = DCalPCLTot(:,6); + iIntZ_PCL = DCalPCLTot(:,9); + caT_PCL = DCalPCLTot(:,10); + intT_PCL = DCalPCLTot(:,11); + + %% Accelerometri + cont = 1; + cn = 1; + % Contatore dei nodi, corregge le accelerazioni con le calibrazioni + for ii=1:3*rPCL + if cont==1 + accPCL(:,ii) = accPCL(:,ii)*caX_PCL(cn)+(tempPCL(:,cn)*pIntX_PCL(cn)+iIntX_PCL(cn)); + cont = cont+1; + elseif cont==2 + accPCL(:,ii) = accPCL(:,ii)*caY_PCL(cn)+(tempPCL(:,cn)*pIntY_PCL(cn)+iIntY_PCL(cn)); + cont = cont+1; + else + accPCL(:,ii) = accPCL(:,ii)*caZ_PCL(cn)+(tempPCL(:,cn)*pIntZ_PCL(cn)+iIntZ_PCL(cn)); + cont = 1; + cn = cn+1; + end + end + + %% Conversione delle temperature + [rT,~] = size(tempPCL); + T_PCL = zeros(rT,1); + for t = 1:rPCL + T_PCL(:,t) = tempPCL(:,t)*caT_PCL(t,1) + intT_PCL(t,1); + end +end + +%% Calcolo della risultante +[rAcc,cAcc] = size(accPCL); +ris_acc_PCL = zeros(rAcc,cAcc/3); % matrice risultante accelerazioni + +clear i +clear ii +clear cont +clear cn + +cont = 1; % contatore +cn = 0; + +%% Calcolo della risultante +for ii = 1:(cAcc/3) % colonne + for i = 1:rAcc % righe + ris_acc_PCL(i,cont) = (accPCL(i,cn*3+1)^2+accPCL(i,cn*3+2)^2+accPCL(i,cn*3+3)^2)^0.5; + end + cn = cn+1; + cont = cont+1; +end + +text = 'Raw Data of PreConv Link converted into physycal units correctly. conv_grezziPCL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end diff --git a/ATD/conv_grezziPCLHR.m b/ATD/conv_grezziPCLHR.m new file mode 100755 index 0000000..4ada6bf --- /dev/null +++ b/ATD/conv_grezziPCLHR.m @@ -0,0 +1,33 @@ +function [angPCLHR,tempPCLHR] = conv_grezziPCLHR(angPCLHR,tempPCLHR,DCalPCLHRTot,... + rPCLHR,FileName) + +text = 'conv_grezziPCLHR function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +caPCLHR = [DCalPCLHRTot(:,1) DCalPCLHRTot(:,2)]; +caT_HRH = DCalPCLHRTot(:,3); +intT_HRH = DCalPCLHRTot(:,4); + +i = 1; +m = 1; +% Contatore dei nodi, converte i punti ADC con le calibrazioni in valori +% angolari +while i <= 2*rPCLHR % nodo + angPCLHR(:,i) = angPCLHR(:,i)*caPCLHR(m,1); + angPCLHR(:,i+1) = angPCLHR(:,i+1)*caPCLHR(m,2); + i = i+2; + m = m+1; +end + +%% Conversione delle temperature +for t = 1:rPCLHR + tempPCLHR(:,t) = tempPCLHR(:,t)*caT_HRH(t,1) + intT_HRH(t,1); +end + +text = 'Raw Data of PreConv Link HR converted into physical units correctly. conv_grezziPCLHR function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/conv_grezziPL.m b/ATD/conv_grezziPL.m new file mode 100755 index 0000000..cb07998 --- /dev/null +++ b/ATD/conv_grezziPL.m @@ -0,0 +1,34 @@ +% Funzione che converte i dati in mA della cella di pressione in dati di +% forza mediante i valori di calibrazione. +% Il risultato è la matrico DatiPressure + +function DatiPressure = conv_grezziPL(Pressure,DCalPLTot,NodoPressureLink,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'conv_grezziPL function started'; +fprintf(fileID,fmt,text); + +[rA,cA] = size(Pressure); +DatiPressure = zeros(rA,cA); +for ii = 1:cA + if strcmp(NodoPressureLink(ii,3),'4-20 mA') + %% Conversione da mA a kPa + % Spacchetto i parametri di calibrazione + a = DCalPLTot(ii,1); + b = DCalPLTot(ii,2); + c = DCalPLTot(ii,3); + DatiPressure(:,ii) = a*(Pressure(:,ii).^2)+b*Pressure(:,ii)+c; % conversione + elseif strcmp(NodoPressureLink(ii,3),'mV/V') + %% Conversione da mV/V a kPa + % Spacchetto i parametri di calibrazione + a = DCalPLTot(ii,1); + DatiPressure(:,ii) = a*Pressure(:,ii); % conversione + end +end + +text = 'Raw Data of Pressure Link converted into physycal units correctly. conv_grezziPL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/conv_grezziRL.m b/ATD/conv_grezziRL.m new file mode 100755 index 0000000..d8a2983 --- /dev/null +++ b/ATD/conv_grezziRL.m @@ -0,0 +1,79 @@ +% Funzione che converte i dati grezzi in dati di accelerazione usando i +% valori delle calibrazioni per i Tilt Link +% accTL raccoglie le accelerazioni +% magTL raccoglie i dati di campo magnetico + +function [accRL,ris_acc_RL,T_RL] = conv_grezziRL(rRL,accRL,tempRL,DCalRLTot,MEMS,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'conv_grezziRL function started'; +fprintf(fileID,fmt,text); + +if MEMS == 2 + % Spacchetto + caX_RL = DCalRLTot(:,1); + caY_RL = DCalRLTot(:,4); + caZ_RL = DCalRLTot(:,7); + pIntX_RL = DCalRLTot(:,2); + pIntY_RL = DCalRLTot(:,5); + pIntZ_RL = DCalRLTot(:,8); + iIntX_RL = DCalRLTot(:,3); + iIntY_RL = DCalRLTot(:,6); + iIntZ_RL = DCalRLTot(:,9); + caT_RL = DCalRLTot(:,10); + intT_RL = DCalRLTot(:,11); + + %% Accelerometri + cont = 1; + cn = 1; + % Contatore dei nodi, corregge le accelerazioni con le calibrazioni + for ii=1:3*rRL + if cont==1 + accRL(:,ii) = accRL(:,ii)*caX_RL(cn)+(tempRL(:,cn)*pIntX_RL(cn)+iIntX_RL(cn)); + cont = cont+1; + elseif cont==2 + accRL(:,ii) = accRL(:,ii)*caY_RL(cn)+(tempRL(:,cn)*pIntY_RL(cn)+iIntY_RL(cn)); + cont = cont+1; + else + accRL(:,ii) = accRL(:,ii)*caZ_RL(cn)+(tempRL(:,cn)*pIntZ_RL(cn)+iIntZ_RL(cn)); + cont = 1; + cn = cn+1; + end + end + + %% Conversione delle temperature + [rT,~] = size(tempRL); + T_RL = zeros(rT,1); + + for t = 1:rRL + T_RL(:,t) = tempRL(:,t)*caT_RL(t,1) + intT_RL(t,1); + end +end + +%% Risultanti +[rAcc,cAcc] = size(accRL); +ris_acc_RL = zeros(rAcc,cAcc/3); % matrice risultante accelerazioni + +clear i +clear ii +clear cont +clear cn + +cont = 1; % contatore +cn = 0; + +%% Calcolo della risultante +for ii = 1:(cAcc/3) % colonne + for i = 1:rAcc % righe + ris_acc_RL(i,cont) = (accRL(i,cn*3+1)^2+accRL(i,cn*3+2)^2+accRL(i,cn*3+3)^2)^0.5; + end + cn = cn+1; + cont = cont+1; +end + +text = 'Raw Data of Radial Link converted into physycal units correctly. conv_grezziRL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/ATD/conv_grezziRL_Dati.m b/ATD/conv_grezziRL_Dati.m new file mode 100755 index 0000000..c1d5cfa --- /dev/null +++ b/ATD/conv_grezziRL_Dati.m @@ -0,0 +1,91 @@ +% Funzione che converte i dati grezzi in dati di accelerazione usando i +% valori delle calibrazioni per i Tilt Link +% accTL raccoglie le accelerazioni +% magTL raccoglie i dati di campo magnetico + +function [accRL,magRL,ris_acc_RL,ris_mag_RL,T_RL] = conv_grezziRL_Dati(... + rRL,accRL,magRL,tempRL,DCalRLTot,FileName) + +% Spacchetto +caX_RL = DCalRLTot(:,1); +caY_RL = DCalRLTot(:,4); +caZ_RL = DCalRLTot(:,7); +pIntX_RL = DCalRLTot(:,2); +pIntY_RL = DCalRLTot(:,5); +pIntZ_RL = DCalRLTot(:,8); +iIntX_RL = DCalRLTot(:,3); +iIntY_RL = DCalRLTot(:,6); +iIntZ_RL = DCalRLTot(:,9); +caT_RL = DCalRLTot(:,10); +intT_RL = DCalRLTot(:,11); + +%% Magnetometri +for ii=1:3*rRL + magRL(:,ii) = magRL(:,ii)/1000; % 1000 Gauss +end +clear ii + +%% Accelerometri +cont = 1; +cn = 1; +% Contatore dei nodi, corregge le accelerazioni con le calibrazioni +for ii=1:3*rRL + if cont==1 + accRL(:,ii) = accRL(:,ii)*caX_RL(cn)+(tempRL(:,cn)*pIntX_RL(cn)+iIntX_RL(cn)); + cont = cont+1; + elseif cont==2 + accRL(:,ii) = accRL(:,ii)*caY_RL(cn)+(tempRL(:,cn)*pIntY_RL(cn)+iIntY_RL(cn)); + cont = cont+1; + else + accRL(:,ii) = accRL(:,ii)*caZ_RL(cn)+(tempRL(:,cn)*pIntZ_RL(cn)+iIntZ_RL(cn)); + cont = 1; + cn = cn+1; + end +end + + +%% Conversione delle temperature +[rT,~] = size(tempRL); +T_RL = zeros(rT,1); + +for t = 1:rRL + T_RL(:,t) = tempRL(:,t)*caT_RL(t,1) + intT_RL(t,1); +end + +%% Calcolo della risultante +[rAcc,cAcc] = size(accRL); +[rMag,cMag] = size(magRL); + +ris_acc_RL = zeros(rAcc,cAcc/3); % matrice risultante accelerazioni +ris_mag_RL = zeros(rMag,cMag/3); % matrice risultante campi magnetici + +clear i +clear ii +clear cont +clear cn +cont = 1; % contatore +cn = 0; +n = 1; + +for ii = 1:cAcc % colonne + if n == 4 + n = 1; + end + for i = 1:rAcc % righe + ris_acc_RL(i,cont) = (accRL(i,cn*3+1)^2+accRL(i,cn*3+2)^2+accRL(i,cn*3+3)^2)^0.5; + ris_mag_RL(i,cont) = (magRL(i,cn*3+1)^2+magRL(i,cn*3+2)^2+magRL(i,cn*3+3)^2)^0.5; + end + if n == 3 + cn = cn+1; + cont = cont+1; + end + n = n+1; +end + +text = 'Raw Data of Radial Link converted into physycal units correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/ATD/conv_grezziSM.m b/ATD/conv_grezziSM.m new file mode 100755 index 0000000..f68a1ce --- /dev/null +++ b/ATD/conv_grezziSM.m @@ -0,0 +1,64 @@ +function [DatiStress,DatiNTCStress,ErrStressMeter] = conv_grezziSM(Stress,NTCStress,... + DatiStressMeter_Rif,DatiNTCStressMeter_Rif,DCalSMTot,NodoStressMeter,ErrStressMeter,... + SM_NTC,rSM,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'conv_grezziSM function started'; +fprintf(fileID,fmt,text); + +[rA,cA] = size(Stress); +DatiStress = zeros(rA,cA); +DatiNTCStress = zeros(rA,cA); +for e = 1:rSM + if strcmp(NodoStressMeter(e,3),'Hz') + GF = cell2mat(DCalSMTot(e,1)); + % Spacchetto i parametri di calibrazione + digit = (Stress(:,e).^2)*0.001; % Freq. ^2 *E-3 + digit_Rif = (DatiStressMeter_Rif(1,e).^2)*0.001; % Freq. ^2 *E-3 + if SM_NTC(e,1)==0 % non è presente il termometro + DatiStress(:,e) = (digit(:,e)-digit_Rif(1,e))*GF; % conversione in Mpa + elseif SM_NTC(e,1)==1 % è presente il termometro - correzione termica + A = 1.4051*10^(-3); + B = 2.369*10^(-4); + C = 1.019*10^(-7); + R = NTCStress(:,e); + [rN,~] = size(R); + for n = 1:rN + if R(n) <= 0 + if n > 1 + R(n) = R(n-1); + else + R(n) = 5000; + end + if ErrStressMeter(n,ii) == 0 + ErrStressMeter(n,ii) = 0.5; + end + end + end + L = reallog(R); + DatiNTCStress(:,e) = (1./(A + B*L + C*(L.^3))) -273.2; % conversione in gradi centigradi + L_Rif = reallog(DatiNTCStressMeter_Rif(1,e)); + DatiNTCStressMeter_Rif(1,e) = (1./(A + B*L_Rif + C*(L_Rif.^3))) -273.2; % conversione in gradi centigradi + [rT,~] = size(DatiNTCStress); + for T = 1:rT + if DatiNTCStress(T,e) > 70 || DatiNTCStress(T,e) < -20 + if T == 1 + DatiNTCStress(T,e) = DatiNTCStress(T+1,e); + else + DatiNTCStress(T,e) = DatiNTCStress(T-1,e); + end + if ErrStressMeter(T,e) == 0 + ErrStressMeter(T,e) = 0.5; + end + end + end + DatiStress(:,e) = (digit-digit_Rif)*GF+(DatiNTCStress(:,e)-DatiNTCStressMeter_Rif(1,e))*2*GF; % conversione in mm + end + end +end + +text = 'Calibrations of Stress Meter defined correctly. conv_grezziSM function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/conv_grezziTLH.m b/ATD/conv_grezziTLH.m new file mode 100755 index 0000000..8d13ef7 --- /dev/null +++ b/ATD/conv_grezziTLH.m @@ -0,0 +1,80 @@ +% Funzione che converte i dati grezzi in dati di accelerazione usando i +% valori delle calibrazioni per i Tilt Link H +% accTLH raccoglie le accelerazioni +% magTLH raccoglie i dati di campo magnetico +% ris_acc_H raccoglie le risultanti delle accelerazioni +% ris_mag_H raccoglie le risultanti dei campi magnetici +% T_TLH raccoglie i dati di temperatura + +function [accTLH,ris_acc_TLH,tempTLH,ErrTiltLinkH] = conv_grezziTLH(rTLH,... + accTLH,tempTLH,DCalTLHTot,ErrTiltLinkH,MEMS,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'conv_grezziTLH function started'; +fprintf(fileID,fmt,text); + +if MEMS == 2 + % Spacchetto + caX_TLH = DCalTLHTot(:,1); + caY_TLH = DCalTLHTot(:,4); + caZ_TLH = DCalTLHTot(:,7); + pIntX_TLH = DCalTLHTot(:,2); + pIntY_TLH = DCalTLHTot(:,5); + pIntZ_TLH = DCalTLHTot(:,8); + iIntX_TLH = DCalTLHTot(:,3); + iIntY_TLH = DCalTLHTot(:,6); + iIntZ_TLH = DCalTLHTot(:,9); + caT_TLH = DCalTLHTot(:,10); + intT_TLH = DCalTLHTot(:,11); + + %% Accelerometri + cont = 1; + cn = 1; + % Contatore dei nodi, corregge le accelerazioni con le calibrazioni + for ii=1:3*rTLH + if cont==1 + accTLH(:,ii) = accTLH(:,ii)*caX_TLH(cn)+(tempTLH(:,cn)*pIntX_TLH(cn)+iIntX_TLH(cn)); + cont = cont+1; + elseif cont==2 + accTLH(:,ii) = accTLH(:,ii)*caY_TLH(cn)+(tempTLH(:,cn)*pIntY_TLH(cn)+iIntY_TLH(cn)); + cont = cont+1; + else + accTLH(:,ii) = accTLH(:,ii)*caZ_TLH(cn)+(tempTLH(:,cn)*pIntZ_TLH(cn)+iIntZ_TLH(cn)); + cont = 1; + cn = cn+1; + end + end + + %% Conversione delle temperature + for t = 1:rTLH + tempTLH(:,t) = tempTLH(:,t)*caT_TLH(t,1) + intT_TLH(t,1); + end + + %% Calcolo della risultante + [rAcc,cAcc] = size(accTLH); + ris_acc_TLH = zeros(rAcc,cAcc/3); % matrice risultante accelerazioni + clear i + clear ii + clear cont + clear cn + cont = 1; % contatore + cn = 0; + %% Calcolo della risultante + for ii = 1:(cAcc/3) % colonne + for i = 1:rAcc % righe + ris_acc_TLH(i,cont) = (accTLH(i,cn*3+1)^2+accTLH(i,cn*3+2)^2+accTLH(i,cn*3+3)^2)^0.5; + end + cn = cn+1; + cont = cont+1; + end + +else + ris_acc_TLH = []; +end + +text15 = 'Raw Data of Tilt Link H converted into physycal units correctly. conv_grezziTLH function closed'; +fprintf(fileID,fmt,text15); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/conv_grezziTLHRH.m b/ATD/conv_grezziTLHRH.m new file mode 100755 index 0000000..71761b9 --- /dev/null +++ b/ATD/conv_grezziTLHRH.m @@ -0,0 +1,36 @@ +% Funzione che converte i dati grezzi del Tilt Link HR H in dati di +% angoli (acc_TLHR) + +function [angTLHRH,tempTLHRH] = conv_grezziTLHRH(angTLHRH,tempTLHRH,DCalTLHRHTot,... + rTLHRH,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'conv_grezziTLHRH function started'; +fprintf(fileID,fmt,text); + +caTLHRH = [DCalTLHRHTot(:,1) DCalTLHRHTot(:,2)]; +caT_HRH = DCalTLHRHTot(:,3); +intT_HRH = DCalTLHRHTot(:,4); + +i = 1; +m = 1; +% Contatore dei nodi, converte i punti ADC con le calibrazioni in valori +% angolari +while i <= 2*rTLHRH % nodo + angTLHRH(:,i) = angTLHRH(:,i)*caTLHRH(m,1); + angTLHRH(:,i+1) = angTLHRH(:,i+1)*caTLHRH(m,2); + i = i+2; + m = m+1; +end + +%% Conversione delle temperature +for t = 1:rTLHRH + tempTLHRH(:,t) = tempTLHRH(:,t)*caT_HRH(t,1) + intT_HRH(t,1); +end + +text = 'Raw Data of Tilt Link HR H converted into physical units correctly. conv_grezziTLHRH function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/conv_grezziTuL.m b/ATD/conv_grezziTuL.m new file mode 100755 index 0000000..5ab8580 --- /dev/null +++ b/ATD/conv_grezziTuL.m @@ -0,0 +1,87 @@ +% Funzione che converte i dati grezzi in dati di accelerazione usando i +% valori delle calibrazioni per i Tunnel Link +% accTuL raccoglie le accelerazioni +% magTuL raccoglie i dati di campo magnetico +% ris_acc raccoglie le risultanti delle accelerazioni +% ris_mag raccoglie le risultanti dei campi magnetici +% T_TuL raccoglie i dati di temperatura + +function [accTuL,ris_acc_TuL,T_TuL,ay_TuL,ay_TuL_AC] = conv_grezziTuL(... + rTuL,accTuL,tempTuL,DCalTuLTot,ay_TuL,t_TuL,ay_TuL_AC,t_TuL_AC,... + NuovoZeroTuL,MEMS,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'conv_grezziTuL function started'; +fprintf(fileID,fmt,text); + +if MEMS == 2 + % Spacchetto i parametri di calibrazione + caX_Tu = DCalTuLTot(:,1); + caY_Tu = DCalTuLTot(:,4); + caZ_Tu = DCalTuLTot(:,7); + pIntX_Tu = DCalTuLTot(:,2); + pIntY_Tu = DCalTuLTot(:,5); + pIntZ_Tu = DCalTuLTot(:,8); + iIntX_Tu = DCalTuLTot(:,3); + iIntY_Tu = DCalTuLTot(:,6); + iIntZ_Tu = DCalTuLTot(:,9); + caT_Tu = DCalTuLTot(:,10); + intT_Tu = DCalTuLTot(:,11); + + %% Accelerometri + cont = 1; + cn = 1; + t_TuL = t_TuL'; + t_TuL_AC = t_TuL_AC'; + % Contatore dei nodi, corregge le accelerazioni con le calibrazioni + for ii=1:3*rTuL + if cont==1 + accTuL(:,ii) = accTuL(:,ii)*caX_Tu(cn)+(tempTuL(:,cn)*pIntX_Tu(cn)+iIntX_Tu(cn)); + cont = cont+1; + elseif cont==2 + accTuL(:,ii) = accTuL(:,ii)*caY_Tu(cn)+(tempTuL(:,cn)*pIntY_Tu(cn)+iIntY_Tu(cn)); + if NuovoZeroTuL == 1 + ay_TuL(:,cn) = ay_TuL(:,cn)*caY_Tu(cn)+(t_TuL(:,cn)*pIntY_Tu(cn)+iIntY_Tu(cn)); + ay_TuL_AC(:,cn) = ay_TuL_AC(:,cn)*caY_Tu(cn)+(t_TuL_AC(:,cn)*pIntY_Tu(cn)+iIntY_Tu(cn)); + end + cont = cont+1; + else + accTuL(:,ii) = accTuL(:,ii)*caZ_Tu(cn)+(tempTuL(:,cn)*pIntZ_Tu(cn)+iIntZ_Tu(cn)); + cont = 1; + cn = cn+1; + end + end + + %% Conversione delle temperature + [rT,~] = size(tempTuL); + T_TuL = zeros(rT,1); + + for t = 1:rTuL + T_TuL(:,t) = tempTuL(:,t)*caT_Tu(t,1) + intT_Tu(t,1); + end +end + +%% Calcolo della risultante +[rAcc,cAcc] = size(accTuL); +ris_acc_TuL = zeros(rAcc,cAcc/3); % matrice risultante accelerazioni +clear ii +clear cn + +cont = 1; % contatore +cn = 0; + +%% Calcolo della risultante +for ii = 1:(cAcc/3) % colonne + for i = 1:rAcc % righe + ris_acc_TuL(i,cont) = (accTuL(i,cn*3+1)^2+accTuL(i,cn*3+2)^2+accTuL(i,cn*3+3)^2)^0.5; + end + cn = cn+1; + cont = cont+1; +end + +text = 'Raw Data of Tunnel Link converted into physycal units correctly. conv_grezziTuL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/ATD/conv_grezziTuL_Dati.m b/ATD/conv_grezziTuL_Dati.m new file mode 100755 index 0000000..34260d5 --- /dev/null +++ b/ATD/conv_grezziTuL_Dati.m @@ -0,0 +1,90 @@ +% Funzione che converte i dati grezzi in dati di accelerazione usando i +% valori delle calibrazioni per i Tunnel Link +% accTuL raccoglie le accelerazioni +% magTuL raccoglie i dati di campo magnetico +% ris_acc raccoglie le risultanti delle accelerazioni +% ris_mag raccoglie le risultanti dei campi magnetici +% T_TuL raccoglie i dati di temperatura + +function [accTuL,ris_acc_TuL,magTuL,ris_mag_TuL,T_TuL,ay_TuL,ay_TuL_AC] = conv_grezziTuL_Dati(... + rTuL,accTuL,magTuL,tempTuL,DCalTuLTot,ay_TuL,t_TuL,ay_TuL_AC,t_TuL_AC,... + NuovoZeroTuL,MEMS,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'conv_grezziTuL function started'; +fprintf(fileID,fmt,text); + +if MEMS == 2 + % Spacchetto i parametri di calibrazione + caX_Tu = DCalTuLTot(:,1); + caY_Tu = DCalTuLTot(:,4); + caZ_Tu = DCalTuLTot(:,7); + pIntX_Tu = DCalTuLTot(:,2); + pIntY_Tu = DCalTuLTot(:,5); + pIntZ_Tu = DCalTuLTot(:,8); + iIntX_Tu = DCalTuLTot(:,3); + iIntY_Tu = DCalTuLTot(:,6); + iIntZ_Tu = DCalTuLTot(:,9); + caT_Tu = DCalTuLTot(:,10); + intT_Tu = DCalTuLTot(:,11); + + %% Accelerometri + cont = 1; + cn = 1; + t_TuL = t_TuL'; + t_TuL_AC = t_TuL_AC'; + % Contatore dei nodi, corregge le accelerazioni con le calibrazioni + for ii=1:3*rTuL + if cont==1 + accTuL(:,ii) = accTuL(:,ii)*caX_Tu(cn)+(tempTuL(:,cn)*pIntX_Tu(cn)+iIntX_Tu(cn)); + cont = cont+1; + elseif cont==2 + accTuL(:,ii) = accTuL(:,ii)*caY_Tu(cn)+(tempTuL(:,cn)*pIntY_Tu(cn)+iIntY_Tu(cn)); + if NuovoZeroTuL == 1 + ay_TuL(:,cn) = ay_TuL(:,cn)*caY_Tu(cn)+(t_TuL(:,cn)*pIntY_Tu(cn)+iIntY_Tu(cn)); + ay_TuL_AC(:,cn) = ay_TuL_AC(:,cn)*caY_Tu(cn)+(t_TuL_AC(:,cn)*pIntY_Tu(cn)+iIntY_Tu(cn)); + end + cont = cont+1; + else + accTuL(:,ii) = accTuL(:,ii)*caZ_Tu(cn)+(tempTuL(:,cn)*pIntZ_Tu(cn)+iIntZ_Tu(cn)); + cont = 1; + cn = cn+1; + end + end + + magTuL = magTuL./1000; + + %% Conversione delle temperature + [rT,~] = size(tempTuL); + T_TuL = zeros(rT,1); + + for t = 1:rTuL + T_TuL(:,t) = tempTuL(:,t)*caT_Tu(t,1) + intT_Tu(t,1); + end +end + +%% Calcolo della risultante +[rAcc,cAcc] = size(accTuL); +ris_acc_TuL = zeros(rAcc,cAcc/3); % matrice risultante accelerazioni +clear ii +clear cn + +cont = 1; % contatore +cn = 0; + +%% Calcolo della risultante +for ii = 1:(cAcc/3) % colonne + for i = 1:rAcc % righe + ris_acc_TuL(i,cont) = (accTuL(i,cn*3+1)^2+accTuL(i,cn*3+2)^2+accTuL(i,cn*3+3)^2)^0.5; + ris_mag_TuL(i,cont) = (magTuL(i,cn*3+1)^2+magTuL(i,cn*3+2)^2+magTuL(i,cn*3+3)^2)^0.5; + end + cn = cn+1; + cont = cont+1; +end + +text = 'Raw Data of Tunnel Link converted into physycal units correctly. conv_grezziTuL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/ATD/conv_grezziWEL.m b/ATD/conv_grezziWEL.m new file mode 100755 index 0000000..a117ac8 --- /dev/null +++ b/ATD/conv_grezziWEL.m @@ -0,0 +1,77 @@ +% Funzione che converte i dati della cella di carico in dati di +% forza mediante i valori di calibrazione. +% Il risultato è la matrico DatiLoad + +function [DatiWireExtensometer,DatiNTCWireExtensometer,ErrWireExtensometerLink] = conv_grezziWEL(... + WireExtensometer,NTCWireExtensometer,DCalWELTot,NodoWireExtensometerLink,... + ErrWireExtensometerLink,WEL_NTC,rWEL,Tmax,Tmin,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'conv_grezziWEL function started'; +fprintf(fileID,fmt,text); + +[rA,cA] = size(WireExtensometer); +DatiWireExtensometer = zeros(rA,cA); +DatiNTCWireExtensometer = zeros(rA,cA); +for ii = 1:rWEL % numero di Wire Extensometer Link + if strcmp(NodoWireExtensometerLink(ii,3),'4-20 mA') + %% Conversione da mA a mm + % Spacchetto i parametri di calibrazione + a = DCalWELTot(ii,1); + b = DCalWELTot(ii,2); + c = DCalWELTot(ii,3); + DatiWireExtensometer(:,ii) = a*(WireExtensometer(:,ii).^2)+b*WireExtensometer(:,ii)+c; % conversione + elseif strcmp(NodoWireExtensometerLink(ii,3),'mV/V') + %% Conversione da mV/V a mm + % Spacchetto i parametri di calibrazione + a = DCalWELTot(ii,1); + b = DCalWELTot(ii,2); + DatiWireExtensometer(:,ii) = a*WireExtensometer(:,ii)+b; % conversione + elseif strcmp(NodoWireExtensometerLink(ii,3),'Hz') + % Spacchetto i parametri di calibrazione + GF = DCalELTot(ii,1); + BF = DCalELTot(ii,2); + digit = (WireExtensometer(:,ii).^2)*0.001; % Freq. ^2 *E-3 + DatiWireExtensometer(:,ii) = GF*BF*digit; % conversione in microEpsilon + end + A = 1.4051*10^(-3); + B = 2.369*10^(-4); + C = 1.019*10^(-7); + if WEL_NTC(ii,1) == 1 % è presente il termometro + R = NTCWireExtensometer(:,ii); + [rN,~] = size(R); + for n = 1:rN + if R(n) <= 0 + if n > 1 + R(n) = R(n-1); + else + R(n) = 5000; + end + if ErrWireExtensometerLink(n,ii) == 0 + ErrWireExtensometerLink(n,ii) = 0.5; + end + end + end + L = reallog(R); + DatiNTCWireExtensometer(:,ii) = (1./(A + B*L + C*(L.^3))) -273.2; % conversione in gradi centigradi + [rT,~] = size(DatiNTCWireExtensometer); + for T = 1:rT + if DatiNTCWireExtensometer(T,ii) > Tmax || DatiNTCWireExtensometer(T,ii) < Tmin + if T == 1 + DatiNTCWireExtensometer(T,ii) = DatiNTCWireExtensometer(T+1,ii); + else + DatiNTCWireExtensometer(T,ii) = DatiNTCWireExtensometer(T-1,ii); + end + if ErrWireExtensometerLink(T,ii) == 0 + ErrWireExtensometerLink(T,ii) = 0.5; + end + end + end + end +end + +text = 'Calibrations of Wire Extensometer Link defined correctly. conv_grezziWEL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/corrTuL.m b/ATD/corrTuL.m new file mode 100755 index 0000000..7696d48 --- /dev/null +++ b/ATD/corrTuL.m @@ -0,0 +1,41 @@ +function [Xi,Zi,Yi,XiStar,ZiStar,YiStar] = corrTuL(indiceX,indiceZ,Xi,Zi,Yi,... + XiStar,ZiStar,YiStar,ii,rTuL,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; + +[rIx,~] = size(indiceX); +if rIx > 0 + for bb = 1:rIx + if ii == indiceX(bb) + Xi = -1*Xi; + text = ['Tunnel Link node number ' num2str(ii) ' corrected with '... + 'sign inversion along X-axes during the execution of corrTuL function']; + fprintf(fileID,fmt,text); + end + if ii == (rTuL - indiceX(bb) +1) + XiStar = -1*XiStar; + end + end +end + +[rIz,~] = size(indiceZ); +if rIz > 0 + for bb = 1:rIz + if ii == indiceZ(bb) + Zi = -1*Zi; + Yi = -1*Yi; + text = ['Tunnel Link node number ' num2str(ii) ' corrected with '... + 'signs inversion along Y and Z axis during the execution of corrTuL function']; + fprintf(fileID,fmt,text); + end + if ii == (rTuL - indiceZ(bb) +1) + ZiStar = -1*ZiStar; + YiStar = -1*YiStar; + end + end +end + +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/database_definition.m b/ATD/database_definition.m new file mode 100755 index 0000000..92041c5 --- /dev/null +++ b/ATD/database_definition.m @@ -0,0 +1,26 @@ +function DB = database_definition(~,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'database_definition function started'; +fprintf(fileID,fmt,text); + +%% DB ASE +Dati = importdata('DB.txt'); +dbname = Dati{1,1}; +username = Dati{2,1}; +password = Dati{3,1}; +driver = Dati{4,1}; +dburl = Dati{5,1}; + +DB{1,1} = cellstr(dbname); +DB{2,1} = cellstr(username); +DB{3,1} = cellstr(password); +DB{4,1} = cellstr(driver); +DB{5,1} = cellstr(dburl); + +text = 'Database defined correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/ATD/database_write.m b/ATD/database_write.m new file mode 100755 index 0000000..3dc7f25 --- /dev/null +++ b/ATD/database_write.m @@ -0,0 +1,452 @@ +function database_write(catena,IDcentralina,DTcatena,X_TuL,Xstar_TuL,Y_TuL,Z_TuL,Zstar_TuL,... + Xlocal_TuL,Ylocal_TuL,Zlocal_TuL,SegStar,HShift_local_TuL,Area_TuL,... + Speed_local_TuL,Acceleration_local_TuL,TempDef_TuL,ARRAYdate_TuL,ErrTunnelLink,... + X_RL,Y_RL,Z_RL,Xlocal_RL,Ylocal_RL,Zlocal_RL,TempDef_RL,ARRAYdate_RL,ErrRadialLink,... + Y_TLH,Z_TLH,Ylocal_TLH,Zlocal_TLH,AlfaX_TLH,AlfaY_TLH,TempDef_TLH,speed_TLH,... + speed_local_TLH,acceleration_TLH,acceleration_local_TLH,ARRAYdate_TLH,ErrTiltLinkH,... + Y_TLHRH,Z_TLHRH,Ylocal_TLHRH,Zlocal_TLHRH,AlfaX_TLHRH,AlfaY_TLHRH,TempDef_TLHRH,speed_TLHRH,... + speed_local_TLHRH,acceleration_TLHRH,acceleration_local_TLHRH,ARRAYdate_TLHRH,ErrTiltLinkHRH,... + Y_PCL,Z_PCL,Ylocal_PCL,Zlocal_PCL,AlfaX_PCL,AlfaY_PCL,TempDef_PCL,speed_PCL,... + speed_local_PCL,acceleration_PCL,acceleration_local_PCL,ARRAYdate_PCL,ErrPreConvLink,... + Y_PCLHR,Z_PCLHR,Ylocal_PCLHR,Zlocal_PCLHR,AlfaX_PCLHR,AlfaY_PCLHR,TempDef_PCLHR,speed_PCLHR,... + speed_local_PCLHR,acceleration_PCLHR,acceleration_local_PCLHR,ARRAYdate_PCLHR,ErrPreConvLinkHR,... + DatiPressure,ARRAYdate_PL,ErrPressureLink,DatiLoad,ARRAYdate_LL,ErrLoadLink,... + DatiExtensometer,DatiNTCExtensometer,ARRAYdate_EL,Carico_ass,Sforzo,Calcolo_Carico,ErrExtensometerLink,ChEL,EL_NTC,... + DatiExtensometer3D,DatiNTCExtensometer3D,ARRAYdate_3DEL,Err3DExtensometerLink,Ch3DEL,EL3D_NTC,... + DatiWireExtensometer,DatiNTCWireExtensometer,ARRAYdate_WEL,ErrWireExtensometerLink,ChWEL,WEL_NTC,... + DatiMultiBase,ARRAYdate_MPBEL,ErrMultiPointExtensometer,NumBasi,... + DatiAnalog,~,~,DatiCrack,DatiNTCCrack,ChCrL,CrL_NTC,ARRAYdate_CrL,ErrCrackLink,... + Dati3DCrack,DatiNTCCrack3D,ARRAYdate_3DCrL,Ch3DCrL,CrL3D_NTC,Err3DCrackLink,... + Dati2DCrack,DatiNTCCrack2D,ARRAYdate_2DCrL,Ch2DCrL,CrL2D_NTC,Err2DCrackLink,... + DatiStress,DatiNTCStress,ARRAYdate_SM,ErrStressMeter,ChSM,SM_NTC,... + conn,FileName) + +[scrivoTuL,scrivoRL,scrivoTLH,scrivoTLHRH,scrivoPCL,scrivoPCLHR,scrivoPL,... + scrivoLL,scrivoEL,scrivo3DEL,scrivoWEL,scrivoMPBEL,~,... + scrivoCrL,scrivo3DCrL,scrivo2DCrL,scrivoSM] = scrivo(X_TuL,X_RL,... + Z_TLH,Z_TLHRH,Z_PCL,Z_PCLHR,DatiPressure,DatiLoad,... + DatiExtensometer,DatiExtensometer3D,DatiWireExtensometer,DatiMultiBase,... + DatiAnalog,DatiCrack,Dati3DCrack,Dati2DCrack,DatiStress,FileName); + +%% Contatori nodi +cTuL = 1; % Tunnel Link +cRL = 1; % Radial Link +cTLH = 1; % Tilt Link H +cTLHRH = 1; % Tilt Link HR H +cPCL = 1; % PreConv Link +cPCLHR = 1; % PreConv Link HR +cPL = 1; % Pressure Link +cLL = 1; % Load Link +cEL = 1; % Extensometer Link +c3DEL = 1; % 3D Extensometer Link +c3DEL_NTC = 1; % NTC 3D Extensometer Link +cWEL = 1; % Wire Extensometer Link +cMPBEL = 1; % Multi Point Rod Extensometer, contatore basi +contMPBEL = 1; % Multi Point Rod Extensometer, contatore singoli nodi +cAL = 1; % Analog Link +cCrL = 1; % Crack Link +c3DCrL = 1; % 3D Crack Link +c2DCrL = 1; % 2D Crack Link +cont3DCrL = 1; % 3D Crack Link, contatore pari a 1/3 del precedente +cSM = 1; + +% conto i dati +[~,colTuL] = size(X_TuL); % controllo quanti dati ho +[~,colRL] = size(X_RL); % controllo quanti dati ho +[~,colTLH] = size(Z_TLH); % controllo quanti dati ho +[~,colTLHRH] = size(Z_TLHRH); % controllo quanti dati ho +[~,colPCL] = size(Z_PCL); % controllo quanti dati ho +[~,colPCLHR] = size(Z_PCLHR); % controllo quanti dati ho +[~,colPL] = size(DatiPressure'); % controllo quanti dati ho +[~,colLL] = size(DatiLoad'); % controllo quanti dati ho +[~,colEL] = size(DatiExtensometer'); % controllo quanti dati ho +[~,col3DEL] = size(DatiExtensometer3D'); % controllo quanti dati ho +[~,colWEL] = size(DatiWireExtensometer'); % controllo quanti dati ho +[~,colMPBEL] = size(DatiMultiBase'); % controllo quanti dati ho +[~,colAL] = size(DatiAnalog'); % controllo quanti dati ho +[~,colCrL] = size(DatiCrack'); % controllo quanti dati ho +[~,col3DCrL] = size(Dati3DCrack'); % controllo quanti dati ho +[~,col2DCrL] = size(Dati2DCrack'); % controllo quanti dati ho +[~,colSM] = size(DatiStress'); % controllo quanti dati ho + +[rC,~] = size(catena); +idNodo = cell2mat(catena(:,1)); + +% Apro il file di log +fileID = fopen(FileName,'a'); +fmt = '%s \r'; + +%% Scrittura risultati su DB +% for a = 1:rC % salto l'ancora +for a = 1:rC % salto l'ancora + + NodeNum = cell2mat(catena(a,3)); + + %% Tunnel Link + if idNodo(a,1) == 17 + if scrivoTuL == 1 + ListaDate = colTuL; + + DATAinsert = cellMakerTuL(IDcentralina,DTcatena,NodeNum,cTuL,ListaDate,ARRAYdate_TuL,... + X_TuL,Xstar_TuL,Y_TuL,Z_TuL,Zstar_TuL,Xlocal_TuL,Ylocal_TuL,Zlocal_TuL,... + SegStar,HShift_local_TuL,TempDef_TuL,Area_TuL,Speed_local_TuL,Acceleration_local_TuL,ErrTunnelLink); + + idElabData = DB_date_time(IDcentralina,DTcatena,NodeNum,ListaDate,ARRAYdate_TuL,conn); + + DBwriteTuL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn); + + cTuL = cTuL+1; + clear DATAinsert + % Logfile + text = ['Tunnel Link node no. ' num2str(NodeNum) ' of ' ... + num2str(rC) ', unit ' IDcentralina ' and chain ' DTcatena... + ', has been written in the DB!']; + fprintf(fileID,fmt,text); + end + + %% Radial Link + elseif idNodo(a,1) == 18 + if scrivoRL == 1 + ListaDate = colRL; + + DATAinsert = cellMakerRL(IDcentralina,DTcatena,NodeNum,cRL,ListaDate,ARRAYdate_RL,... + X_RL,Y_RL,Z_RL,Xlocal_RL,Ylocal_RL,Zlocal_RL,TempDef_RL,ErrRadialLink); + + idElabData = DB_date_time(IDcentralina,DTcatena,NodeNum,ListaDate,ARRAYdate_RL,conn); + + DBwriteRL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn); + + cRL = cRL+1; + clear DATAinsert + % Logfile + text = ['Radial Link node no. ' num2str(NodeNum) ' of ' ... + num2str(rC) ', unit ' IDcentralina ' and chain ' DTcatena... + ', has been written in the DB!']; + fprintf(fileID,fmt,text); + end + + %% Tilt Link H + elseif idNodo(a,1) == 11 + if scrivoTLH == 1 + ListaDate = colTLH; + + DATAinsert = cellMakerTLH(IDcentralina,DTcatena,NodeNum,cTLH,ListaDate,... + Y_TLH,Z_TLH,Ylocal_TLH,Zlocal_TLH,AlfaX_TLH,AlfaY_TLH,TempDef_TLH,speed_TLH,... + speed_local_TLH,acceleration_TLH,acceleration_local_TLH,ErrTiltLinkH,ARRAYdate_TLH); + + idElabData = DB_date_time(IDcentralina,DTcatena,NodeNum,ListaDate,ARRAYdate_TLH,conn); + + DBwriteTLH(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn); + + cTLH = cTLH+1; + clear DATAinsert + % Logfile + text = ['Tilt Link H node no. ' num2str(NodeNum) ' of ' ... + num2str(rC) ', unit ' IDcentralina ' and chain ' DTcatena... + ', has been written in the DB!']; + fprintf(fileID,fmt,text); + end + + %% Tilt Link HR H + elseif idNodo(a,1) == 12 + if scrivoTLHRH == 1 + ListaDate = colTLHRH; + + DATAinsert = cellMakerTLHRH(IDcentralina,DTcatena,NodeNum,cTLHRH,ListaDate,... + Y_TLHRH,Z_TLHRH,Ylocal_TLHRH,Zlocal_TLHRH,AlfaX_TLHRH,AlfaY_TLHRH,TempDef_TLHRH,... + speed_TLHRH,speed_local_TLHRH,acceleration_TLHRH,acceleration_local_TLHRH,... + ErrTiltLinkHRH,ARRAYdate_TLHRH); + + idElabData = DB_date_time(IDcentralina,DTcatena,NodeNum,ListaDate,ARRAYdate_TLHRH,conn); + + DBwriteTLHRH(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn); + + cTLHRH = cTLHRH+1; + clear DATAinsert + % Logfile + text = ['Tilt Link HR H node no. ' num2str(NodeNum) ' of ' ... + num2str(rC) ', unit ' IDcentralina ' and chain ' DTcatena... + ', has been written in the DB!']; + fprintf(fileID,fmt,text); + end + + %% PreConv Link + elseif idNodo(a,1) == 23 + if scrivoPCL == 1 + ListaDate = colPCL; + + DATAinsert = cellMakerPCL(IDcentralina,DTcatena,NodeNum,cPCL,ListaDate,... + Y_PCL,Z_PCL,Ylocal_PCL,Zlocal_PCL,AlfaX_PCL,AlfaY_PCL,TempDef_PCL,speed_PCL,... + speed_local_PCL,acceleration_PCL,acceleration_local_PCL,ErrPreConvLink,ARRAYdate_PCL); + + idElabData = DB_date_time(IDcentralina,DTcatena,NodeNum,ListaDate,ARRAYdate_PCL,conn); + + DBwritePCL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn); + + cPCL = cPCL+1; + clear DATAinsert + % Logfile + text = ['PreConv Link node no. ' num2str(NodeNum) ' of ' ... + num2str(rC) ' of unit ' IDcentralina ' and chain ' ... + DTcatena ' written in the DB!']; + fprintf(fileID,fmt,text); + end + + %% PreConv Link HR + elseif idNodo(a,1) == 24 + if scrivoPCLHR == 1 + ListaDate = colPCLHR; + + DATAinsert = cellMakerPCLHR(IDcentralina,DTcatena,NodeNum,cPCLHR,ListaDate,... + Y_PCLHR,Z_PCLHR,Ylocal_PCLHR,Zlocal_PCLHR,AlfaX_PCLHR,AlfaY_PCLHR,TempDef_PCLHR,... + speed_PCLHR,speed_local_PCLHR,acceleration_PCLHR,acceleration_local_PCLHR,... + ErrPreConvLinkHR,ARRAYdate_PCLHR); + + idElabData = DB_date_time(IDcentralina,DTcatena,NodeNum,ListaDate,ARRAYdate_PCLHR,conn); + + DBwritePCLHR(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn); + + cPCLHR = cPCLHR+1; + clear DATAinsert + % Logfile + text = ['PreConv Link HR node no. ' num2str(NodeNum) ' of ' ... + num2str(rC) ' of unit ' IDcentralina ' and chain ' ... + DTcatena ' written in the DB!']; + fprintf(fileID,fmt,text); + end + + %% Pressure Link + elseif idNodo(a,1) == 21 + if scrivoPL == 1 + ListaDate = colPL; + + DATAinsert = cellMakerPL(IDcentralina,DTcatena,NodeNum,cPL,ListaDate,... + ARRAYdate_PL,DatiPressure,ErrPressureLink); + + idElabData = DB_date_time(IDcentralina,DTcatena,NodeNum,ListaDate,ARRAYdate_PL,conn); + + DBwritePL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn); + + cPL = cPL+1; + clear DATAinsert + % Logfile + text = ['Pressure Link node no. ' num2str(NodeNum) ' of ' ... + num2str(rC) ' of unit ' IDcentralina ' and chain ' ... + DTcatena ' written in the DB!']; + fprintf(fileID,fmt,text); + end + + %% Load Link + elseif idNodo(a,1) == 15 + if scrivoLL == 1 + ListaDate = colLL; + + DATAinsert = cellMakerLL(IDcentralina,DTcatena,NodeNum,cLL,ListaDate,... + ARRAYdate_LL,DatiLoad,ErrLoadLink); + + idElabData = DB_date_time(IDcentralina,DTcatena,NodeNum,ListaDate,ARRAYdate_LL,conn); + + DBwriteLL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn); + + cLL = cLL+1; + clear DATAinsert + % Logfile + text = ['Load Link node no. ' num2str(NodeNum) ' of ' ... + num2str(rC) ' of unit ' IDcentralina ' and chain ' ... + DTcatena ' written in the DB!']; + fprintf(fileID,fmt,text); + end + + %% Extensometer Link + elseif idNodo(a,1) == 16 + if scrivoEL == 1 + ListaDate = colEL; + + DATAinsert = cellMakerEL(IDcentralina,DTcatena,NodeNum,cEL,ListaDate,... + ARRAYdate_EL,DatiExtensometer,DatiNTCExtensometer,Carico_ass,Sforzo,... + Calcolo_Carico,ErrExtensometerLink,ChEL,EL_NTC); + + idElabData = DB_date_time(IDcentralina,DTcatena,NodeNum,... + ListaDate,ARRAYdate_EL,conn); + + DBwriteEL(DATAinsert,idElabData,ListaDate,NodeNum,Calcolo_Carico,... + IDcentralina,DTcatena,cEL,ChEL,EL_NTC,conn); + + cEL = cEL+1; + clear DATAinsert + % Logfile + text = ['Extensometer Link node no. ' num2str(NodeNum) ' of ' ... + num2str(rC) ', unit ' IDcentralina ' and chain ' DTcatena ... + ', has been written in the DB!']; + fprintf(fileID,fmt,text); + end + + %% 3D Extensometer Link + elseif idNodo(a,1) == 19 + if scrivo3DEL == 1 + ListaDate = col3DEL; + + DATAinsert = cellMaker3DEL(IDcentralina,DTcatena,NodeNum,c3DEL,c3DEL_NTC,ListaDate,ARRAYdate_3DEL,... + DatiExtensometer3D,DatiNTCExtensometer3D,Err3DExtensometerLink,Ch3DEL,EL3D_NTC); + + idElabData = DB_date_time(IDcentralina,DTcatena,NodeNum,ListaDate,ARRAYdate_3DEL,conn); + + DBwrite3DEL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,... + DTcatena,Ch3DEL,c3DEL_NTC,EL3D_NTC,conn); + + c3DEL = c3DEL+3; + c3DEL_NTC = c3DEL_NTC+1; + clear DATAinsert + % Logfile + text = ['3D Extensometer Link node no. ' num2str(NodeNum) ' of ' ... + num2str(rC) ', unit ' IDcentralina ' and chain ' DTcatena ... + ', has been written in the DB!']; + fprintf(fileID,fmt,text); + end + + %% Wire Extensometer Link + elseif idNodo(a,1) == 22 + if scrivoWEL == 1 + ListaDate = colWEL; + + DATAinsert = cellMakerWEL(IDcentralina,DTcatena,NodeNum,cWEL,ListaDate,... + ARRAYdate_WEL,DatiWireExtensometer,DatiNTCWireExtensometer,ChWEL,WEL_NTC,... + ErrWireExtensometerLink); + + idElabData = DB_date_time(IDcentralina,DTcatena,NodeNum,ListaDate,ARRAYdate_WEL,conn); + + DBwriteWEL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,... + cWEL,ChWEL,WEL_NTC,conn); + + cWEL = cWEL+1; + clear DATAinsert + % Logfile + text = ['Wire Extensometer Link node no. ' num2str(NodeNum) ' of ' ... + num2str(rC) ', unit ' IDcentralina ' and chain ' DTcatena ... + ', has been written in the DB!']; + fprintf(fileID,fmt,text); + end + + %% Crack Link + elseif idNodo(a,1) == 36 + if scrivoCrL == 1 + ListaDate = colCrL; + + DATAinsert = cellMakerCrL(IDcentralina,DTcatena,NodeNum,cCrL,ListaDate,... + ARRAYdate_CrL,DatiCrack,DatiNTCCrack,ChCrL,CrL_NTC,ErrCrackLink); + + idElabData = DB_date_time(IDcentralina,DTcatena,NodeNum,ListaDate,ARRAYdate_CrL,conn); + + DBwriteCrL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,... + DTcatena,cCrL,ChCrL,CrL_NTC,conn); + + cCrL = cCrL+1; + clear DATAinsert + % Logfile + text = ['Crack Link node no. ' num2str(NodeNum) ' of ' ... + num2str(rC) ', unit ' IDcentralina ' and chain ' DTcatena ... + ', has been written in the DB!']; + fprintf(fileID,fmt,text); + end + + %% 3D Crack Link + elseif idNodo(a,1) == 37 + if scrivo3DCrL == 1 + ListaDate = col3DCrL; + + DATAinsert = cellMaker3DCrL(IDcentralina,DTcatena,NodeNum,c3DCrL,ListaDate,... + ARRAYdate_3DCrL,Dati3DCrack,DatiNTCCrack3D,Err3DCrackLink,... + Ch3DCrL,CrL3D_NTC,cont3DCrL); + + idElabData = DB_date_time(IDcentralina,DTcatena,NodeNum,ListaDate,ARRAYdate_3DCrL,conn); + + DBwrite3DCrL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,... + DTcatena,Ch3DCrL,CrL3D_NTC,cont3DCrL,conn); + + c3DCrL = c3DCrL+3; + cont3DCrL = cont3DCrL+1; + clear DATAinsert + % Logfile + text = ['3D Crack Link node no. ' num2str(NodeNum) ' of ' ... + num2str(rC) ', unit ' IDcentralina ' and chain ' DTcatena ... + ', has been written in the DB!']; + fprintf(fileID,fmt,text); + end + + %% 2D Crack Link + elseif idNodo(a,1) == 51 + if scrivo2DCrL == 1 + ListaDate = col2DCrL; + + DATAinsert = cellMaker2DCrL(IDcentralina,DTcatena,NodeNum,c2DCrL,ListaDate,... + ARRAYdate_2DCrL,Dati2DCrack,DatiNTCCrack2D,Err2DCrackLink,... + Ch2DCrL,CrL2D_NTC,cont2DCrL); + + idElabData = DB_date_time(IDcentralina,DTcatena,NodeNum,ListaDate,ARRAYdate_2DCrL,conn); + + DBwrite3DCrL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,... + DTcatena,Ch3DCrL,CrL3D_NTC,cont3DCrL,conn); + + c2DCrL = c2DCrL+2; + cont3DCrL = cont3DCrL+1; + clear DATAinsert + % Logfile + text = ['2D Crack Link node no. ' num2str(NodeNum) ' of ' ... + num2str(rC) ', unit ' IDcentralina ' and chain ' DTcatena ... + ', has been written in the DB!']; + fprintf(fileID,fmt,text); + end + + %% MultiPoint BoreHole Extensometer + elseif idNodo(a,1) == 25 + if scrivoMPBEL == 1 + ListaDate = colMPBEL; + + DATAinsert = cellMakerMPBEL(IDcentralina,DTcatena,NodeNum,cMPBEL,contMPBEL,... + ListaDate,ARRAYdate_MPBEL,DatiMultiBase,NumBasi,ErrMultiPointExtensometer); + + idElabData = DB_date_time(IDcentralina,DTcatena,NodeNum,ListaDate,ARRAYdate_MPBEL,conn); + + DBwriteMPBEL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,... + DTcatena,NumBasi,conn); + + cMPBEL = cMPBEL+NumBasi; + contMPBEL = contMPBEL+1; + clear DATAinsert + % Logfile + text = ['Multi Point Borehole Extensometer node no. ' num2str(NodeNum) ' of ' ... + num2str(rC) ', unit ' IDcentralina ' and chain ' DTcatena ... + ', has been written in the DB!']; + fprintf(fileID,fmt,text); + end + + %% Stress Meter + elseif idNodo(a,1) == 47 + if scrivoSM == 1 + ListaDate = colSM; + + DATAinsert = cellMakerSM(IDcentralina,DTcatena,NodeNum,cSM,ListaDate,... + ARRAYdate_SM,DatiStress,DatiNTCStress,ChSM,SM_NTC,ErrStressMeter); + + idElabData = DB_date_time(IDcentralina,DTcatena,NodeNum,ListaDate,ARRAYdate_SM,conn); + + DBwriteSM(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,... + DTcatena,ChSM,SM_NTC,cSM,conn); + + cSM = cSM+1; + clear DATAinsert + % Logfile + text = ['Stress Meter node no. ' num2str(NodeNum) ' of ' ... + num2str(rC) ', unit ' IDcentralina ' and chain ' DTcatena ... + ', has been written in the DB!']; + fprintf(fileID,fmt,text); + end + + end +end + +text = 'All the data have been written in the DB correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/ATD/datainiziale.m b/ATD/datainiziale.m new file mode 100755 index 0000000..f5e67f3 --- /dev/null +++ b/ATD/datainiziale.m @@ -0,0 +1,44 @@ +% Funzione che scarica la data iniziale per quell'installazione +function [date,time,date_AC,time_AC,Nodo_AC,unitID] = datainiziale(DTcatena,... + unitID,conn,FileName) + +text = 'datainiziale function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +unitID = num2str(cell2mat(unitID)); +comando = ['select prod_date from tools where unit_ID like ''' unitID ''' and name like ''' DTcatena ''' ']; +data_ini = fetch(conn,comando); +stringa = cell2mat(data_ini); +[lS] = length(stringa); +date = stringa(1,1:10); +time = stringa(1,12:lS); + +text = ['Starting date for the download of data: ' date ' ' time '. datainiziale function closed.']; +fprintf(fileID,fmt,text); + +% Scarico la data iniziale per i nodi dell'arco rovescio +comando = ['select prod_date_node, node_num_prod from tools where unit_ID like ''' unitID ''' and name like ''' DTcatena ''' ']; +dati = fetch(conn,comando); +stringa = cell2mat(dati(1,1)); +[lS] = length(stringa); +if strcmp(stringa,'null') + date_AC = []; + time_AC = []; + Nodo_AC = []; +elseif strcmp(stringa,'No Data') + date_AC = []; + time_AC = []; + Nodo_AC = []; +else + date_AC = stringa(1,1:10); + time_AC = stringa(1,12:lS); + Nodo_AC = cell2mat(dati(1,2)); + text = ['Starting date for the download of invert data related to Cir Array: ' date_AC ' ' time_AC '.']; + fprintf(fileID,fmt,text); +end + +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/defDati2DCrL.m b/ATD/defDati2DCrL.m new file mode 100755 index 0000000..35cb81c --- /dev/null +++ b/ATD/defDati2DCrL.m @@ -0,0 +1,99 @@ +% funzione che definisce i dati per l'estensimetro 2D, in particolare +% tempo (Time2DCrL) e Dato (Crack2D) + +function [Time2DCrL,Crack2D,NTCCrack2D,Err2DCrackLink,ErrNTC2DCrackLink] = ... + defDati2DCrL(Dati2DCrackLink,DatiNTC2DCrackLink,Err2DCrackLink,ErrNTC2DCrackLink,... + r2DCrL,Nodo2DCrackLink,Ch2DCrL,CrL2D_NTC,Ndatidespike,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDati2DCrL function started'; +fprintf(fileID,fmt,text); + +CrL2D_Or = cell2mat(Nodo2DCrackLink(:,6)); + +[r,c] = size(Dati2DCrackLink); +Ncorr = 0; + +% Elimino gli eventuali Not a Number +for a = 2:r + ntc = 1; + control = 1; + for b = 2:c + check = isnan(Dati2DCrackLink(a,b)); + if check == 1 + Dati2DCrackLink(a,b) = Dati2DCrackLink(a-1,b); + Err2DCrackLink(a,b-1) = 1; + Ncorr = Ncorr+1; + end + if control == 1 + if CrL2D_NTC(ntc) == 1 % La prima colonna è una data + check = isnan(DatiNTC2DCrackLink(a,ntc)); + if check == 1 + DatiNTC2DCrackLink(a,b) = DatiNTC2DCrackLink(a-1,ntc); + ErrNTC2DCrackLink(a,b-1) = 0.5; + Ncorr = Ncorr+1; + end + end + control = control+1; + ntc = ntc+1; + end + end +end + +text = ['' num2str(Ncorr) ' NaN of 2D Crack Link corrected by defDati2DCrL function']; +fprintf(fileID,fmt,text); + +Time2DCrL = Dati2DCrackLink(:,1); % data +Crack2D = Dati2DCrackLink(:,2:end); +NTCCrack2D = zeros(r,r2DCrL); +b = 2; % colonna del primo dato +for s = 1:r2DCrL + if Ch2DCrL(s,1) == 1 || Ch2DCrL(s,1) >= 2 %Solo fessurimetro + if CrL2D_NTC(s,1)==1 % si legge anche il termometro + NTCCrack2D(:,s) = DatiNTC2DCrackLink(:,b); % dati NTC + end + b = b+1; + end +end + +Num_Dati = Ndatidespike; % numero di dati per il despike +if Num_Dati > r + Num_Dati = r; +end + +i = 1; +cont = 1; +X = zeros(r,r2DCrL); +Y = zeros(r,r2DCrL); +while i <= 2*r2DCrL + % despiking Fessurimetri + X(1:end-1,cont) = filloutliers(Crack2D(1:end-1,i),'linear','movmedian',Num_Dati); + X(end,cont) = Crack2D(end,i); + Y(1:end-1,cont) = filloutliers(Crack2D(1:end-1,i+1),'linear','movmedian',Num_Dati); + Y(end,cont) = Crack2D(end,i+1); + i = i+2; + cont = cont+1; +end + +if CrL2D_Or == 12 + X_Corr = X; + Y_Corr = Y; +elseif CrL2D_Or == 21 + X_Corr = Y; + Y_Corr = X; +end + +i = 1; +cont = 1; +while i <= 2*r2DCrL + Crack2D(:,i) = X_Corr(:,cont); + Crack2D(:,i+1) = Y_Corr(:,cont); + i = i+2; + cont = cont+1; +end + +text = 'Data of 2D Crack Link defined correctly. defDati2DCrL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/defDati3DCrL.m b/ATD/defDati3DCrL.m new file mode 100755 index 0000000..c96ef15 --- /dev/null +++ b/ATD/defDati3DCrL.m @@ -0,0 +1,121 @@ +% funzione che definisce i dati per la Barretta Estensimetrica, in particolare +% tempo (Time3DCrL) e Dato (Crack3D) + +function [Time3DCrL,Crack3D,NTCCrack3D,Err3DCrackLink,ErrNTC3DCrackLink] = ... + defDati3DCrL(Dati3DCrackLink,DatiNTC3DCrackLink,Err3DCrackLink,ErrNTC3DCrackLink,... + r3DCrL,Nodo3DCrackLink,Ch3DCrL,CrL3D_NTC,Ndatidespike,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDati3DCrL function started'; +fprintf(fileID,fmt,text); + +CrL3D_Or = cell2mat(Nodo3DCrackLink(:,6)); + +[r,c] = size(Dati3DCrackLink); +Ncorr = 0; + +% Elimino gli eventuali Not a Number +for a = 2:r + ntc = 1; + control = 1; + for b = 2:c + check = isnan(Dati3DCrackLink(a,b)); + if check == 1 + Dati3DCrackLink(a,b) = Dati3DCrackLink(a-1,b); + Err3DCrackLink(a,b-1) = 1; + Ncorr = Ncorr+1; + end + if control == 1 + if CrL3D_NTC(ntc) == 1 % La prima colonna è una data + check = isnan(DatiNTC3DCrackLink(a,ntc)); + if check == 1 + DatiNTC3DCrackLink(a,b) = DatiNTC3DCrackLink(a-1,ntc); + ErrNTC3DCrackLink(a,b-1) = 0.5; + Ncorr = Ncorr+1; + end + end + control = control+1; + ntc = ntc+1; + end + end +end + +text = ['' num2str(Ncorr) ' NaN of 3D Crack Link corrected by defDati3DCrL function']; +fprintf(fileID,fmt,text); + +Time3DCrL = Dati3DCrackLink(:,1); % data +Crack3D = Dati3DCrackLink(:,2:end); +NTCCrack3D = zeros(r,r3DCrL); +b = 2; % colonna del primo dato +for s = 1:r3DCrL + if Ch3DCrL(s,1) == 1 || Ch3DCrL(s,1) >= 2 %Solo fessurimetro + if CrL3D_NTC(s,1)==1 % si legge anche il termometro + NTCCrack3D(:,s) = DatiNTC3DCrackLink(:,b); % dati NTC + end + b = b+1; + end +end + +Num_Dati = Ndatidespike; % numero di dati per il despike +if Num_Dati > r + Num_Dati = r; +end + +i = 1; +cont = 1; +X = zeros(r,r3DCrL); +Y = zeros(r,r3DCrL); +Z = zeros(r,r3DCrL); +while i <= 3*r3DCrL + % despiking Fessurimetri + X(1:end-1,cont) = filloutliers(Crack3D(1:end-1,i),'linear','movmedian',Num_Dati); + Y(1:end-1,cont) = filloutliers(Crack3D(1:end-1,i+1),'linear','movmedian',Num_Dati); + Z(1:end-1,cont) = filloutliers(Crack3D(1:end-1,i+2),'linear','movmedian',Num_Dati); + X(end,cont) = Crack3D(end,i); + Y(end,cont) = Crack3D(end,i+1); + Z(end,cont) = Crack3D(end,i+2); + i = i+3; + cont = cont+1; +end + +if CrL3D_Or == 123 + X_Corr = X; + Y_Corr = Y; + Z_Corr = Z; +elseif CrL3D_Or == 132 + X_Corr = X; + Y_Corr = Z; + Z_Corr = Y; +elseif CrL3D_Or == 213 + X_Corr = Y; + Y_Corr = X; + Z_Corr = Z; +elseif CrL3D_Or == 231 + X_Corr = Y; + Y_Corr = Z; + Z_Corr = X; +elseif CrL3D_Or == 312 + X_Corr = Z; + Y_Corr = X; + Z_Corr = Y; +elseif CrL3D_Or == 321 + X_Corr = Z; + Y_Corr = Y; + Z_Corr = X; +end + +i = 1; +cont = 1; +while i <= 3*r3DCrL + Crack3D(:,i) = X_Corr(:,cont); + Crack3D(:,i+1) = Y_Corr(:,cont); + Crack3D(:,i+2) = Z_Corr(:,cont); + i = i+3; + cont = cont+1; +end + +text = 'Data of 3D Crack Link defined correctly. defDati3DCrL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/defDati3DEL.m b/ATD/defDati3DEL.m new file mode 100755 index 0000000..b63a76c --- /dev/null +++ b/ATD/defDati3DEL.m @@ -0,0 +1,154 @@ +% funzione che definisce i dati per la Barretta Estensimetrica, in particolare +% tempo (TimeEL) e Dato (Extensometer) + +function [Time3DEL,Extensometer3D,Extensometer3D_Rif,NTCExtensometer3D,... + Err3DExtensometerLink,ErrNTC3DExtensometerLink] = ... + defDati3DEL(Dati3DExtensometerLink,Dati3DExtensometerLink_Rif,... + DatiNTC3DExtensometerLink,Err3DExtensometerLink,ErrNTC3DExtensometerLink,... + Nodo3DExtensometerLink,r3DEL,Ch3DEL,EL3D_NTC,Ndatidespike,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDati3DEL function started'; +fprintf(fileID,fmt,text); + +EL3D_Or = cell2mat(Nodo3DExtensometerLink(:,6)); + +[r,c] = size(Dati3DExtensometerLink); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + contT = 1; + num = 1; + for b = 2:c + check = isnan(Dati3DExtensometerLink(a,b)); + if check == 1 + Dati3DExtensometerLink(a,b) = Dati3DExtensometerLink(a-1,b); + Err3DExtensometerLink(a,b-1) = 1; + Ncorr = Ncorr+1; + end + if EL3D_NTC(contT) == 1 % La prima colonna è una data + check = isnan(DatiNTC3DExtensometerLink(a,contT)); + if check == 1 + DatiNTC3DExtensometerLink(a,contT) = DatiNTC3DExtensometerLink(a-1,contT); + ErrNTC3DExtensometerLink(a,contT) = 1; + Ncorr = Ncorr+1; + end + end + num = num+1; + if num == 4 + num = 1; + contT = contT+1; + end + end +end + +text = ['' num2str(Ncorr) ' NaN of 3D Extensometer Link corrected by defDati3DEL function']; +fprintf(fileID,fmt,text); + +Time3DEL = Dati3DExtensometerLink(:,1); % data +Extensometer3D = zeros(r,r3DEL); +Extensometer3D_Rif = zeros(1,r3DEL); +NTCExtensometer3D = zeros(r,r3DEL); + +s = 1; +i = 1; +b = 2; % colonna del primo dato +while b <= c + Extensometer3D(:,s:s+2) = Dati3DExtensometerLink(:,b:b+2); % dati 3D Extensometer Link + if Ch3DEL(i,1) == 4 + if EL3D_NTC(i,1)==1 % si legge anche il termometro + NTCExtensometer3D(:,i) = DatiNTC3DExtensometerLink(:,i); % dati T Extensometer Link + end + end + s = s+3; + b = b+3; + i = i+1; +end + +Num_Dati = Ndatidespike; % numero di dati per il despike +if Num_Dati > r + Num_Dati = r; +end + +i = 1; +cont = 1; +X = zeros(r,r3DEL); +Y = zeros(r,r3DEL); +Z = zeros(r,r3DEL); +X_Rif = zeros(1,r3DEL); +Y_Rif = zeros(1,r3DEL); +Z_Rif = zeros(1,r3DEL); +while i <= 3*r3DEL + % despiking Barrette Estensimetriche + X(:,cont) = filloutliers(Extensometer3D(:,i),'linear','movmedian',Num_Dati); + Y(:,cont) = filloutliers(Extensometer3D(:,i+1),'linear','movmedian',Num_Dati); + Z(:,cont) = filloutliers(Extensometer3D(:,i+2),'linear','movmedian',Num_Dati); + X_Rif(1,cont) = Dati3DExtensometerLink_Rif(:,i); + Y_Rif(1,cont) = Dati3DExtensometerLink_Rif(:,i+1); + Z_Rif(1,cont) = Dati3DExtensometerLink_Rif(:,i+2); + i = i+3; + cont = cont+1; +end + +if EL3D_Or == 123 + X_Corr = X; + Y_Corr = Y; + Z_Corr = Z; + X_Corr_Rif = X_Rif; + Y_Corr_Rif = Y_Rif; + Z_Corr_Rif = Z_Rif; +elseif EL3D_Or == 132 + X_Corr = X; + Y_Corr = Z; + Z_Corr = Y; + X_Corr_Rif = X_Rif; + Y_Corr_Rif = Z_Rif; + Z_Corr_Rif = Y_Rif; +elseif EL3D_Or == 213 + X_Corr = Y; + Y_Corr = X; + Z_Corr = Z; + X_Corr_Rif = Y_Rif; + Y_Corr_Rif = X_Rif; + Z_Corr_Rif = Z_Rif; +elseif EL3D_Or == 231 + X_Corr = Y; + Y_Corr = Z; + Z_Corr = X; + X_Corr_Rif = Y_Rif; + Y_Corr_Rif = Z_Rif; + Z_Corr_Rif = X_Rif; +elseif EL3D_Or == 312 + X_Corr = Z; + Y_Corr = X; + Z_Corr = Y; + X_Corr_Rif = Z_Rif; + Y_Corr_Rif = X_Rif; + Z_Corr_Rif = Y_Rif; +elseif EL3D_Or == 321 + X_Corr = Z; + Y_Corr = Y; + Z_Corr = X; + X_Corr_Rif = Z_Rif; + Y_Corr_Rif = Y_Rif; + Z_Corr_Rif = X_Rif; +end + +i = 1; +cont = 1; +while i <= 3*r3DEL + Extensometer3D(:,i) = X_Corr(:,cont); + Extensometer3D(:,i+1) = Y_Corr(:,cont); + Extensometer3D(:,i+2) = Z_Corr(:,cont); + Extensometer3D_Rif(1,i) = X_Corr_Rif(1,cont); + Extensometer3D_Rif(1,i+1) = Y_Corr_Rif(1,cont); + Extensometer3D_Rif(1,i+2) = Z_Corr_Rif(1,cont); + i = i+3; + cont = cont+1; +end + +text = 'Data of 3D Extensometer Link defined correctly. defDati3DEL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/defDatiAL.m b/ATD/defDatiAL.m new file mode 100755 index 0000000..7e0d558 --- /dev/null +++ b/ATD/defDatiAL.m @@ -0,0 +1,37 @@ + % funzione che definisce i dati per il sensore analogico, in particolare +% tempo (TimeAL) e ADC (ADCAnalog) + +function [TimeAL,ADCAnalog,ErrAnalogLink] = defDatiAL(DatiAnalogLink,ErrAnalogLink,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiAL function started'; +fprintf(fileID,fmt,text); + +[r,c] = size(DatiAnalogLink); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 2:c + check = isnan(DatiAnalogLink(a,b)); + if check == 1 + DatiAnalogLink(a,b) = DatiAnalogLink(a-1,b); + ErrAnalogLink(a,b-1) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = ['' num2str(Ncorr) ' NaN of Analog Link corrected by defDatiAL function']; +fprintf(fileID,fmt,text); + +TimeAL = DatiAnalogLink(:,1); % data +ADCAnalog = zeros(r,c-1); + +b = 2; % colonna del primo analog link +ADCAnalog(:,:) = DatiAnalogLink(:,b:end); % dati ADC Analog Link + +text = 'Data of Analog Link defined correctly. defDatiAL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end diff --git a/ATD/defDatiCrL.m b/ATD/defDatiCrL.m new file mode 100755 index 0000000..59d065d --- /dev/null +++ b/ATD/defDatiCrL.m @@ -0,0 +1,67 @@ +% funzione che definisce i dati per la Barretta Estensimetrica, in particolare +% tempo (TimeCrL) e Dato (Crack) + +function [TimeCrL,Crack,NTCCrack,ErrCrackLink] = defDatiCrL(DatiCrackLink,... + DatiNTCCrackLink,ErrCrackLink,ChCrL,CrL_NTC,rCrL,Ndatidespike,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiCrL function started'; +fprintf(fileID,fmt,text); + +[r,c] = size(DatiCrackLink); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 2:c + check = isnan(DatiCrackLink(a,b)); + if check == 1 + DatiCrackLink(a,b) = DatiCrackLink(a-1,b); + ErrCrackLink(a,b-1) = 1; + Ncorr = Ncorr+1; + end + if CrL_NTC(b-1) == 1 % La prima colonna è una data + check = isnan(DatiNTCCrackLink(a,b)); + if check == 1 + DatiNTCCrackLink(a,b) = DatiNTCCrackLink(a-1,b); + if ErrCrackLink(a,b-1) == 0 + ErrCrackLink(a,b-1) = 0.5; + else + ErrCrackLink(a,b-1) = 1; + end + Ncorr = Ncorr+1; + end + end + end +end + +text = ['' num2str(Ncorr) ' NaN of Crack Link corrected by defDatiCrL function']; +fprintf(fileID,fmt,text); + +TimeCrL = DatiCrackLink(:,1); % data +Crack = zeros(r,rCrL); +NTCCrack = zeros(r,rCrL); +b = 2; % colonna del primo dato +for s = 1:rCrL + Crack(:,s) = DatiCrackLink(:,b); + if ChCrL(s,1) == 1 || ChCrL(s,1) >= 2 % Solo fessurimetro + if CrL_NTC(s,1)==1 % si legge anche il termometro + NTCCrack(:,s) = DatiNTCCrackLink(:,b); % dati NTC + end + b = b+1; + end +end + +Num_Dati = Ndatidespike; % numero di dati per il despike +if Num_Dati > r + Num_Dati = r; +end +for i = 1:rCrL + % despiking accelerometri + Crack(1:end-1,i) = filloutliers(Crack(1:end-1,i),'linear','movmedian',Num_Dati); +end + +text = 'Data of Crack Link defined correctly. defDatiCrL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/defDatiEL.m b/ATD/defDatiEL.m new file mode 100755 index 0000000..7153e09 --- /dev/null +++ b/ATD/defDatiEL.m @@ -0,0 +1,70 @@ +% funzione che definisce i dati per la Barretta Estensimetrica, in particolare +% tempo (TimeEL) e Dato (Extensometer) + +function [TimeEL,Extensometer,NTCExtensometer,ErrExtensometerLink]... + = defDatiEL(DatiExtensometerLink,DatiNTCExtensometerLink,ErrExtensometerLink,... + ChEL,EL_NTC,rEL,Ndatidespike,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiEL function started'; +fprintf(fileID,fmt,text); + +[r,c] = size(DatiExtensometerLink); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 2:c + check = isnan(DatiExtensometerLink(a,b)); + if check == 1 + DatiExtensometerLink(a,b) = DatiExtensometerLink(a-1,b); + ErrExtensometerLink(a,b-1) = 1; + Ncorr = Ncorr+1; + end + if EL_NTC(b-1) == 1 % La prima colonna è una data + check = isnan(DatiNTCExtensometerLink(a,b)); + if check == 1 + DatiNTCExtensometerLink(a,b) = DatiNTCExtensometerLink(a-1,b); + if ErrExtensometerLink(a,b-1) == 0 + ErrExtensometerLink(a,b-1) = 0.5; + else + ErrExtensometerLink(a,b-1) = 1; + end + Ncorr = Ncorr+1; + end + end + end +end + +text = ['' num2str(Ncorr) ' NaN of Extensometer Link corrected by defDatiEL function']; +fprintf(fileID,fmt,text); + +TimeEL = DatiExtensometerLink(:,1); % data +Extensometer = zeros(r,rEL); +NTCExtensometer = zeros(r,rEL); + +b = 2; % colonna del primo dato +for s = 1:rEL + Extensometer(:,s) = DatiExtensometerLink(:,b); % dati Extensometer Link + if ChEL(s,1) == 1 || ChEL(s,1) >= 2 % Solo barretta estensimetrica + if EL_NTC(s,1)==1 % si legge anche il termometro + NTCExtensometer(:,s) = DatiNTCExtensometerLink(:,b); % dati Extensometer Link + end + b = b+1; + end +end + +Num_Dati = Ndatidespike; % numero di dati per il despike +if Num_Dati > r + Num_Dati = r; +end + +for i = 1:rEL + % despiking Barrette Estensimetriche + Extensometer(:,i) = filloutliers(Extensometer(:,i),'linear','movmedian',Num_Dati); +end + +text = 'Data of Extensometer Link defined correctly. defDatiEL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/defDatiLL.m b/ATD/defDatiLL.m new file mode 100755 index 0000000..ab8e4d8 --- /dev/null +++ b/ATD/defDatiLL.m @@ -0,0 +1,43 @@ +% funzione che definisce i dati per la Cella di Carico, in particolare +% tempo (TimeLL) e Dato (Load) + +function [TimeLL,Load,ErrLoadLink] = defDatiLL(DatiLoadLink,ErrLoadLink,... + Ndatidespike,rLL,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiLL function started'; +fprintf(fileID,fmt,text); + +[r,c] = size(DatiLoadLink); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 2:c + check = isnan(DatiLoadLink(a,b)); + if check == 1 + DatiLoadLink(a,b) = DatiLoadLink(a-1,b); + ErrLoadLink(a,b-1) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = ['' num2str(Ncorr) ' NaN of Load Link corrected by defDatiLL function']; +fprintf(fileID,fmt,text); + +TimeLL = DatiLoadLink(:,1); % data +Load = DatiLoadLink(:,2:end); % dati Load Link +Num_Dati = Ndatidespike; % numero di dati per il despike +if Num_Dati > r + Num_Dati = r; +end +for i = 1:rLL + % despiking accelerometri + Load(1:end-1,i) = filloutliers(Load(1:end-1,i),'linear','movmedian',Num_Dati); +end + +text = 'Data of Load Link defined correctly. . defDatiLL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/defDatiMPBEL.m b/ATD/defDatiMPBEL.m new file mode 100755 index 0000000..90e4554 --- /dev/null +++ b/ATD/defDatiMPBEL.m @@ -0,0 +1,37 @@ +% funzione che definisce i dati per la Cella di Carico, in particolare +% tempo (TimeMPBEL) e Dato (DatiMultiPointExtensometer) + +function [TimeMPBEL,DatiMPBEL,DatiNTC_MPBEL,ErrMultiPointExtensometer] = ... + defDatiMPBEL(DatiMultiPointExtensometer,DatiNTCMultiPointExtensometer,... + ErrMultiPointExtensometer,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiMPBEL function started'; +fprintf(fileID,fmt,text); + +[r,c] = size(DatiMultiPointExtensometer); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 2:c + check = isnan(DatiMultiPointExtensometer(a,b)); + if check == 1 + DatiMultiPointExtensometer(a,b) = DatiMultiPointExtensometer(a-1,b); + ErrMultiPointExtensometer(a,b-1) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = ['' num2str(Ncorr) ' NaN of Multi Point Extensometer Link corrected by defDatiMPBEL function']; +fprintf(fileID,fmt,text); + +TimeMPBEL = DatiMultiPointExtensometer(:,1); % data +DatiMPBEL = DatiMultiPointExtensometer(:,2:end); +DatiNTC_MPBEL = DatiNTCMultiPointExtensometer(:,2:end); + +text = 'Data of MultiPoint Borehole Rod Estensometer defined correctly. defDatiMPBEL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/defDatiPCL.m b/ATD/defDatiPCL.m new file mode 100755 index 0000000..e63942c --- /dev/null +++ b/ATD/defDatiPCL.m @@ -0,0 +1,67 @@ +function [TimePCL,accPCL,tempPCL,ErrPreConvLink] = defDatiPCL(DatiPreConvLink,... + ErrPreConvLink,Ndatidespike,rPCL,MEMS,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiPCL function started'; +fprintf(fileID,fmt,text); + +[r,c] = size(DatiPreConvLink); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 2:c + check = isnan(DatiPreConvLink(a,b)); + if check == 1 + DatiPreConvLink(a,b) = DatiPreConvLink(a-1,b); + ErrPreConvLink(a,b-1) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = ['' num2str(Ncorr) ' NaN of PreConv Link corrected by defDatiPCL function']; +fprintf(fileID,fmt,text); + +% Definisco Data (gg:mm:aaaa hh:mm), Batteria, i 3 dati di accelerometro +% e magnetometro e la Temperatura per la calibrazione +TimePCL = DatiPreConvLink(:,1); % data +accPCL = zeros(r,rPCL*3); % dati accelerometro +tempPCL = zeros(r,rPCL); % temperatura del nodo per la calibrazione +p = 4; % passo nella definizione dei dati +s = 1; + +for i = 1:rPCL + accPCL(:,s) = DatiPreConvLink(:,2+(i-1)*p); + accPCL(:,s+1) = DatiPreConvLink(:,3+(i-1)*p); + accPCL(:,s+2) = DatiPreConvLink(:,4+(i-1)*p); + s = s+3; + tempPCL(:,i) = DatiPreConvLink(:,5+(i-1)*p); + if MEMS == 2 + [rT,~] = size(tempPCL); + for j = 1:rT + if tempPCL(j,i) > 200 + tempPCL(j,i) = tempPCL(j,i) - 256; % Correzione della temperatura dei nuovi MEMS + end + end + end +end + +s = 1; +Num_Dati = Ndatidespike; % numero di dati per il despike +if Num_Dati > r + Num_Dati = r; +end +for i = 1:rPCL + % despiking accelerometri + accPCL(:,s) = filloutliers(accPCL(:,s),'linear','movmedian',Num_Dati); + accPCL(:,s+1) = filloutliers(accPCL(:,s+1),'linear','movmedian',Num_Dati); + accPCL(:,s+2) = filloutliers(accPCL(:,s+2),'linear','movmedian',Num_Dati); + s = s+3; +end + +text = 'Data of PreConv Link defined correctly. defDatiPCL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/defDatiPCLHR.m b/ATD/defDatiPCLHR.m new file mode 100755 index 0000000..cb79dc3 --- /dev/null +++ b/ATD/defDatiPCLHR.m @@ -0,0 +1,141 @@ +% Funzione che definisce angoli (ang_PCLHR), temperature (tempPCLHR), +% date (TimePCLHR) per i nodi di tipo PreConv Link HR + +function [TimePCLHR,angPCLHR,tempPCLHR,ErrPreConvLinkHR] = defDatiPCLHR(... + DatiPreConvLinkHR,ErrPreConvLinkHR,NodoPreConvLinkHR,Ndatidespike,rPCLHR,IDcentralina,... + DTcatena,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiPCLHR function started'; +fprintf(fileID,fmt,text); + +[r,c] = size(DatiPreConvLinkHR); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 2:c + check = isnan(DatiPreConvLinkHR(a,b)); + if check == 1 + DatiPreConvLinkHR(a,b) = DatiPreConvLinkHR(a-1,b); + ErrPreConvLinkHR(a,b-1) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = ['' num2str(Ncorr) ' NaN of PreConv Link HR corrected by defDatiPCLHR function']; +fprintf(fileID,fmt,text); + +% Definisco Data (gg:mm:aaaa hh:mm), Batteria, i 2 dati di accelerometro +% e la Temperatura +TimePCLHR = DatiPreConvLinkHR(:,1); % data +angPCLHR = zeros(r,rPCLHR*2); % dati angoli +controllo_PCLHR = zeros(r,rPCLHR*3); +tempPCLHR = zeros(r,rPCLHR); % temperatura del nodo per la calibrazione +ctl = 1; +p = 2; % passo +s = 1; +for i = 1:rPCLHR + angPCLHR(:,s_s+1) = DatiPreConvLinkHR(:,p:p+1); + s = s+2; + controllo_PCLHR(:,ctl:ctl+2) = DatiPreConvLinkHR(:,p+2:p+4); + ctl = ctl+3; + tempPCLHR(:,i) = DatiPreConvLinkHR(:,p+5); + p = p+6; +end + +s = 1; +Num_Dati = Ndatidespike; % numero di dati per il despike +if Num_Dati > r + Num_Dati = r; +end +for i = 1:rPCLHR + % despiking cella elettrolitica + angPCLHR(:,s) = filloutliers(angPCLHR(:,s),'linear','movmedian',Num_Dati); + angPCLHR(:,s+1) = filloutliers(angPCLHR(:,s+1),'linear','movmedian',Num_Dati); + s = s+2; +end + +%% !!! Controllo che le ampolle non siano fuori scala (32768) +AmpolleUpdate = ['' IDcentralina '-' DTcatena '-Ampolle.csv']; +Dati = csvread(AmpolleUpdate); +[rD,~] = size(Dati); +[rC,cC] = size(angPCLHR); +if rD ~= 0 + for j = 1:rC + for ii = 1:cC + segno1 = 0; + for a = 2:rD + if TimePCLHR(j,1) == Dati(a,1) + segno1 = sign(Dati(a-1,ii+1)); % segno del valore alla data precedente + break + end + end + if segno1 == 0 + if j == 1 + else + segno1 = sign(angPCLHR(j-1,ii)); % segno del valore alla data precedente + end + end + segno2 = sign(angPCLHR(j,ii)); % segno del valore alla data successiva + if segno2 ~= segno1 % se i due segni sono diversi + if abs(angPCLHR(j,ii)) > 15000 + if segno1 == 1 + angPCLHR(j,ii) = 32768 + (32768 + angPCLHR(j,ii)); % Fondo scala positivo + elseif segno1 == -1 + angPCLHR(j,ii) = -32768 + (-32768 + angPCLHR(j,ii)); % Fondo scala negativo + end + text = ['PreConv Link HR was out of range on node ' NodoPreConvLinkHR(ii/2,2) '']; + fprintf(fileID,fmt,text); + end + end + end + end + indice = 1; + for j=1:rC + if Dati(end,1) == TimePCLHR(j,1) + indice = j+1; + break + end + end +else + indice = 1; +end + +%% Controllo che l'ampolla non venga letta come MEMS! +index = 1; +nodo = 1; +for b = 1:rPCLHR % nodi + for a = 1:rC % date + if controllo_PCLHR(a,index)~=0 && controllo_PCLHR(a,index+1)~=0 && controllo_PCLHR(a,index+2)~=0 + if a == 1 + for aa = 2:rD + if TimePCLHR(a,1) == Dati(aa,1) + angPCLHR(a,2*nodo-1:2*nodo) = Dati(aa-1,2*nodo:2*nodo+1); % valore alla data precedente + break + end + end + else + angPCLHR(a,2*nodo-1:2*nodo) = angPCLHR(a-1,2*nodo-1:2*nodo); + end + ErrPreConvLinkHR(a,2*nodo-1:2*nodo) = 1; + end + end + index = index+3; + nodo = nodo+1; +end + +if isempty(indice) == 0 + datiHRH = [TimePCLHR(indice:end,1) angPCLHR(indice:end,:)]; + dat=isempty(datiHRH); + if dat==0 + delete(AmpolleUpdate); + csvwrite(AmpolleUpdate,datiHRH); + end +end + +text = 'Data of PreConv Link HR defined correctly. defDatiPCLHR function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/defDatiPL.m b/ATD/defDatiPL.m new file mode 100755 index 0000000..db3cdf1 --- /dev/null +++ b/ATD/defDatiPL.m @@ -0,0 +1,44 @@ +% funzione che definisce i dati per la Cella di Pressione, in particolare +% tempo (TimePL) e Dato + +function [TimePL,Pressure,ErrPressureLink] = defDatiPL(DatiPressureLink,... + ErrPressureLink,Ndatidespike,rPrL,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiPL function started'; +fprintf(fileID,fmt,text); + +[r,c] = size(DatiPressureLink); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 2:c + check = isnan(DatiPressureLink(a,b)); + if check == 1 + DatiPressureLink(a,b) = DatiPressureLink(a-1,b); + ErrPressureLink(a,b-1) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = ['' num2str(Ncorr) ' NaN of Pressure Link corrected by defDatiPL function']; +fprintf(fileID,fmt,text); + +TimePL = DatiPressureLink(:,1); % data +Pressure = DatiPressureLink(:,2:end); + +Num_Dati = Ndatidespike; % numero di dati per il despike +if Num_Dati > r + Num_Dati = r; +end +for i = 1:rPrL + % despiking + Pressure(1:end-1,i) = filloutliers(Pressure(1:end-1,i),'linear','movmedian',Num_Dati); +end + +text = 'Data of Pressure Link defined correctly. defDatiPL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/defDatiRL.m b/ATD/defDatiRL.m new file mode 100755 index 0000000..a0e4feb --- /dev/null +++ b/ATD/defDatiRL.m @@ -0,0 +1,66 @@ +function [TimeRL,accRL,tempRL,ErrRadialLink] = defDatiRL(DatiRadialLink,... + ErrRadialLink,Ndatidespike,rRL,MEMS,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiRL function started'; +fprintf(fileID,fmt,text); + +[r,c] = size(DatiRadialLink); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 2:c + check = isnan(DatiRadialLink(a,b)); + if check == 1 + DatiRadialLink(a,b) = DatiRadialLink(a-1,b); + ErrRadialLink(a,b-1) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = ['' num2str(Ncorr) ' NaN of Radial Link corrected by defDatiRL function']; +fprintf(fileID,fmt,text); + +% Definisco Data (gg:mm:aaaa hh:mm), Batteria, i 3 dati di accelerometro +% e magnetometro e la Temperatura per la calibrazione +TimeRL = DatiRadialLink(:,1); % data +accRL = zeros(r,rRL*3); % dati accelerometro +tempRL = zeros(r,rRL); % temperatura del nodo per la calibrazione +p = 4; % passo nella definizione dei dati +s = 1; + +for i = 1:rRL + accRL(:,s) = DatiRadialLink(:,2+(i-1)*p); + accRL(:,s+1) = DatiRadialLink(:,3+(i-1)*p); + accRL(:,s+2) = DatiRadialLink(:,4+(i-1)*p); + s = s+3; + tempRL(:,i) = DatiRadialLink(:,5+(i-1)*p); + [rT,~] = size(tempRL); + if MEMS == 2 + for j = 1:rT + if tempRL(j,i) > 200 + tempRL(j,i) = tempRL(j,i) - 256; % Correzione della temperatura dei nuovi MEMS + end + end + end +end + +s = 1; +Num_Dati = Ndatidespike; % numero di dati per il despike +if Num_Dati > r + Num_Dati = r; +end +for i = 1:rRL + % despiking accelerometri + accRL(:,s) = filloutliers(accRL(:,s),'linear','movmedian',Num_Dati); + accRL(:,s+1) = filloutliers(accRL(:,s+1),'linear','movmedian',Num_Dati); + accRL(:,s+2) = filloutliers(accRL(:,s+2),'linear','movmedian',Num_Dati); + s = s+3; +end + +text = 'Data of Radial Link defined correctly. defDatiRL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/defDatiSM.m b/ATD/defDatiSM.m new file mode 100755 index 0000000..ec47dec --- /dev/null +++ b/ATD/defDatiSM.m @@ -0,0 +1,67 @@ +% funzione che definisce i dati per la Barretta Estensimetrica, in particolare +% tempo e Dato + +function [TimeSM,Stress,NTCStress,ErrStressMeter] = defDatiSM(DatiStressMeter,... + DatiNTCStressMeter,ErrStressMeter,ChSM,SM_NTC,rSM,Ndatidespike,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiSM function started'; +fprintf(fileID,fmt,text); + +[r,c] = size(DatiStressMeter); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 2:c + check = isnan(DatiStressMeter(a,b)); + if check == 1 + DatiStressMeter(a,b) = DatiStressMeter(a-1,b); + ErrStressMeter(a,b-1) = 1; + Ncorr = Ncorr+1; + end + if SM_NTC(b-1) == 1 % La prima colonna è una data + check = isnan(DatiNTCStressMeter(a,b)); + if check == 1 + DatiNTCStressMeter(a,b) = DatiNTCStressMeter(a-1,b); + if ErrStressMeter(a,b-1) == 0 + ErrStressMeter(a,b-1) = 0.5; + else + ErrStressMeter(a,b-1) = 1; + end + Ncorr = Ncorr+1; + end + end + end +end + +text = ['' num2str(Ncorr) ' NaN of Stress Meter corrected by defDatiSM function']; +fprintf(fileID,fmt,text); + +TimeSM = DatiStressMeter(:,1); % data +Stress = zeros(r,rSM); +NTCStress = zeros(r,rSM); +b = 2; % colonna del primo dato +for s = 1:rSM + Stress(:,s) = DatiStressMeter(:,b); % dati + if ChSM(s,1) == 1 || ChSM(s,1) >= 2 %Solo Stress M + if SM_NTC(s,1)==1 % si legge anche il termometro + NTCStress(:,s) = DatiNTCStressMeter(:,b); % dati NTC + end + b = b+1; + end +end + +Num_Dati = Ndatidespike; % numero di dati per il despike +if Num_Dati > r + Num_Dati = r; +end +for i = 1:rSM + % despiking accelerometri + Stress(:,i) = filloutliers(Stress(:,i),'linear','movmedian',Num_Dati); +end + +text = 'Data of Stress Meter defined correctly. defDatiSM function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/defDatiTLH.m b/ATD/defDatiTLH.m new file mode 100755 index 0000000..637fc07 --- /dev/null +++ b/ATD/defDatiTLH.m @@ -0,0 +1,69 @@ +% Funzione che definisce accelerazioni (accTLH), dati magnetici (magTLH), +% temperature (tempTLH), date (TimeTLH)per i nodi di tipo Tilt Link H + +function [TimeTLH,accTLH,tempTLH,ErrTiltLinkH] = defDatiTLH(... + DatiTiltLinkH,ErrTiltLinkH,Ndatidespike,rTLH,MEMS,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiTLH function started'; +fprintf(fileID,fmt,text); + +[r,c] = size(DatiTiltLinkH); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 2:c + check = isnan(DatiTiltLinkH(a,b)); + if check == 1 + DatiTiltLinkH(a,b) = DatiTiltLinkH(a-1,b); + ErrTiltLinkH(a,b-1) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = ['' num2str(Ncorr) ' NaN of Tilt Link H corrected by defDatiTLH function']; +fprintf(fileID,fmt,text); + +TimeTLH = DatiTiltLinkH(:,1); % data +accTLH = zeros(r,rTLH*3); % dati accelerometro +tempTLH = zeros(r,rTLH); % temperatura del nodo per la calibrazione +p = 4; % passo nella definizione dei dati +s = 1; + +for i = 1:rTLH + accTLH(:,s) = DatiTiltLinkH(:,2+(i-1)*p); + accTLH(:,s+1) = DatiTiltLinkH(:,3+(i-1)*p); + accTLH(:,s+2) = DatiTiltLinkH(:,4+(i-1)*p); + s = s+3; + tempTLH(:,i) = DatiTiltLinkH(:,5+(i-1)*p); + if MEMS == 2 + [rT,~] = size(tempTLH); + for j = 1:rT + if tempTLH(j,i) > 200 + tempTLH(j,i) = tempTLH(j,i) - 256; % Correzione della temperatura dei nuovi MEMS + end + end + end +end + +s = 1; +Num_Dati = Ndatidespike; % numero di dati per il despike +if Num_Dati > r + Num_Dati = r; +end + +for i = 1:rTLH + % despiking accelerometri + accTLH(:,s) = filloutliers(accTLH(:,s),'linear','movmedian',Num_Dati); + accTLH(:,s+1) = filloutliers(accTLH(:,s+1),'linear','movmedian',Num_Dati); + accTLH(:,s+2) = filloutliers(accTLH(:,s+2),'linear','movmedian',Num_Dati); + s = s+3; +end + +text = 'Data of Tilt Link H defined correctly. defDatiTLH function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/defDatiTLHRH.m b/ATD/defDatiTLHRH.m new file mode 100755 index 0000000..05e7b37 --- /dev/null +++ b/ATD/defDatiTLHRH.m @@ -0,0 +1,142 @@ +% Funzione che definisce angoli (acc_TLHRH), temperature (tempTLHRH), +% date (TimeTLHRH) e livello della batteria (BattTLHRH) per i nodi di tipo +% Tilt Link HR H + +function [TimeTLHRH,angTLHRH,tempTLHRH,ErrTiltLinkHRH] = defDatiTLHRH(... + DatiTiltLinkHRH,ErrTiltLinkHRH,Ndatidespike,NodoTiltLinkHRH,rTLHRH,... + IDcentralina,DTcatena,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiTLHRH function started'; +fprintf(fileID,fmt,text); + +[r,c]=size(DatiTiltLinkHRH); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 2:c + check = isnan(DatiTiltLinkHRH(a,b)); + if check == 1 + DatiTiltLinkHRH(a,b) = DatiTiltLinkHRH(a-1,b); + ErrTiltLinkHRH(a,b-1) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = [num2str(Ncorr) ' NaN of Tilt Link HR H corrected by defDatiTLHRH function']; +fprintf(fileID,fmt,text); + +TimeTLHRH = DatiTiltLinkHRH(:,1); % data +angTLHRH = zeros(r,rTLHRH*2); % dati accelerometro +controllo_TLHRH = zeros(r,rTLHRH*3); +tempTLHRH = zeros(r,rTLHRH); % temperatura del nodo per la calibrazione +ctl = 1; +p = 2; % passo +s = 1; +for i = 1:rTLHRH + angTLHRH(:,s:s+1) = DatiTiltLinkHRH(:,p:p+1); + s = s+2; + controllo_TLHRH(:,ctl:ctl+2) = DatiTiltLinkHRH(:,p+2:p+4); + ctl = ctl+3; + tempTLHRH(:,i) = DatiTiltLinkHRH(:,p+5); + p = p+6; +end + +s = 1; +Num_Dati = Ndatidespike; % numero di dati per il despike +if Num_Dati > r + Num_Dati = r; +end + +for i = 1:rTLHRH + % despiking + angTLHRH(:,s) = filloutliers(angTLHRH(:,s),'linear','movmedian',Num_Dati); + angTLHRH(:,s+1) = filloutliers(angTLHRH(:,s+1),'linear','movmedian',Num_Dati); + s = s+2; +end + +%% !!! Controllo che le ampolle non siano fuori scala (32768) +AmpolleUpdate = ['' IDcentralina '-' DTcatena '-Ampolle.csv']; +Dati = csvread(AmpolleUpdate); +[rD,~] = size(Dati); +[rC,cC] = size(angTLHRH); +if rD ~= 0 + for j = 1:rC + for ii = 1:cC + segno1 = 0; + for a = 2:rD + if TimeTLHRH(j,1) == Dati(a,1) + segno1 = sign(Dati(a-1,ii+1)); % segno del valore alla data precedente + break + end + end + if segno1 == 0 + if j == 1 + else + segno1 = sign(angTLHRH(j-1,ii)); % segno del valore alla data precedente + end + end + segno2 = sign(angTLHRH(j,ii)); % segno del valore alla data successiva + if segno2 ~= segno1 % se i due segni sono diversi + if abs(angTLHRH(j,ii)) > 15000 + if segno1 == 1 + angTLHRH(j,ii) = 32768 + (32768 + angTLHRH(j,ii)); % Fondo scala positivo + elseif segno1 == -1 + angTLHRH(j,ii) = -32768 + (-32768 + angTLHRH(j,ii)); % Fondo scala negativo + end + text = ['Tilt Link HR H was out of range on node ' NodoTiltLinkHRH(ii/2,2) '']; + fprintf(fileID,fmt,text); + end + end + end + end + indice = 1; + for j=1:rC + if Dati(end,1) == TimeTLHRH(j,1) + indice = j+1; + break + end + end +else + indice = 1; +end + +%% Controllo che l'ampolla non venga letta come MEMS! +index = 1; +nodo = 1; +for b = 1:rTLHRH % nodi + for a = 1:rC % date + if controllo_TLHRH(a,index)~=0 && controllo_TLHRH(a,index+1)~=0 && controllo_TLHRH(a,index+2)~=0 + if a == 1 + for aa = 2:rD + if TimeTLHRH(a,1) == Dati(aa,1) + angTLHRH(a,2*nodo-1:2*nodo) = Dati(aa-1,2*nodo:2*nodo+1); % valore alla data precedente + break + end + end + else + angTLHRH(a,2*nodo-1:2*nodo) = angTLHRH(a-1,2*nodo-1:2*nodo); + end + ErrTiltLinkHRH(a,2*nodo-1:2*nodo) = 1; + end + end + index = index+3; + nodo = nodo+1; +end + +if isempty(indice) == 0 + datiHRH = [TimeTLHRH(indice:end,1) angTLHRH(indice:end,:)]; + dat=isempty(datiHRH); + if dat==0 + delete(AmpolleUpdate); + csvwrite(AmpolleUpdate,datiHRH); + end +end + +text = 'Data of Tilt Link HR H defined correctly. defDatiTLHRH function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/defDatiTuL.m b/ATD/defDatiTuL.m new file mode 100755 index 0000000..54d272f --- /dev/null +++ b/ATD/defDatiTuL.m @@ -0,0 +1,83 @@ +function [TimeTuL,accTuL,tempTuL,ay_TuL,ay_TuL_AC,ErrTunnelLink] = defDatiTuL(... + DatiTunnelLink,ay_TuL,ay_TuL_AC,Ndatidespike,rTuL,NuovoZeroTuL,ErrTunnelLink,MEMS,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiTuL function started'; +fprintf(fileID,fmt,text); + +[r,c] = size(DatiTunnelLink); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 2:c + check = isnan(DatiTunnelLink(a,b)); + if check == 1 + DatiTunnelLink(a,b) = DatiTunnelLink(a-1,b); + ErrTunnelLink(a,b-1) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = ['' num2str(Ncorr) ' NaN of Tunnel Link corrected by defDatiTuL function']; +fprintf(fileID,fmt,text); + +% Definisco Data (gg:mm:aaaa hh:mm), i 3 dati di accelerometro +% e magnetometro e la Temperatura per la calibrazione +TimeTuL = DatiTunnelLink(:,1); % data +accTuL = zeros(r,rTuL*3); % dati accelerometro +tempTuL = zeros(r,rTuL); % temperatura del nodo per la calibrazione +p = 4; % passo nella definizione dei dati +s = 1; + +for i = 1:rTuL + accTuL(:,s) = DatiTunnelLink(:,2+(i-1)*p); + accTuL(:,s+1) = DatiTunnelLink(:,3+(i-1)*p); + accTuL(:,s+2) = DatiTunnelLink(:,4+(i-1)*p); + s = s+3; + tempTuL(:,i) = DatiTunnelLink(:,5+(i-1)*p); + [rT,~] = size(tempTuL); + if MEMS == 2 + for j = 1:rT + if tempTuL(j,i) > 200 + tempTuL(j,i) = tempTuL(j,i) - 256; % Correzione della temperatura dei nuovi MEMS + end + end + end +end + +s = 1; +Num_Dati = Ndatidespike; % numero di dati per il despike +if Num_Dati > r + Num_Dati = r; +end + +[rAC,~]=size(ay_TuL); +y = 1; +Num_Dati_AC = Ndatidespike; % numero di dati per il despike +if Num_Dati_AC > rAC + Num_Dati_AC = rAC; +end + +ay_TuL = ay_TuL'; +ay_TuL_AC = ay_TuL_AC'; +for i = 1:rTuL + % despiking accelerometri + accTuL(:,s) = filloutliers(accTuL(:,s),'linear','movmedian',Num_Dati); + accTuL(:,s+1) = filloutliers(accTuL(:,s+1),'linear','movmedian',Num_Dati); + accTuL(:,s+2) = filloutliers(accTuL(:,s+2),'linear','movmedian',Num_Dati); + s = s+3; + if NuovoZeroTuL == 1 + % despiking dati ay di riferimento + ay_TuL(:,y) = filloutliers(ay_TuL(:,y),'linear','movmedian',Num_Dati_AC); + ay_TuL_AC(:,y) = filloutliers(ay_TuL_AC(:,y),'linear','movmedian',Num_Dati_AC); + y = y+1; + end +end + +text = 'Data of Tunnel Link defined correctly. defDatiTuL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/defDatiTuL_Dati.m b/ATD/defDatiTuL_Dati.m new file mode 100755 index 0000000..1a936e8 --- /dev/null +++ b/ATD/defDatiTuL_Dati.m @@ -0,0 +1,93 @@ +function [TimeTuL,accTuL,magTuL,tempTuL,ay_TuL,ay_TuL_AC,ErrTunnelLink] = defDatiTuL_Dati(... + DatiTunnelLink,ay_TuL,ay_TuL_AC,Ndatidespike,rTuL,NuovoZeroTuL,ErrTunnelLink,MEMS,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiTuL function started'; +fprintf(fileID,fmt,text); + +[r,c] = size(DatiTunnelLink); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 2:c + check = isnan(DatiTunnelLink(a,b)); + if check == 1 + DatiTunnelLink(a,b) = DatiTunnelLink(a-1,b); + ErrTunnelLink(a,b-1) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = ['' num2str(Ncorr) ' NaN of Tunnel Link corrected by defDatiTuL function']; +fprintf(fileID,fmt,text); + +% Definisco Data (gg:mm:aaaa hh:mm), i 3 dati di accelerometro +% e magnetometro e la Temperatura per la calibrazione +TimeTuL = DatiTunnelLink(:,1); % data +accTuL = zeros(r,rTuL*3); % dati accelerometro +magTuL = zeros(r,rTuL*3); % dati accelerometro +tempTuL = zeros(r,rTuL); % temperatura del nodo per la calibrazione +p = 7; % passo nella definizione dei dati +s = 1; + +for i = 1:rTuL + accTuL(:,s) = DatiTunnelLink(:,2+(i-1)*p); + accTuL(:,s+1) = DatiTunnelLink(:,3+(i-1)*p); + accTuL(:,s+2) = DatiTunnelLink(:,4+(i-1)*p); + magTuL(:,s) = DatiTunnelLink(:,5+(i-1)*p); + magTuL(:,s+1) = DatiTunnelLink(:,6+(i-1)*p); + magTuL(:,s+2) = DatiTunnelLink(:,7+(i-1)*p); + s = s+3; + tempTuL(:,i) = DatiTunnelLink(:,8+(i-1)*p); + [rT,~] = size(tempTuL); + if MEMS == 2 + for j = 1:rT + if tempTuL(j,i) > 200 + tempTuL(j,i) = tempTuL(j,i) - 256; % Correzione della temperatura dei nuovi MEMS + end + end + end +end + +s = 1; +Num_Dati = Ndatidespike; % numero di dati per il despike +if Num_Dati > r + Num_Dati = r; +end + +[rAC,~]=size(ay_TuL); +y = 1; +Num_Dati_AC = Ndatidespike; % numero di dati per il despike +if Num_Dati_AC > rAC + Num_Dati_AC = rAC; +end + +xlswrite('Dati.xlsx',accTuL,2); +xlswrite('Dati.xlsx',magTuL,3); + +ay_TuL = ay_TuL'; +ay_TuL_AC = ay_TuL_AC'; +for i = 1:rTuL + % despiking accelerometri + accTuL(:,s) = filloutliers(accTuL(:,s),'linear','movmedian',Num_Dati); + accTuL(:,s+1) = filloutliers(accTuL(:,s+1),'linear','movmedian',Num_Dati); + accTuL(:,s+2) = filloutliers(accTuL(:,s+2),'linear','movmedian',Num_Dati); + magTuL(:,s) = filloutliers(magTuL(:,s),'linear','movmedian',Num_Dati); + magTuL(:,s+1) = filloutliers(magTuL(:,s+1),'linear','movmedian',Num_Dati); + magTuL(:,s+2) = filloutliers(magTuL(:,s+2),'linear','movmedian',Num_Dati); + s = s+3; + if NuovoZeroTuL == 1 + % despiking dati ay di riferimento + ay_TuL(:,y) = filloutliers(ay_TuL(:,y),'linear','movmedian',Num_Dati_AC); + ay_TuL_AC(:,y) = filloutliers(ay_TuL_AC(:,y),'linear','movmedian',Num_Dati_AC); + y = y+1; + end +end + +text = 'Data of Tunnel Link defined correctly. defDatiTuL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/defDatiWEL.m b/ATD/defDatiWEL.m new file mode 100755 index 0000000..25f839a --- /dev/null +++ b/ATD/defDatiWEL.m @@ -0,0 +1,70 @@ +% funzione che definisce i dati per la Barretta Estensimetrica, in particolare +% tempo (TimeEL) e Dato (Extensometer) + +function [TimeWEL,WireExtensometer,NTCWireExtensometer,ErrWireExtensometerLink]... + = defDatiWEL(DatiWireExtensometerLink,DatiNTCWireExtensometerLink,... + ErrWireExtensometerLink,ChWEL,WEL_NTC,rWEL,Ndatidespike,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiWEL function started'; +fprintf(fileID,fmt,text); + +[r,c] = size(DatiWireExtensometerLink); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 2:c + check = isnan(DatiWireExtensometerLink(a,b)); + if check == 1 + DatiWireExtensometerLink(a,b) = DatiWireExtensometerLink(a-1,b); + ErrWireExtensometerLink(a,b-1) = 1; + Ncorr = Ncorr+1; + end + if WEL_NTC(b-1) == 1 % La prima colonna è una data + check = isnan(DatiNTCWireExtensometerLink(a,b)); + if check == 1 + DatiNTCWireExtensometerLink(a,b) = DatiNTCWireExtensometerLink(a-1,b); + if ErrWireExtensometerLink(a,b-1) == 0 + ErrWireExtensometerLink(a,b-1) = 0.5; + else + ErrWireExtensometerLink(a,b-1) = 1; + end + Ncorr = Ncorr+1; + end + end + end +end + +text = ['' num2str(Ncorr) ' NaN of Wire Extensometer Link corrected by defDatiWEL function']; +fprintf(fileID,fmt,text); + +TimeWEL = DatiWireExtensometerLink(:,1); % data +WireExtensometer = zeros(r,rWEL); % dati Wire Extensometer Link +NTCWireExtensometer = zeros(r,rWEL); + +b = 2; % colonna del primo dato +for s = 1:rWEL + WireExtensometer(:,s) = DatiWireExtensometerLink(:,b); % dati Wire Extensometer Link + if ChWEL(s,1) == 1 || ChWEL(s,1) >= 2 % Solo estensimetro + if WEL_NTC(s,1)==1 % si legge anche il termometro + NTCWireExtensometer(:,s) = DatiNTCWireExtensometerLink(:,b); % dati Extensometer Link + end + b = b+1; + end +end + +Num_Dati = Ndatidespike; % numero di dati per il despike +if Num_Dati > r + Num_Dati = r; +end + +for i = 1:rWEL + % despiking Barrette Estensimetriche + WireExtensometer(1:end-1,i) = filloutliers(WireExtensometer(1:end-1,i),'linear','movmedian',Num_Dati); +end + +text = 'Data of Wire Extensometer Link defined correctly. defDatiWEL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/ATD/elab2D_PCL.m b/ATD/elab2D_PCL.m new file mode 100755 index 0000000..375494c --- /dev/null +++ b/ATD/elab2D_PCL.m @@ -0,0 +1,621 @@ +function [Y_PCL,Z_PCL,Ylocal_PCL,Zlocal_PCL,AlfaX_PCL,AlfaY_PCL,TempDef_PCL,... + speed_PCL,speed_local_PCL,acceleration_PCL,acceleration_local_PCL,ARRAYdate_PCL,... + ErrPreConvLink] = elab2D_PCL(IDcentralina,DTcatena,rPCL,accPCL,ACCdefRis_PCL,... + TempDef_PCL,SpePCL,tolleranzaAcc,DatiElabPreConvLink,Ndevst,Wdevst,ARRAYdate_PCL,... + NuovoZeroPCL,NdatiMedia,Ndatidespike,ErrPreConvLink,margine,elab_option,... + Tmax,Tmin,datainiPCL,FileName) + +%% Inizializzazione +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'elab2D_PCL function started'; +fprintf(fileID,fmt,text); + +if NuovoZeroPCL == 1 + if NdatiMedia > Ndatidespike + Ndati = NdatiMedia; + else + Ndati = Ndatidespike; + end + ini = round(Ndati/2)+1; + if rem(Ndati,2) == 0 + ini = ini+1; + end + clear NDati + ini = ini + margine; + if ini < 6 + ini = 6; + end + if Ndevst ~= 0 % Allora prendo tutti i dati e solo in seguito considero i nuovi, a valle della funzione filtro + ini = 1; + end + accPCL = accPCL(ini:end,:); + ACCdefRis_PCL = ACCdefRis_PCL(ini:end,:); + TempDef_PCL = TempDef_PCL(ini:end,:); + DatiElabPreConvLink = DatiElabPreConvLink(ini:end,:); + ARRAYdate_PCL = ARRAYdate_PCL(ini:end,1); + ErrPreConvLink = ErrPreConvLink(ini:end,:); +end + +%% Definisco i dati +Nnodi = rPCL; +% Spacchetto +[r,~] = size(accPCL); % Numero di dati +[Ndati,~] = size(ARRAYdate_PCL); +ax = zeros(r,Nnodi); +ay = zeros(r,Nnodi); +for i=1:Nnodi + ax(:,i) = accPCL(:,(i-1)*3+1); % ax + ay(:,i) = accPCL(:,(i-1)*3+2); % ay +end +ax = ax'; % riga nodi, colonna date +ay = ay'; % riga nodi, colonna date + +%% Costruzione delle matrici + +% Dati locali +asseY_PCL = zeros(Nnodi,Ndati); % Raccoglie i dati planari locali nella direzione di sviluppo della catena +asseZ_PCL = zeros(Nnodi,Ndati); % Raccoglie i dati planari locali nella direzione di sviluppo della catena, basso->alto + +% Dati cumulati +Y_PCL = zeros(Nnodi,Ndati); % Raccoglie i dati cumulati nella direzione di sviluppo della catena +Z_PCL = zeros(Nnodi,Ndati); % Raccoglie i dati cumulati nella direzione di sviluppo della catena, basso->alto + +AlfaX_PCL = zeros(Nnodi,Ndati); +AlfaY_PCL = zeros(Nnodi,Ndati); % + +% parametri per il calcolo +SpePCL = SpePCL(2:end,1); % valori segmenti di pertinenza + +% Inizio del ciclo di elaborazione +text = 'Elaboration of PreConv Link started'; +fprintf(fileID,fmt,text); + +for jj = 1:Ndati + if jj == 1 % al primo dato raccolto riporto i punti di calcolo sui punti noti + % INPUT SITO SPECIFICO DA DARE !!! + fclose(fileID); + if NuovoZeroPCL == 0 + [cYo,cZo,~,~] = punti_noti_PCL(elab_option,... + IDcentralina,DTcatena,FileName); + elseif NuovoZeroPCL == 1 % calcolo a partire da dati già elaborati a cui mi riferisco + [cYo,cZo,~,~] = punti_noti_exe_PCL(asseY_PCL,... + DatiElabPreConvLink,elab_option,FileName); + end + for ii = 1:Nnodi + [Y_PCL,Z_PCL,asseY_PCL,asseZ_PCL,AlfaX_PCL,AlfaY_PCL] = CalcoloBiax_PCL(SpePCL,... + ii,jj,ax,ay,asseY_PCL,asseZ_PCL,Y_PCL,Z_PCL,... + AlfaX_PCL,AlfaY_PCL,elab_option,rPCL,IDcentralina,DTcatena); + end + [shiftY_PCL,shiftZ_PCL] = pos_ini_PCL(cYo,cZo,Y_PCL,Z_PCL); + else + for ii = 1:Nnodi + [Y_PCL,Z_PCL,asseY_PCL,asseZ_PCL,AlfaX_PCL,AlfaY_PCL] = CalcoloBiax_PCL(SpePCL,... + ii,jj,ax,ay,asseY_PCL,asseZ_PCL,Y_PCL,Z_PCL,... + AlfaX_PCL,AlfaY_PCL,elab_option,rPCL,IDcentralina,DTcatena); + end + end + % riporto Y e Z sui punti noti + Y_PCL(:,jj) = Y_PCL(:,jj) - shiftY_PCL(:,1); + Z_PCL(:,jj) = Z_PCL(:,jj) - shiftZ_PCL(:,1); +end + +Yrif = Y_PCL; % mi serve dopo +Zrif = Z_PCL; % mi serve dopo +dY_PCL = diff(asseY_PCL,1,2); +dZ_PCL = diff(asseZ_PCL,1,2); + +%% Controllo della risultante delle accelerazioni +clear r +clear rr +clear c +clear cc +ACCdefRis_PCL = ACCdefRis_PCL'; % Nodi in riga, date in colonna +[r,c] = size(ACCdefRis_PCL); +[rr,cc] = size(Y_PCL); + +% controllo che le matrici con le risultanti delle accelerazioni e +% le matrici con i dati di spostamento abbiano le stesse dimensioni +if r~=rr || c~=cc + text = 'Warning! Displacement data and g vector have not the same size!'; +else + text = 'There are not warning for PreConv Link'; +end +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +clear i +clear j +cont = 1; % contatore +cont2 = 1; % contatore +cont3 = 1; % contatore +TempDef_PCL = TempDef_PCL'; +text1 = 'There are not correction of PreConv Link based on acceleration vector filter'; +text2 = 'There are not correction of PreConv Link based on uncalibrated Acceleration vector'; +text3 = 'There are not correction of PreConv Link based on temperature filter'; +for j = 2:c % data + for i = 1:r % nodo + % se il valore assoluto della differenza è maggiore della + % tolleranza, pongo gli spostamenti giornalieri pari a 0 + if abs(ACCdefRis_PCL(i,j)-ACCdefRis_PCL(i,j-1)) > tolleranzaAcc + dY_PCL(i,j-1) = 0; + dZ_PCL(i,j-1) = 0; + text1 = ['' num2str(cont) ' correction executed for PreConv Link - Acceleration vector filter!']; + cont = cont+1; + end + if ACCdefRis_PCL(i,j) < 0.9 || ACCdefRis_PCL(i,j) > 1.1 % Il nodo è fuori taratura! + dY_PCL(i,j-1) = 0; + dZ_PCL(i,j-1) = 0; + TempDef_PCL(i,j) = TempDef_PCL(i,j-1); + text2 = ['' num2str(cont3) ' correction executed for PreConv Link - uncalibrated Acceleration vector!']; + cont3 = cont3+1; + end + end +end + +FileTemperature = ['' IDcentralina '-' DTcatena '-PCL-Therm.csv']; +if isfile(FileTemperature) == 1 + DatiRaw = csvread(FileTemperature); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; +else + rDR = 1; + cDR = 1; +end +for b = 1:c % Data + for a = 1:r % Nodo + % NON considero i dati al di sopra dei 80 °C o al di sotto dei -30 °C! + if TempDef_PCL(a,b) > Tmax || TempDef_PCL(a,b) < Tmin + cont2 = cont2+1; + if b == 1 + if isfile(FileTemperature) == 1 + RawDate = find(DatiRaw(:,1)<=datenum(datainiPCL)); + if isempty(RawDate) == 1 + cc = 2; + while cc <= c + if TempDef_PCL(a,cc) > Tmax || TempDef_PCL(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_PCL(a,b) = TempDef_PCL(a,cc); + else + if isnan(DatiRaw(RawDate(end),a+1)) == 0 + TempDef_PCL(a,b) = DatiRaw(RawDate(end),a+1); + ErrPreConvLink(b,a) = 0.5; + wardat = 'Temperature data of PreConv Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + else + cc = 2; + while cc <= c + if TempDef_PCL(a,cc) > Tmax || TempDef_PCL(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_PCL(a,b) = TempDef_PCL(a,cc); + end + end + else + cc = 2; + while cc <= c + if TempDef_PCL(a,cc) > Tmax || TempDef_PCL(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_PCL(a,b) = TempDef_PCL(a,cc); + end + else + TempDef_PCL(a,b) = TempDef_PCL(a,b-1); + dY_PCL(a,b-1) = 0; + dZ_PCL(a,b-1) = 0; + ErrPreConvLink(b,a) = 0.5; + end + text3 = ['' num2str(cont2) ' correction executed for PreConv Link - Temperature filter!']; + end + end +end + +if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=ARRAYdate_PCL(1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(ARRAYdate_PCL(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(ARRAYdate_PCL(:,1)>DatiRaw(RawDate1(end)+1,1)); + end +else + RawDate1 = []; + RawDate2 = 1; +end +if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:); ARRAYdate_PCL(RawDate2(1):end) TempDef_PCL(:,RawDate2(1):end)']; +elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = [ARRAYdate_PCL TempDef_PCL']; +else + Dati = DatiRaw; +end +% Elimino appoggio più vecchio di un mese +RawDate3 = find(Dati(:,1) Ndatidespike + NdatiF = NdatiMedia; + else + NdatiF = Ndatidespike; + end + ini = round(NdatiF/2)+1; + if rem(NdatiF,2) == 0 + ini = ini+1; + end + clear NDatiF + iniST = round(Wdevst/2); + if rem(Wdevst,2) == 0 + iniST = iniST+1; + end + iniST = iniST + margine; + if iniST > ini + ini = iniST; + end + if ini < 6 + ini = 6; + end + dY_PCL = dY_PCL(:,ini:end); + dZ_PCL = dZ_PCL(:,ini:end); + TempDef_PCL = TempDef_PCL(ini:end,:); + DatiElabPreConvLink = DatiElabPreConvLink(ini:end,:); + ARRAYdate_PCL = ARRAYdate_PCL(ini:end,1); + ErrPreConvLink = ErrPreConvLink(ini:end,:); +end + +%% Finalizzo i calcoli +[rx,cx] = size(dZ_PCL); +% totale del singolo nodo data per data +sommaY_PCL = zeros(rx,cx+1); +sommaZ_PCL = zeros(rx,cx+1); +% cumulata del singolo nodo data per data in posizione assoluta +% il primo valore è quello di posizione assoluta iniziale +Y_PCL = zeros(rx,cx+1); +Z_PCL = zeros(rx,cx+1); +% cumulata del singolo nodo data per data in posizione relativa +% il primo valore è quello di posizione assoluta iniziale +Ylocal_PCL = zeros(Nnodi,Ndati); +Zlocal_PCL = zeros(Nnodi,Ndati); +speed_PCL = zeros(Nnodi,Ndati); +speed_local_PCL = zeros(Nnodi,Ndati); +acceleration_PCL = zeros(Nnodi,Ndati); +acceleration_local_PCL = zeros(Nnodi,Ndati); + +if NuovoZeroPCL == 1 + [rE,cE] = size(DatiElabPreConvLink); + cont = 3; + contINV = 10; + n = 1; + while cont<=cE + if elab_option == 1 + sommaY_PCL(n,1) = cell2mat(DatiElabPreConvLink(1,cont))'; + Ylocal_PCL(n,1) = sommaY_PCL(n,1); + sommaZ_PCL(n,1) = cell2mat(DatiElabPreConvLink(1,cont+1))'; + Zlocal_PCL(n,1) = sommaZ_PCL(n,1); + Y_PCL(n,1) = cell2mat(DatiElabPreConvLink(1,cont+2))'; + Z_PCL(n,1) = cell2mat(DatiElabPreConvLink(1,cont+3))'; + speed_local_PCL(n,1:rE) = cell2mat(DatiElabPreConvLink(:,cont+7))'; + speed_PCL(n,1:rE) = cell2mat(DatiElabPreConvLink(:,cont+8))'; + acceleration_local_PCL(n,1:rE) = cell2mat(DatiElabPreConvLink(:,cont+9))'; + acceleration_PCL(n,1:rE) = cell2mat(DatiElabPreConvLink(:,cont+10))'; + elseif elab_option == -1 + sommaY_PCL(end-n+1,1) = cell2mat(DatiElabPreConvLink(1,cE-contINV))'; + Ylocal_PCL(end-n+1,1) = sommaY_PCL(end-n+1,1); + sommaZ_PCL(end-n+1,1) = cell2mat(DatiElabPreConvLink(1,cE-contINV+1))'; + Zlocal_PCL(end-n+1,1) = sommaZ_PCL(end-n+1,1); + Y_PCL(end-n+1,1) = cell2mat(DatiElabPreConvLink(1,cE-contINV+2))'; + Z_PCL(end-n+1,1) = cell2mat(DatiElabPreConvLink(1,cE-contINV+3))'; + speed_local_PCL(end-n+1,1:rE) = cell2mat(DatiElabPreConvLink(:,cE-contINV+7))'; + speed_PCL(end-n+1,1:rE) = cell2mat(DatiElabPreConvLink(:,cE-contINV+8))'; + acceleration_local_PCL(end-n+1,1:rE) = cell2mat(DatiElabPreConvLink(:,cE-contINV+9))'; + acceleration_PCL(end-n+1,1:rE) = cell2mat(DatiElabPreConvLink(:,cE-contINV+10))'; + contINV = contINV+13; + end + cont = cont+13; + n = n+1; + end +else + % Primo dato + Y_PCL(:,1) = Yrif(:,1); + Z_PCL(:,1) = Zrif(:,1); +end +for iii = 1:cx % date + % somma singoli spostamenti del singolo nodo + sommaY_PCL(:,iii+1) = sum(dY_PCL(:,1:iii),2)+sommaY_PCL(:,1); + sommaZ_PCL(:,iii+1) = sum(dZ_PCL(:,1:iii),2)+sommaZ_PCL(:,1); + % spostamenti locali riferiti allo 0 + Ylocal_PCL(:,iii+1) = sommaY_PCL(:,iii+1); + Zlocal_PCL(:,iii+1) = sommaZ_PCL(:,iii+1); + % cumulata spostamenti + if elab_option == 1 + Y_PCL(:,iii+1) = Y_PCL(:,1) + cumsum(sommaY_PCL(:,iii+1)) - cumsum(sommaY_PCL(:,1)); + Z_PCL(:,iii+1) = Z_PCL(:,1) + cumsum(sommaZ_PCL(:,iii+1)) - cumsum(sommaZ_PCL(:,1)); + elseif elab_option == -1 + Y_PCL = flipud(Y_PCL); + Z_PCL = flipud(Z_PCL); + Y_PCL(:,iii+1) = Y_PCL(:,1) + cumsum(flipud(sommaY_PCL(:,iii+1))) - cumsum(flipud(sommaY_PCL(:,1))); + Z_PCL(:,iii+1) = Z_PCL(:,1) + cumsum(flipud(sommaZ_PCL(:,iii+1))) - cumsum(flipud(sommaZ_PCL(:,1))); + Y_PCL = flipud(Y_PCL); + Z_PCL = flipud(Z_PCL); + end +end + +% %% Filtri Spostamenti - Temperature +% Parametro1 = 288; % Numero di dati da considerare nell'analisi +% Parametro2 = Parametro1*2; +% Parametro3 = 0.04; % Parametro di filtro +% +% % Trovo ogni quanto leggiamo i sensori +% comando = ['select samplingfreq from unitparms where unit_id like ''' unitID ''' ']; +% curs = exec(conn,comando); +% curs = fetch(curs); +% Campionamento = curs.Data; % minuti +% +% Campionamento = cell2mat(Campionamento)/(60*24); % giorni +% Data_Scarico = ARRAYdate_PCL(1)-(Parametro2*Campionamento); +% dataini = datenum([date,' ',time]); +% if Data_Scarico < dataini +% Data_Scarico = dataini; +% end +% Data_Scarico = datestr(Data_Scarico,'yyyy-mm-dd HH:MM:SS'); +% +% col = 5; +% for p = 1:rPCL +% ini_col = col-4; +% nN = num2str(cell2mat(NodoPreConvLink(p,2))); % scarico i dati del primo nodo PreConvLink +% % Giorno 1 +% comando = ['select EventDate, EventTime, YShift, ZShift, T_node from ElabDataView where EventDate = ''' ... +% Data_Scarico(1,1:10) ''' and EventTime >= ''' Data_Scarico(1,12:end) ''' and UnitName = ''' IDcentralina... +% ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nN ''' ']; +% curs = exec(conn,comando); +% curs = fetch(curs); +% DATnodoPCLd = curs.Data; +% % Giorno successivi +% comando = ['select EventDate, EventTime, YShift, ZShift, T_node from ElabDataView where EventDate > ''' ... +% Data_Scarico(1,1:10) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... +% DTcatena ''' and NodeNum = ''' nN ''' ']; +% curs = exec(conn,comando); +% curs = fetch(curs); +% DATnodoPCL = curs.Data; +% [~,c1] = size(DATnodoPCL); +% [~,c2] = size(DATnodoPCLd); +% if c1 == c2 +% DATnodoPCL = [DATnodoPCLd; DATnodoPCL]; +% elseif c1 < c2 % solo giorno di riferimento +% DATnodoPCL = DATnodoPCLd; +% end +% DatiScaricoPCL(:,ini_col:col) = DATnodoPCL(:,:); +% Z(:,p) = cell2mat(DatiScaricoPCL(:,ini_col+3)); +% T(:,p) = cell2mat(DatiScaricoPCL(:,ini_col+4)); +% Data(:,p) = DatiScaricoPCL(:,ini_col); +% Tempo(:,p) = DatiScaricoPCL(:,ini_col+1); +% col = col+5; +% end +% [rD,~] = size(Data); +% Td = [cell2mat(Data(:,1)) repmat(' ', [rD,1]) cell2mat(Tempo(:,2))]; +% Td = datenum(Td); +% DateElab = Td; +% DatiNew = find(ARRAYdate_PCL(:,1)>DateElab(end,1)); +% [rDN,~] = size(DatiNew); +% NN = rD+rDN; +% +% if rDN == 0 +% Zlocal = Z; +% Temp = T; +% Date = DateElab; +% else +% Zlocal = [Z; Zlocal_PCL(:,DatiNew(1))']; +% Temp = [T; TempDef_PCL(DatiNew(1),:)]; +% Date = [DateElab; ARRAYdate_PCL(DatiNew(1),:)]; +% end +% [dimZ,~] = size(Zlocal); +% if dimZ < Parametro2 +% Parametro2 = dimZ; +% Parametro1 = round(Parametro2/2); +% end +% % Parametri iniziali +% MaxZ = zeros(Parametro2,rPCL); +% MaxT = zeros(Parametro2,rPCL); +% MinZ = zeros(Parametro2,rPCL); +% MinT = zeros(Parametro2,rPCL); +% MedZ = zeros(Parametro2,rPCL); +% MedT = zeros(Parametro2,rPCL); +% DiffZ = zeros(Parametro2,rPCL); +% DiffT = zeros(Parametro2,rPCL); +% Znorm = zeros(Parametro2,rPCL); +% Tnorm = zeros(Parametro2,rPCL); +% for i = 1:rPCL +% off = 0; +% for a = Parametro1:NN +% MaxZ(a,i) = max(Zlocal(a-Parametro1+1:Parametro1+off,i)); +% MinZ(a,i) = min(Zlocal(a-Parametro1+1:Parametro1+off,i)); +% MedZ(a,i) = mean(Zlocal(a-Parametro1+1:Parametro1+off,i)); +% MaxT(a,i) = max(Temp(a-Parametro1+1:Parametro1+off,i)); +% MinT(a,i) = min(Temp(a-Parametro1+1:Parametro1+off,i)); +% MedT(a,i) = mean(Temp(a-Parametro1+1:Parametro1+off,i)); +% DiffZ(a,i) = MaxZ(a,i)-MinZ(a,i); +% if DiffZ(a,i) == 0 +% DiffZ(a,i) = 0.000001; +% end +% DiffT(a,i) = MaxT(a,i)-MinT(a,i); +% if DiffT(a,i) == 0 +% DiffT(a,i) = 0.000001; +% end +% Znorm(a,i) = (Zlocal(a,i)-MedZ(a,i))/DiffZ(a,i); +% Tnorm(a,i) = (Temp(a,i)-MedT(a,i))/DiffT(a,i); +% off = off+1; +% end +% end +% % Parametri secondari +% Pendenza_Z = zeros(NN-Parametro2+1,rPCL); +% Intercetta_Z = zeros(NN-Parametro2+1,rPCL); +% Pendenza_T = zeros(NN-Parametro2+1,rPCL); +% Intercetta_T = zeros(NN-Parametro2+1,rPCL); +% diffM = zeros(NN-Parametro2+1,rPCL); +% for i = 1:rPCL +% off = 0; +% for a = Parametro2:NN +% p = fitlm(Date(Parametro1+off:a,1),Znorm(Parametro1+off:a,i),'RobustOpts','on'); +% p = p.Coefficients; +% Parameter(1,1) = table2array(p(1,1)); +% Parameter(2,1) = table2array(p(2,1)); +% Pendenza_Z(a,i) = Parameter(2,1); +% Intercetta_Z(a,i)= Parameter(1,1); +% p = fitlm(Date(Parametro1+off:a,1),Tnorm(Parametro1+off:a,i),'RobustOpts','on'); +% p = p.Coefficients; +% Parameter(1,1) = table2array(p(1,1)); +% Parameter(2,1) = table2array(p(2,1)); +% Pendenza_T(a,i) = Parameter(2,1); +% Intercetta_T(a,i)= Parameter(1,1); +% diffM(a,i) = abs(Pendenza_Z(a,i))-abs(Pendenza_T(a,i)); +% off = off+1; +% end +% end +% +% tic +% +% % valori di primo tentativo parametro +% aT = zeros(1,rPCL); +% bT = zeros(1,rPCL); +% % options = optimset('MaxIter',100000,'TolFun',1e-6); +% for i = 1:rPCL +% off = 0; +% for j = Parametro2:NN +% e = 1; +% iter = 1; +% while e >= 0.00001 && iter < 3000 +% % Ciclo intercetta +% x0 = [aT(i) bT(i)]; +% TempMod(j,i) = x0(1)*Temp(j,i)+x0(2); +% scarti = @(x)calibPCL(x,Temp,i,j,Parametro1,off,Zlocal,TempMod); +% x = fminsearch(scarti,x0); +% e = max(abs(x-x0)); +% x0 = x; +% iter = iter+1; +% end +% Zfil(j,i) = (Zlocal(j,i)-TempMod(j,i)); % Come valuto l'incremento?! +% off = off+1; +% end +% end +% for i = 1:rPCL +% for j = Parametro2:NN +% % Da qualche parte devo risommare gli incrementi +% if diffM(j,i) < Parametro3 +% Zlocal_PCL(j,i) = Zfil(j,i)-Zfil(j-1,i)+Z_Loc(Parametro2-1,i); % incremento +% else +% Zlocal_PCL(j,i) = Zlocal(j,i)-Zlocal(j-1,i)+Z_Loc(Parametro2-1,i); % incremento +% end +% end +% end +% +% toc + +%% Calcolo velocità di spostamento giornaliera +[numDate,~] = size(ARRAYdate_PCL); % numero di date +d = 1; +p = 1; +diffDate = 0; +n = 1; +period = 1; % calcolo giornaliero +ContSUP = []; +for dd = 1:numDate + while diffDate < period + d = d+1; + if d > numDate % Se d supera le date disponibili, esco dal ciclo while + break + end + diffDate = ARRAYdate_PCL(d) - ARRAYdate_PCL(p); + end + if d >numDate + break + end + ContSUP(n,1) = d; %#ok<*AGROW> % Creo matrice indici dell'estremo superiore della differenza + ContINF(n,1) = p; % Creo matrice indici dell'estremo inferiore della differenza + p = p+1; % passo alla data di partenza successiva + d = p; % resetto il conto di d + n = n+1; + diffDate = 0; +end + +check = isempty(ContSUP); +if check == 0 + [nDate,~] = size(ContSUP); + for s = 1:rPCL + N = 1; + for dd = 1:nDate + speed_PCL(s,ContSUP(N,1)) = (Z_PCL(s,ContSUP(N,1))-Z_PCL(s,ContINF(N,1)))/(ARRAYdate_PCL(ContSUP(N,1))-ARRAYdate_PCL(ContINF(N,1))); + speed_local_PCL(s,ContSUP(N,1)) = (Zlocal_PCL(s,ContSUP(N,1))-Zlocal_PCL(s,ContINF(N,1)))/(ARRAYdate_PCL(ContSUP(N,1))-ARRAYdate_PCL(ContINF(N,1))); + acceleration_PCL(s,ContSUP(N,1)) = (speed_PCL(s,ContSUP(N,1))-speed_PCL(s,ContINF(N,1)))/(ARRAYdate_PCL(ContSUP(N,1))-ARRAYdate_PCL(ContINF(N,1))); + acceleration_local_PCL(s,ContSUP(N,1)) = (speed_local_PCL(s,ContSUP(N,1))-speed_local_PCL(s,ContINF(N,1)))/(ARRAYdate_PCL(ContSUP(N,1))-ARRAYdate_PCL(ContINF(N,1))); + N = N+1; + end + end +end + +fclose(fileID); +% Approssimo i dati con il corretto numero di cifre decimali +[Y_PCL,Z_PCL,Ylocal_PCL,Zlocal_PCL,TempDef_PCL,speed_PCL,... + speed_local_PCL,acceleration_PCL,acceleration_local_PCL,AlfaX_PCL,AlfaY_PCL] = ... + approx_PCL(Y_PCL,Z_PCL,Ylocal_PCL,Zlocal_PCL,TempDef_PCL,speed_PCL,speed_local_PCL,... + acceleration_PCL,acceleration_local_PCL,AlfaX_PCL,AlfaY_PCL,FileName); + +% Riordino matrice errori +[r,~] = size(ErrPreConvLink); +Matrice_err = zeros(r,rPCL); +for i = 1:r % date + d = 1; + for n = 1:rPCL % nodi + j = 1; + err = ErrPreConvLink(i,d:d+3); + while j <= 4 + if err(1,j) == 1 + Matrice_err(i,n) = 1; + end + j = j+1; + end + d = d+4; + end +end +ErrPreConvLink = Matrice_err'; + +text = 'PreConv Link calculation executed correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/elab2D_PCLHR.m b/ATD/elab2D_PCLHR.m new file mode 100755 index 0000000..04ffaeb --- /dev/null +++ b/ATD/elab2D_PCLHR.m @@ -0,0 +1,421 @@ +function [Y_PCLHR,Z_PCLHR,Ylocal_PCLHR,Zlocal_PCLHR,AlfaX_PCLHR,AlfaY_PCLHR,TempDef_PCLHR,... + speed_PCLHR,speed_local_PCLHR,acceleration_PCLHR,acceleration_local_PCLHR,ARRAYdate_PCLHR,... + ErrPreConvLinkHR] = elab2D_PCLHR(IDcentralina,DTcatena,rPCLHR,AngDef_PCLHR,... + TempDef_PCLHR,SpePCLHR,DatiElabPreConvLinkHR,Ndevst_HR,Wdevst_HR,ARRAYdate_PCLHR,... + NuovoZeroPCLHR,NdatiMedia,Ndatidespike,ErrPreConvLinkHR,margine,elab_option,Tmax,Tmin,... + datainiPCLHR,FileName) + +%% Inizializzazione +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'elab2D_PCLHR function started'; +fprintf(fileID,fmt,text); + +if NuovoZeroPCLHR == 1 + if NdatiMedia > Ndatidespike + Ndati = NdatiMedia; + else + Ndati = Ndatidespike; + end + ini = round(Ndati/2)+1; + if rem(Ndati,2) == 0 + ini = ini+1; + end + clear NDati + ini = ini + margine; + if ini < 6 + ini = 6; + end + if Ndevst_HR ~= 0 % Allora prendo tutti i dati e solo in seguito considero i nuovi, a valle della funzione filtro + ini = 1; + end + AngDef_PCLHR = AngDef_PCLHR(ini:end,:); + TempDef_PCLHR = TempDef_PCLHR(ini:end,:); + DatiElabPreConvLinkHR = DatiElabPreConvLinkHR(ini:end,:); + ARRAYdate_PCLHR = ARRAYdate_PCLHR(ini:end,1); + ErrPreConvLinkHR = ErrPreConvLinkHR(ini:end,:); +end + +%% Definisco i dati +Nnodi = rPCLHR; +% Spacchetto +[r,~] = size(AngDef_PCLHR); % Numero di dati +[Ndati,~] = size(ARRAYdate_PCLHR); +ax = zeros(r,Nnodi); +ay = zeros(r,Nnodi); +for i=1:Nnodi + ax(:,i) = AngDef_PCLHR(:,(i-1)*2+1); % ax + ay(:,i) = AngDef_PCLHR(:,(i-1)*2+2); % ay +end +ax = ax'; % riga nodi, colonna date +ay = ay'; % riga nodi, colonna date + +%% Costruzione delle matrici + +% Dati locali +asseY_PCLHR = zeros(Nnodi,Ndati); % Raccoglie i dati planari locali nella direzione di sviluppo della catena +asseZ_PCLHR = zeros(Nnodi,Ndati); % Raccoglie i dati planari locali nella direzione di sviluppo della catena, basso->alto + +% Dati cumulati +Y_PCLHR = zeros(Nnodi,Ndati); % Raccoglie i dati cumulati nella direzione di sviluppo della catena +Z_PCLHR = zeros(Nnodi,Ndati); % Raccoglie i dati cumulati nella direzione di sviluppo della catena, basso->alto + +% Angoli +AlfaX_PCLHR = zeros(Nnodi,Ndati); +AlfaY_PCLHR = zeros(Nnodi,Ndati); % + +% parametri per il calcolo +SpePCLHR = SpePCLHR(2:end,1); % valori segmenti di pertinenza + +% Inizio del ciclo di elaborazione +text = 'Elaboration of PreConv Link HR started'; +fprintf(fileID,fmt,text); +ax = 0.01745329251994329576923690768489.*ax; +ay = 0.01745329251994329576923690768489.*ay; +for jj = 1:Ndati + if jj == 1 % al primo dato raccolto riporto i punti di calcolo sui punti noti + % INPUT SITO SPECIFICO DA DARE !!! + fclose(fileID); + if NuovoZeroPCLHR == 0 + [cYo,cZo,asseY_Rif_PCLHR,asseZ_Rif_PCLHR] = punti_noti_PCLHR(... + IDcentralina,DTcatena,FileName); + elseif NuovoZeroPCLHR == 1 % calcolo a partire da dati già elaborati a cui mi riferisco + [cYo,cZo,asseY_Rif_PCLHR,asseZ_Rif_PCLHR] = punti_noti_exe_PCLHR(... + asseY_PCLHR,DatiElabPreConvLinkHR,FileName); + end + for ii = 1:Nnodi + [Y_PCLHR,Z_PCLHR,asseY_PCLHR,asseZ_PCLHR,AlfaX_PCLHR,AlfaY_PCLHR] = ... + CalcoloBiax_PCLHR(SpePCLHR,ii,jj,ax,ay,asseY_PCLHR,asseZ_PCLHR,asseY_Rif_PCLHR,... + asseZ_Rif_PCLHR,Y_PCLHR,Z_PCLHR,AlfaX_PCLHR,AlfaY_PCLHR,elab_option,rPCLHR); + end + [shiftY_PCLHR,shiftZ_PCLHR] = pos_ini_PCLHR(cYo,cZo,Y_PCLHR,Z_PCLHR); +% riporto Y e Z sui punti noti + Y_PCLHR(:,jj) = Y_PCLHR(:,jj) - shiftY_PCLHR(:,1); + Z_PCLHR(:,jj) = Z_PCLHR(:,jj) - shiftZ_PCLHR(:,1); + else + for ii = 1:Nnodi + [Y_PCLHR,Z_PCLHR,asseY_PCLHR,asseZ_PCLHR,AlfaX_PCLHR,AlfaY_PCLHR] = ... + CalcoloBiax_PCLHR(SpePCLHR,ii,jj,ax,ay,asseY_PCLHR,asseZ_PCLHR,asseY_Rif_PCLHR,... + asseZ_Rif_PCLHR,Y_PCLHR,Z_PCLHR,AlfaX_PCLHR,AlfaY_PCLHR,elab_option,rPCLHR); + end + % correggo X e Z con gli offset + Y_PCLHR(:,jj) = Y_PCLHR(:,jj) - shiftY_PCLHR(:,1); + Z_PCLHR(:,jj) = Z_PCLHR(:,jj) - shiftZ_PCLHR(:,1); + end +end + +Yrif = Y_PCLHR; % mi serve dopo +Zrif = Z_PCLHR; % mi serve dopo +dY_PCLHR = diff(asseY_PCLHR,1,2); +dZ_PCLHR = diff(asseZ_PCLHR,1,2); + +%% Controllo della Temperatura +clear r +clear rr +clear c +clear cc +[r,c] = size(Z_PCLHR); + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +clear i +clear j +cont = 1; % contatore +TempDef_PCLHR = TempDef_PCLHR'; +text = 'There are not correction of PreConv Link HR based on temperature filter'; + +FileTemperature = ['' IDcentralina '-' DTcatena '-TLHRH-Therm.csv']; +if isfile(FileTemperature) == 1 + DatiRaw = csvread(FileTemperature); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; +else + rDR = 1; + cDR = 1; +end + +for j = 1:c % Data + for i = 1:r % Nodo + % NON considero i dati al di sopra di Tmax o al di sotto di Tmin + if TempDef_PCLHR(i,j) > Tmax || TempDef_PCLHR(i,j) < Tmin + cont = cont+1; + if j == 1 + if isfile(FileTemperature) == 1 + RawDate = find(DatiRaw(:,1)<=datenum(datainiPCLHR)); + if isempty(RawDate) == 1 + cc = 2; + while cc <= Ndate + if TempDef_PCLHR(i,cc) > Tmax || TempDef_PCLHR(i,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_PCLHR(i,j) = TempDef_PCLHR(i,cc); + else + if isnan(DatiRaw(RawDate(end),i+1)) == 0 + TempDef_PCLHR(i,j) = DatiRaw(RawDate(end),i+1); + dY_PCLHR(i,j-1) = 0; + dZ_PCLHR(i,j-1) = 0; + ErrPreConvLinkHR(j,i) = 0.5; + wardat = 'Temperature data of PreConv Link HR nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + else + cc = 2; + while cc <= c + if TempDef_PCLHR(i,cc) > Tmax || TempDef_PCLHR(i,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_PCLHR(i,j) = TempDef_PCLHR(i,cc); + end + end + else + cc = 2; + while cc <= c + if TempDef_PCLHR(i,cc) > Tmax || TempDef_PCLHR(i,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_PCLHR(i,j) = TempDef_PCLHR(i,cc); + end + else + dY_PCLHR(i,j-1) = 0; + dZ_PCLHR(i,j-1) = 0; + TempDef_PCLHR(i,j) = TempDef_PCLHR(i,j-1); + ErrPreConvLinkHR(j,i) = 0.5; + end + end + text = ['' num2str(cont) ' correction executed for Tilt Link HR H - Temperature filter!']; + end +end + +if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=ARRAYdate_PCLHR(1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(ARRAYdate_PCLHR(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(ARRAYdate_PCLHR(:,1)>DatiRaw(RawDate1(end)+1,1)); + end +else + RawDate1 = []; + RawDate2 = 1; +end +if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:); ARRAYdate_PCLHR(RawDate2(1):end) TempDef_PCLHR(:,RawDate2(1):end)']; +elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = [ARRAYdate_PCLHR TempDef_PCLHR']; +else + Dati = DatiRaw; +end +% Elimino appoggio più vecchio di un mese +RawDate3 = find(Dati(:,1) Ndatidespike + NdatiF = NdatiMedia; + else + NdatiF = Ndatidespike; + end + ini = round(NdatiF/2)+1; + if rem(NdatiF,2) == 0 + ini = ini+1; + end + clear NDatiF + iniST = round(Wdevst_HR/2); + if rem(Wdevst_HR,2) == 0 + iniST = iniST+1; + end + iniST = iniST + margine; + if iniST > ini + ini = iniST; + end + if ini < 6 + ini = 6; + end + dY_PCLHR = dY_PCLHR(:,ini:end); + dZ_PCLHR = dZ_PCLHR(:,ini:end); + TempDef_PCLHR = TempDef_PCLHR(ini:end,:); + DatiElabPreConvLinkHR = DatiElabPreConvLinkHR(ini:end,:); + ARRAYdate_PCLHR = ARRAYdate_PCLHR(ini:end,1); + ErrPreConvLinkHR = ErrPreConvLinkHR(ini:end,:); +end + +%% Finalizzo i calcoli +[rx,cx] = size(dZ_PCLHR); +% totale del singolo nodo data per data +sommaY_PCLHR = zeros(rx,cx+1); +sommaZ_PCLHR = zeros(rx,cx+1); +% cumulata del singolo nodo data per data in posizione assoluta +% il primo valore è quello di posizione assoluta iniziale +Y_PCLHR = zeros(rx,cx+1); +Z_PCLHR = zeros(rx,cx+1); +% cumulata del singolo nodo data per data in posizione relativa +% il primo valore è quello di posizione assoluta iniziale +Ylocal_PCLHR = zeros(Nnodi,Ndati); +Zlocal_PCLHR = zeros(Nnodi,Ndati); +speed_PCLHR = zeros(Nnodi,Ndati); +speed_local_PCLHR = zeros(Nnodi,Ndati); +acceleration_PCLHR = zeros(Nnodi,Ndati); +acceleration_local_PCLHR = zeros(Nnodi,Ndati); + +if NuovoZeroPCLHR == 1 + [rE,cE] = size(DatiElabPreConvLinkHR); + cont = 3; + contINV = 10; + n = 1; + while cont<=cE + if elab_option == 1 + sommaY_PCLHR(n,1) = cell2mat(DatiElabPreConvLinkHR(1,cont))'; + Ylocal_PCLHR(n,1) = sommaY_PCLHR(n,1); + sommaZ_PCLHR(n,1) = cell2mat(DatiElabPreConvLinkHR(1,cont+1))'; + Zlocal_PCLHR(n,1) = sommaZ_PCLHR(n,1); + Y_PCLHR(n,1) = cell2mat(DatiElabPreConvLinkHR(1,cont+2))'; + Z_PCLHR(n,1) = cell2mat(DatiElabPreConvLinkHR(1,cont+3))'; + speed_local_PCLHR(n,1:rE) = cell2mat(DatiElabPreConvLinkHR(:,cont+7))'; + speed_PCLHR(n,1:rE) = cell2mat(DatiElabPreConvLinkHR(:,cont+8))'; + acceleration_local_PCLHR(n,1:rE) = cell2mat(DatiElabPreConvLinkHR(:,cont+9))'; + acceleration_PCLHR(n,1:rE) = cell2mat(DatiElabPreConvLinkHR(:,cont+10))'; + cont = cont+13; + elseif elab_option == -1 + sommaY_PCLHR(end-n+1,1) = cell2mat(DatiElabPreConvLinkHR(1,cE-contINV))'; + Ylocal_PCLHR(end-n+1,1) = sommaY_PCLHR(end-n+1,1); + sommaZ_PCLHR(end-n+1,1) = cell2mat(DatiElabPreConvLinkHR(1,cE-contINV+1))'; + Zlocal_PCLHR(end-n+1,1) = sommaZ_PCLHR(end-n+1,1); + Y_PCLHR(end-n+1,1) = cell2mat(DatiElabPreConvLinkHR(1,cE-contINV+2))'; + Z_PCLHR(end-n+1,1) = cell2mat(DatiElabPreConvLinkHR(1,cE-contINV+3))'; + speed_local_PCLHR(end-n+1,1:rE) = cell2mat(DatiElabPreConvLinkHR(:,cE-contINV+7))'; + speed_PCLHR(end-n+1,1:rE) = cell2mat(DatiElabPreConvLinkHR(:,cE-contINV+8))'; + acceleration_local_PCLHR(end-n+1,1:rE) = cell2mat(DatiElabPreConvLinkHR(:,cE-contINV+9))'; + acceleration_PCLHR(end-n+1,1:rE) = cell2mat(DatiElabPreConvLinkHR(:,cE-contINV+10))'; + contINV = contINV+13; + end + n = n+1; + end +else + % Primo dato + Y_PCLHR(:,1) = Yrif(:,1); + Z_PCLHR(:,1) = Zrif(:,1); +end +for iii = 1:cx % date + % somma singoli spostamenti del singolo nodo + sommaY_PCLHR(:,iii+1) = sum(dY_PCLHR(:,1:iii),2)+sommaY_PCLHR(:,1); + sommaZ_PCLHR(:,iii+1) = sum(dZ_PCLHR(:,1:iii),2)+sommaZ_PCLHR(:,1); + % spostamenti locali riferiti allo 0 + Ylocal_PCLHR(:,iii+1) = sommaY_PCLHR(:,iii+1); + Zlocal_PCLHR(:,iii+1) = sommaZ_PCLHR(:,iii+1); + % cumulata spostamenti + if elab_option == 1 + Y_PCLHR(:,iii+1) = Y_PCLHR(:,1) + cumsum(sommaY_PCLHR(:,iii+1)) - cumsum(sommaY_PCLHR(:,1)); + Z_PCLHR(:,iii+1) = Z_PCLHR(:,1) + cumsum(sommaZ_PCLHR(:,iii+1)) - cumsum(sommaZ_PCLHR(:,1)); + elseif elab_option == -1 + Y_PCLHR = flipud(Y_PCLHR); + Z_PCLHR = flipud(Z_PCLHR); + Y_PCLHR(:,iii+1) = Y_PCLHR(:,1) + cumsum(flipud(sommaY_PCLHR(:,iii+1))) - cumsum(flipud(sommaY_PCLHR(:,1))); + Z_PCLHR(:,iii+1) = Z_PCLHR(:,1) + cumsum(flipud(sommaZ_PCLHR(:,iii+1))) - cumsum(flipud(sommaZ_PCLHR(:,1))); + Y_PCLHR = flipud(Y_PCLHR); + Z_PCLHR = flipud(Z_PCLHR); + end +end + +%% Calcolo velocità di spostamento giornaliera +[numDate,~] = size(ARRAYdate_PCLHR); % numero di date +d = 1; +p = 1; +diffDate = 0; +n = 1; +period = 1; % calcolo giornaliero +ContSUP = []; +for dd = 1:numDate + while diffDate < period + d = d+1; + if d > numDate % Se d supera le date disponibili, esco dal ciclo while + break + end + diffDate = ARRAYdate_PCLHR(d) - ARRAYdate_PCLHR(p); + end + if d >numDate + break + end + ContSUP(n,1) = d; %#ok<*AGROW> % Creo matrice indici dell'estremo superiore della differenza + ContINF(n,1) = p; % Creo matrice indici dell'estremo inferiore della differenza + p = p+1; % passo alla data di partenza successiva + d = p; % resetto il conto di d + n = n+1; + diffDate = 0; +end + +check = isempty(ContSUP); +if check == 0 + [nDate,~] = size(ContSUP); + for s = 1:rPCLHR + N = 1; + for dd = 1:nDate + speed_PCLHR(s,ContSUP(N,1)) = (Z_PCLHR(s,ContSUP(N,1))-Z_PCLHR(s,ContINF(N,1)))/(ARRAYdate_PCLHR(ContSUP(N,1))-ARRAYdate_PCLHR(ContINF(N,1))); + speed_local_PCLHR(s,ContSUP(N,1)) = (Zlocal_PCLHR(s,ContSUP(N,1))-Zlocal_PCLHR(s,ContINF(N,1)))/(ARRAYdate_PCLHR(ContSUP(N,1))-ARRAYdate_PCLHR(ContINF(N,1))); + acceleration_PCLHR(s,ContSUP(N,1)) = (speed_PCLHR(s,ContSUP(N,1))-speed_PCLHR(s,ContINF(N,1)))/(ARRAYdate_PCLHR(ContSUP(N,1))-ARRAYdate_PCLHR(ContINF(N,1))); + acceleration_local_PCLHR(s,ContSUP(N,1)) = (speed_local_PCLHR(s,ContSUP(N,1))-speed_local_PCLHR(s,ContINF(N,1)))/(ARRAYdate_PCLHR(ContSUP(N,1))-ARRAYdate_PCLHR(ContINF(N,1))); + N = N+1; + end + end +end + +fclose(fileID); +% Approssimo i dati con il corretto numero di cifre decimali +[Y_PCLHR,Z_PCLHR,Ylocal_PCLHR,Zlocal_PCLHR,TempDef_PCLHR,speed_PCLHR,... + speed_local_PCLHR,acceleration_PCLHR,acceleration_local_PCLHR,AlfaX_PCLHR,AlfaY_PCLHR] = ... + approx_PCL(Y_PCLHR,Z_PCLHR,Ylocal_PCLHR,Zlocal_PCLHR,TempDef_PCLHR,speed_PCLHR,speed_local_PCLHR,... + acceleration_PCLHR,acceleration_local_PCLHR,AlfaX_PCLHR,AlfaY_PCLHR,FileName); + +% Riordino matrice errori +[r,~] = size(ErrPreConvLinkHR); +Matrice_err = zeros(r,rPCLHR); +for i = 1:r % date + d = 1; + for n = 1:rPCLHR % nodi + j = 1; + err = ErrPreConvLinkHR(i,d:d+2); + while j <= 3 + if err(1,j) == 1 + Matrice_err(i,n) = 1; + end + j = j+1; + end + d = d+3; + end +end +ErrPreConvLinkHR = Matrice_err'; + +text = 'PreConv Link HR calculation executed correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/elab2D_RL.m b/ATD/elab2D_RL.m new file mode 100755 index 0000000..00a9ba7 --- /dev/null +++ b/ATD/elab2D_RL.m @@ -0,0 +1,417 @@ +function [X_RL,Y_RL,Z_RL,Xlocal_RL,Ylocal_RL,Zlocal_RL,TempDef_RL,ARRAYdate_RL,... + ErrRadialLink] = elab2D_RL(rRL,accRL,ACCdefRis_RL,SpeRL,IDcentralina,DTcatena,... + DatiElabRadialLink,NuovoZeroRL,tolleranzaAcc,TempDef_RL,Ndevst,Wdevst,ARRAYdate_RL,... + elab_option,NdatiMedia,Ndatidespike,margine,ErrRadialLink,Tmax,Tmin,datainiRL,FileName) + + %% Inizializzazione +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'elab2D_RL function started'; +fprintf(fileID,fmt,text); + +if NuovoZeroRL == 1 + if NdatiMedia > Ndatidespike + Ndati = NdatiMedia; + else + Ndati = Ndatidespike; + end + ini = round(Ndati/2)+1; + if rem(Ndati,2) == 0 + ini = ini+1; + end + clear NDati + ini = ini + margine; + if ini < 6 + ini = 6; + end + if Ndevst ~= 0 % Allora prendo tutti i dati e solo in seguito considero i nuovi, a valle della funzione filtro + ini = 1; + end + DatiElabRadialLink = DatiElabRadialLink(ini:end,:); + ACCdefRis_RL = ACCdefRis_RL(ini:end,:); + ARRAYdate_RL = ARRAYdate_RL(ini:end,1); + TempDef_RL = TempDef_RL(ini:end,:); + accRL = accRL(ini:end,:); + ErrRadialLink = ErrRadialLink(ini:end,:); +end + +%% Definizione dei dati +Nnodi = rRL; +[r,~] = size(accRL); +[Ndati,~] = size(ARRAYdate_RL); +ax = zeros(r,Nnodi); +ay = zeros(r,Nnodi); +az = zeros(r,Nnodi); +for i=1:Nnodi + ax(:,i) = accRL(:,(i-1)*3+1); % ax + ay(:,i) = accRL(:,(i-1)*3+2:(i-1)*3+2); % ay + az(:,i) = accRL(:,(i-1)*3+3:(i-1)*3+3); % az +end + +ax = ax'; % riga nodi, colonna date +ay = ay'; % riga nodi, colonna date +az = az'; % riga nodi, colonna date +% Dati locali +asseX_RL = zeros(Nnodi,Ndati); % Raccoglie i dati locali nella sezione della galleria, in direzione orizzontale +asseY_RL = zeros(Nnodi,Ndati); % Raccoglie i dati locali nella direzione trasversale rispetto alla sezione della galleria +asseZ_RL = zeros(Nnodi,Ndati); % Raccoglie i dati locali nella sezione della galleria, in altezza +% Dati cumulati +X_RL = zeros(Nnodi,Ndati); % Raccoglie i dati cumulati nella sezione della galleria, in direzione orizzontale +Y_RL = zeros(Nnodi,Ndati); % Raccoglie i dati cumulati nella direzione trasversale rispetto alla sezione della galleria +Z_RL = zeros(Nnodi,Ndati); % Raccoglie i dati cumulati nella sezione della galleria, in altezza +% parametri per il calcolo +SpeRL = SpeRL(2:end,1); % valori di primo tentativo segmenti di pertinenza + +%% Applico le correzioni post installazione +if NuovoZeroRL == 0 + [ax,ay,az] = check_RL(ax,ay,az,rRL,IDcentralina,DTcatena,FileName); +else + incliX = ax; + incliY = ay; + incliZ = az; + nameXY = strcat([IDcentralina,'-',DTcatena,'-','switchXY']); + name_switchXY = strcat([IDcentralina,'-',DTcatena,'-','switch_signXY']); + nameYZ = strcat([IDcentralina,'-',DTcatena,'-','switchYZ']); + switchXY = load(nameXY); + switchYZ = load(nameYZ); + switch_signXY = load(name_switchXY); + switchXY = switchXY.switchXY; + switch_signXY = switch_signXY.switch_signXY; + switchYZ = switchYZ.switchYZ; + for i = 1:rRL + if switch_signXY(i,1) == 1 + ax(i,:) = -incliX(i,:); + ay(i,:) = -incliY(i,:); + end + if switchXY(i,1) == 1 + ax(i,:) = incliY(i,:); + ay(i,:) = incliX(i,:); + elseif switchXY(i,1) == -1 + ax(i,:) = -incliY(i,:); + ay(i,:) = -incliX(i,:); + end + if switchYZ(i,1) == 1 + az(i,:) = -incliY(i,:); + ay(i,:) = -incliZ(i,:); + end + end +end + +%% Calcolo +for jj = 1:Ndati + if jj == 1 % al primo dato raccolto riporto i punti di calcolo sui punti noti + if NuovoZeroRL == 0 + [cXo,cYo,cZo,asseX_RL,asseY_RL,asseZ_RL] = punti_noti_RL(IDcentralina,... + DTcatena,asseX_RL,asseY_RL,asseZ_RL,FileName); + elseif NuovoZeroRL == 1 % calcolo a partire da dati già elaborati a cui mi riferisco + [cXo,cYo,cZo,asseX_RL,asseY_RL,asseZ_RL] = punti_noti_exe_RL... + (asseX_RL,asseY_RL,asseZ_RL,DatiElabRadialLink,FileName); + end + for ii = 1:Nnodi + [X_RL,Y_RL,Z_RL,asseX_RL,asseY_RL,asseZ_RL] = CalcoloBiax_RL(SpeRL,... + ii,jj,ax,ay,asseX_RL,asseY_RL,asseZ_RL,X_RL,Y_RL,Z_RL,elab_option); + end + [shiftX_RL,shiftY_RL,shiftZ_RL] = pos_ini_RL(cXo,cYo,cZo,X_RL,Y_RL,Z_RL); + else + for ii = 1:Nnodi + [X_RL,Y_RL,Z_RL,asseX_RL,asseY_RL,asseZ_RL] = CalcoloBiax_RL(SpeRL,... + ii,jj,ax,ay,asseX_RL,asseY_RL,asseZ_RL,X_RL,Y_RL,Z_RL,elab_option); + end + end + % riporto X, Y e Z sui punti noti + X_RL(:,jj) = X_RL(:,jj) - shiftX_RL(:,1); + Y_RL(:,jj) = Y_RL(:,jj) - shiftY_RL(:,1); + Z_RL(:,jj) = Z_RL(:,jj) - shiftZ_RL(:,1); +end + +Xrif = X_RL; % mi serve dopo +Yrif = Y_RL; % mi serve dopo +Zrif = Z_RL; % mi serve dopo +dX_RL = diff(asseX_RL,1,2); +dY_RL = diff(asseY_RL,1,2); +dZ_RL = diff(asseZ_RL,1,2); + +%% Controllo della risultante delle accelerazioni +clear r +clear rr +clear c +clear cc +ACCdefRis_RL = ACCdefRis_RL'; % Nodi in riga, date in colonna +[r,c] = size(ACCdefRis_RL); +[rr,cc] = size(X_RL); + +% controllo che le matrici con le risultanti delle accelerazioni e +% le matrici con i dati di spostamento abbiano le stesse dimensioni +if r~=rr + text = '---Warning! Number of row of displacement data do not correspond to the number of acceleration cosine vector!---'; + fprintf(fileID,fmt,text); +end +if c~=cc + text = '---Warning! Number of column of displacement data do not correspond to the number of acceleration cosine vector!---'; + fprintf(fileID,fmt,text); +end +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +clear i +clear j +cont = 1; % contatore +cont2 = 1; % contatore +cont3 = 1; % contatore +TempDef_RL = TempDef_RL'; +text1 = 'There are not correction of Radial Link based on acceleration vector filter'; +text2 = 'There are not correction of Radial Link based on uncalibrated Acceleration vector'; +text3 = 'There are not correction of Radial Link based on temperature filter'; +for j = 2:c % data + for i = 1:r % nodo + % se il valore assoluto della differenza è maggiore della + % tolleranza, pongo gli spostamenti giornalieri pari a 0 + if abs(ACCdefRis_RL(i,j)-ACCdefRis_RL(i,j-1)) > tolleranzaAcc + dX_RL(i,j-1) = 0; + dY_RL(i,j-1) = 0; + dZ_RL(i,j-1) = 0; + text1 = ['' num2str(cont) ' correction executed for Radial Link - Acceleration vector filter!']; + cont = cont+1; + end + if ACCdefRis_RL(i,j) < 0.9 || ACCdefRis_RL(i,j) > 1.1 % Il nodo è fuori taratura! + dX_RL(i,j-1) = 0; + dY_RL(i,j-1) = 0; + dZ_RL(i,j-1) = 0; + TempDef_RL(i,j) = TempDef_RL(i,j-1); + text2 = ['' num2str(cont3) ' correction executed for Tilt Link V - uncalibrated Acceleration vector!']; + cont3 = cont3+1; + end + end +end + +FileTemperature = ['' IDcentralina '-' DTcatena '-RL-Therm.csv']; +if isfile(FileTemperature) == 1 + DatiRaw = csvread(FileTemperature); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; +else + rDR = 1; + cDR = 1; +end +for b = 1:c % Data + for a = 1:r % Nodo + % NON considero i dati al di sopra dei 80 °C o al di sotto dei -30 °C! + if TempDef_RL(a,b) > Tmax || TempDef_RL(a,b) < Tmin + cont2 = cont2+1; + if b == 1 + if isfile(FileTemperature) == 1 + RawDate = find(DatiRaw(:,1)<=datenum(datainiRL)); + if isempty(RawDate) == 1 + cc = 2; + while cc <= c + if TempDef_RL(a,cc) > Tmax || TempDef_RL(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_RL(a,b) = TempDef_RL(a,cc); + else + if isnan(DatiRaw(RawDate(end),a+1)) == 0 + TempDef_RL(a,b) = DatiRaw(RawDate(end),a+1); + ErrRadialLink(b,a) = 0.5; + wardat = 'Temperature data of Radial Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + else + cc = 2; + while cc <= c + if TempDef_RL(a,cc) > Tmax || TempDef_RL(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_RL(a,b) = TempDef_RL(a,cc); + end + end + else + cc = 2; + while cc <= c + if TempDef_RL(a,cc) > Tmax || TempDef_RL(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_RL(a,b) = TempDef_RL(a,cc); + end + else + TempDef_RL(a,b) = TempDef_RL(a,b-1); + dX_RL(a,b-1) = 0; + dY_RL(a,b-1) = 0; + dZ_RL(a,b-1) = 0; + ErrRadialLink(b,a) = 0.5; + end + text3 = ['' num2str(cont2) ' correction executed for Radial Link - Temperature filter!']; + end + end +end + +if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=ARRAYdate_RL(1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(ARRAYdate_RL(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(ARRAYdate_RL(:,1)>DatiRaw(RawDate1(end)+1,1)); + end +else + RawDate1 = []; + RawDate2 = 1; +end +if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:); ARRAYdate_RL(RawDate2(1):end) TempDef_RL(:,RawDate2(1):end)']; +elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = [ARRAYdate_RL TempDef_RL']; +else + Dati = DatiRaw; +end +% Elimino appoggio più vecchio di un mese +RawDate3 = find(Dati(:,1) Ndatidespike + NdatiF = NdatiMedia; + else + NdatiF = Ndatidespike; + end + ini = round(NdatiF/2)+1; + if rem(NdatiF,2) == 0 + ini = ini+1; + end + clear NDatiF + iniST = round(Wdevst/2); + if rem(Wdevst,2) == 0 + iniST = iniST+1; + end + iniST = iniST + margine; + if iniST > ini + ini = iniST; + end + if ini < 6 + ini = 6; + end + dX_RL = dX_RL(:,ini:end); + dY_RL = dY_RL(:,ini:end); + dZ_RL = dZ_RL(:,ini:end); + TempDef_RL = TempDef_RL(ini:end,:); + DatiElabRadialLink = DatiElabRadialLink(ini:end,:); + ARRAYdate_RL = ARRAYdate_RL(ini:end,1); + ErrRadialLink = ErrRadialLink(ini:end,:); +end + +%% Finalizzo i calcoli +[rx,cx] = size(dX_RL); + +% totale del singolo nodo data per data +sommaX_RL = zeros(rx,cx+1); +sommaY_RL = zeros(rx,cx+1); +sommaZ_RL = zeros(rx,cx+1); + +% cumulata del singolo nodo data per data in posizione assoluta +% il primo valore è quello di posizione assoluta iniziale +X_RL = zeros(rx,cx+1); +Y_RL = zeros(rx,cx+1); +Z_RL = zeros(rx,cx+1); + +% cumulata del singolo nodo data per data in posizione relativa +% il primo valore è quello di 0 +Xlocal_RL = zeros(Nnodi,Ndati); +Ylocal_RL = zeros(Nnodi,Ndati); +Zlocal_RL = zeros(Nnodi,Ndati); + +% Primo dato +X_RL(:,1) = Xrif(:,1); +Y_RL(:,1) = Yrif(:,1); +Z_RL(:,1) = Zrif(:,1); + +if NuovoZeroRL == 1 + [~,cE] = size(DatiElabRadialLink); + cont = 3; + n = 1; + while cont<=cE + sommaX_RL(n,1) = cell2mat(DatiElabRadialLink(1,cont))'; + Xlocal_RL(n,1) = sommaX_RL(n,1); + sommaY_RL(n,1) = cell2mat(DatiElabRadialLink(1,cont+1))'; + Ylocal_RL(n,1) = sommaY_RL(n,1); + sommaZ_RL(n,1) = cell2mat(DatiElabRadialLink(1,cont+2))'; + Zlocal_RL(n,1) = sommaZ_RL(n,1); + cont=cont+9; + n = n+1; + end +end + +for iii = 1:cx % date + % somma singoli spostamenti del singolo nodo + sommaX_RL(:,iii+1) = sum(dX_RL(:,1:iii),2) + sommaX_RL(:,1); + sommaY_RL(:,iii+1) = sum(dY_RL(:,1:iii),2) + sommaY_RL(:,1); + sommaZ_RL(:,iii+1) = sum(dZ_RL(:,1:iii),2) + sommaZ_RL(:,1); + % spostamenti locali riferiti allo 0 + Xlocal_RL(:,iii+1) = sommaX_RL(:,iii+1); + Ylocal_RL(:,iii+1) = sommaY_RL(:,iii+1); + Zlocal_RL(:,iii+1) = sommaZ_RL(:,iii+1); + % cumulata spostamenti + X_RL(:,iii+1) = Xrif(:,1) + cumsum(sommaX_RL(:,iii+1)) - cumsum(sommaX_RL(:,1)); + Y_RL(:,iii+1) = Yrif(:,1) + cumsum(sommaY_RL(:,iii+1)) - cumsum(sommaY_RL(:,1)); + Z_RL(:,iii+1) = Zrif(:,1) + cumsum(sommaZ_RL(:,iii+1)) - cumsum(sommaZ_RL(:,1)); +end + +%% Approssimazioni +[X_RL,Y_RL,Z_RL,Xlocal_RL,Ylocal_RL,Zlocal_RL,TempDef_RL] = ... + approx_RL(X_RL,Y_RL,Z_RL,Xlocal_RL,Ylocal_RL,Zlocal_RL,TempDef_RL,FileName); + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; + +[r,~] = size(ErrRadialLink); +Matrice_err = zeros(r,rRL); +for i = 1:r % date + d = 1; + for n = 1:rRL % nodi + j = 1; + err = ErrRadialLink(i,d:d+3); + while j <= 4 + if err(1,j) == 1 + Matrice_err(i,n) = 1; + end + j = j+1; + end + d = d+4; + end +end +ErrRadialLink = Matrice_err'; + +text4 = 'Radial Link calculation executed correctly. elab2D_RL function closed'; +fprintf(fileID,fmt,text4); +fclose(fileID); + +end + \ No newline at end of file diff --git a/ATD/elab2D_TLH.m b/ATD/elab2D_TLH.m new file mode 100755 index 0000000..51774bc --- /dev/null +++ b/ATD/elab2D_TLH.m @@ -0,0 +1,407 @@ +function [Y_TLH,Z_TLH,Ylocal_TLH,Zlocal_TLH,AlfaX_TLH,AlfaY_TLH,TempDef_TLH,... + speed_TLH,speed_local_TLH,acceleration_TLH,acceleration_local_TLH,ARRAYdate_TLH,... + ErrTiltLinkH] = elab2D_TLH(IDcentralina,DTcatena,rTLH,accTLH,ACCdefRis_TLH,... + TempDef_TLH,SpeTLH,PsTLH,tolleranzaAcc,DatiElabTiltLinkH,Ndevst,Wdevst,... + ARRAYdate_TLH,NuovoZeroTLH,NdatiMedia,Ndatidespike,ErrTiltLinkH,margine,... + elab_option,Tmax,Tmin,datainiTLH,FileName) + +%% Inizializzazione +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'elab2D_TLH function started'; +fprintf(fileID,fmt,text); + +if NuovoZeroTLH == 1 + if NdatiMedia > Ndatidespike + Ndati = NdatiMedia; + else + Ndati = Ndatidespike; + end + ini = round(Ndati/2)+1; + if rem(Ndati,2) == 0 + ini = ini+1; + end + clear NDati + ini = ini + margine; + if ini < 6 + ini = 6; + end + if Ndevst ~= 0 % Allora prendo tutti i dati e solo in seguito considero i nuovi, a valle della funzione filtro + ini = 1; + end + accTLH = accTLH(ini:end,:); + ACCdefRis_TLH = ACCdefRis_TLH(ini:end,:); + TempDef_TLH = TempDef_TLH(ini:end,:); + DatiElabTiltLinkH = DatiElabTiltLinkH(ini:end,:); + ARRAYdate_TLH = ARRAYdate_TLH(ini:end,1); + ErrTiltLinkH = ErrTiltLinkH(ini:end,:); +end + +%% Definisco i dati +Nnodi = rTLH; +% Spacchetto +[r,~] = size(accTLH); % Numero di dati +[Ndati,~] = size(ARRAYdate_TLH); +ax = zeros(r,Nnodi); +ay = zeros(r,Nnodi); +for i=1:Nnodi + ax(:,i) = accTLH(:,(i-1)*3+1); % ax + ay(:,i) = accTLH(:,(i-1)*3+2); % ay +end +ax = ax'; % riga nodi, colonna date +ay = ay'; % riga nodi, colonna date + +%% Costruzione delle matrici + +% Dati locali +asseY_TLH = zeros(Nnodi,Ndati); % Raccoglie i dati planari locali nella direzione di sviluppo della catena +asseZ_TLH = zeros(Nnodi,Ndati); % Raccoglie i dati planari locali nella direzione di sviluppo della catena, basso->alto + +% Dati cumulati +Y_TLH = zeros(Nnodi,Ndati); % Raccoglie i dati cumulati nella direzione di sviluppo della catena +Z_TLH = zeros(Nnodi,Ndati); % Raccoglie i dati cumulati nella direzione di sviluppo della catena, basso->alto + +% Angoli +AlfaX_TLH = zeros(Nnodi,Ndati); +AlfaY_TLH = zeros(Nnodi,Ndati); + +% parametri per il calcolo +SpeTLH = SpeTLH(2:end,1); % valori segmenti di pertinenza +PsTLH = PsTLH(2:end,1); % valori posizioni punti di calcolo + +% Inizio del ciclo di elaborazione +text = 'Elaboration of Tilt Link H started'; +fprintf(fileID,fmt,text); + +for jj = 1:Ndati + for ii = 1:Nnodi + [Y_TLH,Z_TLH,asseY_TLH,asseZ_TLH,AlfaX_TLH,AlfaY_TLH] = CalcoloBiax_TLH(... + SpeTLH,PsTLH,ii,jj,ax,ay,asseY_TLH,asseZ_TLH,Y_TLH,Z_TLH,... + elab_option,AlfaX_TLH,AlfaY_TLH); + end +end +dY_TLH = diff(asseY_TLH,1,2); +dZ_TLH = diff(asseZ_TLH,1,2); + +%% Controllo della risultante delle accelerazioni +clear r +clear rr +clear c +clear cc +ACCdefRis_TLH = ACCdefRis_TLH'; % Nodi in riga, date in colonna +[r,c] = size(ACCdefRis_TLH); +[rr,cc] = size(Y_TLH); + +% controllo che le matrici con le risultanti delle accelerazioni e +% le matrici con i dati di spostamento abbiano le stesse dimensioni +if r~=rr || c~=cc + text = 'Warning! Displacement data and g vector have not the same size!'; +else + text = 'There are not warning for Tilt Link H'; +end +fprintf(fileID,fmt,text); +clear i +clear j +cont = 1; % contatore +cont2 = 1; % contatore +cont3 = 1; % contatore +TempDef_TLH = TempDef_TLH'; +text1 = 'There are not correction of Tilt Link H based on acceleration vector filter'; +text2 = 'There are not correction of Tilt Link H based on uncalibrated Acceleration vector'; +text3 = 'There are not correction of Tilt Link H based on temperature filter'; +for j = 2:c % data + for i = 1:r % nodo + % se il valore assoluto della differenza è maggiore della + % tolleranza, pongo gli spostamenti giornalieri pari a 0 + if abs(ACCdefRis_TLH(i,j)-ACCdefRis_TLH(i,j-1)) > tolleranzaAcc + dY_TLH(i,j-1) = 0; + dZ_TLH(i,j-1) = 0; + text1 = ['' num2str(cont) ' correction executed for Tilt Link H - Acceleration vector filter!']; + cont = cont+1; + end + if ACCdefRis_TLH(i,j) < 0.9 || ACCdefRis_TLH(i,j) > 1.1 % Il nodo è fuori taratura! + dY_TLH(i,j-1) = 0; + dZ_TLH(i,j-1) = 0; + TempDef_TLH(i,j) = TempDef_TLH(i,j-1); + text2 = ['' num2str(cont3) ' correction executed for Tilt Link H - uncalibrated Acceleration vector!']; + cont3 = cont3+1; + end + end +end + +FileTemperature = ['' IDcentralina '-' DTcatena '-TLH-Therm.csv']; +if isfile(FileTemperature) == 1 + DatiRaw = csvread(FileTemperature); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; +else + rDR = 1; + cDR = 1; +end +for b = 1:c % Data + for a = 1:r % Nodo + % NON considero i dati al di sopra dei 80 °C o al di sotto dei -30 °C! + if TempDef_TLH(a,b) > Tmax || TempDef_TLH(a,b) < Tmin + cont2 = cont2+1; + if b == 1 + if isfile(FileTemperature) == 1 + RawDate = find(DatiRaw(:,1)<=datenum(datainiTLH)); + if isempty(RawDate) == 1 + cc = 2; + while cc <= c + if TempDef_TLH(a,cc) > Tmax || TempDef_TLH(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_TLH(a,b) = TempDef_TLH(a,cc); + else + if isnan(DatiRaw(RawDate(end),a+1)) == 0 + TempDef_TLH(a,b) = DatiRaw(RawDate(end),a+1); + ErrTiltLinkH(b,a) = 0.5; + wardat = 'Temperature data of Tilt Link H nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + else + cc = 2; + while cc <= c + if TempDef_TLH(a,cc) > Tmax || TempDef_TLH(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_TLH(a,b) = TempDef_TLH(a,cc); + end + end + else + cc = 2; + while cc <= c + if TempDef_TLH(a,cc) > Tmax || TempDef_TLH(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_TLH(a,b) = TempDef_TLH(a,cc); + end + else + TempDef_TLH(a,b) = TempDef_TLH(a,b-1); + dY_TLH(a,b-1) = 0; + dZ_TLH(a,b-1) = 0; + ErrTiltLinkH(b,a) = 0.5; + end + text3 = ['' num2str(cont2) ' correction executed for Tilt Link H - Temperature filter!']; + end + end +end + +if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=ARRAYdate_TLH(1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(ARRAYdate_TLH(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(ARRAYdate_TLH(:,1)>DatiRaw(RawDate1(end)+1,1)); + end +else + RawDate1 = []; + RawDate2 = 1; +end +if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:); ARRAYdate_TLH(RawDate2(1):end) TempDef_TLH(:,RawDate2(1):end)']; +elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = [ARRAYdate_TLH TempDef_TLH']; +else + Dati = DatiRaw; +end +% Elimino appoggio più vecchio di un mese +RawDate3 = find(Dati(:,1) Ndatidespike + NdatiF = NdatiMedia; + else + NdatiF = Ndatidespike; + end + ini = round(NdatiF/2)+1; + if rem(NdatiF,2) == 0 + ini = ini+1; + end + clear NDatiF + iniST = round(Wdevst/2); + if rem(Wdevst,2) == 0 + iniST = iniST+1; + end + iniST = iniST + margine; + if iniST > ini + ini = iniST; + end + if ini < 6 + ini = 6; + end + dY_TLH = dY_TLH(:,ini:end); + dZ_TLH = dZ_TLH(:,ini:end); + TempDef_TLH = TempDef_TLH(ini:end,:); + DatiElabTiltLinkH = DatiElabTiltLinkH(ini:end,:); + ARRAYdate_TLH = ARRAYdate_TLH(ini:end,1); + ErrTiltLinkH = ErrTiltLinkH(ini:end,:); +end + +%% Finalizzo i calcoli +[rx,cx] = size(dZ_TLH); +% totale del singolo nodo data per data +sommaY_TLH = zeros(rx,cx+1); +sommaZ_TLH = zeros(rx,cx+1); +% cumulata del singolo nodo data per data in posizione assoluta +% il primo valore è quello di posizione assoluta iniziale +Y_TLH = zeros(rx,cx+1); +Z_TLH = zeros(rx,cx+1); +% cumulata del singolo nodo data per data in posizione relativa +% il primo valore è quello di posizione assoluta iniziale +Ylocal_TLH = zeros(Nnodi,Ndati); +Zlocal_TLH = zeros(Nnodi,Ndati); +speed_TLH = zeros(Nnodi,Ndati); +speed_local_TLH = zeros(Nnodi,Ndati); +acceleration_TLH = zeros(Nnodi,Ndati); +acceleration_local_TLH = zeros(Nnodi,Ndati); + +if NuovoZeroTLH == 1 + [rE,cE] = size(DatiElabTiltLinkH); + cont = 3; + n = 1; + while cont<=cE + sommaY_TLH(n,1) = cell2mat(DatiElabTiltLinkH(1,cont))'; + Ylocal_TLH(n,1) = sommaY_TLH(n,1); + sommaZ_TLH(n,1) = cell2mat(DatiElabTiltLinkH(1,cont+1))'; + Zlocal_TLH(n,1) = sommaZ_TLH(n,1); + Y_TLH(n,1) = cell2mat(DatiElabTiltLinkH(1,cont+2))'; + Z_TLH(n,1) = cell2mat(DatiElabTiltLinkH(1,cont+3))'; + speed_local_TLH(n,1:rE) = cell2mat(DatiElabTiltLinkH(:,cont+7))'; + speed_TLH(n,1:rE) = cell2mat(DatiElabTiltLinkH(:,cont+8))'; + acceleration_local_TLH(n,1:rE) = cell2mat(DatiElabTiltLinkH(:,cont+9))'; + acceleration_TLH(n,1:rE) = cell2mat(DatiElabTiltLinkH(:,cont+10))'; + cont = cont+13; + n = n+1; + end +else + % Primo dato + Y_TLH(:,1) = PsTLH; + Z_TLH(:,1) = 0; +end +for iii = 1:cx % date + % somma singoli spostamenti del singolo nodo + sommaY_TLH(:,iii+1) = sum(dY_TLH(:,1:iii),2)+sommaY_TLH(:,1); + sommaZ_TLH(:,iii+1) = sum(dZ_TLH(:,1:iii),2)+sommaZ_TLH(:,1); + % spostamenti locali riferiti allo 0 + Ylocal_TLH(:,iii+1) = sommaY_TLH(:,iii+1); + Zlocal_TLH(:,iii+1) = sommaZ_TLH(:,iii+1); + % cumulata spostamenti + Y_TLH(:,iii+1) = Y_TLH(:,1) + cumsum(sommaY_TLH(:,iii+1)) - cumsum(sommaY_TLH(:,1)); + Z_TLH(:,iii+1) = Z_TLH(:,1) + cumsum(sommaZ_TLH(:,iii+1)) - cumsum(sommaZ_TLH(:,1)); +end + +%% Calcolo velocità di spostamento giornaliera +[numDate,~] = size(ARRAYdate_TLH); % numero di date +d = 1; +p = 1; +diffDate = 0; +n = 1; +period = 1; % calcolo giornaliero +ContSUP = []; +for dd = 1:numDate + while diffDate < period + d = d+1; + if d > numDate % Se d supera le date disponibili, esco dal ciclo while + break + end + diffDate = ARRAYdate_TLH(d) - ARRAYdate_TLH(p); + end + if d >numDate + break + end + ContSUP(n,1) = d; %#ok<*AGROW> % Creo matrice indici dell'estremo superiore della differenza + ContINF(n,1) = p; % Creo matrice indici dell'estremo inferiore della differenza + p = p+1; % passo alla data di partenza successiva + d = p; % resetto il conto di d + n = n+1; + diffDate = 0; +end + +check = isempty(ContSUP); +if check == 0 + [nDate,~] = size(ContSUP); + for s = 1:rTLH + N = 1; + for dd = 1:nDate + speed_TLH(s,ContSUP(N,1)) = (Z_TLH(s,ContSUP(N,1))-Z_TLH(s,ContINF(N,1)))... + /(ARRAYdate_TLH(ContSUP(N,1))-ARRAYdate_TLH(ContINF(N,1))); + speed_local_TLH(s,ContSUP(N,1)) = (Zlocal_TLH(s,ContSUP(N,1))-Zlocal_TLH(s,ContINF(N,1)))... + /(ARRAYdate_TLH(ContSUP(N,1))-ARRAYdate_TLH(ContINF(N,1))); + acceleration_TLH(s,ContSUP(N,1)) = (speed_TLH(s,ContSUP(N,1))-speed_TLH(s,ContINF(N,1)))... + /(ARRAYdate_TLH(ContSUP(N,1))-ARRAYdate_TLH(ContINF(N,1))); + acceleration_local_TLH(s,ContSUP(N,1)) = (speed_local_TLH(s,ContSUP(N,1))-speed_local_TLH(s,ContINF(N,1)))... + /(ARRAYdate_TLH(ContSUP(N,1))-ARRAYdate_TLH(ContINF(N,1))); + N = N+1; + end + end +end + +fclose(fileID); +% Approssimo i dati con il corretto numero di cifre decimali +[Y_TLH,Z_TLH,Ylocal_TLH,Zlocal_TLH,TempDef_TLH,speed_TLH,... + speed_local_TLH,acceleration_TLH,acceleration_local_TLH,AlfaX_TLH,AlfaY_TLH] = ... + approx_TLH(Y_TLH,Z_TLH,Ylocal_TLH,Zlocal_TLH,TempDef_TLH,speed_TLH,speed_local_TLH,... + acceleration_TLH,acceleration_local_TLH,AlfaX_TLH,AlfaY_TLH,FileName); + +% Riordino matrice errori +[r,~] = size(ErrTiltLinkH); +Matrice_err = zeros(r,rTLH); +for i = 1:r % date + d = 1; + for n = 1:rTLH % nodi + j = 1; + err = ErrTiltLinkH(i,d:d+3); + while j <= 4 + if err(1,j) == 1 + Matrice_err(i,n) = 1; + end + j = j+1; + end + d = d+4; + end +end +ErrTiltLinkH = Matrice_err'; + +text = 'Tilt Link H calculation executed correctly. elab2D_TLH function closed'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/elab2D_TLHRH.m b/ATD/elab2D_TLHRH.m new file mode 100755 index 0000000..76c20a9 --- /dev/null +++ b/ATD/elab2D_TLHRH.m @@ -0,0 +1,369 @@ +function [Y_TLHRH,Z_TLHRH,Ylocal_TLHRH,Zlocal_TLHRH,AlfaX_TLHRH,AlfaY_TLHRH,... + TempDef_TLHRH,speed_TLHRH,speed_local_TLHRH,acceleration_TLHRH,acceleration_local_TLHRH,... + ARRAYdate_TLHRH,ErrTiltLinkHRH] = elab2D_TLHRH(rTLHRH,AngDef_TLHRH,TempDef_TLHRH,... + SpeTLHRH,PsTLHRH,DatiElabTiltLinkHRH,Ndevst_HR,Wdevst_HR,ARRAYdate_TLHRH,... + NuovoZeroTLHRH,NdatiMedia,Ndatidespike,ErrTiltLinkHRH,margine,elab_option,... + Tmax,Tmin,datainiTLHRH,FileName) + +%% Inizializzazione +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'elab2D_TLHRH function started'; +fprintf(fileID,fmt,text); + +if NuovoZeroTLHRH == 1 + if NdatiMedia > Ndatidespike + Ndati = NdatiMedia; + else + Ndati = Ndatidespike; + end + ini = round(Ndati/2)+1; + if rem(Ndati,2) == 0 + ini = ini+1; + end + clear NDati + ini = ini + margine; + if ini < 6 + ini = 6; + end + if Ndevst_HR ~= 0 % Allora prendo tutti i dati e solo in seguito considero i nuovi, a valle della funzione filtro + ini = 1; + end + AngDef_TLHRH = AngDef_TLHRH(ini:end,:); + TempDef_TLHRH = TempDef_TLHRH(ini:end,:); + DatiElabTiltLinkHRH = DatiElabTiltLinkHRH(ini:end,:); + ARRAYdate_TLHRH = ARRAYdate_TLHRH(ini:end,1); + ErrTiltLinkHRH = ErrTiltLinkHRH(ini:end,:); +end + +%% Definisco i dati +Nnodi = rTLHRH; +% Spacchetto +[r,~] = size(AngDef_TLHRH); % Numero di dati +[Ndati,~] = size(ARRAYdate_TLHRH); +ax = zeros(r,Nnodi); +ay = zeros(r,Nnodi); +for i=1:Nnodi + ax(:,i) = AngDef_TLHRH(:,(i-1)*2+1); % ax + ay(:,i) = AngDef_TLHRH(:,(i-1)*2+2); % ay +end +ax = ax'; % riga nodi, colonna date +ay = ay'; % riga nodi, colonna date + +%% Costruzione delle matrici + +% Dati locali +asseY_TLHRH = zeros(Nnodi,Ndati); % Raccoglie i dati planari locali nella direzione di sviluppo della catena +asseZ_TLHRH = zeros(Nnodi,Ndati); % Raccoglie i dati planari locali nella direzione di sviluppo della catena, basso->alto + +% Dati cumulati +Y_TLHRH = zeros(Nnodi,Ndati); % Raccoglie i dati cumulati nella direzione di sviluppo della catena +Z_TLHRH = zeros(Nnodi,Ndati); % Raccoglie i dati cumulati nella direzione di sviluppo della catena, basso->alto + +% Angoli +AlfaX_TLHRH = zeros(Nnodi,Ndati); +AlfaY_TLHRH = zeros(Nnodi,Ndati); + +% parametri per il calcolo +SpeTLHRH = SpeTLHRH(2:end,1); % valori segmenti di pertinenza +PsTLHRH = PsTLHRH(2:end,1); % valori posizioni punti di calcolo + +% Inizio del ciclo di elaborazione +text = 'Elaboration of Tilt Link HR H started'; +fprintf(fileID,fmt,text); + +for jj = 1:Ndati + for ii = 1:Nnodi + ax = 0.01745329251994329576923690768489*ax; + ay = 0.01745329251994329576923690768489*ay; + [Y_TLHRH,Z_TLHRH,asseY_TLHRH,asseZ_TLHRH,AlfaX_TLHRH,AlfaY_TLHRH] = CalcoloBiax_TLHRH(... + SpeTLHRH,PsTLHRH,ii,jj,ax,ay,asseY_TLHRH,asseZ_TLHRH,Y_TLHRH,Z_TLHRH,... + calotta_base,AlfaX_TLHRH,AlfaY_TLHRH); + end +end +dY_TLHRH = diff(asseY_TLHRH,1,2); +dZ_TLHRH = diff(asseZ_TLHRH,1,2); + +%% Controllo della Temperatura +clear r +clear c +clear cc +[r,c] = size(TempDef_TLHRH); + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +clear i +clear j +contT = 1; % contatore +TempDef_TLHRH = TempDef_TLHRH'; +textT = 'There are not correction of Tilt Link HR H based on temperature filter'; + +FileTemperature = ['' IDcentralina '-' DTcatena '-TLHRH-Therm.csv']; +if isfile(FileTemperature) == 1 + DatiRaw = csvread(FileTemperature); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; +else + rDR = 1; + cDR = 1; +end + +for j = 1:c % Data + for i = 1:r % Nodo + % NON considero i dati al di sopra di Tmax o al di sotto di Tmin + if TempDef_TLHRH(i,j) > Tmax || TempDef_TLHRH(i,j) < Tmin + cont2 = cont2+1; + if j == 1 + if isfile(FileTemperature) == 1 + RawDate = find(DatiRaw(:,1)<=datenum(datainiTLHRH)); + if isempty(RawDate) == 1 + cc = 2; + while cc <= Ndate + if TempDef_TLHRH(i,cc) > Tmax || TempDef_TLHRH(i,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_TLHRH(i,j) = TempDef_TLHRH(i,cc); + else + if isnan(DatiRaw(RawDate(end),i+1)) == 0 + TempDef_TLHRH(i,j) = DatiRaw(RawDate(end),i+1); + ErrTiltLinkHRH(j,i) = 0.5; + wardat = 'Temperature data of Tilt Link HR H nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + else + cc = 2; + while cc <= c + if TempDef_TLHRH(i,cc) > Tmax || TempDef_TLHRH(i,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_TLHRH(i,j) = TempDef_TLHRH(i,cc); + end + end + else + cc = 2; + while cc <= c + if TempDef_TLHRH(i,cc) > Tmax || TempDef_TLHRH(i,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_TLHRH(i,j) = TempDef_TLHRH(i,cc); + end + else + dY_TLHRH(i,j-1) = 0; + dZ_TLHRH(i,j-1) = 0; + TempDef_TLHRH(i,j) = TempDef_TLHRH(i,j-1); + ErrTiltLinkHRH(j,i) = 0.5; + end + end + textT = ['' num2str(contT) ' correction executed for Tilt Link HR H - Temperature filter!']; + end +end + +if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=ARRAYdate_TLHRH(1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(ARRAYdate_TLHRH(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(ARRAYdate_TLHRH(:,1)>DatiRaw(RawDate1(end)+1,1)); + end +else + RawDate1 = []; + RawDate2 = 1; +end +if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:); ARRAYdate_TLHRH(RawDate2(1):end) TempDef_TLHRH(:,RawDate2(1):end)']; +elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = [ARRAYdate_TLHRH TempDef_TLHRH']; +else + Dati = DatiRaw; +end +% Elimino appoggio più vecchio di un mese +RawDate3 = find(Dati(:,1) Ndatidespike + NdatiF = NdatiMedia; + else + NdatiF = Ndatidespike; + end + ini = round(NdatiF/2)+1; + if rem(NdatiF,2) == 0 + ini = ini+1; + end + clear NDatiF + iniST = round(Wdevst_HR/2); + if rem(Wdevst_HR,2) == 0 + iniST = iniST+1; + end + iniST = iniST + margine; + if iniST > ini + ini = iniST; + end + if ini < 6 + ini = 6; + end + dY_TLHRH = dY_TLHRH(:,ini:end); + dZ_TLHRH = dZ_TLHRH(:,ini:end); + TempDef_TLHRH = TempDef_TLHRH(ini:end,:); + DatiElabTiltLinkHRH = DatiElabTiltLinkHRH(ini:end,:); + ARRAYdate_TLHRH = ARRAYdate_TLHRH(ini:end,1); + ErrTiltLinkHRH = ErrTiltLinkHRH(ini:end,:); +end + +%% Finalizzo i calcoli +[rx,cx] = size(dZ_TLHRH); +% totale del singolo nodo data per data +sommaY_TLH = zeros(rx,cx+1); +sommaZ_TLH = zeros(rx,cx+1); +% Locali +Ylocal_TLHRH = zeros(Nnodi,Ndati); +Zlocal_TLHRH = zeros(Nnodi,Ndati); +% cumulata del singolo nodo data per data in posizione assoluta +% il primo valore è quello di posizione assoluta iniziale +Y_TLHRH = zeros(rx,cx+1); +Z_TLHRH = zeros(rx,cx+1); +speed_TLHRH = zeros(Nnodi,Ndati); +speed_local_TLHRH = zeros(Nnodi,Ndati); +acceleration_TLHRH = zeros(Nnodi,Ndati); +acceleration_local_TLHRH = zeros(Nnodi,Ndati); + +if NuovoZeroTLHRH == 1 + [rE,cE] = size(DatiElabTiltLinkHRH); + cont = 3; + n = 1; + while cont<=cE + sommaY_TLH(n,1) = cell2mat(DatiElabTiltLinkHRH(1,cont))'; + Ylocal_TLHRH(n,1) = sommaY_TLH(n,1); + sommaZ_TLH(n,1) = cell2mat(DatiElabTiltLinkHRH(1,cont+1))'; + Zlocal_TLHRH(n,1) = sommaZ_TLH(n,1); + Y_TLHRH(n,1) = cell2mat(DatiElabTiltLinkHRH(1,cont+2))'; + Z_TLHRH(n,1) = cell2mat(DatiElabTiltLinkHRH(1,cont+3))'; + speed_local_TLHRH(n,1:rE) = cell2mat(DatiElabTiltLinkHRH(:,cont+7))'; + speed_TLHRH(n,1:rE) = cell2mat(DatiElabTiltLinkHRH(:,cont+8))'; + acceleration_local_TLHRH(n,1:rE) = cell2mat(DatiElabTiltLinkHRH(:,cont+9))'; + acceleration_TLHRH(n,1:rE) = cell2mat(DatiElabTiltLinkHRH(:,cont+10))'; + cont = cont+13; + n = n+1; + end +else + % Primo dato + Y_TLHRH(:,1) = PsTLHRH; + Z_TLHRH(:,1) = 0; +end +for iii = 1:cx % date + % somma singoli spostamenti del singolo nodo + sommaY_TLH(:,iii+1) = sum(dY_TLHRH(:,1:iii),2)+sommaY_TLH(:,1); + sommaZ_TLH(:,iii+1) = sum(dZ_TLHRH(:,1:iii),2)+sommaZ_TLH(:,1); + % spostamenti locali riferiti allo 0 + Ylocal_TLHRH(:,iii+1) = sommaY_TLH(:,iii+1); + Zlocal_TLHRH(:,iii+1) = sommaZ_TLH(:,iii+1); + % cumulata spostamenti + Y_TLHRH(:,iii+1) = Y_TLHRH(:,1) + cumsum(sommaY_TLH(:,iii+1)) - cumsum(sommaY_TLH(:,1)); + Z_TLHRH(:,iii+1) = Z_TLHRH(:,1) + cumsum(sommaZ_TLH(:,iii+1)) - cumsum(sommaZ_TLH(:,1)); +end + +%% Calcolo velocità di spostamento giornaliera +[numDate,~] = size(ARRAYdate_TLHRH); % numero di date +d = 1; +p = 1; +diffDate = 0; +n = 1; +period = 1; % calcolo giornaliero +ContSUP = []; +for dd = 1:numDate + while diffDate < period + d = d+1; + if d > numDate % Se d supera le date disponibili, esco dal ciclo while + break + end + diffDate = ARRAYdate_TLHRH(d) - ARRAYdate_TLHRH(p); + end + if d >numDate + break + end + ContSUP(n,1) = d; %#ok<*AGROW> % Creo matrice indici dell'estremo superiore della differenza + ContINF(n,1) = p; % Creo matrice indici dell'estremo inferiore della differenza + p = p+1; % passo alla data di partenza successiva + d = p; % resetto il conto di d + n = n+1; + diffDate = 0; +end + +check = isempty(ContSUP); +if check == 0 + [nDate,~] = size(ContSUP); + for s = 1:rTLHRH + N = 1; + for dd = 1:nDate + speed_TLHRH(s,ContSUP(N,1)) = (Z_TLHRH(s,ContSUP(N,1))-Z_TLHRH(s,ContINF(N,1)))/(ARRAYdate_TLHRH(ContSUP(N,1))-ARRAYdate_TLHRH(ContINF(N,1))); + speed_local_TLHRH(s,ContSUP(N,1)) = (Zlocal_TLHRH(s,ContSUP(N,1))-Zlocal_TLHRH(s,ContINF(N,1)))/(ARRAYdate_TLHRH(ContSUP(N,1))-ARRAYdate_TLHRH(ContINF(N,1))); + acceleration_TLHRH(s,ContSUP(N,1)) = (speed_TLHRH(s,ContSUP(N,1))-speed_TLHRH(s,ContINF(N,1)))/(ARRAYdate_TLHRH(ContSUP(N,1))-ARRAYdate_TLHRH(ContINF(N,1))); + acceleration_local_TLHRH(s,ContSUP(N,1)) = (speed_local_TLHRH(s,ContSUP(N,1))-speed_local_TLHRH(s,ContINF(N,1)))/(ARRAYdate_TLHRH(ContSUP(N,1))-ARRAYdate_TLHRH(ContINF(N,1))); + N = N+1; + end + end +end + +fclose(fileID); +% Approssimo i dati con il corretto numero di cifre decimali +[Y_TLHRH,Z_TLHRH,Ylocal_TLHRH,Zlocal_TLHRH,TempDef_TLHRH,speed_TLHRH,... + speed_local_TLHRH,acceleration_TLHRH,acceleration_local_TLHRH,AlfaX_TLHRH,... + AlfaY_TLHRH] = approx_TLHRH(Y_TLHRH,Z_TLHRH,Ylocal_TLHRH,Zlocal_TLHRH,... + TempDef_TLHRH,speed_TLHRH,speed_local_TLHRH,acceleration_TLHRH,... + acceleration_local_TLHRH,AlfaX_TLHRH,AlfaY_TLHRH,FileName); + +% Riordino matrice errori +[r,~] = size(ErrTiltLinkHRH); +Matrice_err = zeros(r,rTLHRH); +for i = 1:r % date + d = 1; + for n = 1:rTLHRH % nodi + j = 1; + err = ErrTiltLinkHRH(i,d:d+2); + while j <= 3 + if err(1,j) == 1 + Matrice_err(i,n) = 1; + end + j = j+1; + end + d = d+3; + end +end +ErrTiltLinkHRH = Matrice_err'; + +text = 'Tilt Link HR H calculation executed correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/elab2D_TuL.m b/ATD/elab2D_TuL.m new file mode 100755 index 0000000..8f59e8f --- /dev/null +++ b/ATD/elab2D_TuL.m @@ -0,0 +1,633 @@ +function [X_TuL,Xstar_TuL,Y_TuL,Z_TuL,Zstar_TuL,Xlocal_TuL,Ylocal_TuL,Zlocal_TuL,... + SegStar,HShift_local_TuL,TempDef_TuL,ARRAYdate_TuL,Area_TuL,Speed_local_TuL,... + Acceleration_local_TuL,ErrTunnelLink] = elab2D_TuL(rTuL,accTuL,ay_TuL,ay_TuL_AC,... + ACCdefRis_TuL,SpeTuL,IDcentralina,DTcatena,DatiElabTunnelLink,NuovoZeroTuL,... + TempDef_TuL,tolleranzaAcc,Ndevst,Wdevst,NdatiMedia,Ndatidespike,ARRAYdate_TuL,... + data1_AC,Nodo_AC,margine,ErrTunnelLink,Tmax,Tmin,datainiTuL,FileName) + +%% Inizializzazione +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'elab2D_TuL function started'; +fprintf(fileID,fmt,text); + +if NuovoZeroTuL == 1 + if NdatiMedia > Ndatidespike + Ndati = NdatiMedia; + else + Ndati = Ndatidespike; + end + ini = round(Ndati/2)+1; + if rem(Ndati,2) == 0 + ini = ini+1; + end + clear NDati + ini = ini + margine; + if ini < 6 + ini = 6; + end + if Ndevst ~= 0 % Allora prendo tutti i dati e solo in seguito considero i nuovi, a valle della funzione filtro + ini = 1; + end + DatiElabTunnelLink = DatiElabTunnelLink(ini:end,:); + ACCdefRis_TuL = ACCdefRis_TuL(ini:end,:); + ARRAYdate_TuL = ARRAYdate_TuL(ini:end,1); + TempDef_TuL = TempDef_TuL(ini:end,:); + accTuL = accTuL(ini:end,:); + ErrTunnelLink = ErrTunnelLink(ini:end,:); +end + +%% Definizione dei dati +Nnodi = rTuL; +[r,~] = size(accTuL); +[Ndati,~] = size(ARRAYdate_TuL); +ax = zeros(r,Nnodi); +ay = zeros(r,Nnodi); +az = zeros(r,Nnodi); +for i=1:Nnodi + ax(:,i) = accTuL(:,(i-1)*3+1); % ax + ay(:,i) = accTuL(:,(i-1)*3+2:(i-1)*3+2); % ay + az(:,i) = accTuL(:,(i-1)*3+3:(i-1)*3+3); % az +end + +ax = ax'; % riga nodi, colonna date +ay = ay'; % riga nodi, colonna date +az = az'; % riga nodi, colonna date +% calcolo orario +asseX_TuL = zeros(Nnodi,Ndati); % Raccoglie i dati locali nella base della sezione della galleria +asseY_TuL = zeros(Nnodi,Ndati); % Raccoglie i dati locali nella direzione trasversale rispetto alla sezione della galleria +asseZ_TuL = zeros(Nnodi,Ndati); % Raccoglie i dati locali nell'altezza della sezione della galleria +% Calcolo antiorario +asseXstar_TuL = zeros(Nnodi,Ndati); +asseYstar_TuL = zeros(Nnodi,Ndati); +asseZstar_TuL = zeros(Nnodi,Ndati); +% Calcolo orario +X_TuL = zeros(Nnodi,Ndati); % Raccoglie i dati cumulati nella base della sezione della galleria +Y_TuL = zeros(Nnodi,Ndati); % Raccoglie i dati cumulati nella direzione trasversale rispetto alla sezione della galleria +Z_TuL = zeros(Nnodi,Ndati); % Raccoglie i dati cumulati nell'altezza della sezione della galleria +% Calcolo antiorario +Xstar_TuL = zeros(Nnodi,Ndati); +Ystar_TuL = zeros(Nnodi,Ndati); +Zstar_TuL = zeros(Nnodi,Ndati); + +% attivo/disattivo calcolo stella +[Verso,Segmenti,Peso,PosIniEnd,Punti_Noti,Antiorario] = star(IDcentralina,... + DTcatena,FileName); % INPUT SITO SPECIFICO DA DARE !!! + +% Carico file con nodi da correggere di segno +[indiceX,indiceZ] = segnoTuL(IDcentralina,DTcatena,FileName); + +[dim,~] = size(Segmenti); % numero di punti per il calcolo della stella +SegStar = zeros(dim,Ndati); +% parametri per il calcolo +SpeTuL = SpeTuL(2:end,1); % valori di primo tentativo segmenti di pertinenza + +% --- Modifica Sito Specifica per Synthesis Ilot Pasteur --- +if strcmp(IDcentralina,'ID0142') == 1 + [dimS,~] = size(SpeTuL); + for ss = 1:dimS + SpeTuL(ss) = 0.5; + end +end + +for jj = 1:Ndati + if jj == 1 % al primo dato raccolto riporto i punti di calcolo sui punti noti + if NuovoZeroTuL == 0 % calcolo a partire dalla prima data + [cXo,cYo,cZo,asseX_TuL,asseY_TuL,asseZ_TuL,asseZstar_TuL] = punti_noti_TuL(asseX_TuL,... + asseY_TuL,asseZ_TuL,Punti_Noti,PosIniEnd); + cXoStar = []; + cZoStar = []; + elseif NuovoZeroTuL == 1 % calcolo a partire da dati già elaborati a cui mi riferisco + [cXo,cXo_ini,cXoStar,cYo,~,cZo,cZo_ini,cZoStar,asseX_TuL,... + asseXstar_TuL,asseY_TuL,asseZ_TuL,asseZstar_TuL] = punti_noti_exe_TuL(asseX_TuL,... + asseY_TuL,asseZ_TuL,DatiElabTunnelLink,PosIniEnd,IDcentralina,DTcatena); + end + for ii = 1:Nnodi + [X_TuL,Y_TuL,Z_TuL,asseX_TuL,asseY_TuL,asseZ_TuL,Xstar_TuL,Ystar_TuL,... + Zstar_TuL,asseXstar_TuL,asseYstar_TuL,asseZstar_TuL] = CalcoloBiax_TuL(SpeTuL,... + ii,jj,ax,ay,az,asseX_TuL,asseY_TuL,asseZ_TuL,X_TuL,Y_TuL,Z_TuL,... + asseXstar_TuL,asseYstar_TuL,asseZstar_TuL,Xstar_TuL,Ystar_TuL,Zstar_TuL,... + Nnodi,PosIniEnd,indiceX,indiceZ,rTuL,FileName); + end + [shiftX,shiftY,shiftZ,shiftXstar,shiftYstar,shiftZstar] = pos_ini_TuL(cXo,... + cXoStar,cYo,cZo,cZoStar,X_TuL,Y_TuL,Z_TuL,Xstar_TuL,Ystar_TuL,Zstar_TuL,NuovoZeroTuL); + else + for ii = 1:Nnodi + [X_TuL,Y_TuL,Z_TuL,asseX_TuL,asseY_TuL,asseZ_TuL,Xstar_TuL,Ystar_TuL,... + Zstar_TuL,asseXstar_TuL,asseYstar_TuL,asseZstar_TuL] = CalcoloBiax_TuL(SpeTuL,... + ii,jj,ax,ay,az,asseX_TuL,asseY_TuL,asseZ_TuL,X_TuL,Y_TuL,Z_TuL,... + asseXstar_TuL,asseYstar_TuL,asseZstar_TuL,Xstar_TuL,Ystar_TuL,... + Zstar_TuL,Nnodi,PosIniEnd,indiceX,indiceZ,rTuL,FileName); + end + end + % riporto X, Y e Z sui punti noti + X_TuL(:,jj) = X_TuL(:,jj) - shiftX(:,1); + Y_TuL(:,jj) = Y_TuL(:,jj) - shiftY(:,1); + Z_TuL(:,jj) = Z_TuL(:,jj) - shiftZ(:,1); + Xstar_TuL(:,jj) = Xstar_TuL(:,jj) - shiftXstar(:,1); + Ystar_TuL(:,jj) = Ystar_TuL(:,jj) - shiftYstar(:,1); + Zstar_TuL(:,jj) = Zstar_TuL(:,jj) - shiftZstar(:,1); + % Nel calcolo della stella non considero Y + [SegStar] = CalcoloStar(X_TuL,Z_TuL,Xstar_TuL,Zstar_TuL,Verso,Segmenti,Peso,jj,SegStar,Nnodi,dim); +end + +Xrif = X_TuL; % mi serve dopo +Yrif = Y_TuL; % mi serve dopo +Zrif = Z_TuL; % mi serve dopo +Xstar_rif = Xstar_TuL; % mi serve dopo +Ystar_rif = Ystar_TuL; % mi serve dopo +Zstar_rif = Zstar_TuL; % mi serve dopo + +dX = diff(asseX_TuL,1,2); +dY = diff(asseY_TuL,1,2); +dZ = diff(asseZ_TuL,1,2); +dXstar = diff(asseXstar_TuL,1,2); +dYstar = diff(asseYstar_TuL,1,2); +dZstar = diff(asseZstar_TuL,1,2); + +%% Controllo della risultante delle accelerazioni +clear r +clear rr +clear c +clear cc +ACCdefRis_TuL = ACCdefRis_TuL'; % Nodi in riga, date in colonna +[r,c] = size(ACCdefRis_TuL); +[rr,cc] = size(X_TuL); + +% controllo che le matrici con le risultanti delle accelerazioni e +% le matrici con i dati di spostamento abbiano le stesse dimensioni +if r~=rr + text = '---Warning! Number of row of displacement data do not correspond to the number of acceleration cosine vector!---'; + fprintf(fileID,fmt,text); +end +if c~=cc + text = '---Warning! Number of column of displacement data do not correspond to the number of acceleration cosine vector!---'; + fprintf(fileID,fmt,text); +end +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +clear i +clear j +cont = 1; % contatore +cont2 = 1; % contatore +cont3 = 1; % contatore +TempDef_TuL = TempDef_TuL'; +text1 = 'There are not correction of Tunnel Link based on acceleration vector filter'; +text2 = 'There are not correction of Tunnel Link based on uncalibrated Acceleration vector'; +text3 = 'There are not correction of Tunnel Link based on temperature filter'; +LIMinf = 0.9; +LIMsup = 1.1; +for j = 2:c % data + for i = 1:r % nodo + % se il valore assoluto della differenza è maggiore della + % tolleranza, pongo gli spostamenti giornalieri pari a 0 + if abs(ACCdefRis_TuL(i,j)-ACCdefRis_TuL(i,j-1)) > tolleranzaAcc + dX(i,j-1) = 0; + dY(i,j-1) = 0; + dZ(i,j-1) = 0; + dXstar(Nnodi+1-i,j-1) = 0; + dYstar(Nnodi+1-i,j-1) = 0; + dZstar(Nnodi+1-i,j-1) = 0; + text1 = ['' num2str(cont) ' correction executed for Tunnel Link - Acceleration vector filter!']; + cont = cont+1; + end + if ACCdefRis_TuL(i,j) < LIMinf || ACCdefRis_TuL(i,j) > LIMsup % Il nodo è fuori taratura! + dX(i,j-1) = 0; + dY(i,j-1) = 0; + dZ(i,j-1) = 0; + dXstar(Nnodi+1-i,j-1) = 0; + dYstar(Nnodi+1-i,j-1) = 0; + dZstar(Nnodi+1-i,j-1) = 0; + TempDef_TuL(i,j) = TempDef_TuL(i,j-1); + text2 = ['' num2str(cont) ' correction executed for Tunnel link - uncalibrated Acceleration vector!']; + cont3 = cont3+1; + end + end +end + +FileTemperature = ['' IDcentralina '-' DTcatena '-TuL-Therm.csv']; +if isfile(FileTemperature) == 1 + DatiRaw = csvread(FileTemperature); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; +else + rDR = 1; + cDR = 1; +end +for b = 1:c % Data + for a = 1:r % Nodo + % NON considero i dati al di sopra dei 80 °C o al di sotto dei -30 °C! + if TempDef_TuL(a,b) > Tmax || TempDef_TuL(a,b) < Tmin + cont2 = cont2+1; + if b == 1 + if isfile(FileTemperature) == 1 + RawDate = find(DatiRaw(:,1)<=datenum(datainiTuL)); + if isempty(RawDate) == 1 + cc = 2; + while cc <= c + if TempDef_TuL(a,cc) > Tmax || TempDef_TuL(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_TuL(a,b) = TempDef_TuL(a,cc); + else + if isnan(DatiRaw(RawDate(end),a+1)) == 0 + TempDef_TuL(a,b) = DatiRaw(RawDate(end),a+1); + ErrTunnelLink(b,a) = 0.5; + wardat = 'Temperature data of Tunnel Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + else + cc = 2; + while cc <= c + if TempDef_TuL(a,cc) > Tmax || TempDef_TuL(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_TuL(a,b) = TempDef_TuL(a,cc); + end + end + else + cc = 2; + while cc <= c + if TempDef_TuL(a,cc) > Tmax || TempDef_TuL(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_TuL(a,b) = TempDef_TuL(a,cc); + end + else + TempDef_TuL(a,b) = TempDef_TuL(a,b-1); + dX(a,b-1) = 0; + dY(a,b-1) = 0; + dZ(a,b-1) = 0; + ErrTunnelLink(b,a) = 0.5; + end + text3 = ['' num2str(cont2) ' correction executed for Tunnel Link - Temperature filter!']; + end + end +end + +if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=ARRAYdate_TuL(1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(ARRAYdate_TuL(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(ARRAYdate_TuL(:,1)>DatiRaw(RawDate1(end)+1,1)); + end +else + RawDate1 = []; + RawDate2 = 1; +end +if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:); ARRAYdate_TuL(RawDate2(1):end) TempDef_TuL(:,RawDate2(1):end)']; +elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = [ARRAYdate_TuL TempDef_TuL']; +else + Dati = DatiRaw; +end +% Elimino appoggio più vecchio di un mese +RawDate3 = find(Dati(:,1) Ndatidespike + NdatiF = NdatiMedia; + else + NdatiF = Ndatidespike; + end + ini = round(NdatiF/2)+1; + if rem(NdatiF,2) == 0 + ini = ini+1; + end + clear NDatiF + iniST = round(Wdevst/2); + if rem(Wdevst,2) == 0 + iniST = iniST+1; + end + iniST = iniST + margine; + if iniST > ini + ini = iniST; + end + if ini < 6 + ini = 6; + end + dX = dX(:,ini:end); + dY = dY(:,ini:end); + dZ = dZ(:,ini:end); + dXstar = dXstar(:,ini:end); + dYstar = dYstar(:,ini:end); + dZstar = dZstar(:,ini:end); + TempDef_TuL = TempDef_TuL(ini:end,:); + DatiElabTunnelLink = DatiElabTunnelLink(ini:end,:); + ARRAYdate_TuL = ARRAYdate_TuL(ini:end,1); + ErrTunnelLink = ErrTunnelLink(ini:end,:); +end + +% Controllo che l'arco rovescio debba già essere calcolato o meno +data_TuL = ARRAYdate_TuL; +data_ARC = datenum(data1_AC); +Delta = data_ARC-data_TuL; +Check = find(Delta>0); +Control_ARC = isempty(Check); +if Control_ARC == 0 + indice_ARC = []; + ay_AC = ay_TuL_AC'; +else + Inizio = find(Delta<=0); + indice_ARC = Inizio(1); + if NuovoZeroTuL == 1 + ay_AC = ay_TuL_AC'; + else + ay_AC = ay; + end +end + + +%% Finalizzo i calcoli +[rx,cx] = size(dX); +% totale del singolo nodo data per data +sommaX = zeros(rx,cx+1); +sommaXstar = zeros(rx,cx+1); +sommaY = zeros(rx,cx+1); +sommaYstar = zeros(rx,cx+1); +sommaZ = zeros(rx,cx+1); +sommaZstar = zeros(rx,cx+1); +% cumulata del singolo nodo data per data in posizione assoluta +% il primo valore è quello di posizione assoluta iniziale +X_TuL = zeros(rx,cx+1); +Y_TuL = zeros(rx,cx+1); +Z_TuL = zeros(rx,cx+1); +Xstar_TuL = zeros(rx,cx+1); +Ystar_TuL = zeros(rx,cx+1); +Zstar_TuL = zeros(rx,cx+1); +% cumulata del singolo nodo data per data in posizione relativa +% il primo valore è quello di posizione assoluta iniziale +Xlocal_TuL = zeros(Nnodi,Ndati); +Ylocal_TuL = zeros(Nnodi,Ndati); +Zlocal_TuL = zeros(Nnodi,Ndati); +Xlocal_star = zeros(Nnodi,Ndati); +Ylocal_star = zeros(Nnodi,Ndati); +Zlocal_star = zeros(Nnodi,Ndati); +ris_local = zeros(Nnodi,1); +Speed_local_TuL = zeros(Nnodi,Ndati); +Acceleration_local_TuL = zeros(Nnodi,Ndati); +% Calcolo area della sezione +Area_TuL = zeros(1,Ndati); +AreaStar_TuL = zeros(1,Ndati); + +% Primo dato +X_TuL(:,1) = Xrif(:,1); +Y_TuL(:,1) = Yrif(:,1); +Z_TuL(:,1) = Zrif(:,1); +Area_TuL(:,1) = polyarea(X_TuL(:,1),Z_TuL(:,1)); +AreaStar_TuL(:,1) = polyarea(Xstar_TuL(:,1),Zstar_TuL(:,1)); +Xstar_TuL(:,1) = Xstar_rif(:,1); +Ystar_TuL(:,1) = Ystar_rif(:,1); +Zstar_TuL(:,1) = Zstar_rif(:,1); +if Control_ARC == 0 % l'arco rovescio si calcola da dopo + X_TuL(Nodo_AC:end,1) = Punti_Noti(Nodo_AC+1:end,1); + Y_TuL(Nodo_AC:end,1) = Punti_Noti(Nodo_AC+1:end,2); + Z_TuL(Nodo_AC:end,1) = Punti_Noti(Nodo_AC+1:end,3); + Xstar_TuL(1:rTuL-Nodo_AC+1,1) = Punti_Noti(Nodo_AC+1:end,1); + Ystar_TuL(1:rTuL-Nodo_AC+1,1) = Punti_Noti(Nodo_AC+1:end,2); + Zstar_TuL(1:rTuL-Nodo_AC+1,1) = Punti_Noti(Nodo_AC+1:end,3); +end +HShift_local_TuL = zeros(rx,cx+1); + +if NuovoZeroTuL == 1 + [~,cE] = size(DatiElabTunnelLink); + cont = 3; + contS = 11; + n = 1; + while cont<=cE + sommaX(n,1) = cell2mat(DatiElabTunnelLink(1,cont))'; + Xlocal_TuL(n,1) = sommaX(n,1); + sommaY(n,1) = cell2mat(DatiElabTunnelLink(1,cont+1))'; + Ylocal_TuL(n,1) = sommaY(n,1); + sommaZ(n,1) = cell2mat(DatiElabTunnelLink(1,cont+2))'; + Zlocal_TuL(n,1) = sommaZ(n,1); + if n < rTuL + if n == 1 % primo + sommaXstar(n,1) = Xstar_TuL(n,1)-cXo_ini(end-n,1); + sommaZstar(n,1) = Zstar_TuL(n,1)-cZo_ini(end-n,1); + else + sommaXstar(n,1) = (Xstar_TuL(n,1)-Xstar_TuL(n-1,1))-(cXo_ini(end-n,1)-cXo_ini(end-n+1,1)); + sommaZstar(n,1) = (Zstar_TuL(n,1)-Zstar_TuL(n-1,1))-(cZo_ini(end-n,1)-cZo_ini(end-n+1,1)); + end + else % ultimo + sommaXstar(n,1) = (Xstar_TuL(n,1)-Xstar_TuL(end-1,1))-(cXo_ini(end,1)-cXo_ini(1,1)); + sommaZstar(n,1) = (Zstar_TuL(n,1)-Zstar_TuL(end-1,1))-(cZo_ini(end,1)-cZo_ini(1,1)); + end + sommaYstar(n,1) = cell2mat(DatiElabTunnelLink(1,cE-contS+2))'; + ris_local(n,1) = cell2mat(DatiElabTunnelLink(1,cont+9))'; + Speed_local_TuL(n,1) = cell2mat(DatiElabTunnelLink(1,cont+12))'; + Acceleration_local_TuL(n,1) = cell2mat(DatiElabTunnelLink(1,cont+13))'; + cont=cont+16; + contS=contS+16; + n = n+1; + end + Xlocal_star(:,1) = sommaXstar(:,1); + Zlocal_star(:,1) = sommaZstar(:,1); +end + +for iii = 1:cx % date + % somma singoli spostamenti del singolo nodo + sommaX(1:Nodo_AC-1,iii+1) = sum(dX(1:Nodo_AC-1,1:iii),2)+sommaX(1:Nodo_AC-1,1); + sommaY(1:Nodo_AC-1,iii+1) = sum(dY(1:Nodo_AC-1,1:iii),2)+sommaY(1:Nodo_AC-1,1); + sommaZ(1:Nodo_AC-1,iii+1) = sum(dZ(1:Nodo_AC-1,1:iii),2)+sommaZ(1:Nodo_AC-1,1); + sommaXstar(rTuL-Nodo_AC+2:end,iii+1) = sum(dXstar(rTuL-Nodo_AC+2:end,1:iii),2)+sommaXstar(rTuL-Nodo_AC+2:end,1); + sommaYstar(rTuL-Nodo_AC+2:end,iii+1) = sum(dYstar(rTuL-Nodo_AC+2:end,1:iii),2)+sommaYstar(rTuL-Nodo_AC+2:end,1); + sommaZstar(rTuL-Nodo_AC+2:end,iii+1) = sum(dZstar(rTuL-Nodo_AC+2:end,1:iii),2)+sommaZstar(rTuL-Nodo_AC+2:end,1); + if Control_ARC == 0 % l'arco rovescio si calcola da dopo + sommaX(Nodo_AC:end,iii+1) = 0; + sommaY(Nodo_AC:end,iii+1) = 0; + sommaZ(Nodo_AC:end,iii+1) = 0; + sommaXstar(1:rTuL-Nodo_AC+1,iii+1) = 0; + sommaYstar(1:rTuL-Nodo_AC+1,iii+1) = 0; + sommaZstar(1:rTuL-Nodo_AC+1,iii+1) = 0; + else + sommaX(Nodo_AC:end,iii+1) = sum(dX(Nodo_AC:end,indice_ARC:iii),2)+sommaX(Nodo_AC:end,1); + sommaY(Nodo_AC:end,iii+1) = sum(dY(Nodo_AC:end,indice_ARC:iii),2)+sommaY(Nodo_AC:end,1); + sommaZ(Nodo_AC:end,iii+1) = sum(dZ(Nodo_AC:end,indice_ARC:iii),2)+sommaZ(Nodo_AC:end,1); + sommaXstar(1:rTuL-Nodo_AC+1,iii+1) = sum(dXstar(1:rTuL-Nodo_AC+1,indice_ARC:iii),2)+sommaXstar(1:rTuL-Nodo_AC+1,1); + sommaYstar(1:rTuL-Nodo_AC+1,iii+1) = sum(dYstar(1:rTuL-Nodo_AC+1,indice_ARC:iii),2)+sommaYstar(1:rTuL-Nodo_AC+1,1); + sommaZstar(1:rTuL-Nodo_AC+1,iii+1) = sum(dZstar(1:rTuL-Nodo_AC+1,indice_ARC:iii),2)+sommaZstar(1:rTuL-Nodo_AC+1,1); + end + + % spostamenti locali riferiti alla posizione assoluta + Xlocal_TuL(:,iii+1) = sommaX(:,iii+1); + Ylocal_TuL(:,iii+1) = sommaY(:,iii+1); + Zlocal_TuL(:,iii+1) = sommaZ(:,iii+1); + Xlocal_star(:,iii+1) = sommaXstar(:,iii+1); + Ylocal_star(:,iii+1) = sommaYstar(:,iii+1); + Zlocal_star(:,iii+1) = sommaZstar(:,iii+1); + + % cumulata spostamenti (posizione assoluta) + if NuovoZeroTuL == 0 + X_TuL(:,iii+1) = Xrif(:,1) + cumsum(sommaX(:,iii+1)); + Y_TuL(:,iii+1) = Yrif(:,1) + cumsum(sommaY(:,iii+1)); + Z_TuL(:,iii+1) = Zrif(:,1) + cumsum(sommaZ(:,iii+1)); + Xstar_TuL(:,iii+1) = Xstar_rif(:,1) + cumsum(sommaXstar(:,iii+1)); + Ystar_TuL(:,iii+1) = Ystar_rif(:,1) + cumsum(sommaYstar(:,iii+1)); + Zstar_TuL(:,iii+1) = Zstar_rif(:,1) + cumsum(sommaZstar(:,iii+1)); + elseif NuovoZeroTuL == 1 + X_TuL(:,iii+1) = Xrif(:,1) + cumsum(sommaX(:,iii+1)) - cumsum(sommaX(:,1)); + Y_TuL(:,iii+1) = Yrif(:,1) + cumsum(sommaY(:,iii+1)) - cumsum(sommaY(:,1)); + Z_TuL(:,iii+1) = Zrif(:,1) + cumsum(sommaZ(:,iii+1)) - cumsum(sommaZ(:,1)); + Xstar_TuL(:,iii+1) = Xstar_rif(:,1) + cumsum(sommaXstar(:,iii+1)) - cumsum(sommaXstar(:,1)); + Ystar_TuL(:,iii+1) = Ystar_rif(:,1) + cumsum(sommaYstar(:,iii+1)) - cumsum(sommaYstar(:,1)); + Zstar_TuL(:,iii+1) = Zstar_rif(:,1) + cumsum(sommaZstar(:,iii+1)) - cumsum(sommaZstar(:,1)); + end + + Area_TuL(1,iii+1) = polyarea(X_TuL(:,iii+1),Z_TuL(:,iii+1)); + AreaStar_TuL(1,iii+1) = polyarea(Xstar_TuL(:,iii+1),Zstar_TuL(:,iii+1)); + % Segno + per spostamenti verso il centro, segno - per spostamenti + % verso l'esterno + if NuovoZeroTuL == 1 + HShift_local_TuL(:,1) = ris_local; + end + HShift_local_TuL(:,iii+1) = (sommaX(:,iii+1).^2+sommaZ(:,iii+1).^2).^0.5; + + if NuovoZeroTuL == 1 + ay_rif = ay_TuL'; + ay_rif_AC = ay_AC; + else + ay_rif = ay; + ay_rif_AC = ay; + end + for jjj = 1:Nnodi + Quadrante = Antiorario(jjj,1); + if jjj >= Nodo_AC + AY_RIF = ay_rif_AC; + else + AY_RIF = ay_rif; + end + if Quadrante == 1 + if ay(jjj,iii+1) - AY_RIF(jjj,1) < 0 % rotazione antioraria, moltiplico per -1 (va in fuori) + HShift_local_TuL(jjj,iii+1) = HShift_local_TuL(jjj,iii+1).*(-1); + end + elseif Quadrante == 2 + if ay(jjj,iii+1) - AY_RIF(jjj,1) > 0 % rotazione antioraria, moltiplico per -1 (va in fuori) + HShift_local_TuL(jjj,iii+1) = HShift_local_TuL(jjj,iii+1).*(-1); + end + elseif Quadrante == 3 + if ay(jjj,iii+1) - AY_RIF(jjj,1) > 0 % rotazione antioraria, moltiplico per -1 (va in fuori) + HShift_local_TuL(jjj,iii+1) = HShift_local_TuL(jjj,iii+1).*(-1); + end + elseif Quadrante == 4 + if ay(jjj,iii+1) - AY_RIF(jjj,1) < 0 % rotazione antioraria, moltiplico per -1 (va in fuori) + HShift_local_TuL(jjj,iii+1) = HShift_local_TuL(jjj,iii+1).*(-1); + end + end + end + jj = iii+1; % contatore date + [SegStar] = CalcoloStar(X_TuL,Z_TuL,Xstar_TuL,Zstar_TuL,Verso,Segmenti,Peso,jj,SegStar,Nnodi,dim); +end + +%% Calcolo velocità e accelerazione di spostamento giornaliera +[numDate,~] = size(ARRAYdate_TuL); % numero di date +d = 1; +p = 1; +diffDate = 0; +n = 1; +period = 1; % calcolo giornaliero +ContSUP = []; +for dd = 1:numDate + while diffDate < period + d = d+1; + if d > numDate % Se d supera le date disponibili, esco dal ciclo while + break + end + diffDate = ARRAYdate_TuL(d) - ARRAYdate_TuL(p); + end + if d >numDate + break + end + ContSUP(n,1) = d; % Creo matrice indici dell'estremo superiore della differenza + ContINF(n,1) = p; % Creo matrice indici dell'estremo inferiore della differenza + p = p+1; % passo alla data di partenza successiva + d = p; % resetto il conto di d + n = n+1; + diffDate = 0; +end + +check = isempty(ContSUP); +if check == 0 + [nDate,~] = size(ContSUP); + for s = 1:rTuL + N = 1; + for dd = 1:nDate + Speed_local_TuL(s,ContSUP(N,1)) = HShift_local_TuL(s,ContSUP(N,1)) - HShift_local_TuL(s,ContINF(N,1)); + Acceleration_local_TuL(s,ContSUP(N,1)) = Speed_local_TuL(s,ContSUP(N,1)) - Speed_local_TuL(s,ContINF(N,1)); + N = N+1; + end + end +end + +fclose(fileID); + +%% Approssimazioni +[X_TuL,Y_TuL,Z_TuL,Xlocal_TuL,Ylocal_TuL,Zlocal_TuL,Xstar_TuL,Zstar_TuL,HShift_local_TuL,... + SegStar,TempDef_TuL,Speed_local_TuL,Acceleration_local_TuL,Area_TuL] = approx_TuL(X_TuL,... + Y_TuL,Z_TuL,Xlocal_TuL,Ylocal_TuL,Zlocal_TuL,Xstar_TuL,Zstar_TuL,HShift_local_TuL,... + SegStar,TempDef_TuL,Speed_local_TuL,Acceleration_local_TuL,Area_TuL,FileName); + +[r,~] = size(ErrTunnelLink); +Matrice_err = zeros(r,rTuL); +for i = 1:r % date + d = 1; + for n = 1:rTuL % nodi + j = 1; + err = ErrTunnelLink(i,d:d+3); + while j <= 4 + if err(1,j) == 1 + Matrice_err(i,n) = 1; + end + j = j+1; + end + d = d+4; + end +end +ErrTunnelLink = Matrice_err'; + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text4 = 'Tunnel Link calculation executed correctly, elab2D_TuL function closed'; +fprintf(fileID,fmt,text4); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/elab2D_TuL_MOD.m b/ATD/elab2D_TuL_MOD.m new file mode 100755 index 0000000..472b242 --- /dev/null +++ b/ATD/elab2D_TuL_MOD.m @@ -0,0 +1,630 @@ +function [X_TuL,Xstar_TuL,Y_TuL,Z_TuL,Zstar_TuL,Xlocal_TuL,Ylocal_TuL,Zlocal_TuL,... + SegStar,HShift_local_TuL,TempDef_TuL,ARRAYdate_TuL,Area_TuL,Speed_local_TuL,... + Acceleration_local_TuL,ErrTunnelLink] = elab2D_TuL(rTuL,accTuL,ay_TuL,ay_TuL_AC,... + ACCdefRis_TuL,SpeTuL,IDcentralina,DTcatena,DatiElabTunnelLink,NuovoZeroTuL,... + TempDef_TuL,tolleranzaAcc,Ndevst,Wdevst,NdatiMedia,Ndatidespike,ARRAYdate_TuL,... + data1_AC,Nodo_AC,margine,ErrTunnelLink,Tmax,Tmin,datainiTuL,DTcatenaRif,FileName) + +%% Inizializzazione +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'elab2D_TuL function started'; +fprintf(fileID,fmt,text); + +if NuovoZeroTuL == 1 + if NdatiMedia > Ndatidespike + Ndati = NdatiMedia; + else + Ndati = Ndatidespike; + end + ini = round(Ndati/2)+1; + if rem(Ndati,2) == 0 + ini = ini+1; + end + clear NDati + ini = ini + margine; + if ini < 6 + ini = 6; + end + if Ndevst ~= 0 % Allora prendo tutti i dati e solo in seguito considero i nuovi, a valle della funzione filtro + ini = 1; + end + DatiElabTunnelLink = DatiElabTunnelLink(ini:end,:); + ACCdefRis_TuL = ACCdefRis_TuL(ini:end,:); + ARRAYdate_TuL = ARRAYdate_TuL(ini:end,1); + TempDef_TuL = TempDef_TuL(ini:end,:); + accTuL = accTuL(ini:end,:); + ErrTunnelLink = ErrTunnelLink(ini:end,:); +end + +%% Definizione dei dati +Nnodi = rTuL; +[r,~] = size(accTuL); +[Ndati,~] = size(ARRAYdate_TuL); +ax = zeros(r,Nnodi); +ay = zeros(r,Nnodi); +az = zeros(r,Nnodi); +for i=1:Nnodi + ax(:,i) = accTuL(:,(i-1)*3+1); % ax + ay(:,i) = accTuL(:,(i-1)*3+2:(i-1)*3+2); % ay + az(:,i) = accTuL(:,(i-1)*3+3:(i-1)*3+3); % az +end + +ax = ax'; % riga nodi, colonna date +ay = ay'; % riga nodi, colonna date +az = az'; % riga nodi, colonna date +% calcolo orario +asseX_TuL = zeros(Nnodi,Ndati); % Raccoglie i dati locali nella base della sezione della galleria +asseY_TuL = zeros(Nnodi,Ndati); % Raccoglie i dati locali nella direzione trasversale rispetto alla sezione della galleria +asseZ_TuL = zeros(Nnodi,Ndati); % Raccoglie i dati locali nell'altezza della sezione della galleria +% Calcolo antiorario +asseXstar_TuL = zeros(Nnodi,Ndati); +asseYstar_TuL = zeros(Nnodi,Ndati); +asseZstar_TuL = zeros(Nnodi,Ndati); +% Calcolo orario +X_TuL = zeros(Nnodi,Ndati); % Raccoglie i dati cumulati nella base della sezione della galleria +Y_TuL = zeros(Nnodi,Ndati); % Raccoglie i dati cumulati nella direzione trasversale rispetto alla sezione della galleria +Z_TuL = zeros(Nnodi,Ndati); % Raccoglie i dati cumulati nell'altezza della sezione della galleria +% Calcolo antiorario +Xstar_TuL = zeros(Nnodi,Ndati); +Ystar_TuL = zeros(Nnodi,Ndati); +Zstar_TuL = zeros(Nnodi,Ndati); + +%% Filtri +clear r +clear rr +clear c +clear cc +ACCdefRis_TuL = ACCdefRis_TuL'; % Nodi in riga, date in colonna +[r,c] = size(ACCdefRis_TuL); + +% controllo che le matrici con le risultanti delle accelerazioni e +% le matrici con i dati di spostamento abbiano le stesse dimensioni +if r~=Nnodi + text = '---Warning! Number of row of displacement data do not correspond to the number of acceleration cosine vector!---'; + fprintf(fileID,fmt,text); +end +if c~=Ndati + text = '---Warning! Number of column of displacement data do not correspond to the number of acceleration cosine vector!---'; + fprintf(fileID,fmt,text); +end +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +clear i +clear j +cont = 1; % contatore +cont2 = 1; % contatore +cont3 = 1; % contatore +TempDef_TuL = TempDef_TuL'; +text1 = 'There are not correction of Tunnel Link based on acceleration vector filter'; +text2 = 'There are not correction of Tunnel Link based on uncalibrated Acceleration vector'; +text3 = 'There are not correction of Tunnel Link based on temperature filter'; +for j = 2:c % data + for i = 1:r % nodo + % se il valore assoluto della differenza è maggiore della + % tolleranza, pongo gli spostamenti giornalieri pari a 0 + if abs(ACCdefRis_TuL(i,j)-ACCdefRis_TuL(i,j-1)) > tolleranzaAcc + ax(i,j) = ax(i,j-1); + ay(i,j) = ay(i,j-1); + az(i,j) = az(i,j-1); + text1 = ['' num2str(cont) ' correction executed for Tunnel Link - Acceleration vector filter!']; + cont = cont+1; + end + if strcmp(IDcentralina,'ID0142') == 0 + if ACCdefRis_TuL(i,j) < 0.9 || ACCdefRis_TuL(i,j) > 1.1 % Il nodo è fuori taratura! + ax(i,j) = ax(i,j-1); + ay(i,j) = ay(i,j-1); + az(i,j) = az(i,j-1); + TempDef_TuL(i,j) = TempDef_TuL(i,j-1); + text2 = ['' num2str(cont) ' correction executed for Tunnel link - uncalibrated Acceleration vector!']; + cont3 = cont3+1; + end + end + end +end + +FileTemperature = ['' IDcentralina '-' DTcatena '-TuL-Therm.csv']; +if isfile(FileTemperature) == 1 + DatiRaw = csvread(FileTemperature); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; +else + rDR = 1; + cDR = 1; +end +for b = 1:c % Data + for a = 1:r % Nodo + % NON considero i dati al di sopra dei 80 °C o al di sotto dei -30 °C! + if TempDef_TuL(a,b) > Tmax || TempDef_TuL(a,b) < Tmin + cont2 = cont2+1; + if b == 1 + if isfile(FileTemperature) == 1 + RawDate = find(DatiRaw(:,1)<=datenum(datainiTuL)); + if isempty(RawDate) == 1 + cc = 2; + while cc <= c + if TempDef_TuL(a,cc) > Tmax || TempDef_TuL(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_TuL(a,b) = TempDef_TuL(a,cc); + else + if isnan(DatiRaw(RawDate(end),a+1)) == 0 + TempDef_TuL(a,b) = DatiRaw(RawDate(end),a+1); + ErrTunnelLink(b,a) = 0.5; + wardat = 'Temperature data of Tunnel Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + else + cc = 2; + while cc <= c + if TempDef_TuL(a,cc) > Tmax || TempDef_TuL(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_TuL(a,b) = TempDef_TuL(a,cc); + end + end + else + cc = 2; + while cc <= c + if TempDef_TuL(a,cc) > Tmax || TempDef_TuL(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_TuL(a,b) = TempDef_TuL(a,cc); + end + else + TempDef_TuL(a,b) = TempDef_TuL(a,b-1); + ax(i,j) = ax(i,j-1); + ay(i,j) = ay(i,j-1); + az(i,j) = az(i,j-1); + ErrTunnelLink(b,a) = 0.5; + end + text3 = ['' num2str(cont2) ' correction executed for Tunnel Link - Temperature filter!']; + end + end +end + +if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=ARRAYdate_TuL(1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(ARRAYdate_TuL(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(ARRAYdate_TuL(:,1)>DatiRaw(RawDate1(end)+1,1)); + end +else + RawDate1 = []; + RawDate2 = 1; +end +if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:); ARRAYdate_TuL(RawDate2(1):end) TempDef_TuL(:,RawDate2(1):end)']; +elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = [ARRAYdate_TuL TempDef_TuL']; +else + Dati = DatiRaw; +end +% Elimino appoggio più vecchio di un mese +RawDate3 = find(Dati(:,1) Ndatidespike + NdatiF = NdatiMedia; + else + NdatiF = Ndatidespike; + end + ini = round(NdatiF/2)+1; + if rem(NdatiF,2) == 0 + ini = ini+1; + end + clear NDatiF + iniST = round(Wdevst/2); + if rem(Wdevst,2) == 0 + iniST = iniST+1; + end + iniST = iniST + margine; + if iniST > ini + ini = iniST; + end + if ini < 6 + ini = 6; + end + dX = dX(:,ini:end); + dY = dY(:,ini:end); + dZ = dZ(:,ini:end); + dXstar = dXstar(:,ini:end); + dYstar = dYstar(:,ini:end); + dZstar = dZstar(:,ini:end); + TempDef_TuL = TempDef_TuL(ini:end,:); + DatiElabTunnelLink = DatiElabTunnelLink(ini:end,:); + ARRAYdate_TuL = ARRAYdate_TuL(ini:end,1); + ErrTunnelLink = ErrTunnelLink(ini:end,:); +end + +% Controllo che l'arco rovescio debba già essere calcolato o meno +data_TuL = ARRAYdate_TuL; +data_ARC = datenum(data1_AC); +Delta = data_ARC-data_TuL; +Check = find(Delta>0); +Control_ARC = isempty(Check); +if Control_ARC == 0 + indice_ARC = []; + ay_AC = ay_TuL_AC'; +else + Inizio = find(Delta<=0); + indice_ARC = Inizio(1); + if NuovoZeroTuL == 1 + ay_AC = ay_TuL_AC'; + else + ay_AC = ay; + end +end + +%% Finalizzo i calcoli +[rx,cx] = size(dX); +% totale del singolo nodo data per data +sommaX = zeros(rx,cx+1); +sommaXstar = zeros(rx,cx+1); +sommaY = zeros(rx,cx+1); +sommaYstar = zeros(rx,cx+1); +sommaZ = zeros(rx,cx+1); +sommaZstar = zeros(rx,cx+1); +% cumulata del singolo nodo data per data in posizione assoluta +% il primo valore è quello di posizione assoluta iniziale +X_TuL = zeros(rx,cx+1); +Y_TuL = zeros(rx,cx+1); +Z_TuL = zeros(rx,cx+1); +Xstar_TuL = zeros(rx,cx+1); +Ystar_TuL = zeros(rx,cx+1); +Zstar_TuL = zeros(rx,cx+1); +% cumulata del singolo nodo data per data in posizione relativa +% il primo valore è quello di posizione assoluta iniziale +Xlocal_TuL = zeros(Nnodi,Ndati); +Ylocal_TuL = zeros(Nnodi,Ndati); +Zlocal_TuL = zeros(Nnodi,Ndati); +Xlocal_star = zeros(Nnodi,Ndati); +Ylocal_star = zeros(Nnodi,Ndati); +Zlocal_star = zeros(Nnodi,Ndati); +ris_local = zeros(Nnodi,1); +Speed_local_TuL = zeros(Nnodi,Ndati); +Acceleration_local_TuL = zeros(Nnodi,Ndati); +% Calcolo area della sezione +Area_TuL = zeros(1,Ndati); +AreaStar_TuL = zeros(1,Ndati); + +% Primo dato +X_TuL(:,1) = Xrif(:,1); +Y_TuL(:,1) = Yrif(:,1); +Z_TuL(:,1) = Zrif(:,1); +Area_TuL(:,1) = polyarea(X_TuL(:,1),Z_TuL(:,1)); +AreaStar_TuL(:,1) = polyarea(Xstar_TuL(:,1),Zstar_TuL(:,1)); +Xstar_TuL(:,1) = Xstar_rif(:,1); +Ystar_TuL(:,1) = Ystar_rif(:,1); +Zstar_TuL(:,1) = Zstar_rif(:,1); +if Control_ARC == 0 % l'arco rovescio si calcola da dopo + X_TuL(Nodo_AC:end,1) = Punti_Noti(Nodo_AC+1:end,1); + Y_TuL(Nodo_AC:end,1) = Punti_Noti(Nodo_AC+1:end,2); + Z_TuL(Nodo_AC:end,1) = Punti_Noti(Nodo_AC+1:end,3); + Xstar_TuL(1:rTuL-Nodo_AC+1,1) = Punti_Noti(Nodo_AC+1:end,1); + Ystar_TuL(1:rTuL-Nodo_AC+1,1) = Punti_Noti(Nodo_AC+1:end,2); + Zstar_TuL(1:rTuL-Nodo_AC+1,1) = Punti_Noti(Nodo_AC+1:end,3); +end +HShift_local_TuL = zeros(rx,cx+1); + +if NuovoZeroTuL == 1 + [~,cE] = size(DatiElabTunnelLink); + cont = 3; + contS = 11; + n = 1; + while cont<=cE + sommaX(n,1) = cell2mat(DatiElabTunnelLink(1,cont))'; + Xlocal_TuL(n,1) = sommaX(n,1); + sommaY(n,1) = cell2mat(DatiElabTunnelLink(1,cont+1))'; + Ylocal_TuL(n,1) = sommaY(n,1); + sommaZ(n,1) = cell2mat(DatiElabTunnelLink(1,cont+2))'; + Zlocal_TuL(n,1) = sommaZ(n,1); + if n < rTuL + if n == 1 % primo + sommaXstar(n,1) = Xstar_TuL(n,1)-cXo_ini(end-n,1); + sommaZstar(n,1) = Zstar_TuL(n,1)-cZo_ini(end-n,1); + else + sommaXstar(n,1) = (Xstar_TuL(n,1)-Xstar_TuL(n-1,1))-(cXo_ini(end-n,1)-cXo_ini(end-n+1,1)); + sommaZstar(n,1) = (Zstar_TuL(n,1)-Zstar_TuL(n-1,1))-(cZo_ini(end-n,1)-cZo_ini(end-n+1,1)); + end + else % ultimo + sommaXstar(n,1) = (Xstar_TuL(n,1)-Xstar_TuL(end-1,1))-(cXo_ini(end,1)-cXo_ini(1,1)); + sommaZstar(n,1) = (Zstar_TuL(n,1)-Zstar_TuL(end-1,1))-(cZo_ini(end,1)-cZo_ini(1,1)); + end + sommaYstar(n,1) = cell2mat(DatiElabTunnelLink(1,cE-contS+2))'; + ris_local(n,1) = cell2mat(DatiElabTunnelLink(1,cont+9))'; + Speed_local_TuL(n,1) = cell2mat(DatiElabTunnelLink(1,cont+12))'; + Acceleration_local_TuL(n,1) = cell2mat(DatiElabTunnelLink(1,cont+13))'; + cont=cont+16; + contS=contS+16; + n = n+1; + end + Xlocal_star(:,1) = sommaXstar(:,1); + Zlocal_star(:,1) = sommaZstar(:,1); +end + +for iii = 1:cx % date + % somma singoli spostamenti del singolo nodo + sommaX(1:Nodo_AC-1,iii+1) = sum(dX(1:Nodo_AC-1,1:iii),2)+sommaX(1:Nodo_AC-1,1); + sommaY(1:Nodo_AC-1,iii+1) = sum(dY(1:Nodo_AC-1,1:iii),2)+sommaY(1:Nodo_AC-1,1); + sommaZ(1:Nodo_AC-1,iii+1) = sum(dZ(1:Nodo_AC-1,1:iii),2)+sommaZ(1:Nodo_AC-1,1); + sommaXstar(rTuL-Nodo_AC+2:end,iii+1) = sum(dXstar(rTuL-Nodo_AC+2:end,1:iii),2)+sommaXstar(rTuL-Nodo_AC+2:end,1); + sommaYstar(rTuL-Nodo_AC+2:end,iii+1) = sum(dYstar(rTuL-Nodo_AC+2:end,1:iii),2)+sommaYstar(rTuL-Nodo_AC+2:end,1); + sommaZstar(rTuL-Nodo_AC+2:end,iii+1) = sum(dZstar(rTuL-Nodo_AC+2:end,1:iii),2)+sommaZstar(rTuL-Nodo_AC+2:end,1); + if Control_ARC == 0 % l'arco rovescio si calcola da dopo + sommaX(Nodo_AC:end,iii+1) = 0; + sommaY(Nodo_AC:end,iii+1) = 0; + sommaZ(Nodo_AC:end,iii+1) = 0; + sommaXstar(1:rTuL-Nodo_AC+1,iii+1) = 0; + sommaYstar(1:rTuL-Nodo_AC+1,iii+1) = 0; + sommaZstar(1:rTuL-Nodo_AC+1,iii+1) = 0; + else + sommaX(Nodo_AC:end,iii+1) = sum(dX(Nodo_AC:end,indice_ARC:iii),2)+sommaX(Nodo_AC:end,1); + sommaY(Nodo_AC:end,iii+1) = sum(dY(Nodo_AC:end,indice_ARC:iii),2)+sommaY(Nodo_AC:end,1); + sommaZ(Nodo_AC:end,iii+1) = sum(dZ(Nodo_AC:end,indice_ARC:iii),2)+sommaZ(Nodo_AC:end,1); + sommaXstar(1:rTuL-Nodo_AC+1,iii+1) = sum(dXstar(1:rTuL-Nodo_AC+1,indice_ARC:iii),2)+sommaXstar(1:rTuL-Nodo_AC+1,1); + sommaYstar(1:rTuL-Nodo_AC+1,iii+1) = sum(dYstar(1:rTuL-Nodo_AC+1,indice_ARC:iii),2)+sommaYstar(1:rTuL-Nodo_AC+1,1); + sommaZstar(1:rTuL-Nodo_AC+1,iii+1) = sum(dZstar(1:rTuL-Nodo_AC+1,indice_ARC:iii),2)+sommaZstar(1:rTuL-Nodo_AC+1,1); + end + + % spostamenti locali riferiti alla posizione assoluta + Xlocal_TuL(:,iii+1) = sommaX(:,iii+1); + Ylocal_TuL(:,iii+1) = sommaY(:,iii+1); + Zlocal_TuL(:,iii+1) = sommaZ(:,iii+1); + Xlocal_star(:,iii+1) = sommaXstar(:,iii+1); + Ylocal_star(:,iii+1) = sommaYstar(:,iii+1); + Zlocal_star(:,iii+1) = sommaZstar(:,iii+1); + + % cumulata spostamenti (posizione assoluta) + if NuovoZeroTuL == 0 + X_TuL(:,iii+1) = Xrif(:,1) + cumsum(sommaX(:,iii+1)); + Y_TuL(:,iii+1) = Yrif(:,1) + cumsum(sommaY(:,iii+1)); + Z_TuL(:,iii+1) = Zrif(:,1) + cumsum(sommaZ(:,iii+1)); + Xstar_TuL(:,iii+1) = Xstar_rif(:,1) + cumsum(sommaXstar(:,iii+1)); + Ystar_TuL(:,iii+1) = Ystar_rif(:,1) + cumsum(sommaYstar(:,iii+1)); + Zstar_TuL(:,iii+1) = Zstar_rif(:,1) + cumsum(sommaZstar(:,iii+1)); + elseif NuovoZeroTuL == 1 + X_TuL(:,iii+1) = Xrif(:,1) + cumsum(sommaX(:,iii+1)) - cumsum(sommaX(:,1)); + Y_TuL(:,iii+1) = Yrif(:,1) + cumsum(sommaY(:,iii+1)) - cumsum(sommaY(:,1)); + Z_TuL(:,iii+1) = Zrif(:,1) + cumsum(sommaZ(:,iii+1)) - cumsum(sommaZ(:,1)); + Xstar_TuL(:,iii+1) = Xstar_rif(:,1) + cumsum(sommaXstar(:,iii+1)) - cumsum(sommaXstar(:,1)); + Ystar_TuL(:,iii+1) = Ystar_rif(:,1) + cumsum(sommaYstar(:,iii+1)) - cumsum(sommaYstar(:,1)); + Zstar_TuL(:,iii+1) = Zstar_rif(:,1) + cumsum(sommaZstar(:,iii+1)) - cumsum(sommaZstar(:,1)); + end + + Area_TuL(1,iii+1) = polyarea(X_TuL(:,iii+1),Z_TuL(:,iii+1)); + AreaStar_TuL(1,iii+1) = polyarea(Xstar_TuL(:,iii+1),Zstar_TuL(:,iii+1)); + % Segno + per spostamenti verso il centro, segno - per spostamenti + % verso l'esterno + if NuovoZeroTuL == 1 + HShift_local_TuL(:,1) = ris_local; + end + HShift_local_TuL(:,iii+1) = (sommaX(:,iii+1).^2+sommaZ(:,iii+1).^2).^0.5; + + if NuovoZeroTuL == 1 + ay_rif = ay_TuL'; + ay_rif_AC = ay_AC; + else + ay_rif = ay; + ay_rif_AC = ay; + end + for jjj = 1:Nnodi + Quadrante = Antiorario(jjj,1); + if jjj >= Nodo_AC + AY_RIF = ay_rif_AC; + else + AY_RIF = ay_rif; + end + if Quadrante == 1 + if ay(jjj,iii+1) - AY_RIF(jjj,1) < 0 % rotazione antioraria, moltiplico per -1 (va in fuori) + HShift_local_TuL(jjj,iii+1) = HShift_local_TuL(jjj,iii+1).*(-1); + end + elseif Quadrante == 2 + if ay(jjj,iii+1) - AY_RIF(jjj,1) > 0 % rotazione antioraria, moltiplico per -1 (va in fuori) + HShift_local_TuL(jjj,iii+1) = HShift_local_TuL(jjj,iii+1).*(-1); + end + elseif Quadrante == 3 + if ay(jjj,iii+1) - AY_RIF(jjj,1) > 0 % rotazione antioraria, moltiplico per -1 (va in fuori) + HShift_local_TuL(jjj,iii+1) = HShift_local_TuL(jjj,iii+1).*(-1); + end + elseif Quadrante == 4 + if ay(jjj,iii+1) - AY_RIF(jjj,1) < 0 % rotazione antioraria, moltiplico per -1 (va in fuori) + HShift_local_TuL(jjj,iii+1) = HShift_local_TuL(jjj,iii+1).*(-1); + end + end + end + jj = iii+1; % contatore date + [SegStar] = CalcoloStar(X_TuL,Z_TuL,Xstar_TuL,Zstar_TuL,Verso,Segmenti,Peso,jj,SegStar,Nnodi,dim); +end + +%% Calcolo velocità e accelerazione di spostamento giornaliera +[numDate,~] = size(ARRAYdate_TuL); % numero di date +d = 1; +p = 1; +diffDate = 0; +n = 1; +period = 1; % calcolo giornaliero +ContSUP = []; +for dd = 1:numDate + while diffDate < period + d = d+1; + if d > numDate % Se d supera le date disponibili, esco dal ciclo while + break + end + diffDate = ARRAYdate_TuL(d) - ARRAYdate_TuL(p); + end + if d >numDate + break + end + ContSUP(n,1) = d; % Creo matrice indici dell'estremo superiore della differenza + ContINF(n,1) = p; % Creo matrice indici dell'estremo inferiore della differenza + p = p+1; % passo alla data di partenza successiva + d = p; % resetto il conto di d + n = n+1; + diffDate = 0; +end + +check = isempty(ContSUP); +if check == 0 + [nDate,~] = size(ContSUP); + for s = 1:rTuL + N = 1; + for dd = 1:nDate + Speed_local_TuL(s,ContSUP(N,1)) = HShift_local_TuL(s,ContSUP(N,1)) - HShift_local_TuL(s,ContINF(N,1)); + Acceleration_local_TuL(s,ContSUP(N,1)) = Speed_local_TuL(s,ContSUP(N,1)) - Speed_local_TuL(s,ContINF(N,1)); + N = N+1; + end + end +end + +fclose(fileID); + +%% Approssimazioni +[X_TuL,Y_TuL,Z_TuL,Xlocal_TuL,Ylocal_TuL,Zlocal_TuL,Xstar_TuL,Zstar_TuL,HShift_local_TuL,... + SegStar,TempDef_TuL,Speed_local_TuL,Acceleration_local_TuL,Area_TuL] = approx_TuL(X_TuL,... + Y_TuL,Z_TuL,Xlocal_TuL,Ylocal_TuL,Zlocal_TuL,Xstar_TuL,Zstar_TuL,HShift_local_TuL,... + SegStar,TempDef_TuL,Speed_local_TuL,Acceleration_local_TuL,Area_TuL,FileName); + +[r,~] = size(ErrTunnelLink); +Matrice_err = zeros(r,rTuL); +for i = 1:r % date + d = 1; + for n = 1:rTuL % nodi + j = 1; + err = ErrTunnelLink(i,d:d+3); + while j <= 4 + if err(1,j) == 1 + Matrice_err(i,n) = 1; + end + j = j+1; + end + d = d+4; + end +end +ErrTunnelLink = Matrice_err'; + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text4 = 'Tunnel Link calculation executed correctly, elab2D_TuL function closed'; +fprintf(fileID,fmt,text4); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/filtro_PCL.m b/ATD/filtro_PCL.m new file mode 100755 index 0000000..3b50b6a --- /dev/null +++ b/ATD/filtro_PCL.m @@ -0,0 +1,71 @@ +% Filtro che considera N deviazioni standard in una finestra centrata di +% input dati (una in avanti e una all'indietro) e mette a zero lo +% spostamento se è inferiore a tale valore +% E' previsto un secondo filtro forfettario se lo spostamento è minore di +% un determinato valore + +function [dY_PCL,dZ_PCL,text] = filtro_PCL(dY_PCL,dZ_PCL,Ndevst,Wdevst) + +dY_PCL = dY_PCL'; +dZ_PCL = dZ_PCL'; +calcoloY_RL = dY_PCL; +calcoloZ_RL = dZ_PCL; + +[r,c] = size(dY_PCL); % riga date, colonna nodi +filtroY = zeros(r,c); +filtroZ = zeros(r,c); +N_dev_st = Ndevst; +finestra = Wdevst; +contY = 0; +contZ = 0; + +for j = 2:c % nodi + for i = (finestra/2+0.5):(r-(finestra/2-0.5)) % date + % Y + var = calcoloY_RL((i-(finestra/2-0.5)):(i+(finestra/2-0.5)),j); + filtroY(i,j) = N_dev_st*std(var); + if abs(dY_PCL(i,j)) 0 + contarray{indice,1} = [num2str(nCA) ' Cir Array']; + if nCA == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nCA) ' Cir Arrays']; + end + indice = indice +1; +end +if nRA > 0 + contarray{indice,1} = [num2str(nRA) ' Rad Array']; + if nRA == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nRA) ' Rad Arrays']; + end + indice = indice +1; +end +if nPCA > 0 + contarray{indice,1} = [num2str(nPCA) ' PreConv Array']; + if nPCA == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nPCA) ' PreConv Arrays']; + end + indice = indice +1; +end +if nVA > 0 + contarray{indice,1} = [num2str(nVA) ' Vertical Array']; + if nVA == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nVA) ' Vertical Arrays']; + end + indice = indice +1; +end +if nHA > 0 + contarray{indice,1} = [num2str(nHA) ' Horizontal Array']; + if nHA == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nHA) ' Horizontal Arrays']; + end + indice = indice +1; +end +if nPZA > 0 + contarray{indice,1} = [num2str(nPZA) ' Piezo Array']; + if nPZA == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nPZA) ' Piezo Arrays']; + end + indice = indice +1; +end +if nP > 0 + contarray{indice,1} = [num2str(nP) ' Pluviometro']; + if nP == 1 + contarrayENG{indice,1} = [num2str(nP) ' Rain Gauge']; + else + contarrayENG{indice,1} = [num2str(nP) ' Rain Gauges']; + end + indice = indice +1; +end +if nTA > 0 + contarray{indice,1} = [num2str(nTA) ' Therm Array']; + if nTA == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nTA) ' Therm Arrays']; + end + indice = indice +1; +end +if nRSN > 0 + contarray{indice,1} = [num2str(nRSN) ' RockFall Safety Network']; + if nRSN == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nRSN) ' RockFall Safety Networks']; + end + indice = indice +1; +end +if nDFSN > 0 + contarray{indice,1} = [num2str(DFRSN) ' Debris Flow Safety Network']; + if nDFSN == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nDFSN) ' Debris Flow Safety Networks']; + end + indice = indice +1; +end +if nVAS > 0 + contarray{indice,1} = [num2str(nVAS) ' Vertical Array Structure']; + if nVAS == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nVAS) ' Vertical Arrays Structure']; + end + indice = indice +1; +end +if nIPA > 0 + contarray{indice,1} = [num2str(nIPA) ' In Place Array']; + if nIPA == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nIPA) ' In Place Arrays']; + end + indice = indice +1; +end +if nMUSA > 0 + contarray{indice,1} = [num2str(nMUSA) ' MUSA']; + if nMUSA == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nMUSA) ' MUSAs']; + end + indice = indice +1; +end +if nKA > 0 + contarray{indice,1} = [num2str(nKA) ' Klino Array']; + if nKA == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nKA) ' Klino Arrays']; + end + indice = indice +1; +end +if nAA > 0 + contarray{indice,1} = [num2str(nAA) ' Analog Array']; + if nAA == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nAA) ' Analog Arrays']; + end + indice = indice +1; +end +if nTS > 0 + contarray{indice,1} = [num2str(nTS) ' Trigger System']; + if nTS == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nTS) ' Trigger Systems']; + end +end +arraysito = strjoin(contarray, ', '); +arraysitoENG = strjoin(contarrayENG, ', '); + +if evita == 0 + % Conto le tipologie di Control Tools + indice_bis = 1; + if nVMS > 0 + conttools{indice_bis,1} = [num2str(nVMS) ' Variable Message System']; + indice_bis = indice_bis +1; + end + if nTL > 0 + conttools{indice_bis,1} = [num2str(nTL) ' Traffic Lights']; + indice_bis = indice_bis +1; + end + if nAL > 0 + conttools{indice_bis,1} = [num2str(nAL) ' Alarms']; + indice_bis = indice_bis +1; + end + if nCAM > 0 + conttools{indice_bis,1} = [num2str(nCAM) ' Camera']; + end + controlsito = strjoin(conttools, ', '); + nCT = nVMS+nTL+nAL+nCAM; +else + controlsito = 0; + nCT = 0; +end + +%% Stabilisco se è presente o meno un sensore ed il numero di sensori per ogni tipologia +[col,~] = size(chainID); % Numero di Array +% Per ogni tipologia di nodo, riconosco se è presente o meno nella catena +yesTL = zeros(col,1); % Tilt Link V +yesTLHR = zeros(col,1); % Tilt Link HR V +yesTLH = zeros(col,1); % Tilt Link H +yesTLHRH = zeros(col,1); % Tilt Link HR H +yesPL = zeros(col,1); % Piezo Link +yesBL = zeros(col,1); % Baro Link +yesLL = zeros(col,1); % Load Link +yesRL = zeros(col,1); % Rain Link +yesKL = zeros(col,1); % Klino Link +yesKLHR = zeros(col,1); % Klino Link HR +yesThL = zeros(col,1); % Therm Link +yesPT100 = zeros(col,1); % PT100 link +yesIPL = zeros(col,1); % In Place Link +yesIPLHR = zeros(col,1); % In Place Link HR +yesTuL = zeros(col,1); % Tunnel Link +yesRaL = zeros(col,1); % Radial Link +yesPCL = zeros(col,1); % Preconv Link +yesPCLHR = zeros(col,1); % Preconv Link HR +yesPrL = zeros(col,1); % Pressure Link +yesEL = zeros(col,1); % Extensometer Link +yes3DEL = zeros(col,1); % 3D Extensometer Link +yesWEL = zeros(col,1); % Wire Extensometer Link +yesMPBEL = zeros(col,1); % Multi Point BoreHole Extensometer Link +yesCrL = zeros(col,1); % Crack Link +yes2DCrL = zeros(col,1); % 2D Crack Link +yes3DCrL = zeros(col,1); % 3D Crack Link +yesBML = zeros(col,1); % Baro Musa Link +yesHL = zeros(col,1); % Humidity link +yesLuxL = zeros(col,1); % Lux link +yesCO2 = zeros (col,1); % CO2 Link +yesRSN = zeros (col,1); % RSN Link +yesRSNHR = zeros (col,1); % RSN Link HR +yesTrL = zeros (col,1); % Trigger Link +yesSM = zeros (col,1); % Stress Meter +yesPE = zeros(col,1); % Pendulum +yesWL = zeros(col,1); % Weir Link +yesGF = zeros(col,1); % G-Flow Link +yesGS = zeros(col,1); % G-Shock Link + +% Numero di nodi per catena +rTL = zeros(col,1); +rTLHR = zeros(col,1); +rTLH = zeros(col,1); +rTLHRH = zeros(col,1); +rPL = zeros(col,1); +rBL = zeros(col,1); +rLL = zeros(col,1); +rRL = zeros(col,1); +rKL = zeros(col,1); +rKLHR = zeros(col,1); +rThL = zeros(col,1); +rPT100 = zeros(col,1); +rIPL = zeros(col,1); +rIPLHR = zeros(col,1); +rTuL = zeros(col,1); +rRaL = zeros(col,1); +rPCL = zeros(col,1); +rPCLHR = zeros(col,1); +rPrL = zeros(col,1); +rEL = zeros(col,1); +r3DEL = zeros(col,1); +rWEL = zeros(col,1); +rMPBEL = zeros(col,1); +rCrL = zeros(col,1); +r3DCrL = zeros(col,1); +rBML = zeros(col,1); +rHL = zeros(col,1); +rLuxL = zeros(col,1); +rCO2 = zeros(col,1); +rRSN = zeros(col,1); +rRSNHR = zeros(col,1); +rTrL = zeros(col,1); +rSM = zeros(col,1); +r2DCrL = zeros(col,1); +rPE = zeros(col,1); +rWL = zeros(col,1); +rGF = zeros(col,1); +rGS = zeros(col,1); + +indice = 1; +[rCS,cCS] = size(Chain_Scheme); +for ii = 1:rCS + for jj = 1:cCS + if isempty(cell2mat(Chain_Scheme(ii,jj))) == 1 + Chain_Scheme{ii,jj} = 0; + end + end +end +Chain_Scheme = cell2mat(Chain_Scheme); +NodoTiltLink = []; +NodoTiltLinkHR = []; +NodoTiltLinkH = []; +NodoTiltLinkHRH = []; +NodoPiezoLink = []; +NodoBaroLink = []; +NodoLoadLink = []; +NodoRainLink = []; +NodoKlinoLink = []; +NodoKlinoLinkHR = []; +NodoThermLink = []; +NodoPT100Link = []; +NodoInPlaceLink = []; +NodoInPlaceLinkHR = []; +NodoTunnelLink = []; +NodoRadialLink = []; +NodoPreConvLink = []; +NodoPreConvLinkHR = []; +NodoPressureLink = []; +NodoExtensometerLink = []; +Nodo3DExtensometerLink = []; +NodoWireExtensometerLink = []; +NodoMultiPointExtensometerLink = []; +NodoCrackLink = []; +Nodo3DCrackLink = []; +NodoBaroMusaLink = []; +NodoHumidityLink = []; +NodoLuxLink = []; +NodoCO2Link = []; +NodoRSNLink = []; +NodoRSNHRLink = []; +NodoTriggerLink = []; +NodoStressMeter = []; +Nodo2DCrackLink = []; +NodoPendulum = []; +NodoWeirLink = []; +NodoGflowLink = []; +NodoGshockLink = []; +for a = 1:col % Array + nTL = 1; + nTLHR = 1; + nTLH = 1; + nTLHRH = 1; + nPL = 1; + nBL = 1; + nLL = 1; + nRL = 1; + nKL = 1; + nKLHR = 1; + nThL = 1; + nPT100 = 1; + nIPL = 1; + nIPLHR = 1; + nTuL = 1; + nRaL = 1; + nPCL = 1; + nPCLHR = 1; + nPrL = 1; + nEL = 1; + n3DEL = 1; + nWEL = 1; + nMPBEL = 1; + nCrL = 1; + n3DCrL = 1; + nBML = 1; + nHL = 1; + nLuxL = 1; + nCO2 = 1; + nRSN = 1; + nRSNHR = 1; + nTrL = 1; + nSM = 1; + n2DCrL = 1; + nPenL = 1; + nWL =1; + nGF = 1; + nGS = 1; + + for b = 1:num_nodi(a) % Numero di nodi dell'Array + if Chain_Scheme(b,indice) == 1 % Tilt Link V + yesTL(a) = 1; + NodoTiltLink(nTL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nTL = nTL+1; + elseif Chain_Scheme(b,indice) == 5 % Tilt Link HR V + yesTLHR(a) = 1; + NodoTiltLinkHR(nTLHR,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nTLHR = nTLHR+1; + elseif Chain_Scheme(b,indice) == 11 % Tilt Link H + yesTLH(a) = 1; + NodoTiltLinkH(nTLH,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nTLH = nTLH+1; + elseif Chain_Scheme(b,indice) == 12 % Tilt Link HR H + yesTLHRH(a) = 1; + NodoTiltLinkHRH(nTLHRH,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nTLHRH = nTLHRH+1; + elseif Chain_Scheme(b,indice) == 2 % Piezo Link + yesPL(a) = 1; + NodoPiezoLink(nPL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nPL = nPL+1; + elseif Chain_Scheme(b,indice) == 3 % Baro Link + yesBL(a) = 1; + NodoBaroLink(nBL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nBL = nBL+1; + elseif Chain_Scheme(b,indice) == 15 % Load Link + yesLL(a) = 1; + NodoLoadLink(nLL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nLL = nLL+1; + elseif Chain_Scheme(b,indice) == 27 % Rain Link + yesRL(a) = 1; + NodoRainLink(nRL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nRL = nRL+1; + elseif Chain_Scheme(b,indice) == 26 % Klino Link + yesKL(a) = 1; + NodoKlinoLink(nKL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nKL = nKL+1; + elseif Chain_Scheme(b,indice) == 44 % Klino Link HR + yesKLHR(a) = 1; + NodoKlinoLinkHR(nKLHR,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nKLHR = nKLHR+1; + elseif Chain_Scheme(b,indice) == 4 % Therm Link + yesThL(a) = 1; + NodoThermLink(nThL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nThL = nThL+1; + elseif Chain_Scheme(b,indice) == 28 % PT100 Link + yesPT100(a) = 1; + NodoPT100Link(nPT100,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nPT100 = nPT100+1; + elseif Chain_Scheme(b,indice) == 42 % In Place Link + yesIPL(a) = 1; + NodoInPlaceLink(nIPL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nIPL = nIPL+1; + elseif Chain_Scheme(b,indice) == 43 % In Place Link HR + yesIPLHR(a) = 1; + NodoInPlaceLinkHR(nIPLHR,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nIPLHR = nIPLHR+1; + elseif Chain_Scheme(b,indice) == 17 % Tunnel Link + yesTuL(a) = 1; + NodoTunnelLink(nTuL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nTuL = nTuL+1; + elseif Chain_Scheme(b,indice) == 18 % Radial Link + yesRaL(a) = 1; + NodoRadialLink(nRaL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nRaL = nRaL+1; + elseif Chain_Scheme(b,indice) == 23 % PreConv Link + yesPCL(a) = 1; + NodoPreConvLink(nPCL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nPCL = nPCL+1; + elseif Chain_Scheme(b,indice) == 24 % PreConv Link HR + yesPCLHR(a) = 1; + NodoPreConvLinkHR(nPCLHR,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nPCLHR = nPCLHR+1; + elseif Chain_Scheme(b,indice) == 21 % Pressure Link + yesPrL(a) = 1; + NodoPressureLink(nPrL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nPrL = nPrL+1; + elseif Chain_Scheme(b,indice) == 16 % Extensometer Link + yesEL(a) = 1; + NodoExtensometerLink(nEL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nEL = nEL+1; + elseif Chain_Scheme(b,indice) == 19 % 3D Extensometer Link + yes3DEL(a) = 1; + Nodo3DExtensometerLink(n3DEL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + n3DEL = n3DEL+1; + elseif Chain_Scheme(b,indice) == 22 % Wire Extensometer Link + yesWEL(a) = 1; + NodoWireExtensometerLink(nWEL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nWEL = nWEL+1; + elseif Chain_Scheme(b,indice) == 25 % Multi Point Borehole Extensometer Link + yesMPBEL(a) = 1; + NodoMultiPointExtensometerLink(nMPBEL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nMPBEL = nMPBEL+1; + elseif Chain_Scheme(b,indice) == 36 % Crack Link + yesCrL(a) = 1; + NodoCrackLink(nCrL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nCrL = nCrL+1; + elseif Chain_Scheme(b,indice) == 37 % 3D Crack Link + yes3DCrL(a) = 1; + Nodo3DCrackLink(n3DCrL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + n3DCrL = n3DCrL+1; + elseif Chain_Scheme(b,indice) == 41 % Baro Musa Link + yesBML(a) = 1; + NodoBaroMusaLink(nBML,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nBML = nBML+1; + elseif Chain_Scheme(b,indice) == 35 % Humidity Link + yesHL(a) = 1; + NodoHumidityLink(nHL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nHL = nHL+1; + elseif Chain_Scheme(b,indice) == 34 % Lux Link + yesLuxL(a) = 1; + NodoLuxLink(nLuxL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nLuxL = nLuxL+1; + elseif Chain_Scheme(b,indice) == 33 % CO2 Link + yesCO2(a) = 1; + NodoCO2Link(nCO2,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nCO2 = nCO2+1; + elseif Chain_Scheme(b,indice) == 38 % RSN Link + yesRSN(a) = 1; + NodoRSNLink(nRSN,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nRSN = nRSN+1; + elseif Chain_Scheme(b,indice) == 39 % RSN Link HR + yesRSNHR(a) = 1; + NodoRSNHRLink(nRSNHR,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nRSNHR = nRSNHR+1; + elseif Chain_Scheme(b,indice) == 40 % Trigger Link + yesTrL(a) = 1; + NodoTriggerLink(nTrL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nTrL = nTrL+1; + elseif Chain_Scheme(b,indice) == 47 % Stress Meter + yesSM(a) = 1; + NodoStressMeter(nSM,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nSM = nSM+1; + elseif Chain_Scheme(b,indice) == 51 % 2D Crack Link + yes2DCrL(a) = 1; + Nodo2DCrackLink(n2DCrL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + n2DCrL = n2DCrL+1; + elseif Chain_Scheme(b,indice) == 52 % Pendulum + yesPE(a) = 1; + NodoPendulum(nPenL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nPenL = nPenL+1; + elseif Chain_Scheme(b,indice) == 53 % Weir Link + yesWL(a) = 1; + NodoWeirLink(nWL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nWL = nWL+1; + elseif Chain_Scheme(b,indice) == 48 % G-Flow Link + yesGF(a) = 1; + NodoGflowLink(nWL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nGF = nGF+1; + elseif Chain_Scheme(b,indice) == 50 % G-Shock Link + yesGS(a) = 1; + NodoGshockLink(nWL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nGS = nGS+1; + end + end + indice = indice+3; + rTL(a) = nTL-1; + rTLHR(a) = nTLHR-1; + rTLH(a) = nTLH-1; + rTLHRH(a) = nTLHRH-1; + rPL(a) = nPL-1; + rBL(a) = nBL-1; + rLL(a) = nLL-1; + rRL(a) = nRL-1; + rKL(a) = nKL-1; + rKLHR(a) = nKLHR-1; + rThL(a) = nThL-1; + rPT100(a) = nPT100-1; + rIPL(a) = nIPL-1; + rIPLHR(a) = nIPLHR-1; + rTuL(a) = nTuL-1; + rRaL(a) = nRaL-1; + rPCL(a) = nPCL-1; + rPCLHR(a) = nPCLHR-1; + rPrL(a) = nPrL-1; + rEL(a) = nEL-1; + r3DEL(a) = n3DEL-1; + rWEL(a) = nWEL-1; + rMPBEL(a) = nMPBEL-1; + rCrL(a) = nCrL-1; + r3DCrL(a) = n3DCrL-1; + rBML(a) = nBML-1; + rHL(a) = nHL-1; + rLuxL(a) = nLuxL-1; + rCO2(a) = nCO2-1; + rRSN(a) = nRSN-1; + rRSNHR(a) = nRSNHR-1; + rTrL(a) = nTrL-1; + rSM(a) = nSM-1; + r2DCrL(a) = n2DCrL-1; + rPE(a) = nPenL-1; + rWL(a) = nWL-1; + rGF(a) = nGF-1; + rGS(a) = nGS-1; +end + +text = 'info_Sito function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/lettura.m b/ATD/lettura.m new file mode 100755 index 0000000..382bf02 --- /dev/null +++ b/ATD/lettura.m @@ -0,0 +1,9979 @@ +% Questa funzione legge i dati di ogni tipologia di nodo (se presente) +% DatiTunnelLink contiene tutti i dati per i Tilt Link +% DatiRadialLink contiene tutti i dati per i Radial Link +% etc. + +function [Batteria,DatiTunnelLink,ErrTunnelLink,datainiTuL,... + DatiRadialLink,ErrRadialLink,datainiRL,DatiTiltLinkH,ErrTiltLinkH,datainiTLH,... + DatiTiltLinkHRH,ErrTiltLinkHRH,datainiTLHRH,DatiPreConvLink,ErrPreConvLink,datainiPCL,... + DatiPreConvLinkHR,ErrPreConvLinkHR,datainiPCLHR,DatiDistoMTLink,ErrDistoMTLink,datainiDM,... + DatiPressureLink,ErrPressureLink,... + DatiLoadLink,ErrLoadLink,DatiExtensometerLink,DatiExtensometerLink_Rif,... + DatiNTCExtensometerLink,ErrExtensometerLink,Dati3DExtensometerLink,ChEL,EL_NTC,... + Dati3DExtensometerLink_Rif,DatiNTC3DExtensometerLink,Err3DExtensometerLink,ErrNTC3DExtensometerLink,Ch3DEL,EL3D_NTC,... + DatiWireExtensometerLink,DatiNTCWireExtensometerLink,ErrWireExtensometerLink,ChWEL,WEL_NTC,... + DatiMultiPointExtensometer,DatiNTCMultiPointExtensometer,ErrMultiPointExtensometer,ErrNTCMultiPointExtensometer,ChMPBEL,MPBEL_NTC,... + DatiAnalogLink,ErrAnalogLink,datainiAL,ChAL,AL_NTC,... + DatiCrackLink,DatiNTCCrackLink,ErrCrackLink,ChCrL,CrL_NTC,... + Dati3DCrackLink,DatiNTC3DCrackLink,Err3DCrackLink,ErrNTC3DCrackLink,Ch3DCrL,CrL3D_NTC,... + Dati2DCrackLink,DatiNTC2DCrackLink,Err2DCrackLink,ErrNTC2DCrackLink,Ch2DCrL,CrL2D_NTC,... + DatiStressMeter,DatiStressMeter_Rif,DatiNTCStressMeter,DatiNTCStressMeter_Rif,ErrStressMeter,ChSM,SM_NTC,... + yesTuL,yesRL,yesTLH,yesTLHRH,yesPCL,yesPCLHR,yesPL,yesLL,yesEL,yes3DEL,... + yesWEL,yesMPBEL,yesAL,yesCrL,yes3DCrL,yes2DCrL,yesSM,yesDM] = ... + lettura(IDcentralina,DTcatena,datainiTuL,tempoiniTuL,NodoTunnelLink,NuovoZeroTuL,date_AC,time_AC,Nodo_AC,... + datainiRL,tempoiniRL,NodoRadialLink,NuovoZeroRL,datainiTLH,tempoiniTLH,NodoTiltLinkH,NuovoZeroTLH,... + datainiTLHRH,tempoiniTLHRH,NodoTiltLinkHRH,NuovoZeroTLHRH,datainiPCL,tempoiniPCL,NodoPreConvLink,NuovoZeroPCL,... + datainiPCLHR,tempoiniPCLHR,NodoPreConvLinkHR,NuovoZeroPCLHR,datainiDM,tempoiniDM,NodoDistoMTLink,NuovoZeroDM,... + datainiPL,tempoiniPL,NodoPressureLink,NuovoZeroPrL,datainiLL,tempoiniLL,NodoLoadLink,NuovoZeroLL,... + datainiEL,tempoiniEL,Date_Rif_EL,NodoExtensometerLink,NuovoZeroEL,... + dataini3DEL,tempoini3DEL,Date_Rif_3DEL,Nodo3DExtensometerLink,NuovoZero3DEL,... + datainiWEL,tempoiniWEL,NodoWireExtensometerLink,NuovoZeroWEL,... + datainiMPBEL,tempoiniMPBEL,NodoMultiPointRodExtensometer,NuovoZeroMPBEL,... + datainiAL,tempoiniAL,NodoAnalogLink,NumBasi,NuovoZeroAL,... + datainiCrL,tempoiniCrL,NodoCrackLink,NuovoZeroCrL,dataini3DCrL,tempoini3DCrL,Nodo3DCrackLink,NuovoZero3DCrL,... + dataini2DCrL,tempoini2DCrL,Nodo2DCrackLink,NuovoZero2DCrL,... + datainiSM,tempoiniSM,Date_Rif_SM,NodoStressMeter,NuovoZeroSM,yesTuL,yesRL,yesTLH,... + yesTLHRH,yesPCL,yesPCLHR,yesPL,yesLL,yesEL,yes3DEL,yesWEL,yesMPBEL,yesAL,yesCrL,... + yes3DCrL,yes2DCrL,yesSM,yesDM,rTuL,rRL,rTLH,rTLHRH,rPCL,rPCLHR,rPrL,... + rLL,rEL,r3DEL,rWEL,rMPBEL,rAL,rCrL,r3DCrL,r2DCrL,rSM,rDM,conn,catena,date,time,FileName) + +% Log file +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'lettura function started'; +fprintf(fileID,fmt,text); + +%% Batteria +% cerco la batteria nel primo nodo +j = 1; +z = 0; +[rC,~] = size(catena); +while z == 0 + if cell2mat(catena(j,3)) == 1 + z = 1; + else + j = j+1; % nodo numero 1 + end +end +condition = 0; +while condition == 0 + if j <= rC + i = cell2mat(catena(j,1)); + if i == 17 + dataini = datainiTuL; + tempoini = tempoiniTuL; + break + elseif i == 18 + dataini = datainiRL; + tempoini = tempoiniRL; + break + elseif i == 11 + dataini = datainiTLH; + tempoini = tempoiniTLH; + break + elseif i == 12 + dataini = datainiTLHRH; + tempoini = tempoiniTLHRH; + break + elseif i == 23 + dataini = datainiPCL; + tempoini = tempoiniPCL; + break + elseif i == 24 + dataini = datainiPCLHR; + tempoini = tempoiniPCLHR; + break + elseif i == 8 + dataini = datainiAL; + tempoini = tempoiniAL; + break + elseif i == 15 + dataini = datainiLL; + tempoini = tempoiniLL; + break + elseif i == 16 + dataini = datainiEL; + tempoini = tempoiniEL; + break + elseif i == 19 + dataini = dataini3DEL; + tempoini = tempoini3DEL; + break + elseif i == 21 + dataini = datainiPL; + tempoini = tempoiniPL; + break + elseif i == 22 + dataini = datainiWEL; + tempoini = tempoiniWEL; + break + elseif i == 25 + dataini = datainiMPBEL; + tempoini = tempoiniMPBEL; + break + elseif i == 36 + dataini = datainiCrL; + tempoini = tempoiniCrL; + break + elseif i == 37 + dataini = dataini3DCrL; + tempoini = tempoini3DCrL; + break + elseif i == 51 + dataini = dataini2DCrL; + tempoini = tempoini2DCrL; + break + elseif i == 47 + dataini = datainiSM; + tempoini = tempoiniSM; + break + elseif i == 56 + dataini = datainiDM; + tempoini = tempoiniDM; + break + end + j = j+1; + else + break + end +end + +NodeNum = '1'; +comando = ['select Date, Time, BatLevel from RawDataView where Date = ''' ... + dataini ''' and Time >= ''' tempoini ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum = ''' NodeNum ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +BatTempo = curs.Data; +comando = ['select Date, Time, BatLevel from RawDataView where Date > ''' ... + dataini ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum = ''' NodeNum ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +BatData = curs.Data; +if strcmp(char(BatData(1)),'No Data') + Batteria = BatTempo; +elseif strcmp(char(BatTempo(1)),'No Data') + Batteria = BatData; +else + Batteria = [BatTempo; BatData]; +end + +Data(1,1) = cellstr(date); +Data(1,2) = cellstr(time); + +%% Tunnel Link +if yesTuL == 0 % Non ci sono Tunnel Link + DatiTunnelLink = []; + ErrTunnelLink = []; + wardat = 'lettura function: there are not Tunnel Link'; + fprintf(fileID,fmt,wardat); +else + RawDataFile = ['' IDcentralina '-' DTcatena '-TuL-RawData.csv']; + NAN = 0; + date_AC = [date_AC ' ' time_AC]; + while NAN == 0 + if datenum(datainiTuL) == datenum(Data(1,1)) + tempoiniTuL = char(Data(1,2)); + end + NodeType = 'Tunnel Link'; + NodeNumTuL = num2str(cell2mat(NodoTunnelLink(1,2))); % scarico i dati del primo nodo + % Scarico dei dati relativi alla centralina con informazioni di Data e ora, livello batteria e temperatura + % Step 1 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date = ''' ... + datainiTuL ''' and Time >= ''' tempoiniTuL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumTuL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniTuL = curs.Data; + Ntempo = DATiniTuL; + [r,c] = size(DATiniTuL); + saltoTuL = 0; + if r==1 && c==1 + textdatTuL = 'Warning: error reading Tunnel Link (control unit data)!'; + fprintf(fileID,fmt,textdatTuL); + saltoTuL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiTuL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumTuL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2TuL = curs.Data; + Ndate = DAT2TuL; + if saltoTuL == 1 + DATiniTuL = DAT2TuL; + end + Check = size(DAT2TuL); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoTuL == 0 + DATiniTuL = [DATiniTuL; DAT2TuL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniTuL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniTuL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniTuL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniTuL = T; + else + DATiniTuL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + % creo la matrice per i dati Tunnel Link + if saltoTuL == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiTunnelLink = cell(rd+rt,4*rTuL); + else + DatiTunnelLink = cell(rt,4*rTuL); + end + else + DatiTunnelLink = cell(rd,4*rTuL); + end + NTunnelLink = cell2mat(NodoTunnelLink(:,2)); + col = 4; + ii = 1; + w = 0; + if now < datenum(date_AC) % NON si elabora Arco Rovescio + Arco = 0; + else + Arco = 1; + end + while ii <= rTuL + if ii >= Nodo_AC % Primo nodo arco rovescio + if Arco == 1 + Continua = 1; + else + Continua = 0; + end + else + Continua = 1; + end + if Continua == 1 + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NTunnelLink(ii,1); + nNodo = num2str(nN); + comando = ['select Val0, Val1, Val2, Val6 from RawDataView where Date = ''' ... + datainiTuL ''' and Time >= ''' tempoiniTuL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTuL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val6 from RawDataView where Date > ''' ... + datainiTuL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTuLd = curs.Data; + end + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-3; + if saltoTuL == 0 + if Continua == 1 + DatiTunnelLink(1:rt,ini_col:col) = DATnodoTuL(:,:); + else + DatiTunnelLink(1:rt,ini_col:col) = cellstr('0'); + end + else + if Continua == 1 + DatiTunnelLink(1:rd,ini_col:col) = DATnodoTuLd(:,:); + else + DatiTunnelLink(1:rd,ini_col:col) = cellstr('0'); + end + end + + [rn,~] = size(DATnodoTuLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoTuLd(i,:) = DATnodoTuLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Tunnel Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoTuL == 0 + if Continua == 1 + DatiTunnelLink(rt+1:rt+rd,ini_col:col) = DATnodoTuLd(:,:); + else + DatiTunnelLink(rt+1:rt+rd,ini_col:col) = cellstr('0'); + end + end + else + DatiTunnelLink = DatiTunnelLink(1:end,:); + end + okdatTuL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rTuL) ' Tunnel Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatTuL); + ii = ii+1; + col = col+4; + end + if w == 0 + wardat = 'There are not warning for Tunnel Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiTunnelLink); + ErrTunnelLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroTuL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiTuL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTunnelLink(1,jj))); + idxND = find(strcmp('No Data',DatiTunnelLink(1,jj))); + idxT = find(strcmp('---',DatiTunnelLink(1,jj))); + idxT2 = find(strcmp('-',DatiTunnelLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiTunnelLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiTunnelLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiTunnelLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiTunnelLink(1,jj))); + idxN = find(strcmp('null',DatiTunnelLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Tunnel Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroTuL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiTuL)+1 < now + datainiTuL = datestr(datenum(datainiTuL)+1,'yyyy-mm-dd'); + break + else + yesTuL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiTuL = datestr(datenum(datainiTuL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiTunnelLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrTunnelLink(1,jj) = 1; + wardat = 'Data of Tunnel Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiTuL = datestr(datenum(datainiTuL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c % nodi + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTunnelLink(:,jj))); + idxND = find(strcmp('No Data',DatiTunnelLink(:,jj))); + idxT = find(strcmp('---',DatiTunnelLink(:,jj))); + idxT2 = find(strcmp('-',DatiTunnelLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiTunnelLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiTunnelLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiTunnelLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiTunnelLink(:,jj))); + idxN = find(strcmp('null',DatiTunnelLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiTuL = datestr(datenum(datainiTuL)-1,'yyyy-mm-dd'); + break + end + DatiTunnelLink(indice,jj) = DatiTunnelLink(indice-1,jj); + ErrTunnelLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r % date + check = isnan(cell2mat(DatiTunnelLink(nnn,jj))); + if check == 1 + DatiTunnelLink(nnn,jj) = DatiTunnelLink(nnn-1,jj); + ErrTunnelLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Tunnel Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiTunnelLink = [DATiniTuL str2double(DatiTunnelLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiTunnelLink(a,1) == DatiTunnelLink(a-1,1) + DatiTunnelLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + if NuovoZeroTuL == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiTunnelLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiTunnelLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiTunnelLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiTunnelLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiTunnelLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniRL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumRL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniRL = curs.Data; + Ntempo = DATiniRL; + [r,c] = size(DATiniRL); + saltoRL = 0; + if r==1 && c==1 + textdatRL = 'Warning: error reading Radial Link (control unit data)!'; + fprintf(fileID,fmt,textdatRL); + saltoRL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiRL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumRL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2RL = curs.Data; + Ndate = DAT2RL; + if saltoRL == 1 + DATiniRL = DAT2RL; + end + Check = size(DAT2RL); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoRL == 0 + DATiniRL = [DATiniRL; DAT2RL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniRL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniRL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniRL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniRL = T; + else + DATiniRL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + if saltoRL == 0 + % creo la matrice per i dati Radial Link + if Check(1,2) > 1 + DatiRadialLink = cell(rd+rt,4*rRL); + else + DatiRadialLink = cell(rt,4*rRL); + end + else + DatiRadialLink = cell(rd,4*rRL); + end + NRadialLink = cell2mat(NodoRadialLink(:,2)); + col = 4; + ii = 1; + w = 0; + while ii <= rRL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NRadialLink(ii,1); + nNodo = num2str(nN); + comando = ['select Val0, Val1, Val2, Val6 from RawDataView where Date = ''' ... + datainiRL ''' and Time >= ''' tempoiniRL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val6 from RawDataView where Date > ''' ... + datainiRL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRLd = curs.Data; + % Concateno i dati relativi a Step 1 e 2 per il nodo ii-esimo. + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-3; + if saltoRL == 0 + DatiRadialLink(1:rt,ini_col:col) = DATnodoRL(:,:); + else + DatiRadialLink(1:rd,ini_col:col) = DATnodoRL(:,:); + end + + [rn,~] = size(DATnodoRLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoRLd(i,:) = DATnodoRLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Radial Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoRL == 0 + DatiRadialLink(rt+1:rt+rd,ini_col:col) = DATnodoRLd(:,:); + end + else + DatiRadialLink = DatiRadialLink(1:end,:); + end + okdatRL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rRL) ' Radial Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatRL); + ii = ii+1; + col = col+4; + end + if w == 0 + wardat = 'There are not warning for Radial Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiRadialLink); + ErrRadialLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroRL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiRL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiRadialLink(1,jj))); + idxND = find(strcmp('No Data',DatiRadialLink(1,jj))); + idxT = find(strcmp('---',DatiRadialLink(1,jj))); + idxT2 = find(strcmp('-',DatiRadialLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiRadialLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiRadialLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiRadialLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiRadialLink(1,jj))); + idxN = find(strcmp('null',DatiRadialLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Radial Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroRL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiRL)+1 < now + datainiRL = datestr(datenum(datainiRL)+1,'yyyy-mm-dd'); + break + else + yesRL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiRL = datestr(datenum(datainiRL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiRadialLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrRadialLink(1,jj) = 1; + wardat = 'Data of Radial Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiRL = datestr(datenum(datainiRL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiRadialLink(:,jj))); + idxND = find(strcmp('No Data',DatiRadialLink(:,jj))); + idxT = find(strcmp('---',DatiRadialLink(:,jj))); + idxT2 = find(strcmp('-',DatiRadialLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiRadialLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiRadialLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiRadialLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiRadialLink(:,jj))); + idxN = find(strcmp('null',DatiRadialLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiRL = datestr(datenum(datainiRL)-1,'yyyy-mm-dd'); + break + end + DatiRadialLink(indice,jj) = DatiRadialLink(indice-1,jj); + ErrRadialLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r % date + check = isnan(cell2mat(DatiRadialLink(nnn,jj))); + if check == 1 + DatiRadialLink(nnn,jj) = DatiRadialLink(nnn-1,jj); + ErrRadialLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Radial Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiRadialLink = [DATiniRL str2double(DatiRadialLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiRadialLink(a,1) == DatiRadialLink(a-1,1) + DatiRadialLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + if NuovoZeroRL == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiRadialLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiRadialLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiRadialLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiRadialLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiRadialLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniTLH ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType ... + ''' and NodeNum = ''' NodeNumTLH ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniTLH = curs.Data; + Ntempo = DATiniTLH; + [r,c] = size(DATiniTLH); + saltoTLH = 0; + if r==1 && c==1 + textdatTLH = 'Warning: error reading Tilt Link H (control unit data)!'; + fprintf(fileID,fmt,textdatTLH); + saltoTLH = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiTLH ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumTLH ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2TLH = curs.Data; + Ndate = DAT2TLH; + if saltoTLH == 1 + DATiniTLH = DAT2TLH; + end + Check = size(DAT2TLH); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoTLH == 0 + DATiniTLH = [DATiniTLH; DAT2TLH]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniTLH); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniTLH(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniTLH(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniTLH = T; + else + DATiniTLH = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + % creo la matrice per i dati Tunnel Link + if saltoTLH == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiTiltLinkH = cell(rd+rt,4*rTLH); + else + DatiTiltLinkH = cell(rt,4*rTLH); + end + else + DatiTiltLinkH = cell(rd,4*rTLH); + end + NTiltLinkH = cell2mat(NodoTiltLinkH(:,2)); + col = 4; + ii = 1; + w = 0; + while ii <= rTLH + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NTiltLinkH(ii,1); + nNodo = num2str(nN); + comando = ['select Val0, Val1, Val2, Val6 from RawDataView where Date = ''' ... + datainiTLH ''' and Time >= ''' tempoiniTLH ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLH = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val6 from RawDataView where Date > ''' ... + datainiTLH ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina ... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-3; + if saltoTLH == 0 + DatiTiltLinkH(1:rt,ini_col:col) = DATnodoTLH(:,:); + else + DatiTiltLinkH(1:rd,ini_col:col) = DATnodoTLHd(:,:); + end + + [rn,~] = size(DATnodoTLHd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoTLHd(i,:) = DATnodoTLHd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Tilt Link H ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoTLH == 0 + DatiTiltLinkH(rt+1:rt+rd,ini_col:col) = DATnodoTLHd(:,:); + end + else + DatiTiltLinkH = DatiTiltLinkH(1:end,:); + end + okdatTLH = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rTLH) ' Tilt Link H nodes downloaded correctly']; + fprintf(fileID,fmt,okdatTLH); + ii = ii+1; + col = col+4; + end + if w == 0 + wardat = 'There are not warning for Tilt Link H!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiTiltLinkH); + ErrTiltLinkH = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroTLH == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiTLH)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTiltLinkH(1,jj))); + idxND = find(strcmp('No Data',DatiTiltLinkH(1,jj))); + idxT = find(strcmp('---',DatiTiltLinkH(1,jj))); + idxT2 = find(strcmp('-',DatiTiltLinkH(1,jj))); + idxE2 = find(strcmp('Err2',DatiTiltLinkH(1,jj))); + idxE255 = find(strcmp('Err255',DatiTiltLinkH(1,jj))); + idxD = find(strcmp('DMUXe',DatiTiltLinkH(1,jj))); + idxE1F = find(strcmp('Err1File',DatiTiltLinkH(1,jj))); + idxN = find(strcmp('null',DatiTiltLinkH(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Tilt Link H nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroTLH == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiTLH)+1 < now + datainiTLH = datestr(datenum(datainiTLH)+1,'yyyy-mm-dd'); + break + else + yesTLH = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiTLH = datestr(datenum(datainiTLH)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiTiltLinkH(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrTiltLinkH(1,jj) = 1; + wardat = 'Data of Tilt Link H nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiTLH = datestr(datenum(datainiTLH)-1,'yyyy-mm-dd'); + break + end + end + end + end + if ESCI == 0 + % Cerco i multipli di 4 per identificare le temperature + Int = jj/4; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiTiltLinkH(1,jj)) > 1000 + if rDR==1 && cDR==1 || NuovoZeroTLH == 0 + NAN = 0; + ESCI = 1; + if datenum(datainiTLH)+1 < now + datainiTLH = datestr(datenum(datainiTLH)+1,'yyyy-mm-dd'); + break + else + yesTLH = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiTLH = datestr(datenum(datainiTLH)-1,'yyyy-mm-dd'); + break + else + DatiTiltLinkH(1,jj-3) = cellstr(num2str(DatiRaw(RawDate(end),jj-2))); + DatiTiltLinkH(1,jj-2) = cellstr(num2str(DatiRaw(RawDate(end),jj-1))); + DatiTiltLinkH(1,jj-1) = cellstr(num2str(DatiRaw(RawDate(end),jj))); + DatiTiltLinkH(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrTiltLinkH(1,jj) = 1; + wardat = ['Data of Tilt Link H nodes corrected using Raw Data of reference Csv file. '... + 'MEMS was read as an electrolytic cell']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTiltLinkH(:,jj))); + idxND = find(strcmp('No Data',DatiTiltLinkH(:,jj))); + idxT = find(strcmp('---',DatiTiltLinkH(:,jj))); + idxT2 = find(strcmp('-',DatiTiltLinkH(:,jj))); + idxE2 = find(strcmp('Err2',DatiTiltLinkH(:,jj))); + idxE255 = find(strcmp('Err255',DatiTiltLinkH(:,jj))); + idxD = find(strcmp('DMUXe',DatiTiltLinkH(:,jj))); + idxE1F = find(strcmp('Err1File',DatiTiltLinkH(:,jj))); + idxN = find(strcmp('null',DatiTiltLinkH(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiTLH = datestr(datenum(datainiTLH)-1,'yyyy-mm-dd'); + break + end + DatiTiltLinkH(indice,jj) = DatiTiltLinkH(indice-1,jj); + ErrTiltLinkH(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + for ii = 2:r + % Cerco i multipli di 7 per identificare le temperature + Int = jj/4; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiTiltLinkH(ii,jj)) > 1000 + DatiTiltLinkH(ii,jj-6:jj) = DatiTiltLinkH(ii-1,jj-6:jj); + ErrTiltLinkH(ii,jj) = 1; + wardat = ['Data of Tilt Link H nodes corrected using Raw Data of reference Csv file. '... + 'MEMS was read as an electrolytic cell']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r % date + check = isnan(cell2mat(DatiTiltLinkH(nnn,jj))); + if check == 1 + DatiTiltLinkH(nnn,jj) = DatiTiltLinkH(nnn-1,jj); + ErrTiltLinkH(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Tilt Link H data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiTiltLinkH = [DATiniTLH str2double(DatiTiltLinkH)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiTiltLinkH(a,1) == DatiTiltLinkH(a-1,1) + DatiTiltLinkH(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + if NuovoZeroTLH == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiTiltLinkH(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiTiltLinkH(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiTiltLinkH(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiTiltLinkH(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiTiltLinkH; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniTLHRH ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumTLHRH ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniTLHRH = curs.Data; + Ntempo = DATiniTLHRH; + [r,c] = size(DATiniTLHRH); + saltoTLHRH = 0; + if r==1 && c==1 + textdatTLHRH = 'Warning: error reading Tilt Link HR H (control unit data)!'; + fprintf(fileID,fmt,textdatTLHRH); + saltoTLHRH = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiTLHRH ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumTLHRH ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2TLHRH = curs.Data; + Ndate = DAT2TLHRH; + if saltoTLHRH == 1 + DATiniTLHRH = DAT2TLHRH; + end + Check = size(DAT2TLHRH); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoTLHRH == 0 + DATiniTLHRH = [DATiniTLHRH; DAT2TLHRH]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniTLHRH); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniTLHRH(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniTLHRH(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniTLHRH = T; + else + DATiniTLHRH = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + % creo la matrice per i dati Tunnel Link + if saltoTLHRH == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiTiltLinkHRH = cell(rd+rt,6*rTLHRH); + else + DatiTiltLinkHRH = cell(rt,6*rTLHRH); + end + else + DatiTiltLinkHRH = cell(rd,6*rTLHRH); + end + NTiltLinkHRH = cell2mat(NodoTiltLinkHRH(:,2)); + col = 6; + ii = 1; + w = 0; + while ii <= rTLHRH + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NTiltLinkHRH(ii,1); + nNodo = num2str(nN); + comando = ['select Val0, Val1, Val3, Val4, Val5, Val6 from RawDataView where Date = ''' ... + datainiTLHRH ''' and Time >= ''' tempoiniTLHRH ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHRH = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val3, Val4, Val5, Val6 from RawDataView where Date > ''' ... + datainiTLHRH ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHRHd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-5; + if saltoTLHRH == 0 + DatiTiltLinkHRH(1:rt,ini_col:col) = DATnodoTLHRH(:,:); + else + DatiTiltLinkHRH(1:rd,ini_col:col) = DATnodoTLHRHd(:,:); + end + + [rn,~] = size(DATnodoTLHRHd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoTLHRHd(i,:) = DATnodoTLHRHd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Tilt Link HR H ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoTLHRH == 0 + DatiTiltLinkHRH(rt+1:rt+rd,ini_col:col) = DATnodoTLHRHd(:,:); + end + else + DatiTiltLinkHRH = DatiTiltLinkHRH(1:end,:); + end + okdatTLHRH = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rTLHRH) ' Tilt Link HR H nodes downloaded correctly']; + fprintf(fileID,fmt,okdatTLHRH); + ii = ii+1; + col = col+6; + end + if w == 0 + wardat = 'There are not warning for Tilt Link HR H!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiTiltLinkHRH); + ErrTiltLinkHRH = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroTLHRH == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiTLHRH)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTiltLinkHRH(1,jj))); + idxND = find(strcmp('No Data',DatiTiltLinkHRH(1,jj))); + idxT = find(strcmp('---',DatiTiltLinkHRH(1,jj))); + idxT2 = find(strcmp('-',DatiTiltLinkHRH(1,jj))); + idxE2 = find(strcmp('Err2',DatiTiltLinkHRH(1,jj))); + idxE255 = find(strcmp('Err255',DatiTiltLinkHRH(1,jj))); + idxD = find(strcmp('DMUXe',DatiTiltLinkHRH(1,jj))); + idxE1F = find(strcmp('Err1File',DatiTiltLinkHRH(1,jj))); + idxN = find(strcmp('null',DatiTiltLinkHRH(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Tilt Link HR H nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroTLHRH == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiTLHRH)+1 < now + datainiTLHRH = datestr(datenum(datainiTLHRH)+1,'yyyy-mm-dd'); + break + else + yesTLHRH = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiTLHRH = datestr(datenum(datainiTLHRH)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiTiltLinkHRH(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrTiltLinkHRH(1,jj) = 1; + wardat = 'Data of Tilt Link HR H nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiTLHRH = datestr(datenum(datainiTLHRH)-1,'yyyy-mm-dd'); + break + end + end + end + end + if ESCI == 0 + % Cerco i multipli di 6 per identificare le temperature + Int = jj/6; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiTiltLinkHRH(1,jj)) > 1000 + if rDR==1 && cDR==1 || NuovoZeroTLHRH == 0 + NAN = 0; + ESCI = 1; + if datenum(datainiTLHRH)+1 < now + datainiTLHRH = datestr(datenum(datainiTLHRH)+1,'yyyy-mm-dd'); + break + else + yesTLHRH = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiTLHRH = datestr(datenum(datainiTLHRH)-1,'yyyy-mm-dd'); + break + else + DatiTiltLinkHRH(1,jj-5) = cellstr(num2str(DatiRaw(RawDate(end),jj-4))); + DatiTiltLinkHRH(1,jj-4) = cellstr(num2str(DatiRaw(RawDate(end),jj-3))); + DatiTiltLinkHRH(1,jj-3) = cellstr(num2str(DatiRaw(RawDate(end),jj-2))); + DatiTiltLinkHRH(1,jj-2) = cellstr(num2str(DatiRaw(RawDate(end),jj-1))); + DatiTiltLinkHRH(1,jj-1) = cellstr(num2str(DatiRaw(RawDate(end),jj))); + DatiTiltLinkHRH(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrTiltLinkHRH(1,jj) = 1; + wardat = ['Data of Tilt Link HR H nodes corrected using Raw Data of reference Csv file. '... + 'MEMS was read as an electrolytic cell']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTiltLinkHRH(:,jj))); + idxND = find(strcmp('No Data',DatiTiltLinkHRH(1,jj))); + idxT = find(strcmp('---',DatiTiltLinkHRH(:,jj))); + idxT2 = find(strcmp('-',DatiTiltLinkHRH(:,jj))); + idxE2 = find(strcmp('Err2',DatiTiltLinkHRH(:,jj))); + idxE255 = find(strcmp('Err255',DatiTiltLinkHRH(:,jj))); + idxD = find(strcmp('DMUXe',DatiTiltLinkHRH(:,jj))); + idxE1F = find(strcmp('Err1File',DatiTiltLinkHRH(:,jj))); + idxN = find(strcmp('null',DatiTiltLinkHRH(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiTLHRH = datestr(datenum(datainiTLHRH)-1,'yyyy-mm-dd'); + break + end + DatiTiltLinkHRH(indice,jj) = DatiTiltLinkHRH(indice-1,jj); + ErrTiltLinkHRH(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r % date + check = isnan(cell2mat(DatiTiltLinkHRH(nnn,jj))); + if check == 1 + DatiTiltLinkHRH(nnn,jj) = DatiTiltLinkHRH(nnn-1,jj); + ErrTiltLinkHRH(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Tilt Link HR H data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiTiltLinkHRH = [DATiniTLHRH str2double(DatiTiltLinkHRH)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiTiltLinkHRH(a,1) == DatiTiltLinkHRH(a-1,1) + DatiTiltLinkHRH(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + if NuovoZeroTLHRH == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiTiltLinkHRH(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiTiltLinkHRH(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiTiltLinkHRH(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiTiltLinkHRH(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiTiltLinkHRH; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniPCL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumPCL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniPCL = curs.Data; + Ntempo = DATiniPCL; + [r,c] = size(DATiniPCL); + saltoPCL = 0; + if r==1 && c==1 + textdatPCL = 'Warning: error reading PreConv Link (control unit data)!'; + fprintf(fileID,fmt,textdatPCL); + saltoPCL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiPCL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumPCL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + DAT2PCL = curs.Data; + Ndate = DAT2PCL; + if saltoPCL == 1 + DATiniPCL = DAT2PCL; + end + Check = size(DAT2PCL); + if Check(1,2) > 1 % ho superato il primo giorno + if saltoPCL == 0 + DATiniPCL = [DATiniPCL; DAT2PCL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniPCL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniPCL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniPCL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniPCL = T; + else + DATiniPCL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoPCL == 0 + % creo la matrice per i datiPreConvLink + if Check(1,2) > 1 + DatiPreConvLink = cell(rd+rt,4*rPCL); + else + DatiPreConvLink = cell(rt,4*rPCL); + end + else + DatiPreConvLink = cell(rd,4*rPCL); + end + NPreConvLink = cell2mat(NodoPreConvLink(:,2)); + col = 4; + ii = 1; + w = 0; + while ii <= rPCL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NPreConvLink(ii,1); + nNodo = num2str(nN); + comando = ['select Val0, Val1, Val2, Val6 from RawDataView where Date = ''' ... + datainiPCL ''' and Time >= ''' tempoiniPCL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPCL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val6 from RawDataView where Date > ''' ... + datainiPCL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPCLd = curs.Data; + % Concateno i dati relativi a Step 1 e 2 per il nodo ii-esimo. + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-3; + if saltoPCL == 0 + DatiPreConvLink(1:rt,ini_col:col) = DATnodoPCL(:,:); + else + DatiPreConvLink(1:rd,ini_col:col) = DATnodoPCL(:,:); + end + + [rn,~] = size(DATnodoPCLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoPCLd(i,:) = DATnodoPCLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node PreConv Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoPCL == 0 + DatiPreConvLink(rt+1:rt+rd,ini_col:col) = DATnodoPCLd(:,:); + end + else + DatiPreConvLink = DatiPreConvLink(1:end,:); + end + okdatPCL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rPCL) ' PreConv Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatPCL); + col = col+4; + ii = ii+1; + end + if w == 0 + wardat = 'There are not warning for PreConv Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiPreConvLink); + ErrPreConvLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroPCL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiPCL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiPreConvLink(1,jj))); + idxND = find(strcmp('No Data',DatiPreConvLink(1,jj))); + idxT = find(strcmp('---',DatiPreConvLink(1,jj))); + idxT2 = find(strcmp('-',DatiPreConvLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiPreConvLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiPreConvLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiPreConvLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiPreConvLink(1,jj))); + idxN = find(strcmp('null',DatiPreConvLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Pre Conv Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroPCL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiPCL)+1 < now + datainiPCL = datestr(datenum(datainiPCL)+1,'yyyy-mm-dd'); + break + else + yesPCL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiPCL = datestr(datenum(datainiPCL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiPreConvLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrPreConvLink(1,jj) = 1; + wardat = 'Data of PreConv Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiPCL = datestr(datenum(datainiPCL)-1,'yyyy-mm-dd'); + break + end + end + end + end + if ESCI == 0 + % Cerco i multipli di 4 per identificare le temperature + Int = jj/4; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiPreConvLink(1,jj)) > 1000 + if rDR==1 && cDR==1 || NuovoZeroPCL == 0 + NAN = 0; + ESCI = 1; + if datenum(datainiPCL)+1 < now + datainiPCL = datestr(datenum(datainiPCL)+1,'yyyy-mm-dd'); + break + else + yesPCL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiPCL = datestr(datenum(datainiPCL)-1,'yyyy-mm-dd'); + break + else + DatiPreConvLink(1,jj-3) = cellstr(num2str(DatiRaw(RawDate(end),jj-2))); + DatiPreConvLink(1,jj-2) = cellstr(num2str(DatiRaw(RawDate(end),jj-1))); + DatiPreConvLink(1,jj-1) = cellstr(num2str(DatiRaw(RawDate(end),jj))); + DatiPreConvLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrPreConvLink(1,jj) = 1; + wardat = ['Data of PreConv Link nodes corrected using Raw Data of reference Csv file. '... + 'MEMS was read as an electrolytic cell']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiPreConvLink(:,jj))); + idxND = find(strcmp('No Data',DatiPreConvLink(:,jj))); + idxT = find(strcmp('---',DatiPreConvLink(:,jj))); + idxT2 = find(strcmp('-',DatiPreConvLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiPreConvLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiPreConvLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiPreConvLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiPreConvLink(:,jj))); + idxN = find(strcmp('null',DatiPreConvLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiPCL = datestr(datenum(datainiPCL)-1,'yyyy-mm-dd'); + break + end + DatiPreConvLink(indice,jj) = DatiPreConvLink(indice-1,jj); + ErrPreConvLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + for ii = 2:r + % Cerco i multipli di 4 per identificare le temperature + Int = jj/4; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiPreConvLink(ii,jj)) > 1000 + DatiPreConvLink(ii,jj-6:jj) = DatiPreConvLink(ii-1,jj-6:jj); + ErrPreConvLink(ii,jj) = 1; + wardat = ['Data of PreConv Link nodes corrected using Raw Data of reference Csv file. '... + 'MEMS was read as an electrolytic cell']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r % date + check = isnan(cell2mat(DatiPreConvLink(nnn,jj))); + if check == 1 + DatiPreConvLink(nnn,jj) = DatiPreConvLink(nnn-1,jj); + ErrPreConvLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of PreConv Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiPreConvLink = [DATiniPCL str2double(DatiPreConvLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiPreConvLink(a,1) == DatiPreConvLink(a-1,1) + DatiPreConvLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + if NuovoZeroPCL == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiPreConvLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiPreConvLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiPreConvLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiPreConvLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiPreConvLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniPCLHR ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumPCLHR ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniPCLHR = curs.Data; + Ntempo = DATiniPCLHR; + [r,c] = size(DATiniPCLHR); + saltoPCLHR = 0; + if r==1 && c==1 + textdatPCLHR = 'Warning: error reading PreConv Link HR (control unit data)!'; + fprintf(fileID,fmt,textdatPCLHR); + saltoPCLHR = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiPCLHR ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' ... + NodeNumPCLHR ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2PCLHR = curs.Data; + Ndate = DAT2PCLHR; + if saltoPCLHR == 1 + DATiniPCLHR = DAT2PCLHR; + end + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + Check = size(DAT2PCLHR); + if Check(1,2) > 1 % ho superato il primo giorno + if saltoPCLHR == 1 + DATiniPCLHR = [DATiniPCLHR; DAT2PCLHR]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniPCLHR); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniPCLHR(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniPCLHR(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniPCLHR = T; + else + DATiniPCLHR = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + % creo la matrice per i dati + if saltoPCLHR == 0 + if Check(1,2) > 1 + DatiPreConvLinkHR = cell(rd+rt,3*rPCLHR); + else + DatiPreConvLinkHR = cell(rt,3*rPCLHR); + end + else + DatiPreConvLinkHR = cell(rd,3*rPCLHR); + end + NPreConvLinkHR = cell2mat(NodoPreConvLinkHR(:,2)); + ii = 1; + col = 3; + w = 0; + while ii <= rPCL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NPreConvLinkHR(ii,1); + nNodo = num2str(nN); + comando = ['select Val0, Val1, Val3, Val4, Val5, Val6 from RawDataView where Date = ''' datainiPCLHR ''' and Time >= ''' ... + tempoiniPCLHR ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPCLHR = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val3, Val4, Val5, Val6 from RawDataView where Date > ''' ... + datainiPCLHR ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPCLHRd = curs.Data; + % Concateno i dati relativi a Step 1 e 2 per il nodo ii-esimo. + + ini_col = col-5; + if saltoPCLHR == 0 + DatiPreConvLinkHR(1:rt,ini_col:col) = DATnodoPCLHR(:,:); + else + DatiPreConvLinkHR(1:rd,ini_col:col) = DATnodoPCLHR(:,:); + end + + [rn,~] = size(DATnodoTLHRdH); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoPCLHRd(i,:) = DATnodoPCLHRd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node PreConv Link HR ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoPCLHR == 0 + DatiPreConvLinkHR(rt+1:rt+rd,ini_col:col) = DATnodoPCLHRd(:,:); + end + else + DatiPreConvLinkHR = DatiPreConvLinkHR(1:end,:); + end + okdatPCLHR = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rPCLHR) ' PreConv Link HR nodes downloaded correctly']; + fprintf(fileID,fmt,okdatPCLHR); + col = col+3; + ii = ii+1; + end + if w == 0 + wardat = 'There are not warning for PreConv Link HR!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiPreConvLinkHR); + ErrPreConvLinkHR = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroPCLHR == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiPCLHR)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiPreConvLinkHR(1,jj))); + idxND = find(strcmp('No Data',DatiPreConvLinkHR(1,jj))); + idxT = find(strcmp('---',DatiPreConvLinkHR(1,jj))); + idxT2 = find(strcmp('-',DatiPreConvLinkHR(1,jj))); + idxE2 = find(strcmp('Err2',DatiPreConvLinkHR(1,jj))); + idxE255 = find(strcmp('Err255',DatiPreConvLinkHR(1,jj))); + idxD = find(strcmp('DMUXe',DatiPreConvLinkHR(1,jj))); + idxE1F = find(strcmp('Err1File',DatiPreConvLinkHR(1,jj))); + idxN = find(strcmp('null',DatiPreConvLinkHR(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of PreConv Link HR nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroPCLHR == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiPCLHR)+1 < now + datainiPCLHR = datestr(datenum(datainiPCLHR)+1,'yyyy-mm-dd'); + break + else + yesPCLHR = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiPCLHR = datestr(datenum(datainiPCLHR)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiPreConvLinkHR(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrPreConvLinkHR(1,jj) = 1; + wardat = 'Data of PreConv Link HR nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiPCLHR = datestr(datenum(datainiPCLHR)-1,'yyyy-mm-dd'); + break + end + end + end + end + if ESCI == 0 + % Cerco i multipli di 6 per identificare le temperature + Int = jj/6; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiPreConvLinkHR(1,jj)) < 500 + if rDR==1 && cDR==1 || NuovoZeroPCLHR == 0 + NAN = 0; + ESCI = 1; + if datenum(datainiPCLHR)+1 < now + datainiPCLHR = datestr(datenum(datainiPCLHR)+1,'yyyy-mm-dd'); + break + else + yesPCLHR = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiPCLHR = datestr(datenum(datainiPCLHR)-1,'yyyy-mm-dd'); + break + else + DatiPreConvLinkHR(1,jj-5) = cellstr(num2str(DatiRaw(RawDate(end),jj-4))); + DatiPreConvLinkHR(1,jj-4) = cellstr(num2str(DatiRaw(RawDate(end),jj-3))); + DatiPreConvLinkHR(1,jj-3) = cellstr(num2str(DatiRaw(RawDate(end),jj-2))); + DatiPreConvLinkHR(1,jj-2) = cellstr(num2str(DatiRaw(RawDate(end),jj-1))); + DatiPreConvLinkHR(1,jj-1) = cellstr(num2str(DatiRaw(RawDate(end),jj))); + DatiPreConvLinkHR(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrPreConvLinkHR(1,jj) = 1; + wardat = ['Data of PreConv Link HR nodes corrected using Raw Data of reference Csv file. '... + 'MEMS was read as an electrolytic cell']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiPreConvLinkHR(:,jj))); + idxND = find(strcmp('No Data',DatiPreConvLinkHR(:,jj))); + idxT = find(strcmp('---',DatiPreConvLinkHR(:,jj))); + idxT2 = find(strcmp('-',DatiPreConvLinkHR(:,jj))); + idxE2 = find(strcmp('Err2',DatiPreConvLinkHR(:,jj))); + idxE255 = find(strcmp('Err255',DatiPreConvLinkHR(:,jj))); + idxD = find(strcmp('DMUXe',DatiPreConvLinkHR(:,jj))); + idxE1F = find(strcmp('Err1File',DatiPreConvLinkHR(:,jj))); + idxN = find(strcmp('null',DatiPreConvLinkHR(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiPCLHR = datestr(datenum(datainiPCLHR)-1,'yyyy-mm-dd'); + break + end + DatiPreConvLinkHR(indice,jj) = DatiPreConvLinkHR(indice-1,jj); + ErrPreConvLinkHR(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r % date + check = isnan(cell2mat(DatiPreConvLinkHR(nnn,jj))); + if check == 1 + DatiPreConvLinkHR(nnn,jj) = DatiPreConvLinkHR(nnn-1,jj); + ErrPreConvLinkHR(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of PreConv Link HR data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiPreConvLinkHR = [DATiniPCLHR str2double(DatiPreConvLinkHR)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiPreConvLinkHR(a,1) == DatiPreConvLinkHR(a-1,1) + DatiPreConvLinkHR(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + if NuovoZeroPCLHR == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiPreConvLinkHR(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiPreConvLinkHR(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiPreConvLinkHR(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiPreConvLinkHR(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiPreConvLinkHR; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniDM ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumDM ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniDM = curs.Data; + Ntempo = DATiniDM; + [r,c] = size(DATiniDM); + saltoDM = 0; + if r==1 && c==1 + textdatDM = 'Warning: error reading DistoMT Link (control unit data)!'; + fprintf(fileID,fmt,textdatDM); + saltoDM = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiDM ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumDM ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2DM = curs.Data; + Ndate = DAT2DM; + if saltoDM == 1 + DATiniDM = DAT2DM; + end + Check = size(DAT2DM); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoDM == 0 + DATiniDM = [DATiniDM; DAT2DM]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniDM); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniDM(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniDM(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniDM = T; + else + DATiniDM = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + % creo la matrice per i dati Tunnel Link + if saltoDM == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiDistoMTLink = cell(rd+rt,4*rDM); + else + DatiDistoMTLink = cell(rt,4*rDM); + end + else + DatiDistoMTLink = cell(rd,4*rDM); + end + NDistoMTLink = cell2mat(NodoDistoMTLink(:,2)); + col = 4; + ii = 1; + w = 0; + while ii <= rDM + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NDistoMTLink(ii,1); + nNodo = num2str(nN); + comando = ['select Val0, Val1, Val2, Val3 from RawDataView where Date = ''' ... + datainiDM ''' and Time >= ''' tempoiniDM ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoDM = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val3 from RawDataView where Date > ''' ... + datainiDM ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoDMd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-3; + if saltoDM == 0 + DatiDistoMTLink(1:rt,ini_col:col) = DATnodoDM(:,:); + else + DatiDistoMTLink(1:rd,ini_col:col) = DATnodoDMd(:,:); + end + + [rn,~] = size(DATnodoDMd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoDMd(i,:) = DATnodoDMd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node DistoMT Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoDM == 0 + DatiDistoMTLink(rt+1:rt+rd,ini_col:col) = DATnodoDMd(:,:); + end + else + DatiDistoMTLink = DatiDistoMTLink(1:end,:); + end + okdatDM = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rDM) ' DistoMT Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatDM); + ii = ii+1; + col = col+4; + end + if w == 0 + wardat = 'There are not warning for DistoMT Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiDistoMTLink); + ErrDistoMTLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroDM == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiDM)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiDistoMTLink(1,jj))); + idxND = find(strcmp('No Data',DatiDistoMTLink(1,jj))); + idxT = find(strcmp('---',DatiDistoMTLink(1,jj))); + idxT2 = find(strcmp('-',DatiDistoMTLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiDistoMTLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiDistoMTLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiDistoMTLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiDistoMTLink(1,jj))); + idxN = find(strcmp('null',DatiDistoMTLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of DistoMT Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroDM == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiDM)+1 < now + datainiDM = datestr(datenum(datainiDM)+1,'yyyy-mm-dd'); + break + else + yesDM = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiDM = datestr(datenum(datainiDM)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiDistoMTLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrDistoMTLink(1,jj) = 1; + wardat = 'Data of DistoMT Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiDM = datestr(datenum(datainiDM)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c % nodi + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiDistoMTLink(:,jj))); + idxND = find(strcmp('No Data',DatiDistoMTLink(:,jj))); + idxT = find(strcmp('---',DatiDistoMTLink(:,jj))); + idxT2 = find(strcmp('-',DatiDistoMTLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiDistoMTLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiDistoMTLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiDistoMTLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiDistoMTLink(:,jj))); + idxN = find(strcmp('null',DatiDistoMTLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiDM = datestr(datenum(datainiDM)-1,'yyyy-mm-dd'); + break + end + DatiDistoMTLink(indice,jj) = DatiDistoMTLink(indice-1,jj); + ErrDistoMTLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r % date + check = isnan(cell2mat(DatiDistoMTLink(nnn,jj))); + if check == 1 + DatiDistoMTLink(nnn,jj) = DatiDistoMTLink(nnn-1,jj); + ErrDistoMTLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of DistoMT Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiDistoMTLink = [DATiniDM str2double(DatiDistoMTLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiDistoMTLink(a,1) == DatiDistoMTLink(a-1,1) + DatiDistoMTLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + if NuovoZeroDM == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiDistoMTLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiDistoMTLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiDistoMTLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiDistoMTLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiDistoMTLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniPL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumPL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniPL = curs.Data; + Ntempo = DATiniPL; + [r,c] = size(DATiniPL); + saltoPL = 0; + if r==1 && c==1 + textdatPL = 'Warning: error reading Pressure Link (control unit data)!'; + fprintf(fileID,fmt,textdatPL); + saltoPL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiPL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = '''... + NodeType ''' and NodeNum = ''' NodeNumPL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2PL = curs.Data; + Ndate = DAT2PL; + if saltoPL == 1 + DATiniPL = DAT2PL; + end + Check = size(DAT2PL); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoPL == 0 + DATiniPL = [DATiniPL; DAT2PL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniPL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniPL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniPL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniPL = T; + else + DATiniPL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + if saltoPL == 0 + if Check(1,2) > 1 + % creo la matrice per i dati Pressure Link + DatiPressureLink = cell(rd+rt,rPrL); + else + DatiPressureLink = cell(rt,rPrL); + end + else + DatiPressureLink = cell(rd,rPrL); + end + NPressureLink = cell2mat(NodoPressureLink(:,2)); + col = 1; + ii = 1; + w = 0; + while ii <= rPrL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NPressureLink(ii,1); + nNodo = num2str(nN); + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiPL ''' and Time >= ''' tempoiniPL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiPL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPLd = curs.Data; + % Concateno i dati relativi a Step 1 e 2 per il nodo ii-esimo. + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoPL == 0 + DatiPressureLink(1:rt,col) = DATnodoPL(:,:); + else + DatiPressureLink(1:rd,col) = DATnodoPL(:,:); + end + + [rn,~] = size(DATnodoPLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoPLd(i,:) = DATnodoPLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Pressure Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoPL == 0 + DatiPressureLink(rt+1:rt+rd,col) = DATnodoPLd(:,:); + end + else + DatiPressureLink = DatiPressureLink(1:end,:); + end + okdatPL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rPrL) ' Pressure Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatPL); + ii = ii+1; + col = col+1; + end + if w == 0 + wardat = 'There are not warning for Pressure Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiPressureLink); + ErrPressureLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroPrL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiPL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + for jj=1:c + % Se il nodo è Dis., devo aumentare di uno la data (il nodo non + % è ancora stato installato!) + if strcmp('Dis.',DatiPressureLink(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',DatiPressureLink(dis,jj)) == 0 + DatiPressureLink = DatiPressureLink(dis:end,:); + DATiniPL = DATiniPL(dis:end,:); + [r,c] = size(DatiPressureLink); + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiPL)+1 < now + datainiPL = datestr(datenum(datainiPL)+1,'yyyy-mm-dd'); + break + else + yesPL = 0; + end + end + end + end + end + if DIS ~= 1 && yesPL == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiPressureLink(1,jj))); + idxT = find(strcmp('---',DatiPressureLink(1,jj))); + idxT2 = find(strcmp('-',DatiPressureLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiPressureLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiPressureLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiPressureLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiPressureLink(1,jj))); + idxN = find(strcmp('null',DatiPressureLink(1,jj))); + idxRX = find(strcmp('No RX',DatiPressureLink(1,jj))); + idxI = find(strcmp('id Error',DatiPressureLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiPressureLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiPressureLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiPressureLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiPressureLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiPressureLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiPressureLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiPressureLink(1,jj))); + idxND = find(strcmp('No Data',DatiPressureLink(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiPressureLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Pressure Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroPrL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiPL)+1 < now + datainiPL = datestr(datenum(datainiPL)+1,'yyyy-mm-dd'); + break + else + yesPL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiPL = datestr(datenum(datainiPL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiPressureLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrPressureLink(1,jj) = 1; + wardat = 'Data of Pressure Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiPL = datestr(datenum(datainiPL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiPressureLink(:,jj))); + idxT = find(strcmp('---',DatiPressureLink(:,jj))); + idxT2 = find(strcmp('-',DatiPressureLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiPressureLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiPressureLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiPressureLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiPressureLink(:,jj))); + idxN = find(strcmp('null',DatiPressureLink(:,jj))); + idxRX = find(strcmp('No RX',DatiPressureLink(:,jj))); + idxI = find(strcmp('id Error',DatiPressureLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiPressureLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiPressureLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiPressureLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiPressureLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiPressureLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiPressureLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiPressureLink(:,jj))); + idxND = find(strcmp('No Data',DatiPressureLink(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiPressureLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiPL = datestr(datenum(datainiPL)-1,'yyyy-mm-dd'); + break + else + DatiPressureLink(indice,jj) = DatiPressureLink(indice-1,jj); + ErrPressureLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiPressureLink(nnn,jj))); + if check == 1 + DatiPressureLink(nnn,jj) = DatiPressureLink(nnn-1,jj); + ErrPressureLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Pressure Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiPressureLink = [DATiniPL str2double(DatiPressureLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiPressureLink(a,1) == DatiPressureLink(a-1,1) + DatiPressureLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + end + if NuovoZeroPrL == 1 && yesPL == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiPressureLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiPressureLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiPressureLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiPressureLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiPressureLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniLL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumLL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniLL = curs.Data; + Ntempo = DATiniLL; + [r,c] = size(DATiniLL); + saltoLL = 0; + if r==1 && c==1 + textdatLL = 'Warning: error reading Load Link (control unit data)!'; + fprintf(fileID,fmt,textdatLL); + saltoLL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiLL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumLL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2LL = curs.Data; + Ndate = DAT2LL; + if saltoLL == 1 + DATiniLL = DAT2LL; + end + Check = size(DAT2LL); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoLL == 0 + DATiniLL = [DATiniLL; DAT2LL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniLL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniLL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniLL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniLL = T; + else + DATiniLL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + % creo la matrice per i dati Load Link + if saltoLL == 0 + if Check(1,2) > 1 + DatiLoadLink = cell(rd+rt,rLL); + else + DatiLoadLink = cell(rt,rLL); + end + else + DatiLoadLink = cell(rd,rLL); + end + NLoadLink = cell2mat(NodoLoadLink(:,2)); + col = 1; + ii = 1; + w = 0; + while ii <= rLL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NLoadLink(ii,1); + nNodo = num2str(nN); + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiLL ''' and Time >= ''' tempoiniLL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoLL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiLL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoLLd = curs.Data; + % Concateno i dati relativi a Step 1 e 2 per il nodo ii-esimo. + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoLL == 0 + DatiLoadLink(1:rt,col) = DATnodoLL(:,:); + else + DatiLoadLink(1:rd,col) = DATnodoLL(:,:); + end + + [rn,~] = size(DATnodoLLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoLLd(i,:) = DATnodoLLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Load Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoLL == 0 + DatiLoadLink(rt+1:rt+rd,col) = DATnodoLLd(:,:); + end + else + DatiLoadLink = DatiLoadLink(1:end,:); + end + okdatLL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rLL) ' Load Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatLL); + ii = ii+1; + col = col+1; + end + if w == 0 + wardat = 'There are not warning for Load Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiLoadLink); + ErrLoadLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroLL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiLL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + for jj=1:c + if strcmp('Dis.',DatiLoadLink(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',DatiLoadLink(dis,jj)) == 0 + DatiLoadLink = DatiLoadLink(dis:end,:); + DATiniLL = DATiniLL(dis:end,:); + [r,c] = size(DatiLoadLink); + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiLL)+1 < now + datainiLL = datestr(datenum(datainiLL)+1,'yyyy-mm-dd'); + break + else + yesLL = 0; + end + end + end + end + end + if DIS ~= 1 && yesLL == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiLoadLink(1,jj))); + idxT = find(strcmp('---',DatiLoadLink(1,jj))); + idxT2 = find(strcmp('-',DatiLoadLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiLoadLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiLoadLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiLoadLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiLoadLink(1,jj))); + idxN = find(strcmp('null',DatiLoadLink(1,jj))); + idxRX = find(strcmp('No RX',DatiLoadLink(1,jj))); + idxI = find(strcmp('id Error',DatiLoadLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiLoadLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiLoadLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiLoadLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiLoadLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiLoadLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiLoadLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiLoadLink(1,jj))); + idxND = find(strcmp('No Data',DatiLoadLink(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiLoadLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Load Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroLL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiLL)+1 < now + datainiLL = datestr(datenum(datainiLL)+1,'yyyy-mm-dd'); + break + else + yesLL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiLL = datestr(datenum(datainiLL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiLoadLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrLoadLink(1,jj) = 1; + wardat = 'Data of Load Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiLL = datestr(datenum(datainiLL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiLoadLink(:,jj))); + idxT = find(strcmp('---',DatiLoadLink(:,jj))); + idxT2 = find(strcmp('-',DatiLoadLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiLoadLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiLoadLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiLoadLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiLoadLink(:,jj))); + idxN = find(strcmp('null',DatiLoadLink(:,jj))); + idxRX = find(strcmp('No RX',DatiLoadLink(:,jj))); + idxI = find(strcmp('id Error',DatiLoadLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiLoadLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiLoadLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiLoadLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiLoadLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiLoadLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiLoadLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiLoadLink(:,jj))); + idxND = find(strcmp('No Data',DatiLoadLink(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiLoadLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiLL = datestr(datenum(datainiLL)-1,'yyyy-mm-dd'); + break + else + DatiLoadLink(indice,jj) = DatiLoadLink(indice-1,jj); + ErrLoadLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiLoadLink(nnn,jj))); + if check == 1 + DatiLoadLink(nnn,jj) = DatiLoadLink(nnn-1,jj); + ErrLoadLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Load Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiLoadLink = [DATiniLL str2double(DatiLoadLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiLoadLink(a,1) == DatiLoadLink(a-1,1) + DatiLoadLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + end + if NuovoZeroLL == 1 && yesLL == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiLoadLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiLoadLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiLoadLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiLoadLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiLoadLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniEL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumEL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniEL = curs.Data; + Ntempo = DATiniEL; + [r,c] = size(DATiniEL); + saltoEL = 0; + if r==1 && c==1 + textdatEL = 'Warning: error reading Extensometer Link (control unit data)!'; + fprintf(fileID,fmt,textdatEL); + saltoEL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiEL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumEL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2EL = curs.Data; + Ndate = DAT2EL; + if saltoEL == 1 + DATiniEL = DAT2EL; + end + Check = size(DAT2EL); + if Check(1,2) > 1 % ho superato il primo giorno + if saltoEL == 0 + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + DATiniEL = [DATiniEL; DAT2EL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniEL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniEL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniEL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniEL = T; + else + DATiniEL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + % creo la matrice per i dati Extensometer Link + col = 1; + ii = 1; + if saltoEL == 0 + if Check(1,2) > 1 + DatiExtensometerLink = cell(rd+rt,rEL); + DatiNTCExtensometerLink = cell(rd+rt,rEL); + else + DatiExtensometerLink = cell(rt,rEL); + DatiNTCExtensometerLink = cell(rt,rEL); + end + else + DatiExtensometerLink = cell(rd,rEL); + DatiNTCExtensometerLink = cell(rd,rEL); + end + DatiExtensometerLink_Rif = cell(150,rEL); + NExtensometerLink = cell2mat(NodoExtensometerLink(:,2)); + w = 0; + while ii <= rEL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NExtensometerLink(ii,1); + nNodo = num2str(nN); + % Dato + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiEL ''' and Time >= ''' tempoiniEL ''' and ToolNameID = ''' ... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoEL = curs.Data; + % Dato + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiEL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = '''... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoELd = curs.Data; + % Riferimento + comando = ['select Val0 from RawDataView where Date = ''' ... + datestr(Date_Rif_EL,'yyyy-mm-dd') ''' and Time >= ''' datestr(Date_Rif_EL,'HH:MM:SS')... + ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoEL_Rif = curs.Data; + if ChEL(ii,1) == 1 + % T + DATnodoEL_NTC = 0; + DATnodoELd_NTC = 0; + elseif ChEL(ii,1) >= 2 + if EL_NTC(ii,1)==1 + % Temperatura + comando = ['select Val1 from RawDataView where Date = ''' ... + datainiEL ''' and Time >= ''' tempoiniEL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoEL_NTC = curs.Data; + comando = ['select Val1 from RawDataView where Date > ''' ... + datainiEL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoELd_NTC = curs.Data; + else + DATnodoEL_NTC = 0; + DATnodoELd_NTC = 0; + end + end + % Concateno i dati relativi a Step 1 e 2 per il nodo ii-esimo. + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoEL == 0 + if ChEL(ii,1) >= 2 + if EL_NTC(ii,1)==1 + DatiExtensometerLink(1:rt,col) = DATnodoEL(:,:); + DatiNTCExtensometerLink(1:rt,col) = DATnodoEL_NTC(:,:); + else + DatiExtensometerLink(1:rt,col) = DATnodoEL(:,:); %#ok<*AGROW> + end + elseif ChEL(ii,1) == 1 + DatiExtensometerLink(1:rt,col) = DATnodoEL(:,:); %#ok<*AGROW> + end + else + if ChEL(ii,1) >= 2 + if EL_NTC(ii,1)==1 + DatiExtensometerLink(1:rd,col) = DATnodoEL(:,:); + DatiNTCExtensometerLink(1:rd,col) = DATnodoEL_NTC(:,:); + else + DatiExtensometerLink(1:rd,col) = DATnodoEL(:,:); %#ok<*AGROW> + end + elseif ChEL(ii,1) == 1 + DatiExtensometerLink(1:rd,col) = DATnodoEL(:,:); %#ok<*AGROW> + end + end + + % Riferimento + [dim,~] = size(DATnodoEL_Rif); % controllo date + DatiExtensometerLink_Rif(1:dim,col) = DATnodoEL_Rif; + if col == 1 + DatiExtensometerLink_Rif(dim+1:end,:) = []; + end + + [rn,~] = size(DATnodoELd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoELd(i,:) = DATnodoELd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Extensometer Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + [rnT,~] = size(DATnodoELd_NTC); % controllo date + if rnT < rd % normalmente sono uguali + for i = rnT+1:rd + DATnodoELd_NTC(i,:) = DATnodoELd_NTC(rnT,:); % se mancano dati, copio gli ultimi + end + wardat = ['NTC of Node Extensometer Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoEL == 0 + if ChEL(ii,1) == 1 + DatiExtensometerLink(rt+1:rt+rd,col) = DATnodoELd(:,:); + elseif EL_NTC(ii,1) == 0 + DatiExtensometerLink(rt+1:rt+rd,col) = DATnodoELd(:,:); + else + DatiExtensometerLink(rt+1:rt+rd,col) = DATnodoELd(:,:); + DatiNTCExtensometerLink(rt+1:rt+rd,col) = DATnodoELd_NTC(:,:); + end + end + else + DatiExtensometerLink = DatiExtensometerLink(1:end,:); + DatiNTCExtensometerLink = DatiNTCExtensometerLink(1:end,:); + end + okdatEL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rEL) ' Extensometer Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatEL); + ii = ii+1; + col = col+1; + end + if w == 0 + wardat = 'There are not warning for Extensometer Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + % Dati + [r,c] = size(DatiExtensometerLink); + ErrExtensometerLink = zeros(r,c); + Ncorr = 0; + NAN = 1; + ESCI = 0; + RIF = 0; + row = 1; + if NuovoZeroEL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiEL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + FileRif = ['' IDcentralina '-' DTcatena '-ExtensometerRif.csv']; + while RIF == 0 + if row <= dim + % Controllo la data di riferimento + idxE = find(strcmp('Err1',DatiExtensometerLink_Rif(row,:))); + idxT = find(strcmp('---',DatiExtensometerLink_Rif(row,:))); + idxT2 = find(strcmp('-',DatiExtensometerLink_Rif(row,:))); + idxE2 = find(strcmp('Err2',DatiExtensometerLink_Rif(row,:))); + idxE255 = find(strcmp('Err255',DatiExtensometerLink_Rif(row,:))); + idxD = find(strcmp('DMUXe',DatiExtensometerLink_Rif(row,:))); + idxE1F = find(strcmp('Err1File',DatiExtensometerLink_Rif(row,:))); + idxN = find(strcmp('null',DatiExtensometerLink_Rif(row,:))); + idxRX = find(strcmp('No RX',DatiExtensometerLink_Rif(row,:))); + idxI = find(strcmp('id Error',DatiExtensometerLink_Rif(row,:))); + idxM = find(strcmp('MUX id Error',DatiExtensometerLink_Rif(row,:))); + idxC = find(strcmp('CH n. Error',DatiExtensometerLink_Rif(row,:))); + idxU = find(strcmp('Unknown Error',DatiExtensometerLink_Rif(row,:))); + idxMC = find(strcmp('MsgCorrup',DatiExtensometerLink_Rif(row,:))); + idxNS = find(strcmp('NotSupp',DatiExtensometerLink_Rif(row,:))); + idxU2 = find(strcmp('Unknown',DatiExtensometerLink_Rif(row,:))); + idxNA = find(strcmp('NotAv',DatiExtensometerLink_Rif(row,:))); + idxDIS = find(strcmp('Dis.',DatiExtensometerLink_Rif(row,:))); + idxND = find(strcmp('No Data',DatiExtensometerLink_Rif(row,:))); + idxCE = find(strcmp('CH n. Er',DatiExtensometerLink_Rif(row,:))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxDIS); + idx = union(idx,idxND); + [~,ri] = size(idx); + if ri >= 1 && isempty(idx) == 0 % Se almeno uno è in errore, allora guardo la riga dopo + if isfile(FileRif) == 1 + DatiRif = csvread(FileRif); + if isnan(DatiRif(1,ri)) == 0 + DatiExtensometerLink_Rif(1,ri) = cellstr(num2str(DatiRif(1,ri))); + else + row = row+1; + end + else + row = row+1; + end + else + RIF = 1; + DatiExtensometerLink_Rif = DatiExtensometerLink_Rif(row,:); + end + else + Date_Rif_EL = datestr(datenum(Date_Rif_EL)+1,'yyyy-mm-dd'); + RIF = 1; + NAN = 0; + end + end + if NAN == 1 + for jj=1:c + % Se il nodo è Dis., devo aumentare di uno la data (il nodo non + % è ancora stato installato!) + if strcmp('Dis.',DatiExtensometerLink(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',DatiExtensometerLink(dis,jj)) == 0 + DatiExtensometerLink = DatiExtensometerLink(dis:end,:); + DATiniEL = DATiniEL(dis:end,:); + DatiNTCExtensometerLink = DatiNTCExtensometerLink(dis:end,:); + [r,c] = size(DatiExtensometerLink); + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiEL)+1 < now + datainiEL = datestr(datenum(datainiEL)+1,'yyyy-mm-dd'); + break + else + yesEL = 0; + end + end + end + end + end + + if DIS ~= 1 && yesEL == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiExtensometerLink(1,jj))); + idxT = find(strcmp('---',DatiExtensometerLink(1,jj))); + idxT2 = find(strcmp('-',DatiExtensometerLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiExtensometerLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiExtensometerLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiExtensometerLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiExtensometerLink(1,jj))); + idxN = find(strcmp('null',DatiExtensometerLink(1,jj))); + idxRX = find(strcmp('No RX',DatiExtensometerLink(1,jj))); + idxI = find(strcmp('id Error',DatiExtensometerLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiExtensometerLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiExtensometerLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiExtensometerLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiExtensometerLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiExtensometerLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiExtensometerLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiExtensometerLink(1,jj))); + idxND = find(strcmp('No Data',DatiExtensometerLink(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiExtensometerLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Extensometer Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroEL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiEL)+1 < now + datainiEL = datestr(datenum(datainiEL)+1,'yyyy-mm-dd'); + break + else + yesEL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiEL = datestr(datenum(datainiEL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiExtensometerLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrExtensometerLink(1,jj) = 1; + wardat = 'Data of Extensometer Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiEL = datestr(datenum(datainiEL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + idxE = find(strcmp('Err1',DatiExtensometerLink(:,jj))); + idxT = find(strcmp('---',DatiExtensometerLink(:,jj))); + idxT2 = find(strcmp('-',DatiExtensometerLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiExtensometerLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiExtensometerLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiExtensometerLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiExtensometerLink(:,jj))); + idxN = find(strcmp('null',DatiExtensometerLink(:,jj))); + idxRX = find(strcmp('No RX',DatiExtensometerLink(:,jj))); + idxI = find(strcmp('id Error',DatiExtensometerLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiExtensometerLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiExtensometerLink(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiExtensometerLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiExtensometerLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiExtensometerLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiExtensometerLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiExtensometerLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiExtensometerLink(:,jj))); + idxND = find(strcmp('No Data',DatiExtensometerLink(:,jj))); + idx = union(idxND,idxE); + idx = union(idx,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxCE); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiEL = datestr(datenum(datainiEL)-1,'yyyy-mm-dd'); + break + else + DatiExtensometerLink(indice,jj) = DatiExtensometerLink(indice-1,jj); + ErrExtensometerLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiExtensometerLink(nnn,jj))); + if check == 1 + DatiExtensometerLink(nnn,jj) = DatiExtensometerLink(nnn-1,jj); + ErrExtensometerLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Extensometer Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiExtensometerLink = [DATiniEL str2double(DatiExtensometerLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiExtensometerLink(a,1) == DatiExtensometerLink(a-1,1) + DatiExtensometerLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + if ESCI == 0 + if sum(EL_NTC(:,1))>0 + if DIS ~= 1 && yesEL == 1 + % T + [r,c] = size(DatiNTCExtensometerLink); + Ncorr = 0; + if NuovoZeroEL == 1 + if isfile(RawDataFile) == 1 + DatiRawNTC = csvread(RawDataFileNTC); + [rDR,cDR] = size(DatiRawNTC); + DatiRawNTC(:,1) = DatiRawNTC(:,1) + 730000; + RawDateNTC = find(DatiRawNTC(:,1)<=datenum(datainiEL)); + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTCExtensometerLink(1,jj))); + idxT = find(strcmp('---',DatiNTCExtensometerLink(1,jj))); + idxT2 = find(strcmp('-',DatiNTCExtensometerLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiNTCExtensometerLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiNTCExtensometerLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiNTCExtensometerLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiNTCExtensometerLink(1,jj))); + idxN = find(strcmp('null',DatiNTCExtensometerLink(1,jj))); + idxRX = find(strcmp('No RX',DatiNTCExtensometerLink(1,jj))); + idxI = find(strcmp('id Error',DatiNTCExtensometerLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiNTCExtensometerLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiNTCExtensometerLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiNTCExtensometerLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTCExtensometerLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiNTCExtensometerLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiNTCExtensometerLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiNTCExtensometerLink(1,jj))); + idxND = find(strcmp('No Data',DatiNTCExtensometerLink(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiNTCExtensometerLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of NTC of Extensometer Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroEL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiEL)+1 < now + datainiEL = datestr(datenum(datainiEL)+1,'yyyy-mm-dd'); + break + else + yesEL = 0; + end + else + if isempty(RawDateNTC) == 1 + NAN = 0; + ESCI = 1; + datainiEL = datestr(datenum(datainiEL)-1,'yyyy-mm-dd'); + break + else + DatiNTCExtensometerLink(1,jj) = cellstr(num2str(DatiRawNTC(RawDateNTC(end),jj+1))); + if ErrExtensometerLink(1,jj) == 0 + ErrExtensometerLink(1,jj) = 0.5; + else + ErrExtensometerLink(1,jj) = 1; + end + wardat = 'Data of NTC of Extensometer Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTCExtensometerLink(:,jj))); + idxT = find(strcmp('-',DatiNTCExtensometerLink(:,jj))); + idxT3 = find(strcmp('---',DatiNTCExtensometerLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiNTCExtensometerLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiNTCExtensometerLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiNTCExtensometerLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiNTCExtensometerLink(:,jj))); + idxN = find(strcmp('null',DatiNTCExtensometerLink(:,jj))); + idxRX = find(strcmp('No RX',DatiNTCExtensometerLink(:,jj))); + idxI = find(strcmp('id Error',DatiNTCExtensometerLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiNTCExtensometerLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiNTCExtensometerLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiNTCExtensometerLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTCExtensometerLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiNTCExtensometerLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiNTCExtensometerLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiNTCExtensometerLink(:,jj))); + idxND = find(strcmp('No Data',DatiNTCExtensometerLink(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiNTCExtensometerLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT3); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiEL = datestr(datenum(datainiEL)-1,'yyyy-mm-dd'); + break + else + DatiNTCExtensometerLink(indice,jj) = DatiNTCExtensometerLink(indice-1,jj); + if ErrExtensometerLink(indice,jj) == 0 + ErrExtensometerLink(indice,jj) = 0.5; + else + ErrExtensometerLink(indice,jj) = 1; + end + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiNTCExtensometerLink(nnn,jj))); + if check == 1 + DatiNTCExtensometerLink(nnn,jj) = DatiNTCExtensometerLink(nnn-1,jj); + if ErrExtensometerLink(indice,jj) == 0 + ErrExtensometerLink(indice,jj) = 0.5; + else + ErrExtensometerLink(indice,jj) = 1; + end + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of NTC for Extensometer Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiNTCExtensometerLink = [DATiniEL str2double(DatiNTCExtensometerLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiNTCExtensometerLink(a,1) == DatiNTCExtensometerLink(a-1,1) + DatiNTCExtensometerLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + end + end + end + if NuovoZeroEL == 1 && yesEL == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiExtensometerLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiExtensometerLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiExtensometerLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiExtensometerLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiExtensometerLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)0 + [rDR,cDR] = size(DatiRawNTC); + if rDR~=1 && cDR~=1 && isempty(DatiRawNTC) == 0 + RawDate1 = find(DatiRawNTC(:,1)<=DatiNTCExtensometerLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiNTCExtensometerLink(:,1)>DatiRawNTC(end,1)); + else + RawDate2 = find(DatiNTCExtensometerLink(:,1)>DatiRawNTC(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + DatiNTC = [DatiRawNTC(1:RawDate1(end),:);DatiNTCExtensometerLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + DatiNTC = DatiNTCExtensometerLink; + else + DatiNTC = DatiRawNTC; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(DatiNTC(:,1)0 + DatiNTC = DatiNTCExtensometerLink; + end + end + Dati(:,1) = Dati(:,1) - 730000; + csvwrite(RawDataFile,Dati); + if sum(EL_NTC(:,1))>0 + DatiNTC(:,1) = DatiNTC(:,1) - 730000; + csvwrite(RawDataFileNTC,DatiNTC); + end + if isfile(FileRif) == 0 + csvwrite(FileRif,str2double(DatiExtensometerLink_Rif)); + end +end + +%% 3D Extensometer Link +if yes3DEL == 0 % Non ci sono 3D Extensometer Link + Dati3DExtensometerLink = []; + Dati3DExtensometerLink_Rif = []; + Err3DExtensometerLink = []; + DatiNTC3DExtensometerLink = []; + ErrNTC3DExtensometerLink = []; + Ch3DEL = []; + EL3D_NTC = []; + wardat = 'lettura function: there are not 3D Extensometer Link'; + fprintf(fileID,fmt,wardat); +else + RawDataFile = ['' IDcentralina '-' DTcatena '-3DExtensometer-RawData.csv']; % Specifico per 3D Extensometer Link + RawDataFileNTC = ['' IDcentralina '-' DTcatena '-3DExtensometerNTC-RawData.csv']; % Specifico per NTC 3D Extensometer Link + Ch3DEL = cell2mat(Nodo3DExtensometerLink(:,4)); + EL3D_NTC = cell2mat(Nodo3DExtensometerLink(:,5)); + NAN = 0; + DIS = 0; + while NAN == 0 + if datenum(dataini3DEL) == datenum(Data(1,1)) + tempoini3DEL = char(Data(1,2)); + end + NodeType = '3D Extensometer Link'; + NodeNum3DEL = num2str(cell2mat(Nodo3DExtensometerLink(1,2))); % scarico i dati del primo nodo + % Scarico dei dati relativi alla centralina con informazioni di Data e ora, livello batteria e temperatura + % Step 1 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date = ''' ... + dataini3DEL ''' and Time >= ''' tempoini3DEL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNum3DEL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATini3DEL = curs.Data; + Ntempo = DATini3DEL; + [r,c] = size(DATini3DEL); + salto3DEL = 0; + if r==1 && c==1 + textdat3DEL = 'Warning: error reading 3D Extensometer Link (control unit data)!'; + fprintf(fileID,fmt,textdat3DEL); + salto3DEL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + dataini3DEL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNum3DEL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT23DEL = curs.Data; + Ndate = DAT23DEL; + if salto3DEL == 1 + DATini3DEL = DAT23DEL; + end + Check = size(DAT23DEL); + if Check(1,2) > 1 % ho superato il primo giorno + if salto3DEL == 0 + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + DATini3DEL = [DATini3DEL; DAT23DEL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATini3DEL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATini3DEL(:,1)) repmat(' ', [rD,1]) cell2mat(DATini3DEL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATini3DEL = T; + else + DATini3DEL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + if salto3DEL == 0 + % creo la matrice per i dati 3D Extensometer Link + if Check(1,2) > 1 + Dati3DExtensometerLink = cell(rd+rt,3*r3DEL); + DatiNTC3DExtensometerLink = cell(rd+rt,r3DEL); + else + Dati3DExtensometerLink = cell(rt,3*r3DEL); + DatiNTC3DExtensometerLink = cell(rt,r3DEL); + end + else + Dati3DExtensometerLink = cell(rd,3*r3DEL); + DatiNTC3DExtensometerLink = cell(rd,r3DEL); + end + Dati3DExtensometerLink_Rif = cell(150,3*r3DEL); + N3DExtensometerLink = cell2mat(Nodo3DExtensometerLink(:,2)); + col = 1; + colT = 1; + ii = 1; + w = 0; + while ii <= r3DEL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = N3DExtensometerLink(ii,1); + nNodo = num2str(nN); + comando = ['select Val0, Val1, Val2 from RawDataView where Date = ''' ... + dataini3DEL ''' and Time >= ''' tempoini3DEL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo3DEL = curs.Data; + comando = ['select Val0, Val1, Val2 from RawDataView where Date > ''' ... + dataini3DEL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo3DELd = curs.Data; + % Riferimento + comando = ['select Val0, Val1, Val2 from RawDataView where Date = ''' ... + datestr(Date_Rif_3DEL,'yyyy-mm-dd') ''' and Time >= ''' datestr(Date_Rif_3DEL,'HH:MM:SS')... + ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo3DEL_Rif = curs.Data; + if Ch3DEL(ii,1) == 3 + % T + DATnodo3DEL_NTC = 0; + DATnodo3DELd_NTC = 0; + elseif Ch3DEL(ii,1) == 4 + if EL3D_NTC(ii,1)==1 + comando = ['select Val3 from RawDataView where Date = ''' ... + dataini3DEL ''' and Time >= ''' tempoini3DEL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo3DEL_NTC = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val3 from RawDataView where Date > ''' ... + dataini3DEL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType... + ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo3DELd_NTC = curs.Data; + else + DATnodo3DEL_NTC = 0; + DATnodo3DELd_NTC = 0; + end + end + % Concateno i dati relativi a Step 1 e 2 per il nodo ii-esimo. + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if salto3DEL == 0 + Dati3DExtensometerLink(1:rt,col:col+2) = DATnodo3DEL(:,:); + if Ch3DEL(ii,1) == 1 + DatiNTC3DExtensometerLink(1:rt,colT) = DATnodo3DEL_NTC(:,:); + end + else + Dati3DExtensometerLink(1:rd,col:col+2) = DATnodo3DEL(:,:); + if Ch3DEL(ii,1) == 1 + DatiNTC3DExtensometerLink(1:rd,colT) = DATnodo3DEL_NTC(:,:); + end + end + + % Riferimento + [dim,~] = size(DATnodo3DEL_Rif); % controllo date + Dati3DExtensometerLink_Rif(1:dim,col:col+2) = DATnodo3DEL_Rif; + if col == 1 + Dati3DExtensometerLink_Rif(dim+1:end,:) = []; + end + + [rn,~] = size(DATnodo3DELd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodo3DELd(i,:) = DATnodo3DELd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node 3D Extensometer Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + [rnT,~] = size(DATnodo3DELd_NTC); % controllo date + if rnT < rd % normalmente sono uguali + for i = rnT+1:rd + DATnodo3DELd_NTC(i,:) = DATnodo3DELd_NTC(rnT,:); % se mancano dati, copio gli ultimi + end + wardat = ['NTC of Node 3D Extensometer Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if salto3DEL == 0 + Dati3DExtensometerLink(rt+1:rt+rd,col:col+2) = DATnodo3DELd(:,:); + if EL3D_NTC(ii,1) == 1 % Si NTC + Dati3DExtensometerLink(rt+1:rt+rd,colT) = DATnodo3DELd_NTC(:,:); + end + end + else + Dati3DExtensometerLink = Dati3DExtensometerLink(1:end,:); + DatiNTC3DExtensometerLink = DatiNTC3DExtensometerLink(1:end,:); + end + okdat3DEL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(r3DEL) ' 3D Extensometer Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdat3DEL); + ii = ii+1; + col = col+3; + colT = colT+1; + end + if w == 0 + wardat = 'There are not warning for 3D Extensometer Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(Dati3DExtensometerLink); + Err3DExtensometerLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + RIF = 0; + row = 1; + if NuovoZero3DEL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(dataini3DEL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + while RIF == 0 + if row <= dim + % Controllo la data di riferimento + idxE = find(strcmp('Err1',Dati3DExtensometerLink_Rif(row,:))); + idxT = find(strcmp('---',Dati3DExtensometerLink_Rif(row,:))); + idxT2 = find(strcmp('-',Dati3DExtensometerLink_Rif(row,:))); + idxE2 = find(strcmp('Err2',Dati3DExtensometerLink_Rif(row,:))); + idxE255 = find(strcmp('Err255',Dati3DExtensometerLink_Rif(row,:))); + idxD = find(strcmp('DMUXe',Dati3DExtensometerLink_Rif(row,:))); + idxE1F = find(strcmp('Err1File',Dati3DExtensometerLink_Rif(row,:))); + idxN = find(strcmp('null',Dati3DExtensometerLink_Rif(row,:))); + idxRX = find(strcmp('No RX',Dati3DExtensometerLink_Rif(row,:))); + idxI = find(strcmp('id Error',Dati3DExtensometerLink_Rif(row,:))); + idxM = find(strcmp('MUX id Error',Dati3DExtensometerLink_Rif(row,:))); + idxC = find(strcmp('CH n. Error',Dati3DExtensometerLink_Rif(row,:))); + idxU = find(strcmp('Unknown Error',Dati3DExtensometerLink_Rif(row,:))); + idxMC = find(strcmp('MsgCorrup',Dati3DExtensometerLink_Rif(row,:))); + idxNS = find(strcmp('NotSupp',Dati3DExtensometerLink_Rif(row,:))); + idxU2 = find(strcmp('Unknown',Dati3DExtensometerLink_Rif(row,:))); + idxNA = find(strcmp('NotAv',Dati3DExtensometerLink_Rif(row,:))); + idxDIS = find(strcmp('Dis.',Dati3DExtensometerLink_Rif(row,:))); + idxND = find(strcmp('No Data',Dati3DExtensometerLink_Rif(row,:))); + idxCE = find(strcmp('CH n. Er',Dati3DExtensometerLink_Rif(row,:))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxDIS); + idx = union(idx,idxND); + [~,ri] = size(idx); + if ri >= 1 && isempty(idx) == 0 % Se almeno uno è in errore, allora guardo la riga dopo + row = row+1; + else + RIF = 1; + Dati3DExtensometerLink_Rif = Dati3DExtensometerLink_Rif(row,:); + end + else + Date_Rif_3DEL = datestr(datenum(Date_Rif_3DEL)+1,'yyyy-mm-dd'); + RIF = 1; + NAN = 0; + end + end + + for jj=1:c + % Se il nodo è Dis., devo aumentare di uno la data (il nodo non + % è ancora stato installato!) + if strcmp('Dis.',Dati3DExtensometerLink(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',Dati3DExtensometerLink(dis,jj)) == 0 + Dati3DExtensometerLink = Dati3DExtensometerLink(dis:end,:); + DatiNTC3DExtensometerLink = DatiNTC3DExtensometerLink(dis:end,:); + DATini3DEL = DATini3DEL(dis:end,:); + [r,c] = size(Dati3DExtensometerLink); + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(dataini3DEL)+1 < now + dataini3DEL = datestr(datenum(dataini3DEL)+1,'yyyy-mm-dd'); + break + else + yes3DEL = 0; + end + end + end + end + end + if DIS ~= 1 && yes3DEL == 1 + % --- Codice per il primo dato --- + for jj=1:c + idxE = find(strcmp('Err1',Dati3DExtensometerLink(1,jj))); + idxT = find(strcmp('---',Dati3DExtensometerLink(1,jj))); + idxT2 = find(strcmp('-',Dati3DExtensometerLink(1,jj))); + idxE2 = find(strcmp('Err2',Dati3DExtensometerLink(1,jj))); + idxE255 = find(strcmp('Err255',Dati3DExtensometerLink(1,jj))); + idxD = find(strcmp('DMUXe',Dati3DExtensometerLink(1,jj))); + idxE1F = find(strcmp('Err1File',Dati3DExtensometerLink(1,jj))); + idxN = find(strcmp('null',Dati3DExtensometerLink(1,jj))); + idxRX = find(strcmp('No RX',Dati3DExtensometerLink(1,jj))); + idxI = find(strcmp('id Error',Dati3DExtensometerLink(1,jj))); + idxM = find(strcmp('MUX id Error',Dati3DExtensometerLink(1,jj))); + idxC = find(strcmp('CH n. Error',Dati3DExtensometerLink(1,jj))); + idxU = find(strcmp('Unknown Error',Dati3DExtensometerLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',Dati3DExtensometerLink(1,jj))); + idxNS = find(strcmp('NotSupp',Dati3DExtensometerLink(1,jj))); + idxU2 = find(strcmp('Unknown',Dati3DExtensometerLink(1,jj))); + idxNA = find(strcmp('NotAv',Dati3DExtensometerLink(1,jj))); + idxND = find(strcmp('No Data',Dati3DExtensometerLink(1,jj))); + idxCE = find(strcmp('CH n. Er',Dati3DExtensometerLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of 3D Extensometer Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZero3DEL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(dataini3DEL)+1 < now + dataini3DEL = datestr(datenum(dataini3DEL)+1,'yyyy-mm-dd'); + break + else + yes3DEL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + dataini3DEL = datestr(datenum(dataini3DEL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + Dati3DExtensometerLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + Err3DExtensometerLink(1,jj) = 1; + wardat = 'Data of 3D Extensometer Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + dataini3DEL = datestr(datenum(dataini3DEL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + idxE = find(strcmp('Err1',Dati3DExtensometerLink(:,jj))); + idxT = find(strcmp('---',Dati3DExtensometerLink(:,jj))); + idxT2 = find(strcmp('-',Dati3DExtensometerLink(:,jj))); + idxE2 = find(strcmp('Err2',Dati3DExtensometerLink(:,jj))); + idxE255 = find(strcmp('Err255',Dati3DExtensometerLink(:,jj))); + idxD = find(strcmp('DMUXe',Dati3DExtensometerLink(:,jj))); + idxE1F = find(strcmp('Err1File',Dati3DExtensometerLink(:,jj))); + idxN = find(strcmp('null',Dati3DExtensometerLink(:,jj))); + idxRX = find(strcmp('No RX',Dati3DExtensometerLink(:,jj))); + idxI = find(strcmp('id Error',Dati3DExtensometerLink(:,jj))); + idxM = find(strcmp('MUX id Error',Dati3DExtensometerLink(:,jj))); + idxC = find(strcmp('CH n. Error',Dati3DExtensometerLink(:,jj))); + idxU = find(strcmp('Unknown Error',Dati3DExtensometerLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',Dati3DExtensometerLink(:,jj))); + idxNS = find(strcmp('NotSupp',Dati3DExtensometerLink(:,jj))); + idxU2 = find(strcmp('Unknown',Dati3DExtensometerLink(:,jj))); + idxNA = find(strcmp('NotAv',Dati3DExtensometerLink(:,jj))); + idxND = find(strcmp('No Data',Dati3DExtensometerLink(:,jj))); + idxCE = find(strcmp('CH n. Er',Dati3DExtensometerLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + dataini3DEL = datestr(datenum(dataini3DEL)+1,'yyyy-mm-dd'); + break + else + Dati3DExtensometerLink(indice,jj) = Dati3DExtensometerLink(indice-1,jj); + Err3DExtensometerLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(Dati3DExtensometerLink(nnn,jj))); + if check == 1 + Dati3DExtensometerLink(nnn,jj) = Dati3DExtensometerLink(nnn-1,jj); + Err3DExtensometerLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of 3D Extensometer Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + Dati3DExtensometerLink = [DATini3DEL str2double(Dati3DExtensometerLink)]; + Dati3DExtensometerLink_Rif = str2double(Dati3DExtensometerLink_Rif); + % Elimino eventuali date doppie + a = 2; + while a <= r + if Dati3DExtensometerLink(a,1) == Dati3DExtensometerLink(a-1,1) + Dati3DExtensometerLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + + if ESCI == 0 + if sum(EL3D_NTC(:,1))>0 + if DIS ~= 1 && yes3DEL == 1 + % T + [r,c] = size(DatiNTC3DExtensometerLink); + ErrNTC3DExtensometerLink = zeros(r,c); + Ncorr = 0; + if NuovoZero3DEL == 1 + if isfile(RawDataFile) == 1 + DatiRawNTC = csvread(RawDataFileNTC); + [rDR,cDR] = size(DatiRawNTC); + DatiRawNTC(:,1) = DatiRawNTC(:,1) + 730000; + RawDateNTC = find(DatiRawNTC(:,1)<=datenum(dataini3DEL)); + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTC3DExtensometerLink(1,jj))); + idxT = find(strcmp('---',DatiNTC3DExtensometerLink(1,jj))); + idxT2 = find(strcmp('-',DatiNTC3DExtensometerLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiNTC3DExtensometerLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiNTC3DExtensometerLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiNTC3DExtensometerLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiNTC3DExtensometerLink(1,jj))); + idxN = find(strcmp('null',DatiNTC3DExtensometerLink(1,jj))); + idxRX = find(strcmp('No RX',DatiNTC3DExtensometerLink(1,jj))); + idxI = find(strcmp('id Error',DatiNTC3DExtensometerLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiNTC3DExtensometerLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiNTC3DExtensometerLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiNTC3DExtensometerLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTC3DExtensometerLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiNTC3DExtensometerLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiNTC3DExtensometerLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiNTC3DExtensometerLink(1,jj))); + idxND = find(strcmp('No Data',DatiNTC3DExtensometerLink(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiNTC3DExtensometerLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = ['Warning on the correction of NTC of 3D Extensometer Link nodes: there are not data at '... + 'the beginning of the array!']; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZero3DEL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + dataini3DEL = datestr(datenum(dataini3DEL)-1,'yyyy-mm-dd'); + break + else + if isempty(RawDateNTC) == 1 + NAN = 0; + ESCI = 1; + if datenum(dataini3DEL)+1 < now + dataini3DEL = datestr(datenum(dataini3DEL)+1,'yyyy-mm-dd'); + break + else + yes3DEL = 0; + end + else + DatiNTC3DExtensometerLink(1,jj) = cellstr(num2str(DatiRawNTC(RawDateNTC(end),jj+1))); + if Err3DExtensometerLink(1,jj) == 0 + Err3DExtensometerLink(1,jj) = 0.5; + else + Err3DExtensometerLink(1,jj) = 1; + end + wardat = 'Data of NTC of 3D Extensometer Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTC3DExtensometerLink(:,jj))); + idxT = find(strcmp('-',DatiNTC3DExtensometerLink(:,jj))); + idxT3 = find(strcmp('---',DatiNTC3DExtensometerLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiNTC3DExtensometerLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiNTC3DExtensometerLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiNTC3DExtensometerLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiNTC3DExtensometerLink(:,jj))); + idxN = find(strcmp('null',DatiNTC3DExtensometerLink(:,jj))); + idxRX = find(strcmp('No RX',DatiNTC3DExtensometerLink(:,jj))); + idxI = find(strcmp('id Error',DatiNTC3DExtensometerLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiNTC3DExtensometerLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiNTC3DExtensometerLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiNTC3DExtensometerLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTC3DExtensometerLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiNTC3DExtensometerLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiNTC3DExtensometerLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiNTC3DExtensometerLink(:,jj))); + idxND = find(strcmp('No Data',DatiNTC3DExtensometerLink(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiNTC3DExtensometerLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxCE); + idx = union(idx,idxT3); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + dataini3DEL = datestr(datenum(dataini3DEL)+1,'yyyy-mm-dd'); + else + DatiNTC3DExtensometerLink(indice,jj) = DatiNTC3DExtensometerLink(indice-1,jj); + if Err3DExtensometerLink(indice,jj) == 0 + ErrNTC3DExtensometerLink(indice,jj) = 0.5; + else + ErrNTC3DExtensometerLink(indice,jj) = 1; + end + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiNTC3DExtensometerLink(nnn,jj))); + if check == 1 + DatiNTC3DExtensometerLink(nnn,jj) = DatiNTC3DExtensometerLink(nnn-1,jj); + ErrNTC3DExtensometerLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of NTC for 3D Extensometer Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiNTC3DExtensometerLink = [DATini3DEL str2double(DatiNTC3DExtensometerLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiNTC3DExtensometerLink(a,1) == DatiNTC3DExtensometerLink(a-1,1) + DatiNTC3DExtensometerLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + else + ErrNTC3DExtensometerLink = 0; + end + end + end + if NuovoZero3DEL == 1 && yes3DEL == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=Dati3DExtensometerLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(Dati3DExtensometerLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(Dati3DExtensometerLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);Dati3DExtensometerLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = Dati3DExtensometerLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)0 + [rDR,cDR] = size(DatiRawNTC); + if rDR~=1 && cDR~=1 && isempty(DatiRawNTC) == 0 + RawDate1 = find(DatiRawNTC(:,1)<=DatiNTC3DExtensometerLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiNTC3DExtensometerLink(:,1)>DatiRawNTC(end,1)); + else + RawDate2 = find(DatiNTC3DExtensometerLink(:,1)>DatiRawNTC(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + DatiNTC = [DatiRawNTC(1:RawDate1(end),:);DatiNTC3DExtensometerLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + DatiNTC = DatiNTC3DExtensometerLink; + else + DatiNTC = DatiRawNTC; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(DatiNTC(:,1)0 + DatiNTC = DatiNTC3DExtensometerLink; + end + end + Dati(:,1) = Dati(:,1) - 730000; + csvwrite(RawDataFile,Dati); + if sum(EL3D_NTC(:,1))>0 + DatiNTC(:,1) = DatiNTC(:,1) - 730000; + csvwrite(RawDataFileNTC,DatiNTC); + end +end + +%% Wire Extensometer Link +if yesWEL == 0 % Non ci sono Wire Extensometer Link + DatiWireExtensometerLink = []; + DatiNTCWireExtensometerLink = []; + ErrWireExtensometerLink = []; + ChWEL = []; + WEL_NTC = []; + wardat = 'lettura function: there are not Wire Extensometer Link'; + fprintf(fileID,fmt,wardat); +else + RawDataFile = ['' IDcentralina '-' DTcatena '-Wire-RawData.csv']; % Specifico per Wire Extensometer Link + RawDataFileNTC = ['' IDcentralina '-' DTcatena '-NTCWire-RawData.csv']; + NAN = 0; + DIS = 0; + ChWEL = cell2mat(NodoWireExtensometerLink(:,4)); + WEL_NTC = cell2mat(NodoWireExtensometerLink(:,5)); + while NAN == 0 + if datenum(datainiWEL) == datenum(Data(1,1)) + tempoiniWEL = char(Data(1,2)); + end + NodeType = 'Wire Extensometer Link'; + NodeNumWEL = num2str(cell2mat(NodoWireExtensometerLink(1,2))); % scarico i dati del primo nodo + % Scarico dei dati relativi alla centralina con informazioni di Data e ora, livello batteria e temperatura + % Step 1 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date = ''' ... + datainiWEL ''' and Time >= ''' tempoiniWEL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumWEL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniWEL = curs.Data; + Ntempo = DATiniWEL; + [r,c] = size(DATiniWEL); + saltoWEL = 0; + if r==1 && c==1 + textdatWEL = 'Warning: error reading Wire Extensometer Link (control unit data)!'; + fprintf(fileID,fmt,textdatWEL); + saltoWEL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiWEL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumWEL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2WEL = curs.Data; + Ndate = DAT2WEL; + if saltoWEL == 1 + DATiniWEL = DAT2WEL; + end + Check = size(DAT2WEL); + if Check(1,2) > 1 % ho superato il primo giorno + if saltoWEL == 0 + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + DATiniWEL = [DATiniWEL; DAT2WEL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniWEL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniWEL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniWEL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniWEL = T; + else + DATiniWEL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + if saltoWEL == 0 + % creo la matrice per i dati Wire Extensometer Link + if Check(1,2) > 1 + DatiWireExtensometerLink = cell(rd+rt,rWEL); + DatiNTCWireExtensometerLink = cell(rd+rt,rWEL); + else + DatiWireExtensometerLink = cell(rt,rWEL); + DatiNTCWireExtensometerLink = cell(rt,rWEL); + end + else + DatiWireExtensometerLink = cell(rd,rWEL); + DatiNTCWireExtensometerLink = cell(rd,rWEL); + end + NWExtensometerLink = cell2mat(NodoWireExtensometerLink(:,2)); + col = 1; + ii = 1; + w = 0; + while ii <= rWEL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NWExtensometerLink(ii,1); + nNodo = num2str(nN); + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiWEL ''' and Time >= ''' tempoiniWEL ''' and ToolNameID = ''' ... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoWEL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiWEL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoWELd = curs.Data; + % Concateno i dati relativi a Step 1 e 2 per il nodo ii-esimo. + if ChWEL(ii,1) == 1 + % T + DATnodoWEL_NTC = cell(1,1); + DATnodoWELd_NTC = cell(1,1); + elseif ChWEL(ii,1) >= 2 + if WEL_NTC(ii,1)==1 + if ChWEL(ii,1) == 2 + comando = ['select Val1 from RawDataView where Date = ''' ... + datainiWEL ''' and Time >= ''' tempoiniWEL ''' and ToolNameID = ''' ... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + elseif ChWEL(ii,1) == 4 + comando = ['select Val2 from RawDataView where Date = ''' ... + datainiWEL ''' and Time >= ''' tempoiniWEL ''' and ToolNameID = ''' ... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + end + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoWEL_NTC = curs.Data; + % Dato + if ChWEL(ii,1) == 2 + comando = ['select Val1 from RawDataView where Date > ''' ... + datainiWEL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = '''... + NodeType ''' and NodeNum = ' nNodo '']; + elseif ChWEL(ii,1) == 4 + comando = ['select Val2 from RawDataView where Date > ''' ... + datainiWEL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = '''... + NodeType ''' and NodeNum = ' nNodo '']; + end + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoWELd_NTC = curs.Data; + else + DATnodoWEL_NTC = cell(1,1); + DATnodoWELd_NTC = cell(1,1); + end + end + + [rn,~] = size(DATnodoWELd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoWELd(i,:) = DATnodoWELd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Wire Extensometer Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + if WEL_NTC(ii,1)==1 + [rnT,~] = size(DATnodoWELd_NTC); % controllo date + if rnT < rd % normalmente sono uguali + for i = rnT+1:rd + DATnodoWELd_NTC(i,:) = DATnodoWELd_NTC(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['NTC of Node Wire Extensometer Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + end + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoWEL == 0 + if ChWEL(ii,1) >= 2 + if WEL_NTC(ii,1) == 1 + DatiWireExtensometerLink(1:rt,col) = DATnodoWEL(:,:); + DatiNTCWireExtensometerLink(1:rt,col) = DATnodoWEL_NTC(:,:); + if Check(1,2) > 1 + DatiWireExtensometerLink(rt+1:rt+rd,col) = DATnodoWELd(:,:); + DatiNTCWireExtensometerLink(rt+1:rt+rd,col) = DATnodoWELd_NTC(:,:); + end + else + DatiWireExtensometerLink(1:rt,col) = DATnodoWEL(:,:); + if Check(1,2) > 1 + DatiWireExtensometerLink(rt+1:rt+rd,col) = DATnodoWELd(:,:); + end + end + elseif ChWEL(ii,1) == 1 + DatiWireExtensometerLink(1:rt,col) = DATnodoWEL(:,:); + if Check(1,2) > 1 + DatiWireExtensometerLink(rt+1:rt+rd,col) = DATnodoWELd(:,:); + end + end + else + if ChWEL(ii,1) >= 2 + if WEL_NTC(ii,1) == 1 + DatiWireExtensometerLink(1:rd,col) = DATnodoWEL(:,:); + DatiNTCWireExtensometerLink(1:rd,col) = DATnodoWEL_NTC(:,:); + else + DatiWireExtensometerLink(1:rd,col) = DATnodoWEL(:,:); + end + elseif ChWEL(ii,1) == 1 + DatiWireExtensometerLink(1:rd,col) = DATnodoWEL(:,:); + end + end + + okdatWEL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rWEL) ' Wire Extensometer Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatWEL); + ii = ii+1; + col = col+1; + end + if w == 0 + wardat = 'There are not warning for Wire Extensometer Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + + % Dati + [r,c] = size(DatiWireExtensometerLink); + ErrWireExtensometerLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroWEL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiWEL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + for jj=1:c + % Se il nodo è Dis., devo aumentare di uno la data (il nodo non + % è ancora stato installato!) + if strcmp('Dis.',DatiWireExtensometerLink(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',DatiWireExtensometerLink(dis,jj)) == 0 + DatiWireExtensometerLink = DatiWireExtensometerLink(dis:end,:); + DatiNTCWireExtensometerLink = DatiNTCWireExtensometerLink(dis:end,:); + DATiniWEL = DATiniWEL(dis:end,:); + [r,c] = size(DatiWireExtensometerLink); + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiWEL)+1 < now + datainiWEL = datestr(datenum(datainiWEL)+1,'yyyy-mm-dd'); + break + else + yesWEL = 0; + end + end + end + end + end + if DIS ~= 1 && yesWEL == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiWireExtensometerLink(1,jj))); + idxT = find(strcmp('---',DatiWireExtensometerLink(1,jj))); + idxT2 = find(strcmp('-',DatiWireExtensometerLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiWireExtensometerLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiWireExtensometerLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiWireExtensometerLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiWireExtensometerLink(1,jj))); + idxN = find(strcmp('null',DatiWireExtensometerLink(1,jj))); + idxRX = find(strcmp('No RX',DatiWireExtensometerLink(1,jj))); + idxI = find(strcmp('id Error',DatiWireExtensometerLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiWireExtensometerLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiWireExtensometerLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiWireExtensometerLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiWireExtensometerLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiWireExtensometerLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiWireExtensometerLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiWireExtensometerLink(1,jj))); + idxND = find(strcmp('No Data',DatiWireExtensometerLink(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiWireExtensometerLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Wire Extensometer Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroWEL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiWEL)+1 < now + datainiWEL = datestr(datenum(datainiWEL)+1,'yyyy-mm-dd'); + break + else + yesWEL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiWEL = datestr(datenum(datainiWEL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiWireExtensometerLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrWireExtensometerLink(1,jj) = 1; + wardat = 'Data of Wire Extensometer Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + dataini3DEL = datestr(datenum(dataini3DEL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiWireExtensometerLink(:,jj))); + idxT = find(strcmp('---',DatiWireExtensometerLink(:,jj))); + idxT2 = find(strcmp('-',DatiWireExtensometerLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiWireExtensometerLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiWireExtensometerLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiWireExtensometerLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiWireExtensometerLink(:,jj))); + idxN = find(strcmp('null',DatiWireExtensometerLink(:,jj))); + idxRX = find(strcmp('No RX',DatiWireExtensometerLink(:,jj))); + idxI = find(strcmp('id Error',DatiWireExtensometerLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiWireExtensometerLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiWireExtensometerLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiWireExtensometerLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiWireExtensometerLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiWireExtensometerLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiWireExtensometerLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiWireExtensometerLink(:,jj))); + idxND = find(strcmp('No Data',DatiWireExtensometerLink(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiWireExtensometerLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + wardat = 'Warning on the correction of Wire Extensometer Link: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + NAN = 0; + ESCI = 1; + datainiWEL = datestr(datenum(datainiWEL)-1,'yyyy-mm-dd'); + else + DatiWireExtensometerLink(indice,jj) = DatiWireExtensometerLink(indice-1,jj); + ErrWireExtensometerLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiWireExtensometerLink(nnn,jj))); + if check == 1 + DatiWireExtensometerLink(nnn,jj) = DatiWireExtensometerLink(nnn-1,jj); + ErrWireExtensometerLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Wire Extensometer Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiWireExtensometerLink = [DATiniWEL str2double(DatiWireExtensometerLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiWireExtensometerLink(a,1) == DatiWireExtensometerLink(a-1,1) + DatiWireExtensometerLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + + if ESCI == 0 + if sum(WEL_NTC(:,1))>0 + % NTC + if DIS ~= 1 && yesWEL == 1 + [r,c] = size(DatiNTCWireExtensometerLink); + Ncorr = 0; + if NuovoZeroWEL == 1 + if isfile(RawDataFile) == 1 + DatiRawNTC = csvread(RawDataFileNTC); + [rDR,cDR] = size(DatiRawNTC); + DatiRawNTC(:,1) = DatiRawNTC(:,1) + 730000; + RawDateNTC = find(DatiRawNTC(:,1)<=datenum(datainiWEL)); + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTCWireExtensometerLink(1,jj))); + idxND = find(strcmp('No Data',DatiNTCWireExtensometerLink(1,jj))); + idxT3 = find(strcmp('---',DatiNTCWireExtensometerLink(1,jj))); + idxT = find(strcmp('-',DatiNTCWireExtensometerLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiNTCWireExtensometerLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiNTCWireExtensometerLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiNTCWireExtensometerLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiNTCWireExtensometerLink(1,jj))); + idxN = find(strcmp('null',DatiNTCWireExtensometerLink(1,jj))); + idxRX = find(strcmp('No RX',DatiNTCWireExtensometerLink(1,jj))); + idxI = find(strcmp('id Error',DatiNTCWireExtensometerLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiNTCWireExtensometerLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiNTCWireExtensometerLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiNTCWireExtensometerLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTCWireExtensometerLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiNTCWireExtensometerLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiNTCWireExtensometerLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiNTCWireExtensometerLink(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiNTCWireExtensometerLink(1,jj))); + idx = union(idxE,idxT3); + idx = union(idx,idxND); + idx = union(idx,idxCE); + idx = union(idx,idxT); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of NTC of Wire Extensometer Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroWEL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiWEL)+1 < now + datainiWEL = datestr(datenum(datainiWEL)+1,'yyyy-mm-dd'); + break + else + yesWEL = 0; + end + else + if isempty(RawDateNTC) == 1 + NAN = 0; + ESCI = 1; + datainiWEL = datestr(datenum(datainiWEL)-1,'yyyy-mm-dd'); + break + else + DatiNTCWireExtensometerLink(1,jj) = cellstr(num2str(DatiRawNTC(RawDateNTC(end),jj+1))); + if ErrWireExtensometerLink(1,jj) == 0 + ErrWireExtensometerLink(1,jj) = 0.5; + else + ErrWireExtensometerLink(1,jj) = 1; + end + wardat = 'Data of NTC of Wire Extensometer Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTCWireExtensometerLink(:,jj))); + idxND = find(strcmp('No Data',DatiNTCWireExtensometerLink(:,jj))); + idxT3 = find(strcmp('---',DatiNTCWireExtensometerLink(:,jj))); + idxT = find(strcmp('-',DatiNTCWireExtensometerLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiNTCWireExtensometerLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiNTCWireExtensometerLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiNTCWireExtensometerLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiNTCWireExtensometerLink(:,jj))); + idxN = find(strcmp('null',DatiNTCWireExtensometerLink(:,jj))); + idxRX = find(strcmp('No RX',DatiNTCWireExtensometerLink(:,jj))); + idxI = find(strcmp('id Error',DatiNTCWireExtensometerLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiNTCWireExtensometerLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiNTCWireExtensometerLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiNTCWireExtensometerLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTCWireExtensometerLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiNTCWireExtensometerLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiNTCWireExtensometerLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiNTCWireExtensometerLink(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiNTCWireExtensometerLink(:,jj))); + idx = union(idxE,idxT3); + idx = union(idx,idxND); + idx = union(idx,idxCE); + idx = union(idx,idxT); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + if DIS == 1 + wardat = 'Warning on the correction of NTC of Wire Extensometer Link: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + NAN = 0; + ESCI = 1; + datainiWEL = datestr(datenum(datainiWEL)+1,'yyyy-mm-dd'); + break + else + wardat = 'Warning on the correction of NTC of Wire Extensometer Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 % il file non è mai stato scritto + NAN = 0; + ESCI = 1; + datainiWEL = datestr(datenum(datainiWEL)-1,'yyyy-mm-dd'); + break + else + if isempty(RawDateNTC) == 1 + NAN = 0; + ESCI = 1; + datainiWEL = datestr(datenum(datainiWEL)-1,'yyyy-mm-dd'); + break + else + DatiNTCWireExtensometerLink(indice,jj) = cellstr(num2str(DatiRawNTC(RawDateNTC(end),jj+1))); + if ErrWireExtensometerLink(indice,jj) == 0 + ErrWireExtensometerLink(indice,jj) = 0.5; + else + ErrWireExtensometerLink(indice,jj) = 1; + end + wardat = 'Data of Wire Extensometer Link nodes corrected using Raw Data of Excel file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + else + DatiNTCWireExtensometerLink(indice,jj) = DatiNTCWireExtensometerLink(indice-1,jj); + if ErrWireExtensometerLink(indice,jj) == 0 + ErrWireExtensometerLink(indice,jj) = 0.5; + else + ErrWireExtensometerLink(indice,jj) = 1; + end + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiNTCWireExtensometerLink(nnn,jj))); + if check == 1 + DatiNTCWireExtensometerLink(nnn,jj) = DatiNTCWireExtensometerLink(nnn-1,jj); + if ErrWireExtensometerLink(indice,jj) == 0 + ErrWireExtensometerLink(indice,jj) = 0.5; + else + ErrWireExtensometerLink(indice,jj) = 1; + end + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of NTC Wire Extensometer Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiNTCWireExtensometerLink = [DATiniWEL str2double(DatiNTCWireExtensometerLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiNTCWireExtensometerLink(a,1) == DatiNTCWireExtensometerLink(a-1,1) + DatiNTCWireExtensometerLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + end + end + if NuovoZeroWEL == 1 && yesWEL == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiWireExtensometerLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiWireExtensometerLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiWireExtensometerLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiWireExtensometerLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiWireExtensometerLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)0 + [rDR,cDR] = size(DatiRawNTC); + if rDR~=1 && cDR~=1 && isempty(DatiRawNTC) == 0 + RawDate1 = find(DatiRawNTC(:,1)<=DatiNTCWireExtensometerLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiNTCWireExtensometerLink(:,1)>DatiRawNTC(end,1)); + else + RawDate2 = find(DatiNTCWireExtensometerLink(:,1)>DatiRawNTC(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + DatiNTC = [DatiRawNTC(1:RawDate1(end),:);DatiNTCWireExtensometerLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + DatiNTC = DatiNTCWireExtensometerLink; + else + DatiNTC = DatiRawNTC; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(DatiNTC(:,1)0 + DatiNTC = DatiNTCWireExtensometerLink; + end + end + Dati(:,1) = Dati(:,1) - 730000; + csvwrite(RawDataFile,Dati); + if sum(WEL_NTC(:,1))>0 + DatiNTC(:,1) = DatiNTC(:,1) - 730000; + csvwrite(RawDataFileNTC,DatiNTC); + end +end + +%% MultiPoint Borehole Extensometer Link +if yesMPBEL == 0 % Non ci sono Multipoint borehole rod extensometer + DatiMultiPointExtensometer = []; + DatiNTCMultiPointExtensometer = []; + ErrMultiPointExtensometer = []; + ErrNTCMultiPointExtensometer = []; + ChMPBEL = []; + MPBEL_NTC = []; + wardat = 'lettura function: there are not Multi Point Extensometer Link'; + fprintf(fileID,fmt,wardat); +else + RawDataFile = ['' IDcentralina '-' DTcatena '-MPBEL-RawData.csv']; % Specifico per MPBE Link + RawDataFileNTC = ['' IDcentralina '-' DTcatena '-NTCMPBEL-RawData.csv']; % Specifico per NTC MPBE Link + ChMPBEL = cell2mat(NodoMultiPointRodExtensometer(:,4)); + MPBEL_NTC = cell2mat(NodoMultiPointRodExtensometer(:,5)); + NAN = 0; + DIS = 0; + while NAN == 0 + if datenum(datainiMPBEL) == datenum(Data(1,1)) + tempoiniMPBEL = char(Data(1,2)); + end + NodeType = 'Multipoint borehole rod extensometer'; + NodeNumMPBEL = num2str(cell2mat(NodoMultiPointRodExtensometer(1,2))); % scarico i dati del primo nodo + % Scarico dei dati relativi alla centralina con informazioni di Data e ora, livello batteria e temperatura + % Step 1 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date = ''' ... + datainiMPBEL ''' and Time >= ''' tempoiniMPBEL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumMPBEL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniMPBEL = curs.Data; + Ntempo = DATiniMPBEL; + [r,c] = size(DATiniMPBEL); + saltoMPBEL = 0; + if r==1 && c==1 + textdatMPBEL = 'Warning: error reading Multipoint borehole rod extensometer (control unit data)!'; + fprintf(fileID,fmt,textdatMPBEL); + saltoMPBEL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiMPBEL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumMPBEL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2MPBEL = curs.Data; + Ndate = DAT2MPBEL; + if saltoMPBEL == 1 + DATiniMPBEL = DAT2MPBEL; + end + Check = size(DAT2MPBEL); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoMPBEL == 0 + DATiniMPBEL = [DATiniMPBEL; DAT2MPBEL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniMPBEL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniMPBEL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniMPBEL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniMPBEL = T; + else + DATiniMPBEL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + % creo la matrice per i dati Multipoint borehole rod extensometer + if saltoMPBEL == 0 + if Check(1,2) > 1 + DatiMultiPointExtensometer = cell(rd+rt,rMPBEL*NumBasi); + DatiNTCMultiPointExtensometer = cell(rd+rt,rMPBEL*NumBasi); + else + DatiMultiPointExtensometer = cell(rt,rMPBEL*NumBasi); + DatiNTCMultiPointExtensometer = cell(rt,rMPBEL*NumBasi); + end + else + DatiMultiPointExtensometer = cell(rd,rMPBEL*NumBasi); + DatiNTCMultiPointExtensometer = cell(rd,rMPBEL*NumBasi); + end + NMPBExtensometerLink = cell2mat(NodoMultiPointRodExtensometer(:,2)); + col = 1; + ii = 1; + w = 0; + while ii <= rMPBEL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NMPBExtensometerLink(ii,1); + nNodo = num2str(nN); + % 1 Base + if NumBasi == 1 + % Dato + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiMPBEL ''' and Time >= ''' tempoiniMPBEL ''' and ToolNameID = '''... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBEL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiMPBEL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBELd = curs.Data; + if ChMPBEL(ii,1) >= 2 && MPBEL_NTC(ii,1) == 1 % leggo la temperatura + % T + comando = ['select Val1 from RawDataView where Date = ''' ... + datainiMPBEL ''' and Time >= ''' tempoiniMPBEL ''' and ToolNameID = '''... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBEL_NTC = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val1 from RawDataView where Date > ''' ... + datainiMPBEL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBELd_NTC = curs.Data; + else % non la leggo + DATnodoMPBEL_NTC = 0; + DATnodoMPBELd_NTC = 0; + end + % 2 Basi + elseif NumBasi == 2 + if ChMPBEL(ii,1) == 4 + % Dato + comando = ['select Val0, Val2 from RawDataView where Date = ''' ... + datainiMPBEL ''' and Time >= ''' tempoiniMPBEL ''' and ToolNameID = '''... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBEL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val2 from RawDataView where Date > ''' ... + datainiMPBEL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBELd = curs.Data; + else + % Dato + comando = ['select Val0, Val1 from RawDataView where Date = ''' ... + datainiMPBEL ''' and Time >= ''' tempoiniMPBEL ''' and ToolNameID = '''... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBEL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1 from RawDataView where Date > ''' ... + datainiMPBEL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBELd = curs.Data; + end + if ChMPBEL(ii,1) >= 3 && MPBEL_NTC(ii,1) == 1 % leggo la temperatura + % T + comando = ['select Val2 from RawDataView where Date = ''' ... + datainiMPBEL ''' and Time >= ''' tempoiniMPBEL ''' and ToolNameID = '''... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBEL_NTC = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val2 from RawDataView where Date > ''' ... + datainiMPBEL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBELd_NTC = curs.Data; + else % non la leggo + DATnodoMPBEL_NTC = 0; + DATnodoMPBELd_NTC = 0; + end + elseif NumBasi == 3 + if ChMPBEL(ii,1) == 6 + % Dato + comando = ['select Val0, Val2, Val4 from RawDataView where Date = ''' ... + datainiMPBEL ''' and Time >= ''' tempoiniMPBEL ''' and ToolNameID = '''... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBEL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val2, Val4 from RawDataView where Date > ''' ... + datainiMPBEL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBELd = curs.Data; + else + % Dato + comando = ['select Val0, Val1, Val2 from RawDataView where Date = ''' ... + datainiMPBEL ''' and Time >= ''' tempoiniMPBEL ''' and ToolNameID = '''... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBEL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2 from RawDataView where Date > ''' ... + datainiMPBEL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBELd = curs.Data; + end + if ChMPBEL(ii,1) >= 4 && MPBEL_NTC(ii,1) == 1 % leggo la temperatura della prima base + % T + comando = ['select Val3 from RawDataView where Date = ''' ... + datainiMPBEL ''' and Time >= ''' tempoiniMPBEL ''' and ToolNameID = '''... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBEL_NTC = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val3 from RawDataView where Date > ''' ... + datainiMPBEL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBELd_NTC = curs.Data; + else + DATnodoMPBEL_NTC = 0; + DATnodoMPBELd_NTC = 0; + end + end + % Concateno i dati relativi a Step 1 e 2 per il nodo ii-esimo. + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if NumBasi == 1 + if saltoMPBEL == 0 + DatiMultiPointExtensometer(1:rt,col) = DATnodoMPBEL(:,:); + if ChMPBEL(ii) >= 2 && MPBEL_NTC(ii) == 1 + DatiNTCMultiPointExtensometer(1:rt,col) = DATnodoMPBEL_NTC(:,:); + end + else + DatiMultiPointExtensometer(1:rd,col) = DATnodoMPBEL(:,:); + if ChMPBEL(ii) >= 2 && MPBEL_NTC(ii) == 1 + DatiNTCMultiPointExtensometer(1:rd,col) = DATnodoMPBEL_NTC(:,:); + end + end + + elseif NumBasi == 2 + if saltoMPBEL == 0 + DatiMultiPointExtensometer(1:rt,col:col+1) = DATnodoMPBEL(:,:); + if ChMPBEL(ii) >= 3 && MPBEL_NTC(ii) == 1 || ChMPBEL(ii) == 4 && MPBEL_NTC(ii) == 1 + DatiNTCMultiPointExtensometer(1:rt,col) = DATnodoMPBEL_NTC(:,:); + end + else + DatiMultiPointExtensometer(1:rd,col:col+1) = DATnodoMPBEL(:,:); + if ChMPBEL(ii) >= 3 && MPBEL_NTC(ii) == 1 || ChMPBEL(ii) == 4 && MPBEL_NTC(ii) == 1 + DatiNTCMultiPointExtensometer(1:rd,col) = DATnodoMPBEL_NTC(:,:); + end + end + + elseif NumBasi == 3 + if saltoMPBEL == 0 + DatiMultiPointExtensometer(1:rt,col:col+2) = DATnodoMPBEL(:,:); + if ChMPBEL(ii) >= 4 && MPBEL_NTC(ii) == 1 + DatiNTCMultiPointExtensometer(1:rt,col) = DATnodoMPBEL_NTC(:,:); + end + else + DatiMultiPointExtensometer(1:rd,col:col+2) = DATnodoMPBEL(:,:); + if ChMPBEL(ii) >= 4 && MPBEL_NTC(ii) == 1 + DatiNTCMultiPointExtensometer(1:rd,col) = DATnodoMPBEL_NTC(:,:); + end + end + end + [rn,~] = size(DATnodoMPBELd); % controllo date + [rnT,~] = size(DATnodoMPBELd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoMPBELd(i,:) = DATnodoMPBELd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Multipoint Borehole Rod Extensometer ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + if rnT < rd % normalmente sono uguali + for i = rnT+1:rd + DATnodoMPBELd_NTC(i,:) = DATnodoMPBELd_NTC(rnT,:); % se mancano dati, copio gli ultimi + end + wardat = ['NTC of Node Multipoint Borehole Rod Extensometer ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoMPBEL == 0 + if NumBasi == 1 + DatiMultiPointExtensometer(rt+1:rt+rd,col) = DATnodoMPBELd(:,:); + if ChMPBEL(ii) >= 2 && MPBEL_NTC(ii) == 1 + DatiNTCMultiPointExtensometer(rt+1:rt+rd,col) = DATnodoMPBELd_NTC(:,:); + end + elseif NumBasi == 2 + DatiMultiPointExtensometer(rt+1:rt+rd,col:col+1) = DATnodoMPBELd(:,:); + if ChMPBEL(ii) >= 3 && MPBEL_NTC(ii) == 1 + DatiNTCMultiPointExtensometer(rt+1:rt+rd,col) = DATnodoMPBELd_NTC(:,:); + end + elseif NumBasi == 3 + DatiMultiPointExtensometer(rt+1:rt+rd,col:col+2) = DATnodoMPBELd(:,:); + if ChMPBEL(ii) >= 4 && MPBEL_NTC(ii) == 1 + DatiNTCMultiPointExtensometer(rt+1:rt+rd,col) = DATnodoMPBELd_NTC(:,:); + end + end + end + else + DatiMultiPointExtensometer = DatiMultiPointExtensometer(1:end,:); + DatiNTCMultiPointExtensometer = DatiNTCMultiPointExtensometer(1:end,:); + end + okdatMPBEL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rMPBEL) ' Multipoint Borehole Rod Extensometer nodes downloaded correctly']; + fprintf(fileID,fmt,okdatMPBEL); + ii = ii+1; + if NumBasi == 1 + col = col+1; + elseif NumBasi == 2 + col = col+2; + elseif NumBasi == 3 + col = col+3; + elseif NumBasi == 4 + col = col+4; + elseif NumBasi == 5 + col = col+5; + elseif NumBasi == 6 + col = col+6; + end + end + if w == 0 + wardat = 'There are not warning for Multipoint Borehole Rod Extensometer!'; + fprintf(fileID,fmt,wardat); + end + + % ---- Dati Multibase -------------- + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiMultiPointExtensometer); + ErrMultiPointExtensometer = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroMPBEL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiMPBEL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + for jj=1:c + % Se il nodo è Dis., devo aumentare di uno la data (il nodo non + % è ancora stato installato!) + if strcmp('Dis.',DatiMultiPointExtensometer(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',DatiMultiPointExtensometer(dis,jj)) == 0 + DatiMultiPointExtensometer = DatiMultiPointExtensometer(dis:end,:); + DatiNTCMultiPointExtensometer = DatiNTCMultiPointExtensometer(dis:end,:); + DATiniMPBEL = DATiniMPBEL(dis:end,:); + [r,c] = size(DatiMultiPointExtensometer); + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiMPBEL)+1 < now + datainiMPBEL = datestr(datenum(datainiMPBEL)+1,'yyyy-mm-dd'); + break + else + yesMPBEL = 0; + end + end + end + end + end + if DIS ~= 1 && yesMPBEL == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiMultiPointExtensometer(1,jj))); + idxT = find(strcmp('---',DatiMultiPointExtensometer(1,jj))); + idxT2 = find(strcmp('-',DatiMultiPointExtensometer(1,jj))); + idxE2 = find(strcmp('Err2',DatiMultiPointExtensometer(1,jj))); + idxE255 = find(strcmp('Err255',DatiMultiPointExtensometer(1,jj))); + idxD = find(strcmp('DMUXe',DatiMultiPointExtensometer(1,jj))); + idxE1F = find(strcmp('Err1File',DatiMultiPointExtensometer(1,jj))); + idxN = find(strcmp('null',DatiMultiPointExtensometer(1,jj))); + idxRX = find(strcmp('No RX',DatiMultiPointExtensometer(1,jj))); + idxI = find(strcmp('id Error',DatiMultiPointExtensometer(1,jj))); + idxM = find(strcmp('MUX id Error',DatiMultiPointExtensometer(1,jj))); + idxC = find(strcmp('CH n. Error',DatiMultiPointExtensometer(1,jj))); + idxU = find(strcmp('Unknown Error',DatiMultiPointExtensometer(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiMultiPointExtensometer(1,jj))); + idxNS = find(strcmp('NotSupp',DatiMultiPointExtensometer(1,jj))); + idxU2 = find(strcmp('Unknown',DatiMultiPointExtensometer(1,jj))); + idxNA = find(strcmp('NotAv',DatiMultiPointExtensometer(1,jj))); + idxND = find(strcmp('No Data',DatiMultiPointExtensometer(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiMultiPointExtensometer(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of MultiPoint Rod Extensometer Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroMPBEL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiMPBEL)+1 < now + datainiMPBEL = datestr(datenum(datainiMPBEL)+1,'yyyy-mm-dd'); + break + else + yesMPBEL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiMPBEL = datestr(datenum(datainiMPBEL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiMultiPointExtensometer(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrMultiPointExtensometer(1,jj) = 1; + wardat = 'Data of MultiPoint Rod Extensometer Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiMPBEL = datestr(datenum(datainiMPBEL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiMultiPointExtensometer(:,jj))); + idxT = find(strcmp('---',DatiMultiPointExtensometer(:,jj))); + idxT2 = find(strcmp('-',DatiMultiPointExtensometer(:,jj))); + idxE2 = find(strcmp('Err2',DatiMultiPointExtensometer(:,jj))); + idxE255 = find(strcmp('Err255',DatiMultiPointExtensometer(:,jj))); + idxD = find(strcmp('DMUXe',DatiMultiPointExtensometer(:,jj))); + idxE1F = find(strcmp('Err1File',DatiMultiPointExtensometer(:,jj))); + idxN = find(strcmp('null',DatiMultiPointExtensometer(:,jj))); + idxRX = find(strcmp('No RX',DatiMultiPointExtensometer(:,jj))); + idxI = find(strcmp('id Error',DatiMultiPointExtensometer(:,jj))); + idxM = find(strcmp('MUX id Error',DatiMultiPointExtensometer(:,jj))); + idxC = find(strcmp('CH n. Error',DatiMultiPointExtensometer(:,jj))); + idxU = find(strcmp('Unknown Error',DatiMultiPointExtensometer(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiMultiPointExtensometer(:,jj))); + idxNS = find(strcmp('NotSupp',DatiMultiPointExtensometer(:,jj))); + idxU2 = find(strcmp('Unknown',DatiMultiPointExtensometer(:,jj))); + idxNA = find(strcmp('NotAv',DatiMultiPointExtensometer(:,jj))); + idxND = find(strcmp('No Data',DatiMultiPointExtensometer(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiMultiPointExtensometer(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiMPBEL = datestr(datenum(datainiMPBEL)-1,'yyyy-mm-dd'); + else + DatiMultiPointExtensometer(indice,jj) = DatiMultiPointExtensometer(indice-1,jj); + ErrMultiPointExtensometer(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiMultiPointExtensometer(nnn,jj))); + if check == 1 + DatiMultiPointExtensometer(nnn,jj) = DatiMultiPointExtensometer(nnn-1,jj); + ErrMultiPointExtensometer(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Multipoint Borehole Rod Extensometer data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiMultiPointExtensometer = [DATiniMPBEL str2double(DatiMultiPointExtensometer)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiMultiPointExtensometer(a,1) == DatiMultiPointExtensometer(a-1,1) + DatiMultiPointExtensometer(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + + if ESCI == 0 + if sum(MPBEL_NTC(:,1))>0 + if DIS ~= 1 && yesMPBEL == 1 + % ---- Dati NTC Multibase -------------- + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiNTCMultiPointExtensometer); + ErrNTCMultiPointExtensometer = zeros(r,c); + Ncorr = 0; + if NuovoZeroMPBEL == 1 + if isfile(RawDataFile) == 1 + DatiRawNTC = csvread(RawDataFileNTC); + [rDR,cDR] = size(DatiRawNTC); + DatiRawNTC(:,1) = DatiRawNTC(:,1) + 730000; + RawDateNTC = find(DatiRawNTC(:,1)<=datenum(datainiMPBEL)); + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTCMultiPointExtensometer(1,jj))); + idxT = find(strcmp('---',DatiNTCMultiPointExtensometer(1,jj))); + idxT2 = find(strcmp('-',DatiNTCMultiPointExtensometer(1,jj))); + idxE2 = find(strcmp('Err2',DatiNTCMultiPointExtensometer(1,jj))); + idxE255 = find(strcmp('Err255',DatiNTCMultiPointExtensometer(1,jj))); + idxD = find(strcmp('DMUXe',DatiNTCMultiPointExtensometer(1,jj))); + idxE1F = find(strcmp('Err1File',DatiNTCMultiPointExtensometer(1,jj))); + idxN = find(strcmp('null',DatiNTCMultiPointExtensometer(1,jj))); + idxRX = find(strcmp('No RX',DatiNTCMultiPointExtensometer(1,jj))); + idxI = find(strcmp('id Error',DatiNTCMultiPointExtensometer(1,jj))); + idxM = find(strcmp('MUX id Error',DatiNTCMultiPointExtensometer(1,jj))); + idxC = find(strcmp('CH n. Error',DatiNTCMultiPointExtensometer(1,jj))); + idxU = find(strcmp('Unknown Error',DatiNTCMultiPointExtensometer(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTCMultiPointExtensometer(1,jj))); + idxNS = find(strcmp('NotSupp',DatiNTCMultiPointExtensometer(1,jj))); + idxU2 = find(strcmp('Unknown',DatiNTCMultiPointExtensometer(1,jj))); + idxNA = find(strcmp('NotAv',DatiNTCMultiPointExtensometer(1,jj))); + idxND = find(strcmp('No Data',DatiNTCMultiPointExtensometer(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiNTCMultiPointExtensometer(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of NTC of MultiPoint Rod Extensometer Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroMPBEL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiMPBEL)+1 < now + datainiMPBEL = datestr(datenum(datainiMPBEL)+1,'yyyy-mm-dd'); + break + else + yesMPBEL = 0; + end + else + if isempty(RawDateNTC) == 1 + NAN = 0; + ESCI = 1; + datainiMPBEL = datestr(datenum(datainiMPBEL)-1,'yyyy-mm-dd'); + break + else + DatiNTCMultiPointExtensometer(1,jj) = cellstr(num2str(DatiRawNTC(RawDateNTC(end),jj+1))); + if ErrMultiPointExtensometer(1,jj) == 0 + ErrMultiPointExtensometer(1,jj) = 0.5; + else + ErrMultiPointExtensometer(1,jj) = 1; + end + wardat = 'Data of NTC of Multi Point Rod Extensometer Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTCMultiPointExtensometer(:,jj))); + idxT3 = find(strcmp('---',DatiNTCMultiPointExtensometer(:,jj))); + idxT = find(strcmp('-',DatiNTCMultiPointExtensometer(:,jj))); + idxE2 = find(strcmp('Err2',DatiNTCMultiPointExtensometer(:,jj))); + idxE255 = find(strcmp('Err255',DatiNTCMultiPointExtensometer(:,jj))); + idxD = find(strcmp('DMUXe',DatiNTCMultiPointExtensometer(:,jj))); + idxE1F = find(strcmp('Err1File',DatiNTCMultiPointExtensometer(:,jj))); + idxN = find(strcmp('null',DatiNTCMultiPointExtensometer(:,jj))); + idxRX = find(strcmp('No RX',DatiNTCMultiPointExtensometer(:,jj))); + idxI = find(strcmp('id Error',DatiNTCMultiPointExtensometer(:,jj))); + idxM = find(strcmp('MUX id Error',DatiNTCMultiPointExtensometer(:,jj))); + idxC = find(strcmp('CH n. Error',DatiNTCMultiPointExtensometer(:,jj))); + idxU = find(strcmp('Unknown Error',DatiNTCMultiPointExtensometer(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTCMultiPointExtensometer(:,jj))); + idxNS = find(strcmp('NotSupp',DatiNTCMultiPointExtensometer(:,jj))); + idxU2 = find(strcmp('Unknown',DatiNTCMultiPointExtensometer(:,jj))); + idxNA = find(strcmp('NotAv',DatiNTCMultiPointExtensometer(:,jj))); + idxND = find(strcmp('No Data',DatiNTCMultiPointExtensometer(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiNTCMultiPointExtensometer(:,jj))); + idx = union(idxE,idxT3); + idx = union(idx,idxND); + idx = union(idx,idxCE); + idx = union(idx,idxT); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiMPBEL = datestr(datenum(datainiMPBEL)-1,'yyyy-mm-dd'); + break + else + DatiNTCMultiPointExtensometer(indice,jj) = DatiNTCMultiPointExtensometer(indice-1,jj); + ErrNTCMultiPointExtensometer(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiNTCMultiPointExtensometer(nnn,jj))); + if check == 1 + DatiNTCMultiPointExtensometer(nnn,jj) = DatiNTCMultiPointExtensometer(nnn-1,jj); + if ErrMultiPointExtensometer(indice,jj) == 0 + ErrMultiPointExtensometer(indice,jj) = 0.5; + else + ErrMultiPointExtensometer(indice,jj) = 1; + end + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of NTC of Multipoint Borehole Rod Extensometer data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiNTCMultiPointExtensometer = [DATiniMPBEL str2double(DatiNTCMultiPointExtensometer)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiNTCMultiPointExtensometer(a,1) == DatiNTCMultiPointExtensometer(a-1,1) + DatiNTCMultiPointExtensometer(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + else + ErrNTCMultiPointExtensometer = 0; + end + end + end + if NuovoZeroMPBEL == 1 && yesMPBEL == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiMultiPointExtensometer(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiMultiPointExtensometer(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiMultiPointExtensometer(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiMultiPointExtensometer(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiMultiPointExtensometer; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)0 + [rDR,cDR] = size(DatiRawNTC); + if rDR~=1 && cDR~=1 && isempty(DatiRawNTC) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiNTCMultiPointExtensometer(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiNTCMultiPointExtensometer(:,1)>DatiRawNTC(end,1)); + else + RawDate2 = find(DatiNTCMultiPointExtensometer(:,1)>DatiRawNTC(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + DatiNTC = [DatiRawNTC(1:RawDate1(end),:);DatiNTCMultiPointExtensometer(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + DatiNTC = DatiNTCMultiPointExtensometer; + else + DatiNTC = DatiRawNTC; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(DatiNTC(:,1)0 + DatiNTC = DatiNTCMultiPointExtensometer; + end + end + Dati(:,1) = Dati(:,1) - 730000; + csvwrite(RawDataFile,Dati); + if sum(MPBEL_NTC(:,1))>0 + DatiNTC(:,1) = DatiNTC(:,1) - 730000; + csvwrite(RawDataFileNTC,DatiNTC); + end +end + +%% Analog Link +if yesAL == 0 % Non ci sono Analog Link + DatiAnalogLink = []; + ErrAnalogLink = []; + ChAL = []; + AL_NTC = []; + wardat = 'lettura function: there are not Analog Link'; + fprintf(fileID,fmt,wardat); +else + RawDataFile = ['' IDcentralina '-' DTcatena '-AL-RawData.csv']; % Specifico per An Link + ChAL = cell2mat(NodoAnalogLink(:,4)); + AL_NTC = cell2mat(NodoAnalogLink(:,5)); + NAN = 0; + DIS = 0; + while NAN == 0 + if datenum(datainiAL) == datenum(Data(1,1)) + tempoiniAL = char(Data(1,2)); + end + NodeType = 'Analog Link'; + NodeNumAL = num2str(cell2mat(NodoAnalogLink(1,2))); % scarico i dati del primo nodo + % Scarico dei dati relativi alla centralina con informazioni di Data e ora, livello batteria e temperatura + % Step 1 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date = ''' ... + datainiAL ''' and Time >= ''' tempoiniAL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumAL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniAL = curs.Data; + Ntempo = DATiniAL; + [r,c] = size(DATiniAL); + saltoAL = 0; + if r==1 && c==1 + textdatAL = 'Warning: error reading Analog Link (control unit data)!'; + fprintf(fileID,fmt,textdatAL); + saltoAL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiAL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumAL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2AL = curs.Data; + Ndate = DAT2AL; + if saltoAL == 1 + DATiniAL = DAT2AL; + end + Check = size(DAT2AL); + if Check(1,2) > 1 % ho superato il primo giorno + if saltoAL == 0 + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + DATiniAL = [DATiniAL; DAT2AL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniAL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniAL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniAL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniAL = T; + else + DATiniAL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + % creo la matrice per i dati Analog Link + if saltoAL == 0 + if Check(1,2) > 1 + DatiAnalogLink = cell(rd+rt,rAL*ChAL); + else + DatiAnalogLink = cell(rt,rAL*ChAL); + end + else + DatiAnalogLink = cell(rd,rAL*ChAL); + end + NAnalogLink = cell2mat(NodoAnalogLink(:,2)); + col = ChAL; + ii = 1; + w = 0; + while ii <= rAL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NAnalogLink(ii,1); + nNodo = num2str(nN); + if ChAL == 1 + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiAL ''' and Time >= ''' tempoiniAL ''' and ToolNameID = '''... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = '''... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoAL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiAL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoALd = curs.Data; + elseif AnalogCh == 2 + comando = ['select Val0, Val1 from RawDataView where Date = ''' ... + datainiAL ''' and Time >= ''' tempoiniAL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoAL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1 from RawDataView where Date > ''' ... + datainiAL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoALd = curs.Data; + elseif AnalogCh == 3 + comando = ['select Val0, Val1, Val2 from RawDataView where Date = ''' ... + datainiAL ''' and Time >= ''' tempoiniAL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoAL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2 from RawDataView where Date > ''' ... + datainiAL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoALd = curs.Data; + elseif AnalogCh == 4 + comando = ['select Val0, Val1, Val2, Val3 from RawDataView where Date = ''' ... + datainiAL ''' and Time >= ''' tempoiniAL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoAL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val3 from RawDataView where Date > ''' ... + datainiAL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoALd = curs.Data; + elseif AnalogCh == 5 + comando = ['select Val0, Val1, Val2, Val3, Val4 from RawDataView where Date = ''' ... + datainiAL ''' and Time >= ''' tempoiniAL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoAL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val3, Val4 from RawDataView where Date > ''' ... + datainiAL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoALd = curs.Data; + elseif AnalogCh == 6 + comando = ['select Val0, Val1, Val2, Val3, Val4, Val5 from RawDataView where Date = ''' ... + datainiAL ''' and Time >= ''' tempoiniAL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoAL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val3, Val4, Val5 from RawDataView where Date > ''' ... + datainiAL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoALd = curs.Data; + end + % Concateno i dati relativi a Step 1 e 2 per il nodo ii-esimo. + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoAL == 0 + if AnalogCh == 1 + DatiAnalogLink(1:rt,col) = DATnodoAL(:,:); + elseif AnalogCh == 2 + ini_col = col-1; + DatiAnalogLink(1:rt,ini_col:col) = DATnodoAL(:,:); + elseif AnalogCh == 3 + ini_col = col-2; + DatiAnalogLink(1:rt,ini_col:col) = DATnodoAL(:,:); + elseif AnalogCh == 4 + ini_col = col-3; + DatiAnalogLink(1:rt,ini_col:col) = DATnodoAL(:,:); + elseif AnalogCh == 5 + ini_col = col-4; + DatiAnalogLink(1:rt,ini_col:col) = DATnodoAL(:,:); + elseif AnalogCh == 6 + ini_col = col-5; + DatiAnalogLink(1:rt,ini_col:col) = DATnodoAL(:,:); + end + else + if AnalogCh == 1 + DatiAnalogLink(1:rd,col) = DATnodoAL(:,:); + elseif AnalogCh == 2 + ini_col = col-1; + DatiAnalogLink(1:rd,ini_col:col) = DATnodoAL(:,:); + elseif AnalogCh == 3 + ini_col = col-2; + DatiAnalogLink(1:rd,ini_col:col) = DATnodoAL(:,:); + elseif AnalogCh == 4 + ini_col = col-3; + DatiAnalogLink(1:rd,ini_col:col) = DATnodoAL(:,:); + elseif AnalogCh == 5 + ini_col = col-4; + DatiAnalogLink(1:rd,ini_col:col) = DATnodoAL(:,:); + elseif AnalogCh == 6 + ini_col = col-5; + DatiAnalogLink(1:rd,ini_col:col) = DATnodoAL(:,:); + end + end + [rn,~] = size(DATnodoALd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoALd(i,:) = DATnodoALd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Analog Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoAL == 0 + if ChAL == 1 + DatiAnalogLink(rt+1:rt+rd,col) = DATnodoALd(:,:); + else + DatiAnalogLink(rt+1:rt+rd,ini_col:col) = DATnodoALd(:,:); + end + end + else + DatiAnalogLink = DatiAnalogLink(1:end,:); + end + okdatAL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rAL) ' Analog Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatAL); + ii = ii+1; + if ChAL == 1 + col = col+1; + elseif ChAL == 2 + col = col+2; + elseif ChAL == 3 + col = col+3; + elseif ChAL == 4 + col = col+4; + elseif ChAL == 5 + col = col+5; + elseif ChAL == 6 + col = col+6; + end + end + if w == 0 + wardat = 'There are not warning for Analog Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiAnalogLink); + ErrAnalogLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroAL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiAL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + for jj=1:c + % Se il nodo è Dis., devo aumentare di uno la data (il nodo non + % è ancora stato installato!) + if strcmp('Dis.',DatiAnalogLink(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',DatiAnalogLink(dis,jj)) == 0 + DatiAnalogLink = DatiAnalogLink(dis:end,:); + DATiniAL = DATiniAL(dis:end,:); + [r,c] = size(DatiAnalogLink); + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiAL)+1 < now + datainiAL = datestr(datenum(datainiAL)+1,'yyyy-mm-dd'); + break + else + yesAL = 0; + end + end + end + end + end + if DIS ~= 1 && yesAL == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiAnalogLink(1,jj))); + idxT = find(strcmp('---',DatiAnalogLink(1,jj))); + idxT2 = find(strcmp('-',DatiAnalogLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiAnalogLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiAnalogLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiAnalogLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiAnalogLink(1,jj))); + idxN = find(strcmp('null',DatiAnalogLink(1,jj))); + idxRX = find(strcmp('No RX',DatiAnalogLink(1,jj))); + idxI = find(strcmp('id Error',DatiAnalogLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiAnalogLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiAnalogLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiAnalogLink(1,jj))); + idxDis = find(strcmp('Dis.',DatiAnalogLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiAnalogLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiAnalogLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiAnalogLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiAnalogLink(1,jj))); + idxND = find(strcmp('No Data',DatiAnalogLink(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiAnalogLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxCE); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxDis); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Analog Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroAL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiAL)+1 < now + datainiAL = datestr(datenum(datainiAL)+1,'yyyy-mm-dd'); + break + else + yesAL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiAL = datestr(datenum(datainiAL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiAnalogLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrAnalogLink(1,jj) = 1; + wardat = 'Data of Analog Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiAL = datestr(datenum(datainiAL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiAnalogLink(:,jj))); + idxT = find(strcmp('---',DatiAnalogLink(:,jj))); + idxT2 = find(strcmp('-',DatiAnalogLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiAnalogLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiAnalogLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiAnalogLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiAnalogLink(:,jj))); + idxN = find(strcmp('null',DatiAnalogLink(:,jj))); + idxRX = find(strcmp('No RX',DatiAnalogLink(:,jj))); + idxI = find(strcmp('id Error',DatiAnalogLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiAnalogLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiAnalogLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiAnalogLink(:,jj))); + idxDis = find(strcmp('Dis.',DatiAnalogLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiAnalogLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiAnalogLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiAnalogLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiAnalogLink(:,jj))); + idxND = find(strcmp('No Data',DatiAnalogLink(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiAnalogLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxCE); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxDis); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiAL = datestr(datenum(datainiAL)-1,'yyyy-mm-dd'); + else + DatiAnalogLink(indice,jj) = DatiAnalogLink(indice-1,jj); + ErrAnalogLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiAnalogLink(nnn,jj))); + if check == 1 + DatiAnalogLink(nnn,jj) = DatiAnalogLink(nnn-1,jj); + ErrAnalogLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Analog Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiAnalogLink = [DATiniAL str2double(DatiAnalogLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiAnalogLink(a,1) == DatiAnalogLink(a-1,1) + DatiAnalogLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + end + if NuovoZeroAL == 1 && yesAL == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiAnalogLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiAnalogLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiAnalogLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiAnalogLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiAnalogLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniCrL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumCrL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniCrL = curs.Data; + Ntempo = DATiniCrL; + [r,c] = size(DATiniCrL); + saltoCrL = 0; + if r==1 && c==1 + textdatCrL = 'Warning: error reading Crack Link (control unit data)!'; + fprintf(fileID,fmt,textdatCrL); + saltoCrL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiCrL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumCrL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2CrL = curs.Data; + Ndate = DAT2CrL; + if saltoCrL == 1 + DATiniCrL = DAT2CrL; + end + Check = size(DAT2CrL); + if Check(1,2) > 1 % ho superato il primo giorno + if saltoCrL == 0 + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + DATiniCrL = [DATiniCrL; DAT2CrL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniCrL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniCrL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniCrL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniCrL = T; + else + DATiniCrL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + % creo la matrice per i dati Extensometer Link + if saltoCrL == 0 + if Check(1,2) > 1 + DatiCrackLink = cell(rd+rt,rCrL); + DatiNTCCrackLink = cell(rd+rt,rCrL); + else + DatiCrackLink = cell(rt,rCrL); + DatiNTCCrackLink = cell(rt,rCrL); + end + else + DatiCrackLink = cell(rd,rCrL); + DatiNTCCrackLink = cell(rd,rCrL); + end + NCrackLink = cell2mat(NodoCrackLink(:,2)); + col = 1; + ii = 1; + w = 0; + while ii <= rCrL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NCrackLink(ii,1); + nNodo = num2str(nN); + % Dato + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiCrL ''' and Time >= ''' tempoiniCrL ''' and ToolNameID = ''' ... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoCrL = curs.Data; + % Dato + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiCrL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = '''... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoCrLd = curs.Data; + if ChCrL(ii,1) == 1 + % T + DATnodoCrL_NTC = cell(1,1); + DATnodoCrLd_NTC = cell(1,1); + elseif ChCrL(ii,1) >= 2 + if CrL_NTC(ii,1)==1 + comando = ['select Val1 from RawDataView where Date = ''' ... + datainiCrL ''' and Time >= ''' tempoiniCrL ''' and ToolNameID = ''' ... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoCrL_NTC = curs.Data; + % Dato + comando = ['select Val1 from RawDataView where Date > ''' ... + datainiCrL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = '''... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoCrLd_NTC = curs.Data; + else + DATnodoCrL_NTC = cell(1,1); + DATnodoCrLd_NTC = cell(1,1); + end + end + + [rn,~] = size(DATnodoCrLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoCrLd(i,:) = DATnodoCrLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Crack Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + [rnT,~] = size(DATnodoCrLd_NTC); % controllo date + if rnT < rd % normalmente sono uguali + for i = rnT+1:rd + DATnodoCrLd_NTC(i,:) = DATnodoCrLd_NTC(rnT,:); % se mancano dati, copio gli ultimi + end + wardat = ['NTC of Node Crack Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoCrL == 0 + if ChCrL(ii,1) >= 2 + if CrL_NTC(ii,1)==1 + DatiCrackLink(1:rt,col) = DATnodoCrL(:,:); %#ok<*AGROW> + DatiNTCCrackLink(1:rt,col) = DATnodoCrL_NTC(:,:); %#ok<*AGROW> + if Check(1,2) > 1 + DatiCrackLink(rt+1:rt+rd,col) = DATnodoCrLd(:,:); + DatiNTCCrackLink(rt+1:rt+rd,col) = DATnodoCrLd_NTC(:,:); %#ok<*AGROW> + end + else + DatiCrackLink(1:rt,col) = DATnodoCrL(:,:); %#ok<*AGROW> + if Check(1,2) > 1 + DatiCrackLink(rt+1:rt+rd,col) = DATnodoCrLd(:,:); + end + end + elseif ChCrL(ii,1) == 1 + DatiCrackLink(1:rt,col) = DATnodoCrL(:,:); %#ok<*AGROW> + if Check(1,2) > 1 + DatiCrackLink(rt+1:rt+rd,col) = DATnodoCrLd(:,:); + end + end + else + if ChCrL(ii,1) >= 2 + if CrL_NTC(ii,1)==1 + DatiCrackLink(1:rd,col) = DATnodoCrL(:,:); %#ok<*AGROW> + DatiNTCCrackLink(1:rd,col) = DATnodoCrL_NTC(:,:); %#ok<*AGROW> + else + DatiCrackLink(1:rd,col) = DATnodoCrL(:,:); %#ok<*AGROW> + end + elseif ChCrL(ii,1) == 1 + DatiCrackLink(1:rd,col) = DATnodoCrL(:,:); %#ok<*AGROW> + end + end + + okdatCrL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rCrL) ' Crack Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatCrL); + ii = ii+1; + col = col+1; + end + if w == 0 + wardat = 'There are not warning for Crack Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + + % Dati + [r,c] = size(DatiCrackLink); + ErrCrackLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroCrL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiCrL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + for jj=1:c + % Se il nodo è Dis., devo aumentare di uno la data (il nodo non + % è ancora stato installato!) + if strcmp('Dis.',DatiCrackLink(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',DatiCrackLink(dis,jj)) == 0 + DatiCrackLink = DatiCrackLink(dis:end,:); + DatiNTCCrackLink = DatiNTCCrackLink(dis:end,:); + DATiniCrL = DATiniCrL(dis:end,:); + [r,c] = size(DatiCrackLink); + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiCrL)+1 < now + datainiCrL = datestr(datenum(datainiCrL)+1,'yyyy-mm-dd'); + break + else + yesCrL = 0; + end + end + end + + end + end + if DIS ~= 1 && yesCrL == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiCrackLink(1,jj))); + idxT = find(strcmp('---',DatiCrackLink(1,jj))); + idxT2 = find(strcmp('-',DatiCrackLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiCrackLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiCrackLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiCrackLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiCrackLink(1,jj))); + idxN = find(strcmp('null',DatiCrackLink(1,jj))); + idxRX = find(strcmp('No RX',DatiCrackLink(1,jj))); + idxI = find(strcmp('id Error',DatiCrackLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiCrackLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiCrackLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiCrackLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiCrackLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiCrackLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiCrackLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiCrackLink(1,jj))); + idxND = find(strcmp('No Data',DatiCrackLink(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiCrackLink(1,jj))); + idx0 = find(strcmp('0.000',DatiCrackLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + idx = union(idx,idx0); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Crack Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroCrL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiCrL)+1 < now + datainiCrL = datestr(datenum(datainiCrL)+1,'yyyy-mm-dd'); + break + else + yesCrL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiCrL = datestr(datenum(datainiCrL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiCrackLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrCrackLink(1,jj) = 1; + wardat = 'Data of Crack Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiCrL = datestr(datenum(datainiCrL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiCrackLink(:,jj))); + idxT = find(strcmp('---',DatiCrackLink(:,jj))); + idxT2 = find(strcmp('-',DatiCrackLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiCrackLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiCrackLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiCrackLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiCrackLink(:,jj))); + idxN = find(strcmp('null',DatiCrackLink(:,jj))); + idxRX = find(strcmp('No RX',DatiCrackLink(:,jj))); + idxI = find(strcmp('id Error',DatiCrackLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiCrackLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiCrackLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiCrackLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiCrackLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiCrackLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiCrackLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiCrackLink(:,jj))); + idxND = find(strcmp('No Data',DatiCrackLink(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiCrackLink(:,jj))); + idx0 = find(strcmp('0.000',DatiCrackLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + idx = union(idx,idx0); + [ri,~] = size(idx); + for kk = 1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiCrL = datestr(datenum(datainiCrL)+1,'yyyy-mm-dd'); + break + else + DatiCrackLink(indice,jj) = DatiCrackLink(indice-1,jj); + ErrCrackLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiCrackLink(nnn,jj))); + if check == 1 + DatiCrackLink(nnn,jj) = DatiCrackLink(nnn-1,jj); + ErrCrackLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Crack Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiCrackLink = [DATiniCrL str2double(DatiCrackLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiCrackLink(a,1) == DatiCrackLink(a-1,1) + DatiCrackLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + + if ESCI == 0 + if sum(CrL_NTC(:,1))>0 + if DIS ~= 1 && yesCrL == 1 + % NTC + [r,c] = size(DatiNTCCrackLink); + Ncorr = 0; + if NuovoZeroCrL == 1 + if isfile(RawDataFile) == 1 + DatiRawNTC = csvread(RawDataFileNTC); + [rDR,cDR] = size(DatiRawNTC); + DatiRawNTC(:,1) = DatiRawNTC(:,1) + 730000; + RawDateNTC = find(DatiRawNTC(:,1)<=datenum(datainiCrL)); + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTCCrackLink(1,jj))); + idxND = find(strcmp('No Data',DatiNTCCrackLink(1,jj))); + idxT3 = find(strcmp('---',DatiNTCCrackLink(1,jj))); + idxT = find(strcmp('-',DatiNTCCrackLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiNTCCrackLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiNTCCrackLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiNTCCrackLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiNTCCrackLink(1,jj))); + idxN = find(strcmp('null',DatiNTCCrackLink(1,jj))); + idxRX = find(strcmp('No RX',DatiNTCCrackLink(1,jj))); + idxI = find(strcmp('id Error',DatiNTCCrackLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiNTCCrackLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiNTCCrackLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiNTCCrackLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTCCrackLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiNTCCrackLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiNTCCrackLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiNTCCrackLink(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiNTCCrackLink(1,jj))); + idx = union(idxE,idxT3); + idx = union(idx,idxND); + idx = union(idx,idxCE); + idx = union(idx,idxT); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of NTC of Crack Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroCrL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiCrL)+1 < now + datainiCrL = datestr(datenum(datainiCrL)+1,'yyyy-mm-dd'); + break + else + yesCrL = 0; + end + else + if isempty(RawDateNTC) == 1 + NAN = 0; + ESCI = 1; + datainiCrL = datestr(datenum(datainiCrL)-1,'yyyy-mm-dd'); + break + else + DatiNTCCrackLink(1,jj) = cellstr(num2str(DatiRawNTC(RawDateNTC(end),jj+1))); + if ErrCrackLink(1,jj) == 0 + ErrCrackLink(1,jj) = 0.5; + else + ErrCrackLink(1,jj) = 1; + end + wardat = 'Data of NTC of Crack Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTCCrackLink(:,jj))); + idxND = find(strcmp('No Data',DatiNTCCrackLink(:,jj))); + idxT3 = find(strcmp('---',DatiNTCCrackLink(:,jj))); + idxT = find(strcmp('-',DatiNTCCrackLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiNTCCrackLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiNTCCrackLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiNTCCrackLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiNTCCrackLink(:,jj))); + idxN = find(strcmp('null',DatiNTCCrackLink(:,jj))); + idxRX = find(strcmp('No RX',DatiNTCCrackLink(:,jj))); + idxI = find(strcmp('id Error',DatiNTCCrackLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiNTCCrackLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiNTCCrackLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiNTCCrackLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTCCrackLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiNTCCrackLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiNTCCrackLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiNTCCrackLink(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiNTCCrackLink(:,jj))); + idx = union(idxE,idxT3); + idx = union(idx,idxND); + idx = union(idx,idxCE); + idx = union(idx,idxT); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + if DIS == 1 + wardat = 'Warning on the correction of NTC of Crack Link: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + NAN = 0; + ESCI = 1; + datainiCrL = datestr(datenum(datainiCrL)+1,'yyyy-mm-dd'); + break + else + wardat = 'Warning on the correction of NTC of Crack Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 % il file non è mai stato scritto + NAN = 0; + ESCI = 1; + datainiCrL = datestr(datenum(datainiCrL)-1,'yyyy-mm-dd'); + break + else + if isempty(RawDateNTC) == 1 + NAN = 0; + ESCI = 1; + datainiCrL = datestr(datenum(datainiCrL)-1,'yyyy-mm-dd'); + break + else + DatiNTCCrackLink(indice,jj) = cellstr(num2str(DatiRawNTC(RawDateNTC(end),jj+1))); + if ErrCrackLink(indice,jj) == 0 + ErrCrackLink(indice,jj) = 0.5; + else + ErrCrackLink(indice,jj) = 1; + end + wardat = 'Data of Crack Link nodes corrected using Raw Data of Excel file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + else + DatiNTCCrackLink(indice,jj) = DatiNTCCrackLink(indice-1,jj); + if ErrCrackLink(indice,jj) == 0 + ErrCrackLink(indice,jj) = 0.5; + else + ErrCrackLink(indice,jj) = 1; + end + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiNTCCrackLink(nnn,jj))); + if check == 1 + DatiNTCCrackLink(nnn,jj) = DatiNTCCrackLink(nnn-1,jj); + if ErrCrackLink(indice,jj) == 0 + ErrCrackLink(indice,jj) = 0.5; + else + ErrCrackLink(indice,jj) = 1; + end + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of NTC Crack Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiNTCCrackLink = [DATiniCrL str2double(DatiNTCCrackLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiNTCCrackLink(a,1) == DatiNTCCrackLink(a-1,1) + DatiNTCCrackLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + end + end + if NuovoZeroCrL == 1 && yesCrL == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiCrackLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiCrackLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiCrackLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiCrackLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiCrackLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)0 + [rDR,cDR] = size(DatiRawNTC); + if rDR~=1 && cDR~=1 && isempty(DatiRawNTC) == 0 + RawDate1 = find(DatiRawNTC(:,1)<=DatiNTCCrackLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiNTCCrackLink(:,1)>DatiRawNTC(end,1)); + else + RawDate2 = find(DatiNTCCrackLink(:,1)>DatiRawNTC(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + DatiNTC = [DatiRawNTC(1:RawDate1(end),:);DatiNTCCrackLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + DatiNTC = DatiNTCCrackLink; + else + DatiNTC = DatiRawNTC; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(DatiNTC(:,1)0 + DatiNTC = DatiNTCCrackLink; + end + end + Dati(:,1) = Dati(:,1) - 730000; + csvwrite(RawDataFile,Dati); + if sum(CrL_NTC(:,1))>0 + DatiNTC(:,1) = DatiNTC(:,1) - 730000; + csvwrite(RawDataFileNTC,DatiNTC); + end +end + +%% 3D Crack Link +if yes3DCrL == 0 % Non ci sono 3D Crack Link + Dati3DCrackLink = []; + DatiNTC3DCrackLink = []; + Err3DCrackLink = []; + ErrNTC3DCrackLink = []; + Ch3DCrL = []; + CrL3D_NTC = []; + wardat = 'lettura function: there are not 3D Crack Link'; + fprintf(fileID,fmt,wardat); +else + RawDataFile = ['' IDcentralina '-' DTcatena '-3DCrack-RawData.csv']; % Specifico per 3D Crack Link + RawDataFileNTC = ['' IDcentralina '-' DTcatena '-3DCrackNTC-RawData.csv']; % Specifico per 3D Crack Link + Ch3DCrL = cell2mat(Nodo3DCrackLink(:,4)); + CrL3D_NTC = cell2mat(Nodo3DCrackLink(:,5)); + NAN = 0; + DIS = 0; + while NAN == 0 + if datenum(dataini3DCrL) == datenum(Data(1,1)) + tempoini3DCrL = char(Data(1,2)); + end + NodeType = '3D Crack Link'; + NodeNum3DCrL = num2str(cell2mat(Nodo3DCrackLink(1,2))); % scarico i dati del primo nodo + % Scarico dei dati relativi alla centralina con informazioni di Data e ora, livello batteria e temperatura + % Step 1 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date = ''' ... + dataini3DCrL ''' and Time >= ''' tempoini3DCrL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNum3DCrL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATini3DCrL = curs.Data; + Ntempo = DATini3DCrL; + [r,c] = size(DATini3DCrL); + salto3DCrL = 0; + if r==1 && c==1 + textdat3DCrL = 'Warning: error reading 3D Crack Link (control unit data)!'; + fprintf(fileID,fmt,textdat3DCrL); + salto3DCrL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + dataini3DCrL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNum3DCrL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT23DCrL = curs.Data; + Ndate = DAT23DCrL; + if salto3DCrL == 1 + DATini3DCrL = DAT23DCrL; + end + Check = size(DAT23DCrL); + if Check(1,2) > 1 % ho superato il primo giorno + if salto3DCrL == 0 + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + DATini3DCrL = [DATini3DCrL; DAT23DCrL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATini3DCrL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATini3DCrL(:,1)) repmat(' ', [rD,1]) cell2mat(DATini3DCrL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATini3DCrL = T; + else + DATini3DCrL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + if salto3DCrL == 0 + % creo la matrice per i dati 3D Crack Link + if Check(1,2) > 1 + Dati3DCrackLink = cell(rd+rt,3*r3DCrL); + DatiNTC3DCrackLink = cell(rd+rt,r3DCrL); + else + Dati3DCrackLink = cell(rt,3*r3DCrL); + DatiNTC3DCrackLink = cell(rt,r3DCrL); + end + else + Dati3DCrackLink = cell(rd,3*r3DCrL); + DatiNTC3DCrackLink = cell(rd,r3DCrL); + end + col = 1; + ii = 1; + w = 0; + N3DCrackLink = cell2mat(Nodo3DCrackLink(:,2)); + while ii <= r3DCrL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = N3DCrackLink(ii,1); + nNodo = num2str(nN); + if Ch3DCrL(ii,1) == 3 || Ch3DCrL(ii,1) == 4 + comando = ['select Val0, Val1, Val2 from RawDataView where Date = ''' ... + dataini3DCrL ''' and Time >= ''' tempoini3DCrL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo3DCrL = curs.Data; + comando = ['select Val0, Val1, Val2 from RawDataView where Date > ''' ... + dataini3DCrL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo3DCrLd = curs.Data; + if Ch3DCrL(ii,1) == 4 % Termometro + comando = ['select Val3 from RawDataView where Date = ''' ... + dataini3DCrL ''' and Time >= ''' tempoini3DCrL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo3DCrL_NTC = curs.Data; + comando = ['select Val3 from RawDataView where Date > ''' ... + dataini3DCrL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo3DCrL_NTCd = curs.Data; + else + DATnodo3DCrL_NTC = 0; + DATnodo3DCrL_NTCd = 0; + end + elseif Ch3DCrL(ii,1) >= 6 + comando = ['select Val0, Val2, Val4 from RawDataView where Date = ''' ... + dataini3DCrL ''' and Time >= ''' tempoini3DCrL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo3DCrL = curs.Data; + comando = ['select Val0, Val2, Val4 from RawDataView where Date > ''' ... + dataini3DCrL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo3DCrLd = curs.Data; + DATnodo3DCrL_NTC = 0; + DATnodo3DCrL_NTCd = 0; + end + + % Concateno i dati relativi a Step 1 e 2 per il nodo ii-esimo. + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + [rn,~] = size(DATnodo3DCrLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodo3DCrLd(i,:) = DATnodo3DCrLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node 3D Crack Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + [rn,~] = size(DATnodo3DCrL_NTCd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodo3DCrL_NTCd(i,:) = DATnodo3DCrL_NTCd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['NTC of Node 3D Crack Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if salto3DCrL == 0 + if Ch3DCrL(ii,1) == 4 + if CrL3D_NTC(ii,1) == 1 + Dati3DCrackLink(1:rt,col:col+2) = DATnodo3DCrL; %#ok<*AGROW> + DatiNTC3DCrackLink(1:rt,ii) = DATnodo3DCrL_NTC; %#ok<*AGROW> + if Check(1,2) > 1 + Dati3DCrackLink(rt+1:rt+rd,col:col+2) = DATnodo3DCrLd; + DatiNTC3DCrackLink(rt+1:rt+rd,ii) = DATnodo3DCrL_NTCd; %#ok<*AGROW> + end + else + Dati3DCrackLink(1:rt,col:col+2) = DATnodo3DCrL; %#ok<*AGROW> + if Check(1,2) > 1 + Dati3DCrackLink(rt+1:rt+rd,col:col+2) = DATnodo3DCrLd; + end + end + elseif Ch3DCrL(ii,1) == 3 || Ch3DCrL(ii,1) >= 6 + Dati3DCrackLink(1:rt,col:col+2) = DATnodo3DCrL; %#ok<*AGROW> + if Check(1,2) > 1 + Dati3DCrackLink(rt+1:rt+rd,col:col+2) = DATnodo3DCrLd; + end + end + else + if Ch3DCrL(ii,1) == 4 + if CrL3D_NTC(ii,1)==1 + Dati3DCrackLink(1:rd,col:col+2) = DATnodo3DCrL; %#ok<*AGROW> + DatiNTC3DCrackLink(1:rd,ii) = DATnodo3DCrL_NTC; %#ok<*AGROW> + else + Dati3DCrackLink(1:rd,col:col+2) = DATnodo3DCrL; %#ok<*AGROW> + end + elseif Ch3DCrL(ii,1) == 1 + Dati3DCrackLink(1:rd,col:col+2) = DATnodo3DCrL; %#ok<*AGROW> + end + end + + okdat3DCrL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(r3DCrL) ' 3D Crack Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdat3DCrL); + ii = ii+1; + col = col+3; + end + if w == 0 + wardat = 'There are not warning for 3D Crack Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(Dati3DCrackLink); + Err3DCrackLink = zeros(r,c); + Ncorr = 0; + NAN = 1; + ESCI = 0; + if NuovoZero3DCrL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(dataini3DCrL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + for jj=1:c + % Se il nodo è Dis., devo aumentare di uno la data (il nodo non + % è ancora stato installato!) + if strcmp('Dis.',Dati3DCrackLink(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',Dati3DCrackLink(dis,jj)) == 0 + Dati3DCrackLink = Dati3DCrackLink(dis:end,:); + DatiNTC3DCrackLink = DatiNTC3DCrackLink(dis:end,:); + DATini3DCrL = DATini3DCrL(dis:end,:); + [r,c] = size(Dati3DCrackLink); + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(dataini3DCrL)+1 < now + dataini3DCrL = datestr(datenum(dataini3DCrL)+1,'yyyy-mm-dd'); + break + else + yes3DCrL = 0; + end + end + end + end + end + if NAN == 1 + if DIS ~= 1 && yes3DCrL == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',Dati3DCrackLink(1,jj))); + idxT = find(strcmp('---',Dati3DCrackLink(1,jj))); + idxT2 = find(strcmp('-',Dati3DCrackLink(1,jj))); + idxE2 = find(strcmp('Err2',Dati3DCrackLink(1,jj))); + idxE255 = find(strcmp('Err255',Dati3DCrackLink(1,jj))); + idxD = find(strcmp('DMUXe',Dati3DCrackLink(1,jj))); + idxE1F = find(strcmp('Err1File',Dati3DCrackLink(1,jj))); + idxN = find(strcmp('null',Dati3DCrackLink(1,jj))); + idxRX = find(strcmp('No RX',Dati3DCrackLink(1,jj))); + idxI = find(strcmp('id Error',Dati3DCrackLink(1,jj))); + idxM = find(strcmp('MUX id Error',Dati3DCrackLink(1,jj))); + idxC = find(strcmp('CH n. Error',Dati3DCrackLink(1,jj))); + idxU = find(strcmp('Unknown Error',Dati3DCrackLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',Dati3DCrackLink(1,jj))); + idxNS = find(strcmp('NotSupp',Dati3DCrackLink(1,jj))); + idxU2 = find(strcmp('Unknown',Dati3DCrackLink(1,jj))); + idxNA = find(strcmp('NotAv',Dati3DCrackLink(1,jj))); + idxND = find(strcmp('No Data',Dati3DCrackLink(1,jj))); + idxCE = find(strcmp('CH n. Er',Dati3DCrackLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of 3D Crack Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZero3DCrL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(dataini3DCrL)+1 < now + dataini3DCrL = datestr(datenum(dataini3DCrL)+1,'yyyy-mm-dd'); + break + else + yes3DCrL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + dataini3DCrL = datestr(datenum(dataini3DCrL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + Dati3DCrackLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + Err3DCrackLink(1,jj) = 1; + wardat = 'Data of 3D Crack Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + dataini3DCrL = datestr(datenum(dataini3DCrL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',Dati3DCrackLink(:,jj))); + idxT = find(strcmp('---',Dati3DCrackLink(:,jj))); + idxT2 = find(strcmp('-',Dati3DCrackLink(:,jj))); + idxE2 = find(strcmp('Err2',Dati3DCrackLink(:,jj))); + idxE255 = find(strcmp('Err255',Dati3DCrackLink(:,jj))); + idxD = find(strcmp('DMUXe',Dati3DCrackLink(:,jj))); + idxE1F = find(strcmp('Err1File',Dati3DCrackLink(:,jj))); + idxN = find(strcmp('null',Dati3DCrackLink(:,jj))); + idxRX = find(strcmp('No RX',Dati3DCrackLink(:,jj))); + idxI = find(strcmp('id Error',Dati3DCrackLink(:,jj))); + idxM = find(strcmp('MUX id Error',Dati3DCrackLink(:,jj))); + idxC = find(strcmp('CH n. Error',Dati3DCrackLink(:,jj))); + idxU = find(strcmp('Unknown Error',Dati3DCrackLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',Dati3DCrackLink(:,jj))); + idxNS = find(strcmp('NotSupp',Dati3DCrackLink(:,jj))); + idxU2 = find(strcmp('Unknown',Dati3DCrackLink(:,jj))); + idxNA = find(strcmp('NotAv',Dati3DCrackLink(:,jj))); + idxND = find(strcmp('No Data',Dati3DCrackLink(:,jj))); + idxCE = find(strcmp('CH n. Er',Dati3DCrackLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + dataini3DCrL = datestr(datenum(dataini3DCrL)-1,'yyyy-mm-dd'); + break + else + Dati3DCrackLink(indice,jj) = Dati3DCrackLink(indice-1,jj); + Err3DCrackLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(Dati3DCrackLink(nnn,jj))); + if check == 1 + Dati3DCrackLink(nnn,jj) = Dati3DCrackLink(nnn-1,jj); + Err3DCrackLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of 3D Crack Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + Dati3DCrackLink = [DATini3DCrL str2double(Dati3DCrackLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if Dati3DCrackLink(a,1) == Dati3DCrackLink(a-1,1) + Dati3DCrackLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + end + + if ESCI == 0 + if sum(CrL3D_NTC(:,1))>0 + % NTC + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiNTC3DCrackLink); + Ncorr = 0; + ErrNTC3DCrackLink = zeros(r,c); + if NuovoZero3DCrL == 1 + if isfile(RawDataFile) == 1 + DatiRawNTC = csvread(RawDataFileNTC); + [rDR,cDR] = size(DatiRawNTC); + DatiRawNTC(:,1) = DatiRawNTC(:,1) + 730000; + RawDateNTC = find(DatiRawNTC(:,1)<=datenum(dataini3DCrL)); + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTC3DCrackLink(1,jj))); + idxT3 = find(strcmp('---',DatiNTC3DCrackLink(1,jj))); + idxT = find(strcmp('-',DatiNTC3DCrackLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiNTC3DCrackLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiNTC3DCrackLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiNTC3DCrackLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiNTC3DCrackLink(1,jj))); + idxN = find(strcmp('null',DatiNTC3DCrackLink(1,jj))); + idxRX = find(strcmp('No RX',DatiNTC3DCrackLink(1,jj))); + idxI = find(strcmp('id Error',DatiNTC3DCrackLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiNTC3DCrackLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiNTC3DCrackLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiNTC3DCrackLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTC3DCrackLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiNTC3DCrackLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiNTC3DCrackLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiNTC3DCrackLink(1,jj))); + idxND = find(strcmp('No Data',DatiNTC3DCrackLink(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiNTC3DCrackLink(1,jj))); + idx = union(idxE,idxT3); + idx = union(idx,idxND); + idx = union(idx,idxCE); + idx = union(idx,idxT); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of 3D Crack Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZero3DCrL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(dataini3DCrL)+1 < now + dataini3DCrL = datestr(datenum(dataini3DCrL)+1,'yyyy-mm-dd'); + break + else + yes3DCrL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + dataini3DCrL = datestr(datenum(dataini3DCrL)-1,'yyyy-mm-dd'); + break + else + Dati3DCrackLink(1,jj) = cellstr(num2str(DatiRaw(RawDateNTC(end),jj+1))); + Err3DCrackLink(1,jj) = 1; + wardat = 'Data of 3D Crack Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTC3DCrackLink(:,jj))); + idxT3 = find(strcmp('---',DatiNTC3DCrackLink(:,jj))); + idxT = find(strcmp('-',DatiNTC3DCrackLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiNTC3DCrackLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiNTC3DCrackLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiNTC3DCrackLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiNTC3DCrackLink(:,jj))); + idxN = find(strcmp('null',DatiNTC3DCrackLink(:,jj))); + idxRX = find(strcmp('No RX',DatiNTC3DCrackLink(:,jj))); + idxI = find(strcmp('id Error',DatiNTC3DCrackLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiNTC3DCrackLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiNTC3DCrackLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiNTC3DCrackLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTC3DCrackLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiNTC3DCrackLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiNTC3DCrackLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiNTC3DCrackLink(:,jj))); + idxND = find(strcmp('No Data',DatiNTC3DCrackLink(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiNTC3DCrackLink(:,jj))); + idx = union(idxE,idxT3); + idx = union(idx,idxND); + idx = union(idx,idxCE); + idx = union(idx,idxT); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + dataini3DCrL = datestr(datenum(dataini3DCrL)-1,'yyyy-mm-dd'); + else + DatiNTC3DCrackLink(indice,jj) = DatiNTC3DCrackLink(indice-1,jj); + ErrNTC3DCrackLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiNTC3DCrackLink(nnn,jj))); + if check == 1 + DatiNTC3DCrackLink(nnn,jj) = DatiNTC3DCrackLink(nnn-1,jj); + ErrNTC3DCrackLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of NTC of 3D Crack Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiNTC3DCrackLink = [DATini3DCrL str2double(DatiNTC3DCrackLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiNTC3DCrackLink(a,1) == DatiNTC3DCrackLink(a-1,1) + DatiNTC3DCrackLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + else + ErrNTC3DCrackLink = 0; + end + end + end + if NuovoZero3DCrL == 1 && yes3DCrL == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=Dati3DCrackLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(Dati3DCrackLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(Dati3DCrackLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);Dati3DCrackLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = Dati3DCrackLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)0 + [rDR,cDR] = size(DatiRawNTC); + if rDR~=1 && cDR~=1 && isempty(DatiRawNTC) == 0 + RawDate1 = find(DatiRawNTC(:,1)<=DatiNTC3DCrackLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiNTC3DCrackLink(:,1)>DatiRawNTC(end,1)); + else + RawDate2 = find(DatiNTC3DCrackLink(:,1)>DatiRawNTC(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + DatiNTC = [DatiRawNTC(1:RawDate1(end),:);DatiNTC3DCrackLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + DatiNTC = DatiNTC3DCrackLink; + else + DatiNTC = DatiRawNTC; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(DatiNTC(:,1)0 + DatiNTC = DatiNTC3DCrackLink; + end + end + Dati(:,1) = Dati(:,1) - 730000; + csvwrite(RawDataFile,Dati); + if sum(CrL3D_NTC(:,1))>0 + DatiNTC(:,1) = DatiNTC(:,1) - 730000; + csvwrite(RawDataFileNTC,DatiNTC); + end +end + +%% 2D Crack Link +if yes2DCrL == 0 % Non ci sono 2D Crack Link + Dati2DCrackLink = []; + DatiNTC2DCrackLink = []; + Err2DCrackLink = []; + ErrNTC2DCrackLink = []; + Ch2DCrL = []; + CrL2D_NTC = []; + wardat = 'lettura function: there are not 2D Crack Link'; + fprintf(fileID,fmt,wardat); +else + RawDataFile = ['' IDcentralina '-' DTcatena '-2DCrack-RawData.csv']; % Specifico per 2D Crack Link + RawDataFileNTC = ['' IDcentralina '-' DTcatena '-2DCrackNTC-RawData.csv']; % Specifico per 2D Crack Link + Ch2DCrL = cell2mat(Nodo2DCrackLink(:,4)); + CrL2D_NTC = cell2mat(Nodo2DCrackLink(:,5)); + NAN = 0; + DIS = 0; + while NAN == 0 + if datenum(dataini2DCrL) == datenum(Data(1,1)) + tempoini2DCrL = char(Data(1,2)); + end + NodeType = '2D Crack Link'; + NodeNum2DCrL = num2str(cell2mat(Nodo2DCrackLink(1,2))); % scarico i dati del primo nodo + % Scarico dei dati relativi alla centralina con informazioni di Data e ora, livello batteria e temperatura + % Step 1 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date = ''' ... + dataini2DCrL ''' and Time >= ''' tempoini2DCrL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNum2DCrL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATini2DCrL = curs.Data; + Ntempo = DATini2DCrL; + [r,c] = size(DATini2DCrL); + salto2DCrL = 0; + if r==1 && c==1 + textdat2DCrL = 'Warning: error reading 2D Crack Link (control unit data)!'; + fprintf(fileID,fmt,textdat2DCrL); + salto2DCrL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + dataini2DCrL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNum2DCrL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT22DCrL = curs.Data; + Ndate = DAT22DCrL; + if salto2DCrL == 1 + DATini2DCrL = DAT22DCrL; + end + Check = size(DAT22DCrL); + if Check(1,2) > 1 % ho superato il primo giorno + if salto2DCrL == 0 + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + DATini2DCrL = [DATini2DCrL; DAT22DCrL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATini2DCrL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATini2DCrL(:,1)) repmat(' ', [rD,1]) cell2mat(DATini2DCrL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATini2DCrL = T; + else + DATini2DCrL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + if salto2DCrL == 0 + % creo la matrice per i dati 2D Crack Link + if Check(1,2) > 1 + Dati2DCrackLink = cell(rd+rt,2*r2DCrL); + DatiNTC2DCrackLink = cell(rd+rt,r2DCrL); + else + Dati2DCrackLink = cell(rt,2*r2DCrL); + DatiNTC2DCrackLink = cell(rt,r2DCrL); + end + else + Dati2DCrackLink = cell(rd,2*r2DCrL); + DatiNTC2DCrackLink = cell(rd,r2DCrL); + end + col = 1; + ii = 1; + w = 0; + N2DCrackLink = cell2mat(Nodo2DCrackLink(:,2)); + Ch2DCrL = cell2mat(Ch2DCrL); + while ii <= r2DCrL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = N2DCrackLink(ii,1); + nNodo = num2str(nN); + if Ch2DCrL(ii,1) == 2 || Ch2DCrL(ii,1) == 3 + comando = ['select Val0, Val1 from RawDataView where Date = ''' ... + dataini2DCrL ''' and Time >= ''' tempoini2DCrL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo2DCrL = curs.Data; + comando = ['select Val0, Val1 from RawDataView where Date > ''' ... + dataini2DCrL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo2DCrLd = curs.Data; + if Ch2DCrL(ii,1) == 3 % Termometro + comando = ['select Val2 from RawDataView where Date = ''' ... + dataini2DCrL ''' and Time >= ''' tempoini2DCrL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo2DCrL_NTC = curs.Data; + comando = ['select Val2 from RawDataView where Date > ''' ... + dataini2DCrL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo2DCrL_NTCd = curs.Data; + else + DATnodo2DCrL_NTC = 0; + DATnodo2DCrL_NTCd = 0; + end + elseif Ch2DCrL(ii,1) >= 4 + comando = ['select Val0, Val2 from RawDataView where Date = ''' ... + dataini32CrL ''' and Time >= ''' tempoini2DCrL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo2DCrL = curs.Data; + comando = ['select Val0, Val2 from RawDataView where Date > ''' ... + dataini2DCrL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo2DCrLd = curs.Data; + DATnodo2DCrL_NTC = 0; + DATnodo2DCrL_NTCd = 0; + end + + % Concateno i dati relativi a Step 1 e 2 per il nodo ii-esimo. + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + [rn,~] = size(DATnodo2DCrLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodo2DCrLd(i,:) = DATnodo2DCrLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node 2D Crack Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + [rn,~] = size(DATnodo2DCrL_NTCd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodo2DCrL_NTCd(i,:) = DATnodo2DCrL_NTCd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['NTC of Node 2D Crack Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if salto2DCrL == 0 + if Ch2DCrL(ii,1) == 3 + if CrL2D_NTC(ii,1) == 1 + Dati2DCrackLink(1:rt,col:col+1) = DATnodo2DCrL; %#ok<*AGROW> + Dati2DCrackLink_NTC(1:rt,ii) = DATnodo2DCrL_NTC; %#ok<*AGROW> + if Check(1,2) > 1 + Dati2DCrackLink(rt+1:rt+rd,col:col+1) = DATnodo2DCrLd; + Dati2DCrackLink_NTC(rt+1:rt+rd,ii) = DATnodo2DCrL_NTCd; %#ok<*AGROW> + end + else + Dati2DCrackLink(1:rt,col:col+1) = DATnodo2DCrL; %#ok<*AGROW> + if Check(1,2) > 1 + Dati2DCrackLink(rt+1:rt+rd,col:col+1) = DATnodo3DCrLd; + end + end + elseif Ch3DCrL(ii,1) == 2 || Ch3DCrL(ii,1) >= 4 + Dati2DCrackLink(1:rt,col:col+1) = DATnodo2DCrL; %#ok<*AGROW> + if Check(1,2) > 1 + Dati2DCrackLink(rt+1:rt+rd,col:col+1) = DATnodo2DCrLd; + end + end + else + if Ch2DCrL(ii,1) == 3 + if CrL2D_NTC(ii,1)==1 + Dati2DCrackLink(1:rd,col:col+1) = DATnodo2DCrL; %#ok<*AGROW> + Dati2DCrackLink_NTC(1:rd,ii) = DATnodo2DCrL_NTC; %#ok<*AGROW> + else + Dati2DCrackLink(1:rd,col:col+1) = DATnodo2DCrL; %#ok<*AGROW> + end + elseif Ch2DCrL(ii,1) == 1 + Dati2DCrackLink(1:rd,col:col+1) = DATnodo2DCrL; %#ok<*AGROW> + end + end + + okdat2DCrL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(r2DCrL) ' 2D Crack Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdat2DCrL); + ii = ii+1; + col = col+2; + end + if w == 0 + wardat = 'There are not warning for 2D Crack Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(Dati2DCrackLink); + Err2DCrackLink = zeros(r,c); + Ncorr = 0; + NAN = 1; + ESCI = 0; + if NuovoZero2DCrL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(dataini2DCrL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + for jj=1:c + % Se il nodo è Dis., devo aumentare di uno la data (il nodo non + % è ancora stato installato!) + if strcmp('Dis.',Dati2DCrackLink(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',Dati2DCrackLink(dis,jj)) == 0 + Dati2DCrackLink = Dati2DCrackLink(dis:end,:); + DatiNTC2DCrackLink = DatiNTC2DCrackLink(dis:end,:); + DATini2DCrL = DATini2DCrL(dis:end,:); + [r,c] = size(Dati2DCrackLink); + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(dataini2DCrL)+1 < now + dataini2DCrL = datestr(datenum(dataini2DCrL)+1,'yyyy-mm-dd'); + break + else + yes2DCrL = 0; + end + end + end + end + end + if NAN == 1 + if DIS ~= 1 && yes2DCrL == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',Dati2DCrackLink(1,jj))); + idxT = find(strcmp('---',Dati2DCrackLink(1,jj))); + idxT2 = find(strcmp('-',Dati2DCrackLink(1,jj))); + idxE2 = find(strcmp('Err2',Dati2DCrackLink(1,jj))); + idxE255 = find(strcmp('Err255',Dati2DCrackLink(1,jj))); + idxD = find(strcmp('DMUXe',Dati2DCrackLink(1,jj))); + idxE1F = find(strcmp('Err1File',Dati2DCrackLink(1,jj))); + idxN = find(strcmp('null',Dati2DCrackLink(1,jj))); + idxRX = find(strcmp('No RX',Dati2DCrackLink(1,jj))); + idxI = find(strcmp('id Error',Dati2DCrackLink(1,jj))); + idxM = find(strcmp('MUX id Error',Dati2DCrackLink(1,jj))); + idxC = find(strcmp('CH n. Error',Dati2DCrackLink(1,jj))); + idxU = find(strcmp('Unknown Error',Dati2DCrackLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',Dati2DCrackLink(1,jj))); + idxNS = find(strcmp('NotSupp',Dati2DCrackLink(1,jj))); + idxU2 = find(strcmp('Unknown',Dati2DCrackLink(1,jj))); + idxNA = find(strcmp('NotAv',Dati2DCrackLink(1,jj))); + idxND = find(strcmp('No Data',Dati2DCrackLink(1,jj))); + idxCE = find(strcmp('CH n. Er',Dati2DCrackLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of 2D Crack Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZero2DCrL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(dataini2DCrL)+1 < now + dataini2DCrL = datestr(datenum(dataini2DCrL)+1,'yyyy-mm-dd'); + break + else + yes2DCrL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + dataini2DCrL = datestr(datenum(dataini2DCrL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + Dati2DCrackLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + Err2DCrackLink(1,jj) = 1; + wardat = 'Data of 2D Crack Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + dataini2DCrL = datestr(datenum(dataini2DCrL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',Dati2DCrackLink(:,jj))); + idxT = find(strcmp('---',Dati2DCrackLink(:,jj))); + idxT2 = find(strcmp('-',Dati2DCrackLink(:,jj))); + idxE2 = find(strcmp('Err2',Dati2DCrackLink(:,jj))); + idxE255 = find(strcmp('Err255',Dati2DCrackLink(:,jj))); + idxD = find(strcmp('DMUXe',Dati2DCrackLink(:,jj))); + idxE1F = find(strcmp('Err1File',Dati2DCrackLink(:,jj))); + idxN = find(strcmp('null',Dati2DCrackLink(:,jj))); + idxRX = find(strcmp('No RX',Dati2DCrackLink(:,jj))); + idxI = find(strcmp('id Error',Dati2DCrackLink(:,jj))); + idxM = find(strcmp('MUX id Error',Dati2DCrackLink(:,jj))); + idxC = find(strcmp('CH n. Error',Dati2DCrackLink(:,jj))); + idxU = find(strcmp('Unknown Error',Dati2DCrackLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',Dati2DCrackLink(:,jj))); + idxNS = find(strcmp('NotSupp',Dati2DCrackLink(:,jj))); + idxU2 = find(strcmp('Unknown',Dati2DCrackLink(:,jj))); + idxNA = find(strcmp('NotAv',Dati2DCrackLink(:,jj))); + idxND = find(strcmp('No Data',Dati2DCrackLink(:,jj))); + idxCE = find(strcmp('CH n. Er',Dati2DCrackLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + dataini2DCrL = datestr(datenum(dataini2DCrL)-1,'yyyy-mm-dd'); + break + else + Dati2DCrackLink(indice,jj) = Dati2DCrackLink(indice-1,jj); + Err2DCrackLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(Dati2DCrackLink(nnn,jj))); + if check == 1 + Dati2DCrackLink(nnn,jj) = Dati2DCrackLink(nnn-1,jj); + Err2DCrackLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of 2D Crack Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + Dati2DCrackLink = [DATini2DCrL str2double(Dati2DCrackLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if Dati2DCrackLink(a,1) == Dati2DCrackLink(a-1,1) + Dati2DCrackLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + end + + if ESCI == 0 + if sum(CrL2D_NTC(:,1))>0 + % NTC + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiNTC2DCrackLink); + Ncorr = 0; + ErrNTC2DCrackLink = zeros(r,c); + if NuovoZero2DCrL == 1 + if isfile(RawDataFile) == 1 + DatiRawNTC = csvread(RawDataFileNTC); + [rDR,cDR] = size(DatiRawNTC); + DatiRawNTC(:,1) = DatiRawNTC(:,1) + 730000; + RawDateNTC = find(DatiRawNTC(:,1)<=datenum(dataini2DCrL)); + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTC2DCrackLink(1,jj))); + idxT3 = find(strcmp('---',DatiNTC2DCrackLink(1,jj))); + idxT = find(strcmp('-',DatiNTC2DCrackLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiNTC2DCrackLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiNTC2DCrackLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiNTC2DCrackLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiNTC2DCrackLink(1,jj))); + idxN = find(strcmp('null',DatiNTC2DCrackLink(1,jj))); + idxRX = find(strcmp('No RX',DatiNTC2DCrackLink(1,jj))); + idxI = find(strcmp('id Error',DatiNTC2DCrackLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiNTC2DCrackLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiNTC2DCrackLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiNTC2DCrackLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTC2DCrackLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiNTC2DCrackLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiNTC2DCrackLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiNTC2DCrackLink(1,jj))); + idxND = find(strcmp('No Data',DatiNTC2DCrackLink(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiNTC2DCrackLink(1,jj))); + idx = union(idxE,idxT3); + idx = union(idx,idxND); + idx = union(idx,idxCE); + idx = union(idx,idxT); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of 2D Crack Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZero2DCrL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(dataini2DCrL)+1 < now + dataini2DCrL = datestr(datenum(dataini2DCrL)+1,'yyyy-mm-dd'); + break + else + yes2DCrL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + dataini2DCrL = datestr(datenum(dataini2DCrL)-1,'yyyy-mm-dd'); + break + else + Dati2DCrackLink(1,jj) = cellstr(num2str(DatiRaw(RawDateNTC(end),jj+1))); + Err2DCrackLink(1,jj) = 1; + wardat = 'Data of 2D Crack Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTC2DCrackLink(:,jj))); + idxT3 = find(strcmp('---',DatiNTC2DCrackLink(:,jj))); + idxT = find(strcmp('-',DatiNTC2DCrackLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiNTC2DCrackLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiNTC2DCrackLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiNTC2DCrackLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiNTC2DCrackLink(:,jj))); + idxN = find(strcmp('null',DatiNTC2DCrackLink(:,jj))); + idxRX = find(strcmp('No RX',DatiNTC2DCrackLink(:,jj))); + idxI = find(strcmp('id Error',DatiNTC2DCrackLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiNTC2DCrackLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiNTC2DCrackLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiNTC2DCrackLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTC2DCrackLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiNTC2DCrackLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiNTC2DCrackLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiNTC2DCrackLink(:,jj))); + idxND = find(strcmp('No Data',DatiNTC2DCrackLink(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiNTC2DCrackLink(:,jj))); + idx = union(idxE,idxT3); + idx = union(idx,idxND); + idx = union(idx,idxCE); + idx = union(idx,idxT); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + dataini2DCrL = datestr(datenum(dataini2DCrL)-1,'yyyy-mm-dd'); + else + DatiNTC2DCrackLink(indice,jj) = DatiNTC2DCrackLink(indice-1,jj); + ErrNTC2DCrackLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiNTC2DCrackLink(nnn,jj))); + if check == 1 + DatiNTC2DCrackLink(nnn,jj) = DatiNTC2DCrackLink(nnn-1,jj); + ErrNTC2DCrackLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of NTC of 2D Crack Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiNTC2DCrackLink = [DATini2DCrL str2double(DatiNTC2DCrackLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiNTC2DCrackLink(a,1) == DatiNTC2DCrackLink(a-1,1) + DatiNTC2DCrackLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + else + ErrNTC2DCrackLink = 0; + end + end + end + if NuovoZero2DCrL == 1 && yes2DCrL == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=Dati2DCrackLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(Dati2DCrackLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(Dati2DCrackLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);Dati2DCrackLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = Dati2DCrackLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)0 + [rDR,cDR] = size(DatiRawNTC); + if rDR~=1 && cDR~=1 && isempty(DatiRawNTC) == 0 + RawDate1 = find(DatiRawNTC(:,1)<=DatiNTC2DCrackLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiNTC2DCrackLink(:,1)>DatiRawNTC(end,1)); + else + RawDate2 = find(DatiNTC2DCrackLink(:,1)>DatiRawNTC(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + DatiNTC = [DatiRawNTC(1:RawDate1(end),:);DatiNTC2DCrackLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + DatiNTC = DatiNTC2DCrackLink; + else + DatiNTC = DatiRawNTC; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(DatiNTC(:,1)0 + DatiNTC = DatiNTC2DCrackLink; + end + end + Dati(:,1) = Dati(:,1) - 730000; + csvwrite(RawDataFile,Dati); + if sum(CrL2D_NTC(:,1))>0 + DatiNTC(:,1) = DatiNTC(:,1) - 730000; + csvwrite(RawDataFileNTC,DatiNTC); + end +end + +%% Stress Meter +attiva_SM = zeros(1,rSM); +if yesSM == 0 % Non ci sono Stress Meter + DatiStressMeter = []; + DatiNTCStressMeter = []; + DatiStressMeter_Rif = []; + DatiNTCStressMeter_Rif = []; + ErrStressMeter = []; + ChSM = []; + SM_NTC = []; + wardat = 'lettura function: there are not Stress Meter'; + fprintf(fileID,fmt,wardat); +else + RawDataFile = ['' IDcentralina '-' DTcatena '-Stress-RawData.csv']; % Specifico per Stress Meter + RawDataFileNTC = ['' IDcentralina '-' DTcatena '-NTCStress-RawData.csv']; + ChSM = cell2mat(NodoStressMeter(:,4)); + SM_NTC = cell2mat(NodoStressMeter(:,5)); + NAN = 0; + DIS = 0; + while NAN == 0 + if datenum(datainiSM) == datenum(Data(1,1)) + tempoiniSM = char(Data(1,2)); + end + NodeType = 'Stress Meter'; + NodeNumSM = num2str(cell2mat(NodoStressMeter(1,2))); % scarico i dati del primo nodo + % Scarico dei dati relativi alla centralina con informazioni di Data e ora, livello batteria e temperatura + % Step 1 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date = ''' ... + datainiSM ''' and Time >= ''' tempoiniSM ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumSM ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniSM = curs.Data; + Ntempo = DATiniSM; + [r,c] = size(DATiniSM); + saltoSM = 0; + if r==1 && c==1 + textdatSM = 'Warning: error reading Stress Meter (control unit data)!'; + fprintf(fileID,fmt,textdatSM); + saltoSM = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiSM ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumSM ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2SM = curs.Data; + Ndate = DAT2SM; + if saltoSM == 1 + DATiniSM = DAT2SM; + end + Check = size(DAT2SM); + if Check(1,2) > 1 % ho superato il primo giorno + if saltoSM == 0 + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + DATiniSM = [DATiniSM; DAT2SM]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniSM); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniSM(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniSM(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniSM = T; + else + DATiniSM = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + % creo la matrice per i dati Extensometer Link + if saltoSM == 0 + if Check(1,2) > 1 + DatiStressMeter = cell(rd+rt,rSM); + DatiNTCStressMeter = cell(rd+rt,rSM); + else + DatiStressMeter = cell(rt,rSM); + DatiNTCStressMeter = cell(rt,rSM); + end + else + DatiStressMeter = cell(rd,rSM); + DatiNTCStressMeter = cell(rd,rSM); + end + DatiStressMeter_Rif = cell(150,rSM); + DatiNTCStressMeter_Rif = cell(150,rSM); + NStress = cell2mat(NodoStressMeter(:,2)); + col = 1; + ii = 1; + w = 0; + while ii <= rSM + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NStress(ii,1); + nNodo = num2str(nN); + % Dato + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiSM ''' and Time >= ''' tempoiniSM ''' and ToolNameID = ''' ... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoSM = curs.Data; + % Dato + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiSM ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = '''... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoSMd = curs.Data; + % Riferimento + comando = ['select Val0 from RawDataView where Date = ''' ... + datestr(Date_Rif_SM,'yyyy-mm-dd') ''' and Time >= ''' datestr(Date_Rif_SM,'HH:MM:SS')... + ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoSM_Rif = curs.Data; + if ChSM(ii,1) == 1 + % T + DATnodoSM_NTC = 0; + DATnodoSMd_NTC = 0; + elseif ChSM(ii,1) == 2 + if SM_NTC(ii,1)==1 + comando = ['select Val1 from RawDataView where Date = ''' ... + datainiSM ''' and Time >= ''' tempoiniSM ''' and ToolNameID = ''' ... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoSM_NTC = curs.Data; + % Dato + comando = ['select Val1 from RawDataView where Date > ''' ... + datainiSM ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = '''... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoSMd_NTC = curs.Data; + % Riferimento + comando = ['select Val1 from RawDataView where Date = ''' ... + datestr(Date_Rif_SM,'yyyy-mm-dd') ''' and Time >= ''' datestr(Date_Rif_SM,'HH:MM:SS')... + ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoNTCSM_Rif = curs.Data; + else + DATnodoSM_NTC = 0; + DATnodoSMd_NTC = 0; + end + end + + [rn,~] = size(DATnodoSMd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoSMd(i,:) = DATnodoSMd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Stress Meter ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + [rnT,~] = size(DATnodoSMd_NTC); % controllo date + if rnT < rd % normalmente sono uguali + for i = rnT+1:rd + DATnodoSMd_NTC(i,:) = DATnodoSMd_NTC(rnT,:); % se mancano dati, copio gli ultimi + end + wardat = ['NTC of Node Stress Meter ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoSM == 0 + if ChSM(ii,1) >= 2 + if SM_NTC(ii,1)==1 + DatiStressMeter(1:rt,col) = DATnodoSM(:,:); %#ok<*AGROW> + DatiNTCStressMeter(1:rt,col) = DATnodoSM_NTC(:,:); %#ok<*AGROW> + if Check(1,2) > 1 + [rrr,~] = size(DATnodoSMd); + if rrr ~= rd + DatiStressMeter(rt+rd-rrr+1:rt+rd,col) = DATnodoSMd; + DatiNTCStressMeter(rt+rd-rrr+1:rt+rd,col) = DATnodoSMd_NTC; %#ok<*AGROW> + else + DatiStressMeter(rt+1:rt+rd,col) = DATnodoSMd(:,:); + DatiNTCStressMeter(rt+1:rt+rd,col) = DATnodoSMd_NTC(:,:); %#ok<*AGROW> + end + end + else + DatiStressMeter(1:rt,col) = DATnodoSM(:,:); %#ok<*AGROW> + if Check(1,2) > 1 + DatiStressMeter(rt+1:rt+rd,col) = DATnodoSMd(:,:); + end + end + elseif ChSM(ii,1) == 1 + DatiStressMeter(1:rt,col) = DATnodoSM(:,:); %#ok<*AGROW> + if Check(1,2) > 1 + DatiStressMeter(rt+1:rt+rd,col) = DATnodoSMd(:,:); + end + end + else + if ChSM(ii,1) >= 2 + if SM_NTC(ii,1)==1 + DatiStressMeter(1:rd,col) = DATnodoSM(:,:); %#ok<*AGROW> + DatiNTCStressMeter(1:rd,col) = DATnodoSM_NTC(:,:); %#ok<*AGROW> + else + DatiStressMeter(1:rd,col) = DATnodoSM(:,:); %#ok<*AGROW> + end + elseif ChSM(ii,1) == 1 + DatiStressMeter(1:rd,col) = DATnodoSM(:,:); %#ok<*AGROW> + end + end + + % Riferimento + [dim,~] = size(DATnodoSM_Rif); % controllo date + DatiStressMeter_Rif(1:dim,col) = DATnodoSM_Rif; + if col == 1 + DatiStressMeter_Rif(dim+1:end,:) = []; + end + [dimT,~] = size(DATnodoNTCSM_Rif); % controllo date + DatiNTCStressMeter_Rif(1:dimT,col) = DATnodoNTCSM_Rif; + if col == 1 + DatiNTCStressMeter_Rif(dim+1:end,:) = []; + end + + okdatSM = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rSM) ' Stress Meter nodes downloaded correctly']; + fprintf(fileID,fmt,okdatSM); + ii = ii+1; + col = col+1; + end + if w == 0 + wardat = 'There are not warning for Stress Meter!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + + % Dati + [r,c] = size(DatiStressMeter); + ErrStressMeter = zeros(r,c); + Ncorr = 0; + ESCI = 0; + Rilancia = 0; + NAN = 1; + if NuovoZeroSM == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiSM)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + [dim,numS] = size(DatiStressMeter_Rif); + for SM = 1:numS + RIF = 0; + row = 1; + rompi = 0; + while RIF == 0 + if attiva_SM(1,SM) == 0 + if row <= dim + % Controllo la data di riferimento + idxE = find(strcmp('Err1',DatiStressMeter_Rif(row,SM))); + idxT = find(strcmp('---',DatiStressMeter_Rif(row,SM))); + idxE2 = find(strcmp('Err2',DatiStressMeter_Rif(row,SM))); + idxE255 = find(strcmp('Err255',DatiStressMeter_Rif(row,SM))); + idxD = find(strcmp('DMUXe',DatiStressMeter_Rif(row,SM))); + idxE1F = find(strcmp('Err1File',DatiStressMeter_Rif(row,SM))); + idxN = find(strcmp('null',DatiStressMeter_Rif(row,SM))); + idxRX = find(strcmp('No RX',DatiStressMeter_Rif(row,SM))); + idxI = find(strcmp('id Error',DatiStressMeter_Rif(row,SM))); + idxM = find(strcmp('MUX id Error',DatiStressMeter_Rif(row,SM))); + idxC = find(strcmp('CH n. Error',DatiStressMeter_Rif(row,SM))); + idxU = find(strcmp('Unknown Error',DatiStressMeter_Rif(row,SM))); + idxMC = find(strcmp('MsgCorrup',DatiStressMeter_Rif(row,SM))); + idxNS = find(strcmp('NotSupp',DatiStressMeter_Rif(row,SM))); + idxU2 = find(strcmp('Unknown',DatiStressMeter_Rif(row,SM))); + idxNA = find(strcmp('NotAv',DatiStressMeter_Rif(row,SM))); + idxDIS = find(strcmp('Dis.',DatiStressMeter_Rif(row,SM))); + idxND = find(strcmp('No Data',DatiStressMeter_Rif(row,SM))); + idxPP = find(strcmp('[]',DatiStressMeter_Rif(row,SM))); + idxCE = find(strcmp('CH n. Er',DatiStressMeter_Rif(row,SM))); + idx = union(idxE,idxT); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxDIS); + idx = union(idx,idxND); + idx = union(idx,idxPP); + [~,ri] = size(idx); + if isempty(idx) == 0 || isempty(cell2mat(DatiStressMeter_Rif(row,SM))) == 1 + if ri >= 1 % Se almeno uno è in errore, allora guardo la riga dopo + row = row+1; + else + RIF = 1; + if attiva_SM(1,SM) == 0 + DatiStress_Rif(1,SM) = DatiStressMeter_Rif(row,SM); + DatiNTCStress_Rif(1,SM) = str2double(DatiNTCStressMeter_Rif(row,SM)); + end + attiva_SM(1,SM) = 1; + end + else + RIF = 1; + if attiva_SM(1,SM) == 0 + DatiStress_Rif(1,SM) = DatiStressMeter_Rif(row,SM); + DatiNTCStress_Rif(1,SM) = str2double(DatiNTCStressMeter_Rif(row,SM)); + end + attiva_SM(1,SM) = 1; + end + else + Date_Rif_SM = floor(Date_Rif_SM)+1; + if Date_Rif_SM > now + Rilancia = 0; + RIF = 1; + DatiStress_Rif(1,SM) = num2cell(0); + DatiNTCStress_Rif(1,SM) = 0; + attiva_SM(1,SM) = 0; + else + RIF = 1; + NAN = 0; + Rilancia = 1; + end + rompi = 1; + end + else + break + end + end + if rompi == 1 + break + end + end + + if Rilancia == 0 + for jj=1:c + % Se il nodo è Dis., devo aumentare di uno la data (il nodo non + % è ancora stato installato!) + if strcmp('Dis.',DatiStressMeter(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',DatiStressMeter(dis,jj)) == 0 + DatiStressMeter = DatiStressMeter(dis:end,:); + DATiniSM = DATiniSM(dis:end,:); + [r,c] = size(DatiStressMeter); + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiSM)+1 < now + datainiSM = datestr(datenum(datainiSM)+1,'yyyy-mm-dd'); + break + else + yesSM = 0; + end + end + end + + end + end + if DIS ~= 1 && yesSM == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiStressMeter(1,jj))); + idxT = find(strcmp('---',DatiStressMeter(1,jj))); + idxT2 = find(strcmp('-',DatiStressMeter(1,jj))); + idxE2 = find(strcmp('Err2',DatiStressMeter(1,jj))); + idxE255 = find(strcmp('Err255',DatiStressMeter(1,jj))); + idxD = find(strcmp('DMUXe',DatiStressMeter(1,jj))); + idxE1F = find(strcmp('Err1File',DatiStressMeter(1,jj))); + idxN = find(strcmp('null',DatiStressMeter(1,jj))); + idxRX = find(strcmp('No RX',DatiStressMeter(1,jj))); + idxI = find(strcmp('id Error',DatiStressMeter(1,jj))); + idxM = find(strcmp('MUX id Error',DatiStressMeter(1,jj))); + idxC = find(strcmp('CH n. Error',DatiStressMeter(1,jj))); + idxU = find(strcmp('Unknown Error',DatiStressMeter(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiStressMeter(1,jj))); + idxNS = find(strcmp('NotSupp',DatiStressMeter(1,jj))); + idxU2 = find(strcmp('Unknown',DatiStressMeter(1,jj))); + idxNA = find(strcmp('NotAv',DatiStressMeter(1,jj))); + idxND = find(strcmp('No Data',DatiStressMeter(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Stress Meter nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroSM == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiSM)+1 < now + datainiSM = datestr(datenum(datainiSM)+1,'yyyy-mm-dd'); + break + else + yesSM = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiSM = datestr(datenum(datainiSM)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiStressMeter(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrStressMeter(1,jj) = 1; + wardat = 'Data of Stress Meter nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiSM = datestr(datenum(datainiSM)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiStressMeter(:,jj))); + idxT = find(strcmp('---',DatiStressMeter(:,jj))); + idxT2 = find(strcmp('-',DatiStressMeter(:,jj))); + idxE2 = find(strcmp('Err2',DatiStressMeter(:,jj))); + idxE255 = find(strcmp('Err255',DatiStressMeter(:,jj))); + idxD = find(strcmp('DMUXe',DatiStressMeter(:,jj))); + idxE1F = find(strcmp('Err1File',DatiStressMeter(:,jj))); + idxN = find(strcmp('null',DatiStressMeter(:,jj))); + idxRX = find(strcmp('No RX',DatiStressMeter(:,jj))); + idxI = find(strcmp('id Error',DatiStressMeter(:,jj))); + idxM = find(strcmp('MUX id Error',DatiStressMeter(:,jj))); + idxC = find(strcmp('CH n. Error',DatiStressMeter(:,jj))); + idxU = find(strcmp('Unknown Error',DatiStressMeter(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiStressMeter(:,jj))); + idxNS = find(strcmp('NotSupp',DatiStressMeter(:,jj))); + idxU2 = find(strcmp('Unknown',DatiStressMeter(:,jj))); + idxNA = find(strcmp('NotAv',DatiStressMeter(:,jj))); + idxND = find(strcmp('No Data',DatiStressMeter(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiSM = datestr(datenum(datainiSM)-1,'yyyy-mm-dd'); + break + else + DatiStressMeter(indice,jj) = DatiStressMeter(indice-1,jj); + ErrStressMeter(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiStressMeter(nnn,jj))); + if check == 1 + DatiStressMeter(nnn,jj) = DatiStressMeter(nnn-1,jj); + ErrStressMeter(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Stress Meter data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiStressMeter = [DATiniSM str2double(DatiStressMeter)]; + DatiStress_Rif = str2double(DatiStress_Rif); + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiStressMeter(a,1) == DatiStressMeter(a-1,1) + DatiStressMeter(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + + if ESCI == 0 + if sum(SM_NTC(:,1))>0 + if DIS ~= 1 && yesSM == 1 + % NTC + [r,c] = size(DatiNTCStressMeter); + Ncorr = 0; + if NuovoZeroSM == 1 + if isfile(RawDataFile) == 1 + DatiRawNTC = csvread(RawDataFileNTC); + [rDR,cDR] = size(DatiRawNTC); + DatiRawNTC(:,1) = DatiRawNTC(:,1) + 730000; + RawDateNTC = find(DatiRawNTC(:,1)<=datenum(datainiSM)); + else + rDR = 1; + cDR = 1; + DatiRawNTC = []; + RawDateNTC = []; + end + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTCStressMeter(1,jj))); + idxND = find(strcmp('No Data',DatiNTCStressMeter(1,jj))); + idxT3 = find(strcmp('---',DatiNTCStressMeter(1,jj))); + idxT = find(strcmp('-',DatiNTCStressMeter(1,jj))); + idxE2 = find(strcmp('Err2',DatiNTCStressMeter(1,jj))); + idxE255 = find(strcmp('Err255',DatiNTCStressMeter(1,jj))); + idxD = find(strcmp('DMUXe',DatiNTCStressMeter(1,jj))); + idxE1F = find(strcmp('Err1File',DatiNTCStressMeter(1,jj))); + idxN = find(strcmp('null',DatiNTCStressMeter(1,jj))); + idxRX = find(strcmp('No RX',DatiNTCStressMeter(1,jj))); + idxI = find(strcmp('id Error',DatiNTCStressMeter(1,jj))); + idxM = find(strcmp('MUX id Error',DatiNTCStressMeter(1,jj))); + idxC = find(strcmp('CH n. Error',DatiNTCStressMeter(1,jj))); + idxU = find(strcmp('Unknown Error',DatiNTCStressMeter(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTCStressMeter(1,jj))); + idxNS = find(strcmp('NotSupp',DatiNTCStressMeter(1,jj))); + idxU2 = find(strcmp('Unknown',DatiNTCStressMeter(1,jj))); + idxNA = find(strcmp('NotAv',DatiNTCStressMeter(1,jj))); + idx = union(idxE,idxT3); + idx = union(idx,idxT); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of NTC of Stress Meter nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroSM == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiSM)+1 < now + datainiSM = datestr(datenum(datainiSM)+1,'yyyy-mm-dd'); + break + else + yesSM = 0; + end + else + if isempty(RawDateNTC) == 1 + NAN = 0; + ESCI = 1; + datainiSM = datestr(datenum(datainiSM)-1,'yyyy-mm-dd'); + break + else + DatiNTCStressMeter(1,jj) = cellstr(num2str(DatiRawNTC(RawDateNTC(end),jj+1))); + if ErrStressMeter(indice,jj) == 0 + ErrStressMeter(indice,jj) = 0.5; + else + ErrStressMeter(indice,jj) = 1; + end + wardat = 'Data of NTC of Stress Meter nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTCStressMeter(:,jj))); + idxND = find(strcmp('No Data',DatiNTCStressMeter(:,jj))); + idxT3 = find(strcmp('---',DatiNTCStressMeter(:,jj))); + idxT = find(strcmp('-',DatiNTCStressMeter(:,jj))); + idxE2 = find(strcmp('Err2',DatiNTCStressMeter(:,jj))); + idxE255 = find(strcmp('Err255',DatiNTCStressMeter(:,jj))); + idxD = find(strcmp('DMUXe',DatiNTCStressMeter(:,jj))); + idxE1F = find(strcmp('Err1File',DatiNTCStressMeter(:,jj))); + idxN = find(strcmp('null',DatiNTCStressMeter(:,jj))); + idxRX = find(strcmp('No RX',DatiNTCStressMeter(:,jj))); + idxI = find(strcmp('id Error',DatiNTCStressMeter(:,jj))); + idxM = find(strcmp('MUX id Error',DatiNTCStressMeter(:,jj))); + idxC = find(strcmp('CH n. Error',DatiNTCStressMeter(:,jj))); + idxU = find(strcmp('Unknown Error',DatiNTCStressMeter(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTCStressMeter(:,jj))); + idxNS = find(strcmp('NotSupp',DatiNTCStressMeter(:,jj))); + idxU2 = find(strcmp('Unknown',DatiNTCStressMeter(:,jj))); + idxNA = find(strcmp('NotAv',DatiNTCStressMeter(:,jj))); + idx = union(idxE,idxT3); + idx = union(idx,idxND); + idx = union(idx,idxT); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiSM = datestr(datenum(datainiSM)-1,'yyyy-mm-dd'); + break + else + DatiNTCStressMeter(indice,jj) = DatiNTCStressMeter(indice-1,jj); + if ErrStressMeter(indice,jj) == 0 + ErrStressMeter(indice,jj) = 0.5; + else + ErrStressMeter(indice,jj) = 1; + end + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiNTCStressMeter(nnn,jj))); + if check == 1 + DatiNTCStressMeter(nnn,jj) = DatiNTCStressMeter(nnn-1,jj); + if ErrStressMeter(indice,jj) == 0 + ErrStressMeter(indice,jj) = 0.5; + else + ErrStressMeter(indice,jj) = 1; + end + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of NTC Stress Meter data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiNTCStressMeter = [DATiniSM str2double(DatiNTCStressMeter)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiNTCStressMeter(a,1) == DatiNTCStressMeter(a-1,1) + DatiNTCStressMeter(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + end + end + end + if NuovoZeroSM == 1 && yesSM == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiStressMeter(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiStressMeter(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiStressMeter(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiStressMeter(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiStressMeter; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)0 + [rDR,cDR] = size(DatiRawNTC); + if rDR~=1 && cDR~=1 && isempty(DatiRawNTC) == 0 + RawDate1 = find(DatiRawNTC(:,1)<=DatiNTCStressMeter(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiNTCStressMeter(:,1)>DatiRawNTC(end,1)); + else + RawDate2 = find(DatiNTCStressMeter(:,1)>DatiRawNTC(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + DatiNTC = [DatiRawNTC(1:RawDate1(end),:);DatiNTCStressMeter(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + DatiNTC = DatiNTCStressMeter; + else + DatiNTC = DatiRawNTC; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(DatiNTC(:,1)0 + DatiNTC = DatiNTCStressMeter; + end + end + Dati(:,1) = Dati(:,1) - 730000; + csvwrite(RawDataFile,Dati); + if sum(SM_NTC(:,1))>0 + DatiNTC(:,1) = DatiNTC(:,1) - 730000; + csvwrite(RawDataFileNTC,DatiNTC); + end + DatiStressMeter_Rif = DatiStress_Rif; + DatiNTCStressMeter_Rif = DatiNTCStress_Rif; +end + +corrdat = 'lettura function executed'; +fprintf(fileID,fmt,corrdat); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/letturaCal.m b/ATD/letturaCal.m new file mode 100755 index 0000000..3ecb8b0 --- /dev/null +++ b/ATD/letturaCal.m @@ -0,0 +1,740 @@ +% Funzione che legge i valori di calibrazione per i vari sensori + +function [DCalTuLTot,DCalRLTot,DCalTLHTot,DCalTLHRHTot,DCalPCLTot,DCalPCLHRTot,... + DCalPLTot,DCalLLTot,DCalELTot,DCalEL3DTot,DCalWELTot,DCalMPBELTot,... + DCalALTot,DCalCrLTot,DCal3DCrLTot,DCal2DCrLTot,DCalSMTot,yesTuL,yesRL,yesTLH,yesTLHRH,... + yesPCL,yesPCLHR,yesPL,yesLL,yesEL,yes3DEL,yesWEL,yesMPBEL,yesCrL,yes3DCrL,yes2DCrL,... + yesAL,yesSM] = letturaCal(IDcentralina,DTcatena,catena,rTuL,rRL,rTLH,rTLHRH,... + rPCL,rPCLHR,rPrL,rLL,rEL,r3DEL,rWEL,rMPBEL,NumBasi,rAL,rCrL,r3DCrL,r2DCrL,rSM,... + NodoTunnelLink,NodoRadialLink,NodoTiltLinkH,NodoPreConvLink,NodoPressureLink,... + NodoLoadLink,NodoExtensometerLink,Nodo3DExtensometerLink,... + NodoWireExtensometerLink,NodoMultiPointRodExtensometer,NodoAnalogLink,... + NodoCrackLink,Nodo3DCrackLink,Nodo2DCrackLink,NodoStressMeter,yesTuL,yesRL,yesTLH,yesTLHRH,... + yesPCL,yesPCLHR,yesPL,yesLL,yesEL,yes3DEL,yesWEL,yesMPBEL,yesAL,yesCrL,yes3DCrL,yes2DCrL,... + yesSM,conn,FileName) + +% Apro file di testo +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'letturaCal function started'; +fprintf(fileID,fmt,text); + +% Inizializzo le matrici +[rC,~] = size(catena); +idNodo = cell2mat(catena(:,1)); + +% Tunnel Link +if isempty(NodoTunnelLink) == 1 + DCalTuLTot = []; +else + if strcmp(NodoTunnelLink(1,4),'ADC') || strcmp(NodoTunnelLink{1,4},'null') || isempty(NodoTunnelLink{1,4}) == 1 + DCalTuLTot = cell(rTuL,11); + elseif strcmp(NodoTunnelLink(1,4),'g') + DCalTuLTot = []; + end +end + +% Radial Link +if isempty(NodoRadialLink) == 1 + DCalRLTot = []; +else + if strcmp(NodoRadialLink(1,4),'ADC') || strcmp(NodoRadialLink{1,4},'null') || isempty(NodoRadialLink{1,4}) == 1 + DCalRLTot = cell(rRL,11); + elseif strcmp(NodoRadialLink(1,4),'g') + DCalRLTot = []; + end +end + +% Tilt Link H +if isempty(NodoTiltLinkH) == 1 + DCalTLHTot = []; +else + if strcmp(NodoTiltLinkH(1,4),'ADC') || strcmp(NodoTiltLinkH{1,4},'null') || isempty(NodoTiltLinkH{1,4}) == 1 + DCalTLHTot = cell(rTLH,11); + elseif strcmp(NodoTiltLinkH(1,4),'Gradi') || strcmp(NodoTiltLinkH(1,4),'g') + DCalTLHTot = []; + end +end + +% Tilt Link HR H +DCalTLHRHTot = cell(rTLHRH,4); % matrice che concatena i dati di calibrazione relativi a ciascun nodo Tilt Link HR H + +% PreConv Link +if isempty(NodoPreConvLink) == 1 + DCalPCLTot = []; +else + if strcmp(NodoPreConvLink(1,4),'ADC') || strcmp(NodoPreConvLink{1,4},'null') || isempty(NodoPreConvLink{1,4}) == 1 + DCalPCLTot = cell(rPCL,11); + elseif strcmp(NodoPreConvLink(1,4),'g') + DCalPCLTot = []; + end +end + +% PreConv Link HR +DCalPCLHRTot = cell(rPCLHR,4); % matrice che concatena i dati di calibrazione relativi a ciascun nodo PreConv Link HR + +% Pressure Link +x = isempty(NodoPressureLink); +if x == 0 + for P = 1:rPrL + if strcmp(NodoPressureLink(P,3),'4-20 mA') + DCalPLTot = cell(rPrL,3); % matrice che concatena i dati relativi a ciascun nodo Pressure Link + break + elseif strcmp(NodoPressureLink(P,3),'mV/V') + DCalPLTot = cell(rPrL,2); % matrice che concatena i dati relativi a ciascun nodo Pressure Link + end + end +else + DCalPLTot = []; +end + +% Load Link +x = isempty(NodoLoadLink); +if x == 0 + for P = 1:rLL + if strcmp(NodoLoadLink(P,3),'4-20 mA') + DCalLLTot = cell(rLL,3); % matrice che concatena i dati relativi a ciascun nodo Load Link + break + elseif strcmp(NodoLoadLink(P,3),'mV/V') || strcmp(NodoLoadLink(P,3),'ADC') + DCalLLTot = cell(rLL,2); % matrice che concatena i dati relativi a ciascun nodo Load Link + end + end +else + DCalLLTot = []; +end + +% Extensometer Link +x = isempty(NodoExtensometerLink); +if x == 0 + for P = 1:rEL + if strcmp(NodoExtensometerLink(P,3),'4-20 mA') + DCalELTot = cell(rEL,4); + break + elseif strcmp(NodoExtensometerLink(P,3),'mV/V') || strcmp(NodoExtensometerLink(P,3),'Hz') + DCalELTot = cell(rEL,3); + end + end +else + DCalELTot = []; +end + +% 3D Extensometer Link +x = isempty(Nodo3DExtensometerLink); +if x == 0 + for P = 1:r3DEL + if strcmp(Nodo3DExtensometerLink(P,3),'4-20 mA') + DCalEL3DTot = cell(rEL,9); + break + elseif strcmp(Nodo3DExtensometerLink(P,3),'mV/V') || strcmp(Nodo3DExtensometerLink(P,3),'Hz') + DCalEL3DTot = cell(r3DEL,6); + end + end +else + DCalEL3DTot = []; +end + +% Wire Extensometer Link +x = isempty(NodoWireExtensometerLink); +if x == 0 + for P = 1:rWEL + if strcmp(NodoWireExtensometerLink(P,3),'4-20 mA') + DCalWELTot = cell(rWEL,3); + break + elseif strcmp(NodoWireExtensometerLink(P,3),'mV/V') || strcmp(NodoWireExtensometerLink(P,3),'Hz') + DCalWELTot = cell(rWEL,2); + end + end +else + DCalWELTot = []; +end + +% Estensimetri multibase +x = isempty(NodoMultiPointRodExtensometer); +if x == 0 + for P = 1:rMPBEL + if strcmp(NodoMultiPointRodExtensometer(P,3),'mV/V') + DCalMPBELTot = cell(rMPBEL,NumBasi); % matrice che concatena i dati relativi a ciascun nodo Multi Point Borehole Extensometer Link + break + end + end +else + DCalMPBELTot = []; +end + +% Analog Link +DCalALTot = cell(rAL,3); % matrice che concatena i dati relativi a ciascun nodo Analog Link + +% Crack Link +x = isempty(NodoCrackLink); +if x == 0 + for P = 1:rCrL + if strcmp(NodoCrackLink(P,3),'Hz') || strcmp(NodoCrackLink(P,3),'4-20 mA')||strcmp(NodoCrackLink(P,3),'Hz mm') + DCalCrLTot = cell(rCrL,3); % matrice che concatena i dati relativi a ciascun nodo Crack Link + elseif strcmp(NodoCrackLink(P,3),'mV/V') + DCalCrLTot = cell(rCrL,2); % matrice che concatena i dati relativi a ciascun nodo Crack Link + end + end +else + DCalCrLTot = []; +end + +% 3D Crack Link +x = isempty(Nodo3DCrackLink); +if x == 0 + for P = 1:r3DCrL + if strcmp(Nodo3DCrackLink(P,3),'Hz') || strcmp(Nodo3DCrackLink(P,3),'4-20 mA') + DCal3DCrLTot = cell(r3DCrL,9); % matrice che concatena i dati relativi a ciascun nodo 3D Crack Link + elseif strcmp(Nodo3DCrackLink(P,3),'mV/V') + DCal3DCrLTot = cell(r3DCrL,6); % matrice che concatena i dati relativi a ciascun nodo 3D Crack Link + end + end +else + DCal3DCrLTot = []; +end + +% 2D Crack Link +x = isempty(Nodo2DCrackLink); +if x == 0 + for P = 1:r2DCrL + if strcmp(Nodo2DCrackLink(P,3),'Hz') || strcmp(Nodo2DCrackLink(P,3),'4-20 mA') + DCal2DCrLTot = cell(r2DCrL,6); % matrice che concatena i dati relativi a ciascun nodo 2D Crack Link + elseif strcmp(Nodo2DCrackLink(P,3),'mV/V') + DCal2DCrLTot = cell(r2DCrL,4); % matrice che concatena i dati relativi a ciascun nodo 2D Crack Link + end + end +else + DCal2DCrLTot = []; +end + +% Stress Meter +x = isempty(NodoStressMeter); +if x == 0 + for P = 1:rSM + if strcmp(NodoStressMeter(P,3),'Hz') + DCalSMTot = cell(rSM,1); % matrice che concatena i dati relativi a ciascun nodo Stress Meter + end + end +else + DCalSMTot = []; +end + +%% Contatori +% Matrice con testi di conferma lettura o warning di lettura per le varie tipologie di nodi +TuL = 1; % Tunnel Link +RL = 1; % Radial Link +TLH = 1; % Tilt Link H +TLHRH = 1; % Tilt Link HR H +PCL = 1; % PreConv Link +PCLHR = 1; % PreConv Link HR +PL = 1; % Pressure Link +LL = 1; % Load Link +EL = 1; % Extensometer Link +EL3D = 1; % 3D Extensometer Link +WEL = 1; % Wire Extensometer Link +MPBEL = 1; % Multi Point Borehole Extensometer Link +AL = 1; % Analog Link +CrL = 1; % Crack Link +CrL3D = 1; % 3D Crack Link +CrL2D = 1; % 2D Crack Link +SM = 1; % Stress Meter + +for a = 1:rC + nNodo = mat2str(cell2mat(catena(a,3))); + + if idNodo(a,1) == 17 % Tunnel Link + if strcmp(NodoTunnelLink(1,4),'ADC') || strcmp(NodoTunnelLink{1,4},'null') || isempty(NodoTunnelLink{1,4}) == 1 + %% Tunnel link + comando = ['select Cal0, Cal1, Cal2, Cal3, Cal4, Cal5, Cal6, Cal7, Cal8, CalA, CalB from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo '''']; + curs = exec(conn,comando); + curs = fetch(curs); + DCalTuL = curs.Data; % matrice che raccoglie i dati del nodo numero 'a' di tipo Tunnel Link + [rr,cc] = size(DCalTuL); + if rr==1 && cc==1 + text = ['Warning: there was an error reading node Tunnel Link number ' nNodo '']; + fprintf(fileID,fmt,text); + yesTuL = 0; + else + DCalTuLTot(TuL,:) = DCalTuL(:,:); + TuL = TuL+1; + text = ['Calibration of node Tunnel Link number ' nNodo ' downloaded correctly']; + fprintf(fileID,fmt,text); + end + else + ok = ['Calibration parameters of node Tunnel Link number ' nNodo ' unnecessary']; + fprintf(fileID,fmt,ok); + end + + elseif idNodo(a,1) == 18 % Radial Link + if strcmp(NodoRadialLink(1,4),'ADC') || strcmp(NodoRadialLink{1,4},'null') || isempty(NodoRadialLink{1,4}) == 1 + %% Radial Link + comando = ['select Cal0, Cal1, Cal2, Cal3, Cal4, Cal5, Cal6, Cal7, Cal8, CalA, CalB from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeNum = ''' nNodo '''']; + curs = exec(conn,comando); + curs = fetch(curs); + DCalRL = curs.Data; % matrice che raccoglie i dati del nodo numero 'a' di tipo Radial Link + [rr,cc] = size(DCalRL); + if rr==1 && cc==1 + text = ['Warning: there was an error reading node Radial Link number ' nNodo '']; + fprintf(fileID,fmt,text); + yesRL = 0; + else + DCalRLTot(RL,:) = DCalRL(:,:); + RL = RL+1; + text = ['Calibration of node Radial Link number ' nNodo ' downloaded correctly']; + fprintf(fileID,fmt,text); + end + else + ok = ['Calibration parameters of node Radial Link number ' nNodo ' unnecessary']; + fprintf(fileID,fmt,ok); + end + + elseif idNodo(a,1) == 11 % Tilt Link H + %% Tilt Link H + if strcmp(NodoTiltLinkH(1,4),'ADC') || strcmp(NodoTiltLinkH{1,4},'null') || isempty(NodoTiltLinkH{1,4}) == 1 + %% Importazione dei dati di calibrazione per Tilt link H + comando = ['select Cal0, Cal1, Cal2, Cal3, Cal4, Cal5, Cal6, Cal7, Cal8, CalA, CalB from CalibrationView where UnitName = '''... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo '''']; + curs = exec(conn,comando); + curs = fetch(curs); + DCalTLH = curs.Data; % matrice che raccoglie i dati del nodo numero 'a' di tipo Tilt Link H + [rr,cc] = size(DCalTLH); + if rr==1 && cc==1 + w = ['Warning: there was an error reading calibration values of node Tilt Link H number ' nNodo '']; + fprintf(fileID,fmt,w); + yesTLH = 0; + else + DCalTLHTot(TLH,:) = DCalTLH; + TLH = TLH+1; + ok = ['Calibration parameters of node Tilt Link H number ' nNodo ' downloaded correctly']; + fprintf(fileID,fmt,ok); + end + else + ok = ['Calibration parameters of node Tilt Link H number ' nNodo ' unnecessary']; + fprintf(fileID,fmt,ok); + end + + elseif idNodo(a,1) == 12 % Tilt Link HR H + %% Tilt Link HR H + comando = ['select Cal0, Cal1, Cal2, Cal3 from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo '''']; + curs = exec(conn,comando); + curs = fetch(curs); + DCalTLHRH = curs.Data; % matrice che raccoglie i dati del nodo numero 'a' di tipo Tilt Link HR H + [rr,cc] = size(DCalTLHRH); + if rr==1 && cc==1 + text = ['Warning: there was an error reading node Tilt Link HR H number ' nNodo '']; + fprintf(fileID,fmt,text); + yesTLHRH = 0; + else + DCalTLHRHTot(TLHRH,:) = DCalTLHRH(:,:); + TLHRH = TLHRH+1; + text = ['Calibration of node Tilt Link HR H number ' nNodo ' downloaded correctly']; + fprintf(fileID,fmt,text); + end + + elseif idNodo(a,1) == 23 % PreConv Link + if strcmp(NodoPreConvLink(1,4),'ADC') || strcmp(NodoPreConvLink{1,4},'null') || isempty(NodoPreConvLink{1,4}) == 1 + %% PreConv Link + comando = ['select Cal0, Cal1, Cal2, Cal3, Cal4, Cal5, Cal6, Cal7, Cal8, CalA, CalB from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo '''']; + curs = exec(conn,comando); + curs = fetch(curs); + DCalPCL = curs.Data; % matrice che raccoglie i dati del nodo numero 'a' di tipo PreConv Link + [rr,cc] = size(DCalPCL); + if rr==1 && cc==1 + text = ['Warning: there was an error reading node PreConv Link number ' nNodo '']; + fprintf(fileID,fmt,text); + yesPCL = 0; + else + DCalPCLTot(PCL,:) = DCalPCL(:,:); + PCL = PCL+1; + text = ['Calibration of node PreConv Link number ' nNodo ' downloaded correctly']; + fprintf(fileID,fmt,text); + end + else + ok = ['Calibration parameters of node PreConv Link number ' nNodo ' unnecessary']; + fprintf(fileID,fmt,ok); + end + + elseif idNodo(a,1) == 24 % PreConv Link HR + %% PreConv Link HR + comando = ['select Cal0, Cal1, CalA, CalB from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo '''']; + curs = exec(conn,comando); + curs = fetch(curs); + DCalPCLHR = curs.Data; % matrice che raccoglie i dati del nodo numero 'a' di tipo PreConv Link HR + [rr,cc] = size(DCalPCLHR); + if rr==1 && cc==1 + text = ['Warning: there was an error reading node PreConv Link HR number ' nNodo '']; + fprintf(fileID,fmt,text); + yesPCLHR = 0; + else + DCalPCLHRTot(PCLHR,:) = DCalPCLHR(:,:); + PCLHR = PCLHR+1; + text = ['Calibration of node PreConv Link HR number ' nNodo ' downloaded correctly']; + fprintf(fileID,fmt,text); + end + + elseif idNodo(a,1) == 21 % Pressure Link + %% Pressure Link + if strcmp(NodoPressureLink(PL,3),'4-20 mA') + comando = ['select Cal0, Cal1, Cal2 from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo ''' ']; + elseif strcmp(NodoPressureLink(PL,3),'mV/V') + comando = ['select Cal0 from CalibrationView where UnitName = ''' ... + IDcentralina ''' andToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo ''' ']; + end + curs = exec(conn,comando); + curs = fetch(curs); + DCalPL = curs.Data; % matrice che raccoglie i dati del nodo numero 'nNodo' di tipo Pressure Link + [rr,cc] = size(DCalPL); + if rr==1 && cc==1 + text = ['Warning: there was an error reading node Pressure Link number ' nNodo '']; + fprintf(fileID,fmt,text); + yesPL = 0; + else + if strcmp(NodoPressureLink(PL,3),'mV/V') + DCalPLTot(PL,1) = DCalPL(:,:); + elseif strcmp(NodoPressureLink(PL,3),'4-20 mA') + DCalPLTot(PL,1:3) = DCalPL(:,:); + end + PL = PL+1; + text = ['Calibration of node Pressure Link number ' nNodo ' downloaded correctly']; + fprintf(fileID,fmt,text); + end + + elseif idNodo(a,1) == 15 % Load Link + %% Importazione dei dati di calibrazione per Load Link + if strcmp(NodoLoadLink(LL,3),'mV/V') || strcmp(NodoLoadLink(a,3),'ADC') + comando = ['select Cal0, Cal1 from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo ''' ']; + elseif strcmp(NodoLoadLink(LL,3),'4-20 mA') + comando = ['select Cal0, Cal1, Cal2 from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo ''' ']; + end + curs = exec(conn,comando); + curs = fetch(curs); + DCalLL = curs.Data; % matrice che raccoglie i dati del nodo numero 'a' di tipo Load Link + [rr,cc] = size(DCalLL); + if rr==1 && cc==1 + text = ['Warning: there was an error reading node Load Link number ' nNodo '']; + fprintf(fileID,fmt,text); + yesLL = 0; + else + if strcmp(NodoLoadLink(LL,3),'mV/V') || strcmp(NodoLoadLink(LL,3),'ADC') + DCalLLTot(LL,1:2) = DCalLL(:,:); + elseif strcmp(NodoLoadLink(LL,3),'4-20 mA') + DCalLLTot(LL,1:3) = DCalLL(:,:); + end + LL = LL+1; + text = ['Calibration of node Load Link number ' nNodo ' downloaded correctly']; + fprintf(fileID,fmt,text); + end + + elseif idNodo(a,1) == 16 % Extensometer Link + %% Importazione dei dati di calibrazione per Extensometer Link + if strcmp(NodoExtensometerLink(EL,3),'Hz') || strcmp(NodoExtensometerLink(EL,3),'mV/V') + comando = ['select Cal0, Cal1, carico_iniziale from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo ''' ']; + elseif strcmp(NodoExtensometerLink(EL,3),'4-20 mA') + comando = ['select Cal0, Cal1, Cal2, carico_iniziale from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo ''' ']; + end + curs = exec(conn,comando); + curs = fetch(curs); + DCalEL = curs.Data; % matrice che raccoglie i dati del nodo numero 'a' di tipo Extensometer Link + [rr,cc] = size(DCalEL); + if rr==1 && cc==1 + text = ['Warning: there was an error reading node Extensometer Link number ' nNodo '']; + fprintf(fileID,fmt,text); + yesEL = 0; + else + if strcmp(NodoExtensometerLink(EL,3),'Hz') || strcmp(NodoExtensometerLink(EL,3),'mV/V') + DCalELTot(EL,1:3) = DCalEL(:,:); + elseif strcmp(NodoExtensometerLink(EL,3),'4-20 mA') + DCalELTot(EL,1:4) = DCalEL(:,:); + end + EL = EL+1; + text = ['Calibration of node Extensometer Link number ' nNodo ' downloaded correctly']; + fprintf(fileID,fmt,text); + end + + elseif idNodo(a,1) == 19 % 3D Extensometer Link + %% Importazione dei dati di calibrazione per 3D Extensometer Link + if strcmp(Nodo3DExtensometerLink(EL3D,3),'Hz') || strcmp(Nodo3DExtensometerLink(EL3D,3),'mV/V') + comando = ['select Cal0, Cal1, Cal2, Cal3, Cal4, Cal5 from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo ''' ']; + elseif strcmp(Nodo3DExtensometerLink(EL3D,3),'4-20 mA') + comando = ['select Cal0, Cal1, Cal2, Cal3, Cal4, Cal5, Cal6, Cal7, Cal8 from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo ''' ']; + end + curs = exec(conn,comando); + curs = fetch(curs); + DCalEL3D = curs.Data; % matrice che raccoglie i dati del nodo numero 'a' di tipo Extensometer Link + [rr,cc] = size(DCalEL3D); + if rr==1 && cc==1 + text = ['Warning: there was an error reading node 3D Extensometer Link number ' nNodo '']; + fprintf(fileID,fmt,text); + yes3DEL = 0; + else + if strcmp(Nodo3DExtensometerLink(EL3D,3),'Hz') || strcmp(Nodo3DExtensometerLink(EL3D,3),'mV/V') + DCalEL3DTot(EL3D,1:6) = DCalEL3D(:,:); + elseif strcmp(Nodo3DExtensometerLink(EL3D,3),'4-20 mA') + DCalEL3DTot(EL3D,1:9) = DCalEL3D(:,:); + end + EL3D = EL3D+1; + text = ['Calibration of node 3D Extensometer Link number ' nNodo ' downloaded correctly']; + fprintf(fileID,fmt,text); + end + + elseif idNodo(a,1) == 22 % Wire Extensometer Link + %% Importazione dei dati di calibrazione per Wire Extensometer Link + if strcmp(NodoWireExtensometerLink(WEL,3),'4-20 mA') + comando = ['select Cal0, Cal1, Cal2 from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo ''' ']; + elseif strcmp(NodoWireExtensometerLink(WEL,3),'mV/V') + comando = ['select Cal0, Cal1 from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo ''' ']; + end + curs = exec(conn,comando); + curs = fetch(curs); + DCalWEL = curs.Data; % matrice che raccoglie i dati del nodo numero 'a' di tipo Wire Extensometer Link + [rr,cc] = size(DCalWEL); + if rr==1 && cc==1 + text = ['Warning: there was an error reading node Wire Extensometer Link number ' nNodo '']; + fprintf(fileID,fmt,text); + yesWEL = 0; + else + if strcmp(NodoWireExtensometerLink(WEL,3),'4-20 mA') + DCalWELTot(WEL,1:3) = DCalWEL(:,:); + elseif strcmp(NodoWireExtensometerLink(WEL,3),'mV/V') + DCalWELTot(WEL,1:2) = DCalWEL(:,:); + end + WEL = WEL+1; + text = ['Calibration of node Wire Extensometer Link number ' nNodo ' downloaded correctly']; + fprintf(fileID,fmt,text); + end + + elseif idNodo(a,1) == 25 % Multi Point Borehole Extensometer Link + %% Importazione dei dati di calibrazione per Multi Point Borehole Extensometer Link + if strcmp(NodoMultiPointRodExtensometer(MPBEL,3),'mV/V') + if NumBasi == 1 + comando = ['select Cal0 from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeNum = ''' nNodo ''' ']; + elseif NumBasi == 2 + comando = ['select Cal0, Cal1 from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeNum = ''' nNodo ''' ']; + elseif NumBasi == 3 + comando = ['select Cal0, Cal1, Cal2 from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeNum = ''' nNodo ''' ']; + elseif NumBasi == 4 + comando = ['select Cal0, Cal1, Cal2, Cal3 from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeNum = ''' nNodo ''' ']; + elseif NumBasi == 5 + comando = ['select Cal0, Cal1, Cal2, Cal3, Cal4 from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeNum = ''' nNodo ''' ']; + end + end + curs = exec(conn,comando); + curs = fetch(curs); + DCalMPBEL = curs.Data; % matrice che raccoglie i dati del nodo numero 'a' di tipo Multi Point Borehole Extensometer Link + [rr,cc] = size(DCalMPBEL); + if rr==1 && cc==1 + text = ['Warning: there was an error reading node MultiPoint Borehole Extensometer Link number ' nNodo '']; + fprintf(fileID,fmt,text); + yesMPBEL = 0; + else + if strcmp(NodoMultiPointRodExtensometer(MPBEL,3),'mV/V') + if NumBasi == 1 + DCalMPBELTot(MPBEL,1) = DCalMPBEL(:,:); + elseif NumBasi == 2 + DCalMPBELTot(MPBEL,1:2) = DCalMPBEL(:,:); + elseif NumBasi == 3 + DCalMPBELTot(MPBEL,1:3) = DCalMPBEL(:,:); + elseif NumBasi == 4 + DCalMPBELTot(MPBEL,1:4) = DCalMPBEL(:,:); + elseif NumBasi == 5 + DCalMPBELTot(MPBEL,1:5) = DCalMPBEL(:,:); + elseif NumBasi == 6 + DCalMPBELTot(MPBEL,1:6) = DCalMPBEL(:,:); + end + end + MPBEL = MPBEL+1; + text = ['Calibration of node MultiPoint Borehole Extensometer Link number ' nNodo ' downloaded correctly']; + fprintf(fileID,fmt,text); + end + + elseif idNodo(a,1) == 8 % Analog Link + %% Importazione dei dati di calibrazione per Analog Link + if strcmp(NodoAnalogLink(AL,3),'mV/V') + comando = ['select Cal0, Cal1 from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeNum = ''' nNodo ''' ']; + elseif strcmp(NodoAnalogLink(a,3),'4-20 mA') + comando = ['select Cal0, Cal1, Cal2 from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeNum = ''' nNodo ''' ']; + elseif strcmp(NodoAnalogLink(a,3),'Hz') + comando = ['select Cal0, Cal1 from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeNum = ''' nNodo ''' ']; + end + curs = exec(conn,comando); + curs = fetch(curs); + DCalAL = curs.Data; % matrice che raccoglie i dati del nodo numero 'a' di tipo Analog Link + [rr,cc] = size(DCalAL); + if rr==1 && cc==1 + text = ['Warning: there was an error reading node Analog Link number ' nNodo '']; + fprintf(fileID,fmt,text); + yesAL = 0; + else + if strcmp(NodoAnalogLink(AL,3),'mV/V') + DCalALTot(AL,1:2) = DCalAL(:,:); + elseif strcmp(NodoAnalogLink(AL,3),'4-20 mA') + DCalALTot(AL,1:3) = DCalAL(:,:); + elseif strcmp(NodoAnalogLink(AL,3),'Hz') + DCalALTot(AL,1:2) = DCalAL(:,:); + end + AL = AL+1; + text = ['Calibration of node Analog Link number ' nNodo ' downloaded correctly']; + fprintf(fileID,fmt,text); + end + + elseif idNodo(a,1) == 36 % Crack Link + %% Importazione dei dati di calibrazione per Crack Link + if strcmp(NodoCrackLink(CrL,3),'mV/V') + comando = ['select Cal0, Cal1 from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo ''' ']; + elseif strcmp(NodoCrackLink(CrL,3),'Hz')||strcmp(NodoCrackLink(CrL,3),'Hz mm') + comando = ['select Cal0, Cal1, Cal2 from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo ''' ']; + end + curs = exec(conn,comando); + curs = fetch(curs); + DCalCrL = curs.Data; % matrice che raccoglie i dati del nodo numero 'a' di tipo Crack Link + [rr,cc] = size(DCalCrL); + if rr==1 && cc==1 + text = ['Warning: there was an error reading node Crack Link number ' nNodo '']; + fprintf(fileID,fmt,text); + yesCrL = 0; + else + if strcmp(NodoCrackLink(CrL,3),'mV/V') + DCalCrLTot(CrL,1:2) = DCalCrL(:,:); + elseif strcmp(NodoCrackLink(CrL,3),'Hz')||strcmp(NodoCrackLink(CrL,3),'Hz mm') + DCalCrLTot(CrL,1:3) = DCalCrL(:,:); + end + CrL = CrL+1; + text = ['Calibration of node Crack Link number ' nNodo ' downloaded correctly']; + fprintf(fileID,fmt,text); + end + + elseif idNodo(a,1) == 37 % 3D Crack Link + %% Importazione dei dati di calibrazione per 3D Crack Link + if strcmp(Nodo3DCrackLink(CrL3D,3),'mV/V') + comando = ['select Cal0, Cal1, Cal2, Cal3, Cal4, Cal5 from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo ''' ']; + elseif strcmp(Nodo3DCrackLink(CrL3D,3),'Hz') || strcmp(Nodo3DCrackLink(CrL3D,3),'4-20 mA') + comando = ['select Cal0, Cal1, Cal2, Cal3, Cal4, Cal5, Cal6, Cal7, Cal8 from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo ''' ']; + end + curs = exec(conn,comando); + curs = fetch(curs); + DCal3DCrL = curs.Data; % matrice che raccoglie i dati del nodo numero 'a' di tipo 3D Crack Link + [rr,cc] = size(DCal3DCrL); + if rr==1 && cc==1 + text = ['Warning: there was an error reading node 3D Crack Link number ' nNodo '']; + fprintf(fileID,fmt,text); + yes3DCrL = 0; + else + if strcmp(Nodo3DCrackLink(CrL3D,3),'mV/V') + DCal3DCrLTot(CrL3D,1:6) = DCal3DCrL(:,:); + elseif strcmp(Nodo3DCrackLink(CrL3D,3),'Hz') || strcmp(Nodo3DCrackLink(CrL3D,3),'4-20 mA') + DCal3DCrLTot(CrL3D,1:9) = DCal3DCrL(:,:); + end + CrL3D = CrL3D+1; + text = ['Calibration of node 3D Crack Link number ' nNodo ' downloaded correctly']; + fprintf(fileID,fmt,text); + end + + elseif idNodo(a,1) == 51 % 2D Crack Link + %% Importazione dei dati di calibrazione per 2D Crack Link + if strcmp(Nodo2DCrackLink(CrL2D,3),'Hz') || strcmp(Nodo3DCrackLink(CrL3D,3),'4-20 mA') + comando = ['select Cal0, Cal1, Cal2, Cal3, Cal4, Cal5 from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo ''' ']; + elseif strcmp(Nodo2DCrackLink(CrL2D,3),'mV/V') + comando = ['select Cal0, Cal1, Cal2, Cal3 from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo ''' ']; + end + curs = exec(conn,comando); + curs = fetch(curs); + DCal2DCrL = curs.Data; % matrice che raccoglie i dati del nodo numero 'a' di tipo 2D Crack Link + [rr,cc] = size(DCal2DCrL); + if rr==1 && cc==1 + text = ['Warning: there was an error reading node 2D Crack Link number ' nNodo '']; + fprintf(fileID,fmt,text); + yes2DCrL = 0; + else + if strcmp(Nodo2DCrackLink(CrL2D,3),'Hz') || strcmp(Nodo3DCrackLink(CrL3D,3),'4-20 mA') + DCal2DCrLTot(CrL2D,1:6) = DCal2DCrL(:,:); + elseif strcmp(Nodo2DCrackLink(CrL2D,3),'mV/V') + DCal2DCrLTot(CrL2D,1:4) = DCal2DCrL(:,:); + end + CrL2D = CrL2D+1; + text = ['Calibration of node 2D Crack Link number ' nNodo ' downloaded correctly']; + fprintf(fileID,fmt,text); + end + + elseif idNodo(a,1) == 47 % Stress Meter + %% Importazione dei dati di calibrazione per Stress Meter + if strcmp(NodoStressMeter(SM,3),'Hz') + comando = ['select Cal0, Cal1 from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo ''' ']; + end + curs = exec(conn,comando); + curs = fetch(curs); + DCalSM = curs.Data; % matrice che raccoglie i dati del nodo numero 'a' di tipo 3D Crack Link + [rr,cc] = size(DCalSM); + if rr==1 && cc==1 + text = ['Warning: there was an error reading node Stress Meter number ' nNodo '']; + fprintf(fileID,fmt,text); + yesSM = 0; + else + if strcmp(NodoStressMeter(SM,3),'Hz') + DCalSMTot(SM,1) = DCalSM(:,1); + end + SM = SM+1; + text = ['Calibration of node Stress Meter number ' nNodo ' downloaded correctly']; + fprintf(fileID,fmt,text); + end + + elseif idNodo(a,1) == 9 % Ancora + text = 'Anchor'; + fprintf(fileID,fmt,text); + end +end + +text = 'NuovaConversione function started'; +fprintf(fileID,fmt,text); + +% Nuova conversione da fare per il nuovo database +[DCalTuLTot,DCalRLTot,DCalTLHTot,DCalTLHRHTot,DCalPCLTot,DCalPCLHRTot,... + DCalPLTot,DCalLLTot,DCalELTot,DCalEL3DTot,DCalWELTot,DCalMPBELTot,DCalALTot,... + DCalCrLTot,DCal3DCrLTot,DCal2DCrLTot] = NuovaConversione(DCalTuLTot,yesTuL,DCalRLTot,yesRL,... + DCalTLHTot,yesTLH,DCalTLHRHTot,yesTLHRH,DCalPCLTot,yesPCL,DCalPCLHRTot,yesPCLHR,... + DCalPLTot,yesPL,DCalLLTot,yesLL,DCalELTot,yesEL,DCalEL3DTot,yes3DEL,DCalWELTot,yesWEL,... + DCalMPBELTot,yesMPBEL,DCalALTot,yesAL,DCalCrLTot,yesCrL,DCal3DCrLTot,yes3DCrL,... + DCal2DCrLTot,yes2DCrL,FileName); + +%% Chiudo Testo +text = 'NuovaConversione & letturaCal functions ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/ATD/lettura_Dati.m b/ATD/lettura_Dati.m new file mode 100755 index 0000000..7926e39 --- /dev/null +++ b/ATD/lettura_Dati.m @@ -0,0 +1,9648 @@ +% Questa funzione legge i dati di ogni tipologia di nodo (se presente) +% DatiTunnelLink contiene tutti i dati per i Tilt Link +% DatiRadialLink contiene tutti i dati per i Radial Link +% etc. + +function [Batteria,DatiTunnelLink,ErrTunnelLink,datainiTuL,... + DatiRadialLink,ErrRadialLink,datainiRL,DatiTiltLinkH,ErrTiltLinkH,datainiTLH,... + DatiTiltLinkHRH,ErrTiltLinkHRH,datainiTLHRH,DatiPreConvLink,ErrPreConvLink,datainiPCL,... + DatiPreConvLinkHR,ErrPreConvLinkHR,datainiPCLHR,DatiPressureLink,ErrPressureLink,... + DatiLoadLink,ErrLoadLink,DatiExtensometerLink,DatiExtensometerLink_Rif,... + DatiNTCExtensometerLink,ErrExtensometerLink,Dati3DExtensometerLink,ChEL,EL_NTC,... + Dati3DExtensometerLink_Rif,DatiNTC3DExtensometerLink,Err3DExtensometerLink,ErrNTC3DExtensometerLink,Ch3DEL,EL3D_NTC,... + DatiWireExtensometerLink,DatiNTCWireExtensometerLink,ErrWireExtensometerLink,ChWEL,WEL_NTC,... + DatiMultiPointExtensometer,DatiNTCMultiPointExtensometer,ErrMultiPointExtensometer,ErrNTCMultiPointExtensometer,ChMPBEL,MPBEL_NTC,... + DatiAnalogLink,ErrAnalogLink,datainiAL,ChAL,AL_NTC,... + DatiCrackLink,DatiNTCCrackLink,ErrCrackLink,ChCrL,CrL_NTC,... + Dati3DCrackLink,DatiNTC3DCrackLink,Err3DCrackLink,ErrNTC3DCrackLink,Ch3DCrL,CrL3D_NTC,... + Dati2DCrackLink,DatiNTC2DCrackLink,Err2DCrackLink,ErrNTC2DCrackLink,Ch2DCrL,CrL2D_NTC,... + DatiStressMeter,DatiStressMeter_Rif,DatiNTCStressMeter,DatiNTCStressMeter_Rif,ErrStressMeter,ChSM,SM_NTC,... + yesTuL,yesRL,yesTLH,yesTLHRH,yesPCL,yesPCLHR,yesPL,yesLL,yesEL,yes3DEL,... + yesWEL,yesMPBEL,yesAL,yesCrL,yes3DCrL,yes2DCrL,yesSM] = ... + lettura_Dati(IDcentralina,DTcatena,datainiTuL,tempoiniTuL,NodoTunnelLink,NuovoZeroTuL,date_AC,time_AC,Nodo_AC,... + datainiRL,tempoiniRL,NodoRadialLink,NuovoZeroRL,datainiTLH,tempoiniTLH,NodoTiltLinkH,NuovoZeroTLH,... + datainiTLHRH,tempoiniTLHRH,NodoTiltLinkHRH,NuovoZeroTLHRH,datainiPCL,tempoiniPCL,NodoPreConvLink,NuovoZeroPCL,... + datainiPCLHR,tempoiniPCLHR,NodoPreConvLinkHR,NuovoZeroPCLHR,datainiPL,tempoiniPL,NodoPressureLink,NuovoZeroPrL,... + datainiLL,tempoiniLL,NodoLoadLink,NuovoZeroLL,datainiEL,tempoiniEL,Date_Rif_EL,NodoExtensometerLink,NuovoZeroEL,... + dataini3DEL,tempoini3DEL,Date_Rif_3DEL,Nodo3DExtensometerLink,NuovoZero3DEL,... + datainiWEL,tempoiniWEL,NodoWireExtensometerLink,NuovoZeroWEL,... + datainiMPBEL,tempoiniMPBEL,NodoMultiPointRodExtensometer,NuovoZeroMPBEL,... + datainiAL,tempoiniAL,NodoAnalogLink,NumBasi,NuovoZeroAL,... + datainiCrL,tempoiniCrL,NodoCrackLink,NuovoZeroCrL,dataini3DCrL,tempoini3DCrL,Nodo3DCrackLink,NuovoZero3DCrL,... + dataini2DCrL,tempoini2DCrL,Nodo2DCrackLink,NuovoZero2DCrL,... + datainiSM,tempoiniSM,Date_Rif_SM,NodoStressMeter,NuovoZeroSM,yesTuL,yesRL,yesTLH,... + yesTLHRH,yesPCL,yesPCLHR,yesPL,yesLL,yesEL,yes3DEL,yesWEL,yesMPBEL,yesAL,yesCrL,... + yes3DCrL,yes2DCrL,yesSM,rTuL,rRL,rTLH,rTLHRH,rPCL,rPCLHR,rPrL,... + rLL,rEL,r3DEL,rWEL,rMPBEL,rAL,rCrL,r3DCrL,r2DCrL,rSM,conn,catena,date,time,FileName) + +% Log file +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'lettura function started'; +fprintf(fileID,fmt,text); + +%% Batteria +% cerco la batteria nel primo nodo +j = 1; +z = 0; +[rC,~] = size(catena); +while z == 0 + if cell2mat(catena(j,3)) == 1 + z = 1; + else + j = j+1; % nodo numero 1 + end +end +condition = 0; +while condition == 0 + if j <= rC + i = cell2mat(catena(j,1)); + if i == 17 + dataini = datainiTuL; + tempoini = tempoiniTuL; + break + elseif i == 18 + dataini = datainiRL; + tempoini = tempoiniRL; + break + elseif i == 11 + dataini = datainiTLH; + tempoini = tempoiniTLH; + break + elseif i == 12 + dataini = datainiTLHRH; + tempoini = tempoiniTLHRH; + break + elseif i == 23 + dataini = datainiPCL; + tempoini = tempoiniPCL; + break + elseif i == 24 + dataini = datainiPCLHR; + tempoini = tempoiniPCLHR; + break + elseif i == 8 + dataini = datainiAL; + tempoini = tempoiniAL; + break + elseif i == 15 + dataini = datainiLL; + tempoini = tempoiniLL; + break + elseif i == 16 + dataini = datainiEL; + tempoini = tempoiniEL; + break + elseif i == 19 + dataini = dataini3DEL; + tempoini = tempoini3DEL; + break + elseif i == 21 + dataini = datainiPL; + tempoini = tempoiniPL; + break + elseif i == 22 + dataini = datainiWEL; + tempoini = tempoiniWEL; + break + elseif i == 25 + dataini = datainiMPBEL; + tempoini = tempoiniMPBEL; + break + elseif i == 36 + dataini = datainiCrL; + tempoini = tempoiniCrL; + break + elseif i == 37 + dataini = dataini3DCrL; + tempoini = tempoini3DCrL; + break + elseif i == 51 + dataini = dataini2DCrL; + tempoini = tempoini2DCrL; + break + elseif i == 47 + dataini = datainiSM; + tempoini = tempoiniSM; + break + end + j = j+1; + else + break + end +end + +NodeNum = '1'; +comando = ['select Date, Time, BatLevel from RawDataView where Date = ''' ... + dataini ''' and Time >= ''' tempoini ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum = ''' NodeNum ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +BatTempo = curs.Data; +comando = ['select Date, Time, BatLevel from RawDataView where Date > ''' ... + dataini ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum = ''' NodeNum ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +BatData = curs.Data; +if strcmp(char(BatData(1)),'No Data') + Batteria = BatTempo; +elseif strcmp(char(BatTempo(1)),'No Data') + Batteria = BatData; +else + Batteria = [BatTempo; BatData]; +end + +Data(1,1) = cellstr(date); +Data(1,2) = cellstr(time); + +%% Tunnel Link +if yesTuL == 0 % Non ci sono Tunnel Link + DatiTunnelLink = []; + ErrTunnelLink = []; + wardat = 'lettura function: there are not Tunnel Link'; + fprintf(fileID,fmt,wardat); +else + RawDataFile = ['' IDcentralina '-' DTcatena '-TuL-RawData.csv']; + NAN = 0; + date_AC = [date_AC ' ' time_AC]; + while NAN == 0 + if datenum(datainiTuL) == datenum(Data(1,1)) + tempoiniTuL = char(Data(1,2)); + end + NodeType = 'Tunnel Link'; + NodeNumTuL = num2str(cell2mat(NodoTunnelLink(1,2))); % scarico i dati del primo nodo + % Scarico dei dati relativi alla centralina con informazioni di Data e ora, livello batteria e temperatura + % Step 1 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date = ''' ... + datainiTuL ''' and Time >= ''' tempoiniTuL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumTuL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniTuL = curs.Data; + Ntempo = DATiniTuL; + [r,c] = size(DATiniTuL); + saltoTuL = 0; + if r==1 && c==1 + textdatTuL = 'Warning: error reading Tunnel Link (control unit data)!'; + fprintf(fileID,fmt,textdatTuL); + saltoTuL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiTuL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumTuL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2TuL = curs.Data; + Ndate = DAT2TuL; + if saltoTuL == 1 + DATiniTuL = DAT2TuL; + end + Check = size(DAT2TuL); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoTuL == 0 + DATiniTuL = [DATiniTuL; DAT2TuL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniTuL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniTuL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniTuL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniTuL = T; + else + DATiniTuL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + % creo la matrice per i dati Tunnel Link + if saltoTuL == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiTunnelLink = cell(rd+rt,7*rTuL); + else + DatiTunnelLink = cell(rt,7*rTuL); + end + else + DatiTunnelLink = cell(rd,7*rTuL); + end + NTunnelLink = cell2mat(NodoTunnelLink(:,2)); + col = 7; + ii = 1; + w = 0; + if now < datenum(date_AC) % NON si elabora Arco Rovescio + Arco = 0; + else + Arco = 1; + end + while ii <= rTuL + if ii >= Nodo_AC % Primo nodo arco rovescio + if Arco == 1 + Continua = 1; + else + Continua = 0; + end + else + Continua = 1; + end + if Continua == 1 + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NTunnelLink(ii,1); + nNodo = num2str(nN); + comando = ['select Val0, Val1, Val2, Val3, Val4, Val5, Val6 from RawDataView where Date = ''' ... + datainiTuL ''' and Time >= ''' tempoiniTuL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTuL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val3, Val4, Val5, Val6 from RawDataView where Date > ''' ... + datainiTuL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTuLd = curs.Data; + end + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-6; + if saltoTuL == 0 + if Continua == 1 + DatiTunnelLink(1:rt,ini_col:col) = DATnodoTuL(:,:); + else + DatiTunnelLink(1:rt,ini_col:col) = cellstr('0'); + end + else + if Continua == 1 + DatiTunnelLink(1:rd,ini_col:col) = DATnodoTuLd(:,:); + else + DatiTunnelLink(1:rd,ini_col:col) = cellstr('0'); + end + end + + [rn,~] = size(DATnodoTuLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoTuLd(i,:) = DATnodoTuLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Tunnel Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoTuL == 0 + if Continua == 1 + DatiTunnelLink(rt+1:rt+rd,ini_col:col) = DATnodoTuLd(:,:); + else + DatiTunnelLink(rt+1:rt+rd,ini_col:col) = cellstr('0'); + end + end + else + DatiTunnelLink = DatiTunnelLink(1:end,:); + end + okdatTuL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rTuL) ' Tunnel Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatTuL); + ii = ii+1; + col = col+7; + end + if w == 0 + wardat = 'There are not warning for Tunnel Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiTunnelLink); + ErrTunnelLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroTuL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiTuL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTunnelLink(1,jj))); + idxND = find(strcmp('No Data',DatiTunnelLink(1,jj))); + idxT = find(strcmp('---',DatiTunnelLink(1,jj))); + idxT2 = find(strcmp('-',DatiTunnelLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiTunnelLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiTunnelLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiTunnelLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiTunnelLink(1,jj))); + idxN = find(strcmp('null',DatiTunnelLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Tunnel Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroTuL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiTuL)+1 < now + datainiTuL = datestr(datenum(datainiTuL)+1,'yyyy-mm-dd'); + break + else + yesTuL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiTuL = datestr(datenum(datainiTuL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiTunnelLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrTunnelLink(1,jj) = 1; + wardat = 'Data of Tunnel Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiTuL = datestr(datenum(datainiTuL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c % nodi + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTunnelLink(:,jj))); + idxND = find(strcmp('No Data',DatiTunnelLink(:,jj))); + idxT = find(strcmp('---',DatiTunnelLink(:,jj))); + idxT2 = find(strcmp('-',DatiTunnelLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiTunnelLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiTunnelLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiTunnelLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiTunnelLink(:,jj))); + idxN = find(strcmp('null',DatiTunnelLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiTuL = datestr(datenum(datainiTuL)-1,'yyyy-mm-dd'); + break + end + DatiTunnelLink(indice,jj) = DatiTunnelLink(indice-1,jj); + ErrTunnelLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r % date + check = isnan(cell2mat(DatiTunnelLink(nnn,jj))); + if check == 1 + DatiTunnelLink(nnn,jj) = DatiTunnelLink(nnn-1,jj); + ErrTunnelLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Tunnel Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiTunnelLink = [DATiniTuL str2double(DatiTunnelLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiTunnelLink(a,1) == DatiTunnelLink(a-1,1) + DatiTunnelLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + if NuovoZeroTuL == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiTunnelLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiTunnelLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiTunnelLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiTunnelLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiTunnelLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniRL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumRL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniRL = curs.Data; + Ntempo = DATiniRL; + [r,c] = size(DATiniRL); + saltoRL = 0; + if r==1 && c==1 + textdatRL = 'Warning: error reading Radial Link (control unit data)!'; + fprintf(fileID,fmt,textdatRL); + saltoRL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiRL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumRL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2RL = curs.Data; + Ndate = DAT2RL; + if saltoRL == 1 + DATiniRL = DAT2RL; + end + Check = size(DAT2RL); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoRL == 0 + DATiniRL = [DATiniRL; DAT2RL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniRL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniRL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniRL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniRL = T; + else + DATiniRL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + if saltoRL == 0 + % creo la matrice per i dati Radial Link + if Check(1,2) > 1 + DatiRadialLink = cell(rd+rt,4*rRL); + else + DatiRadialLink = cell(rt,4*rRL); + end + else + DatiRadialLink = cell(rd,4*rRL); + end + NRadialLink = cell2mat(NodoRadialLink(:,2)); + col = 4; + ii = 1; + w = 0; + while ii <= rRL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NRadialLink(ii,1); + nNodo = num2str(nN); + comando = ['select Val0, Val1, Val2, Val6 from RawDataView where Date = ''' ... + datainiRL ''' and Time >= ''' tempoiniRL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val6 from RawDataView where Date > ''' ... + datainiRL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRLd = curs.Data; + % Concateno i dati relativi a Step 1 e 2 per il nodo ii-esimo. + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-3; + if saltoRL == 0 + DatiRadialLink(1:rt,ini_col:col) = DATnodoRL(:,:); + else + DatiRadialLink(1:rd,ini_col:col) = DATnodoRL(:,:); + end + + [rn,~] = size(DATnodoRLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoRLd(i,:) = DATnodoRLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Radial Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoRL == 0 + DatiRadialLink(rt+1:rt+rd,ini_col:col) = DATnodoRLd(:,:); + end + else + DatiRadialLink = DatiRadialLink(1:end,:); + end + okdatRL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rRL) ' Radial Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatRL); + ii = ii+1; + col = col+4; + end + if w == 0 + wardat = 'There are not warning for Radial Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiRadialLink); + ErrRadialLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroRL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiRL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiRadialLink(1,jj))); + idxND = find(strcmp('No Data',DatiRadialLink(1,jj))); + idxT = find(strcmp('---',DatiRadialLink(1,jj))); + idxT2 = find(strcmp('-',DatiRadialLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiRadialLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiRadialLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiRadialLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiRadialLink(1,jj))); + idxN = find(strcmp('null',DatiRadialLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Radial Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroRL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiRL)+1 < now + datainiRL = datestr(datenum(datainiRL)+1,'yyyy-mm-dd'); + break + else + yesRL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiRL = datestr(datenum(datainiRL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiRadialLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrRadialLink(1,jj) = 1; + wardat = 'Data of Radial Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiRL = datestr(datenum(datainiRL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiRadialLink(:,jj))); + idxND = find(strcmp('No Data',DatiRadialLink(:,jj))); + idxT = find(strcmp('---',DatiRadialLink(:,jj))); + idxT2 = find(strcmp('-',DatiRadialLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiRadialLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiRadialLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiRadialLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiRadialLink(:,jj))); + idxN = find(strcmp('null',DatiRadialLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiRL = datestr(datenum(datainiRL)-1,'yyyy-mm-dd'); + break + end + DatiRadialLink(indice,jj) = DatiRadialLink(indice-1,jj); + ErrRadialLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r % date + check = isnan(cell2mat(DatiRadialLink(nnn,jj))); + if check == 1 + DatiRadialLink(nnn,jj) = DatiRadialLink(nnn-1,jj); + ErrRadialLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Radial Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiRadialLink = [DATiniRL str2double(DatiRadialLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiRadialLink(a,1) == DatiRadialLink(a-1,1) + DatiRadialLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + if NuovoZeroRL == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiRadialLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiRadialLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiRadialLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiRadialLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiRadialLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniTLH ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType ... + ''' and NodeNum = ''' NodeNumTLH ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniTLH = curs.Data; + Ntempo = DATiniTLH; + [r,c] = size(DATiniTLH); + saltoTLH = 0; + if r==1 && c==1 + textdatTLH = 'Warning: error reading Tilt Link H (control unit data)!'; + fprintf(fileID,fmt,textdatTLH); + saltoTLH = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiTLH ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumTLH ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2TLH = curs.Data; + Ndate = DAT2TLH; + if saltoTLH == 1 + DATiniTLH = DAT2TLH; + end + Check = size(DAT2TLH); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoTLH == 0 + DATiniTLH = [DATiniTLH; DAT2TLH]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniTLH); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniTLH(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniTLH(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniTLH = T; + else + DATiniTLH = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + % creo la matrice per i dati Tunnel Link + if saltoTLH == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiTiltLinkH = cell(rd+rt,4*rTLH); + else + DatiTiltLinkH = cell(rt,4*rTLH); + end + else + DatiTiltLinkH = cell(rd,4*rTLH); + end + NTiltLinkH = cell2mat(NodoTiltLinkH(:,2)); + col = 4; + ii = 1; + w = 0; + while ii <= rTLH + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NTiltLinkH(ii,1); + nNodo = num2str(nN); + comando = ['select Val0, Val1, Val2, Val6 from RawDataView where Date = ''' ... + datainiTLH ''' and Time >= ''' tempoiniTLH ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLH = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val6 from RawDataView where Date > ''' ... + datainiTLH ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina ... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-3; + if saltoTLH == 0 + DatiTiltLinkH(1:rt,ini_col:col) = DATnodoTLH(:,:); + else + DatiTiltLinkH(1:rd,ini_col:col) = DATnodoTLHd(:,:); + end + + [rn,~] = size(DATnodoTLHd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoTLHd(i,:) = DATnodoTLHd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Tilt Link H ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoTLH == 0 + DatiTiltLinkH(rt+1:rt+rd,ini_col:col) = DATnodoTLHd(:,:); + end + else + DatiTiltLinkH = DatiTiltLinkH(1:end,:); + end + okdatTLH = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rTLH) ' Tilt Link H nodes downloaded correctly']; + fprintf(fileID,fmt,okdatTLH); + ii = ii+1; + col = col+4; + end + if w == 0 + wardat = 'There are not warning for Tilt Link H!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiTiltLinkH); + ErrTiltLinkH = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroTLH == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiTLH)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTiltLinkH(1,jj))); + idxND = find(strcmp('No Data',DatiTiltLinkH(1,jj))); + idxT = find(strcmp('---',DatiTiltLinkH(1,jj))); + idxT2 = find(strcmp('-',DatiTiltLinkH(1,jj))); + idxE2 = find(strcmp('Err2',DatiTiltLinkH(1,jj))); + idxE255 = find(strcmp('Err255',DatiTiltLinkH(1,jj))); + idxD = find(strcmp('DMUXe',DatiTiltLinkH(1,jj))); + idxE1F = find(strcmp('Err1File',DatiTiltLinkH(1,jj))); + idxN = find(strcmp('null',DatiTiltLinkH(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Tilt Link H nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroTLH == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiTLH)+1 < now + datainiTLH = datestr(datenum(datainiTLH)+1,'yyyy-mm-dd'); + break + else + yesTLH = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiTLH = datestr(datenum(datainiTLH)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiTiltLinkH(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrTiltLinkH(1,jj) = 1; + wardat = 'Data of Tilt Link H nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiTLH = datestr(datenum(datainiTLH)-1,'yyyy-mm-dd'); + break + end + end + end + end + if ESCI == 0 + % Cerco i multipli di 4 per identificare le temperature + Int = jj/4; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiTiltLinkH(1,jj)) > 1000 + if rDR==1 && cDR==1 || NuovoZeroTLH == 0 + NAN = 0; + ESCI = 1; + if datenum(datainiTLH)+1 < now + datainiTLH = datestr(datenum(datainiTLH)+1,'yyyy-mm-dd'); + break + else + yesTLH = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiTLH = datestr(datenum(datainiTLH)-1,'yyyy-mm-dd'); + break + else + DatiTiltLinkH(1,jj-3) = cellstr(num2str(DatiRaw(RawDate(end),jj-2))); + DatiTiltLinkH(1,jj-2) = cellstr(num2str(DatiRaw(RawDate(end),jj-1))); + DatiTiltLinkH(1,jj-1) = cellstr(num2str(DatiRaw(RawDate(end),jj))); + DatiTiltLinkH(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrTiltLinkH(1,jj) = 1; + wardat = ['Data of Tilt Link H nodes corrected using Raw Data of reference Csv file. '... + 'MEMS was read as an electrolytic cell']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTiltLinkH(:,jj))); + idxND = find(strcmp('No Data',DatiTiltLinkH(:,jj))); + idxT = find(strcmp('---',DatiTiltLinkH(:,jj))); + idxT2 = find(strcmp('-',DatiTiltLinkH(:,jj))); + idxE2 = find(strcmp('Err2',DatiTiltLinkH(:,jj))); + idxE255 = find(strcmp('Err255',DatiTiltLinkH(:,jj))); + idxD = find(strcmp('DMUXe',DatiTiltLinkH(:,jj))); + idxE1F = find(strcmp('Err1File',DatiTiltLinkH(:,jj))); + idxN = find(strcmp('null',DatiTiltLinkH(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiTLH = datestr(datenum(datainiTLH)-1,'yyyy-mm-dd'); + break + end + DatiTiltLinkH(indice,jj) = DatiTiltLinkH(indice-1,jj); + ErrTiltLinkH(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + for ii = 2:r + % Cerco i multipli di 7 per identificare le temperature + Int = jj/4; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiTiltLinkH(ii,jj)) > 1000 + DatiTiltLinkH(ii,jj-6:jj) = DatiTiltLinkH(ii-1,jj-6:jj); + ErrTiltLinkH(ii,jj) = 1; + wardat = ['Data of Tilt Link H nodes corrected using Raw Data of reference Csv file. '... + 'MEMS was read as an electrolytic cell']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r % date + check = isnan(cell2mat(DatiTiltLinkH(nnn,jj))); + if check == 1 + DatiTiltLinkH(nnn,jj) = DatiTiltLinkH(nnn-1,jj); + ErrTiltLinkH(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Tilt Link H data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiTiltLinkH = [DATiniTLH str2double(DatiTiltLinkH)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiTiltLinkH(a,1) == DatiTiltLinkH(a-1,1) + DatiTiltLinkH(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + if NuovoZeroTLH == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiTiltLinkH(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiTiltLinkH(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiTiltLinkH(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiTiltLinkH(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiTiltLinkH; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniTLHRH ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumTLHRH ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniTLHRH = curs.Data; + Ntempo = DATiniTLHRH; + [r,c] = size(DATiniTLHRH); + saltoTLHRH = 0; + if r==1 && c==1 + textdatTLHRH = 'Warning: error reading Tilt Link HR H (control unit data)!'; + fprintf(fileID,fmt,textdatTLHRH); + saltoTLHRH = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiTLHRH ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumTLHRH ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2TLHRH = curs.Data; + Ndate = DAT2TLHRH; + if saltoTLHRH == 1 + DATiniTLHRH = DAT2TLHRH; + end + Check = size(DAT2TLHRH); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoTLHRH == 0 + DATiniTLHRH = [DATiniTLHRH; DAT2TLHRH]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniTLHRH); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniTLHRH(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniTLHRH(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniTLHRH = T; + else + DATiniTLHRH = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + % creo la matrice per i dati Tunnel Link + if saltoTLHRH == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiTiltLinkHRH = cell(rd+rt,6*rTLHRH); + else + DatiTiltLinkHRH = cell(rt,6*rTLHRH); + end + else + DatiTiltLinkHRH = cell(rd,6*rTLHRH); + end + NTiltLinkHRH = cell2mat(NodoTiltLinkHRH(:,2)); + col = 6; + ii = 1; + w = 0; + while ii <= rTLHRH + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NTiltLinkHRH(ii,1); + nNodo = num2str(nN); + comando = ['select Val0, Val1, Val3, Val4, Val5, Val6 from RawDataView where Date = ''' ... + datainiTLHRH ''' and Time >= ''' tempoiniTLHRH ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHRH = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val3, Val4, Val5, Val6 from RawDataView where Date > ''' ... + datainiTLHRH ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHRHd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-5; + if saltoTLHRH == 0 + DatiTiltLinkHRH(1:rt,ini_col:col) = DATnodoTLHRH(:,:); + else + DatiTiltLinkHRH(1:rd,ini_col:col) = DATnodoTLHRHd(:,:); + end + + [rn,~] = size(DATnodoTLHRHd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoTLHRHd(i,:) = DATnodoTLHRHd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Tilt Link HR H ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoTLHRH == 0 + DatiTiltLinkHRH(rt+1:rt+rd,ini_col:col) = DATnodoTLHRHd(:,:); + end + else + DatiTiltLinkHRH = DatiTiltLinkHRH(1:end,:); + end + okdatTLHRH = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rTLHRH) ' Tilt Link HR H nodes downloaded correctly']; + fprintf(fileID,fmt,okdatTLHRH); + ii = ii+1; + col = col+6; + end + if w == 0 + wardat = 'There are not warning for Tilt Link HR H!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiTiltLinkHRH); + ErrTiltLinkHRH = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroTLHRH == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiTLHRH)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTiltLinkHRH(1,jj))); + idxND = find(strcmp('No Data',DatiTiltLinkHRH(1,jj))); + idxT = find(strcmp('---',DatiTiltLinkHRH(1,jj))); + idxT2 = find(strcmp('-',DatiTiltLinkHRH(1,jj))); + idxE2 = find(strcmp('Err2',DatiTiltLinkHRH(1,jj))); + idxE255 = find(strcmp('Err255',DatiTiltLinkHRH(1,jj))); + idxD = find(strcmp('DMUXe',DatiTiltLinkHRH(1,jj))); + idxE1F = find(strcmp('Err1File',DatiTiltLinkHRH(1,jj))); + idxN = find(strcmp('null',DatiTiltLinkHRH(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Tilt Link HR H nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroTLHRH == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiTLHRH)+1 < now + datainiTLHRH = datestr(datenum(datainiTLHRH)+1,'yyyy-mm-dd'); + break + else + yesTLHRH = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiTLHRH = datestr(datenum(datainiTLHRH)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiTiltLinkHRH(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrTiltLinkHRH(1,jj) = 1; + wardat = 'Data of Tilt Link HR H nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiTLHRH = datestr(datenum(datainiTLHRH)-1,'yyyy-mm-dd'); + break + end + end + end + end + if ESCI == 0 + % Cerco i multipli di 6 per identificare le temperature + Int = jj/6; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiTiltLinkHRH(1,jj)) > 1000 + if rDR==1 && cDR==1 || NuovoZeroTLHRH == 0 + NAN = 0; + ESCI = 1; + if datenum(datainiTLHRH)+1 < now + datainiTLHRH = datestr(datenum(datainiTLHRH)+1,'yyyy-mm-dd'); + break + else + yesTLHRH = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiTLHRH = datestr(datenum(datainiTLHRH)-1,'yyyy-mm-dd'); + break + else + DatiTiltLinkHRH(1,jj-5) = cellstr(num2str(DatiRaw(RawDate(end),jj-4))); + DatiTiltLinkHRH(1,jj-4) = cellstr(num2str(DatiRaw(RawDate(end),jj-3))); + DatiTiltLinkHRH(1,jj-3) = cellstr(num2str(DatiRaw(RawDate(end),jj-2))); + DatiTiltLinkHRH(1,jj-2) = cellstr(num2str(DatiRaw(RawDate(end),jj-1))); + DatiTiltLinkHRH(1,jj-1) = cellstr(num2str(DatiRaw(RawDate(end),jj))); + DatiTiltLinkHRH(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrTiltLinkHRH(1,jj) = 1; + wardat = ['Data of Tilt Link HR H nodes corrected using Raw Data of reference Csv file. '... + 'MEMS was read as an electrolytic cell']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTiltLinkHRH(:,jj))); + idxND = find(strcmp('No Data',DatiTiltLinkHRH(1,jj))); + idxT = find(strcmp('---',DatiTiltLinkHRH(:,jj))); + idxT2 = find(strcmp('-',DatiTiltLinkHRH(:,jj))); + idxE2 = find(strcmp('Err2',DatiTiltLinkHRH(:,jj))); + idxE255 = find(strcmp('Err255',DatiTiltLinkHRH(:,jj))); + idxD = find(strcmp('DMUXe',DatiTiltLinkHRH(:,jj))); + idxE1F = find(strcmp('Err1File',DatiTiltLinkHRH(:,jj))); + idxN = find(strcmp('null',DatiTiltLinkHRH(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiTLHRH = datestr(datenum(datainiTLHRH)-1,'yyyy-mm-dd'); + break + end + DatiTiltLinkHRH(indice,jj) = DatiTiltLinkHRH(indice-1,jj); + ErrTiltLinkHRH(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r % date + check = isnan(cell2mat(DatiTiltLinkHRH(nnn,jj))); + if check == 1 + DatiTiltLinkHRH(nnn,jj) = DatiTiltLinkHRH(nnn-1,jj); + ErrTiltLinkHRH(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Tilt Link HR H data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiTiltLinkHRH = [DATiniTLHRH str2double(DatiTiltLinkHRH)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiTiltLinkHRH(a,1) == DatiTiltLinkHRH(a-1,1) + DatiTiltLinkHRH(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + if NuovoZeroTLHRH == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiTiltLinkHRH(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiTiltLinkHRH(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiTiltLinkHRH(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiTiltLinkHRH(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiTiltLinkHRH; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniPCL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumPCL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniPCL = curs.Data; + Ntempo = DATiniPCL; + [r,c] = size(DATiniPCL); + saltoPCL = 0; + if r==1 && c==1 + textdatPCL = 'Warning: error reading PreConv Link (control unit data)!'; + fprintf(fileID,fmt,textdatPCL); + saltoPCL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiPCL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumPCL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + DAT2PCL = curs.Data; + Ndate = DAT2PCL; + if saltoPCL == 1 + DATiniPCL = DAT2PCL; + end + Check = size(DAT2PCL); + if Check(1,2) > 1 % ho superato il primo giorno + if saltoPCL == 0 + DATiniPCL = [DATiniPCL; DAT2PCL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniPCL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniPCL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniPCL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniPCL = T; + else + DATiniPCL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoPCL == 0 + % creo la matrice per i datiPreConvLink + if Check(1,2) > 1 + DatiPreConvLink = cell(rd+rt,4*rPCL); + else + DatiPreConvLink = cell(rt,4*rPCL); + end + else + DatiPreConvLink = cell(rd,4*rPCL); + end + NPreConvLink = cell2mat(NodoPreConvLink(:,2)); + col = 4; + ii = 1; + w = 0; + while ii <= rPCL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NPreConvLink(ii,1); + nNodo = num2str(nN); + comando = ['select Val0, Val1, Val2, Val6 from RawDataView where Date = ''' ... + datainiPCL ''' and Time >= ''' tempoiniPCL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPCL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val6 from RawDataView where Date > ''' ... + datainiPCL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPCLd = curs.Data; + % Concateno i dati relativi a Step 1 e 2 per il nodo ii-esimo. + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-3; + if saltoPCL == 0 + DatiPreConvLink(1:rt,ini_col:col) = DATnodoPCL(:,:); + else + DatiPreConvLink(1:rd,ini_col:col) = DATnodoPCL(:,:); + end + + [rn,~] = size(DATnodoPCLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoPCLd(i,:) = DATnodoPCLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node PreConv Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoPCL == 0 + DatiPreConvLink(rt+1:rt+rd,ini_col:col) = DATnodoPCLd(:,:); + end + else + DatiPreConvLink = DatiPreConvLink(1:end,:); + end + okdatPCL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rPCL) ' PreConv Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatPCL); + col = col+4; + ii = ii+1; + end + if w == 0 + wardat = 'There are not warning for PreConv Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiPreConvLink); + ErrPreConvLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroPCL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiPCL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiPreConvLink(1,jj))); + idxND = find(strcmp('No Data',DatiPreConvLink(1,jj))); + idxT = find(strcmp('---',DatiPreConvLink(1,jj))); + idxT2 = find(strcmp('-',DatiPreConvLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiPreConvLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiPreConvLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiPreConvLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiPreConvLink(1,jj))); + idxN = find(strcmp('null',DatiPreConvLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Pre Conv Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroPCL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiPCL)+1 < now + datainiPCL = datestr(datenum(datainiPCL)+1,'yyyy-mm-dd'); + break + else + yesPCL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiPCL = datestr(datenum(datainiPCL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiPreConvLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrPreConvLink(1,jj) = 1; + wardat = 'Data of PreConv Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiPCL = datestr(datenum(datainiPCL)-1,'yyyy-mm-dd'); + break + end + end + end + end + if ESCI == 0 + % Cerco i multipli di 4 per identificare le temperature + Int = jj/4; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiPreConvLink(1,jj)) > 1000 + if rDR==1 && cDR==1 || NuovoZeroPCL == 0 + NAN = 0; + ESCI = 1; + if datenum(datainiPCL)+1 < now + datainiPCL = datestr(datenum(datainiPCL)+1,'yyyy-mm-dd'); + break + else + yesPCL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiPCL = datestr(datenum(datainiPCL)-1,'yyyy-mm-dd'); + break + else + DatiPreConvLink(1,jj-3) = cellstr(num2str(DatiRaw(RawDate(end),jj-2))); + DatiPreConvLink(1,jj-2) = cellstr(num2str(DatiRaw(RawDate(end),jj-1))); + DatiPreConvLink(1,jj-1) = cellstr(num2str(DatiRaw(RawDate(end),jj))); + DatiPreConvLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrPreConvLink(1,jj) = 1; + wardat = ['Data of PreConv Link nodes corrected using Raw Data of reference Csv file. '... + 'MEMS was read as an electrolytic cell']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiPreConvLink(:,jj))); + idxND = find(strcmp('No Data',DatiPreConvLink(:,jj))); + idxT = find(strcmp('---',DatiPreConvLink(:,jj))); + idxT2 = find(strcmp('-',DatiPreConvLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiPreConvLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiPreConvLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiPreConvLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiPreConvLink(:,jj))); + idxN = find(strcmp('null',DatiPreConvLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiPCL = datestr(datenum(datainiPCL)-1,'yyyy-mm-dd'); + break + end + DatiPreConvLink(indice,jj) = DatiPreConvLink(indice-1,jj); + ErrPreConvLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + for ii = 2:r + % Cerco i multipli di 4 per identificare le temperature + Int = jj/4; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiPreConvLink(ii,jj)) > 1000 + DatiPreConvLink(ii,jj-6:jj) = DatiPreConvLink(ii-1,jj-6:jj); + ErrPreConvLink(ii,jj) = 1; + wardat = ['Data of PreConv Link nodes corrected using Raw Data of reference Csv file. '... + 'MEMS was read as an electrolytic cell']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r % date + check = isnan(cell2mat(DatiPreConvLink(nnn,jj))); + if check == 1 + DatiPreConvLink(nnn,jj) = DatiPreConvLink(nnn-1,jj); + ErrPreConvLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of PreConv Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiPreConvLink = [DATiniPCL str2double(DatiPreConvLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiPreConvLink(a,1) == DatiPreConvLink(a-1,1) + DatiPreConvLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + if NuovoZeroPCL == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiPreConvLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiPreConvLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiPreConvLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiPreConvLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiPreConvLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniPCLHR ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumPCLHR ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniPCLHR = curs.Data; + Ntempo = DATiniPCLHR; + [r,c] = size(DATiniPCLHR); + saltoPCLHR = 0; + if r==1 && c==1 + textdatPCLHR = 'Warning: error reading PreConv Link HR (control unit data)!'; + fprintf(fileID,fmt,textdatPCLHR); + saltoPCLHR = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiPCLHR ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' ... + NodeNumPCLHR ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2PCLHR = curs.Data; + Ndate = DAT2PCLHR; + if saltoPCLHR == 1 + DATiniPCLHR = DAT2PCLHR; + end + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + Check = size(DAT2PCLHR); + if Check(1,2) > 1 % ho superato il primo giorno + if saltoPCLHR == 1 + DATiniPCLHR = [DATiniPCLHR; DAT2PCLHR]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniPCLHR); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniPCLHR(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniPCLHR(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniPCLHR = T; + else + DATiniPCLHR = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + % creo la matrice per i dati + if saltoPCLHR == 0 + if Check(1,2) > 1 + DatiPreConvLinkHR = cell(rd+rt,3*rPCLHR); + else + DatiPreConvLinkHR = cell(rt,3*rPCLHR); + end + else + DatiPreConvLinkHR = cell(rd,3*rPCLHR); + end + NPreConvLinkHR = cell2mat(NodoPreConvLinkHR(:,2)); + ii = 1; + col = 3; + w = 0; + while ii <= rPCL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NPreConvLinkHR(ii,1); + nNodo = num2str(nN); + comando = ['select Val0, Val1, Val3, Val4, Val5, Val6 from RawDataView where Date = ''' datainiPCLHR ''' and Time >= ''' ... + tempoiniPCLHR ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPCLHR = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val3, Val4, Val5, Val6 from RawDataView where Date > ''' ... + datainiPCLHR ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPCLHRd = curs.Data; + % Concateno i dati relativi a Step 1 e 2 per il nodo ii-esimo. + + ini_col = col-5; + if saltoPCLHR == 0 + DatiPreConvLinkHR(1:rt,ini_col:col) = DATnodoPCLHR(:,:); + else + DatiPreConvLinkHR(1:rd,ini_col:col) = DATnodoPCLHR(:,:); + end + + [rn,~] = size(DATnodoTLHRdH); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoPCLHRd(i,:) = DATnodoPCLHRd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node PreConv Link HR ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoPCLHR == 0 + DatiPreConvLinkHR(rt+1:rt+rd,ini_col:col) = DATnodoPCLHRd(:,:); + end + else + DatiPreConvLinkHR = DatiPreConvLinkHR(1:end,:); + end + okdatPCLHR = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rPCLHR) ' PreConv Link HR nodes downloaded correctly']; + fprintf(fileID,fmt,okdatPCLHR); + col = col+3; + ii = ii+1; + end + if w == 0 + wardat = 'There are not warning for PreConv Link HR!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiPreConvLinkHR); + ErrPreConvLinkHR = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroPCLHR == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiPCLHR)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiPreConvLinkHR(1,jj))); + idxND = find(strcmp('No Data',DatiPreConvLinkHR(1,jj))); + idxT = find(strcmp('---',DatiPreConvLinkHR(1,jj))); + idxT2 = find(strcmp('-',DatiPreConvLinkHR(1,jj))); + idxE2 = find(strcmp('Err2',DatiPreConvLinkHR(1,jj))); + idxE255 = find(strcmp('Err255',DatiPreConvLinkHR(1,jj))); + idxD = find(strcmp('DMUXe',DatiPreConvLinkHR(1,jj))); + idxE1F = find(strcmp('Err1File',DatiPreConvLinkHR(1,jj))); + idxN = find(strcmp('null',DatiPreConvLinkHR(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of PreConv Link HR nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroPCLHR == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiPCLHR)+1 < now + datainiPCLHR = datestr(datenum(datainiPCLHR)+1,'yyyy-mm-dd'); + break + else + yesPCLHR = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiPCLHR = datestr(datenum(datainiPCLHR)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiPreConvLinkHR(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrPreConvLinkHR(1,jj) = 1; + wardat = 'Data of PreConv Link HR nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiPCLHR = datestr(datenum(datainiPCLHR)-1,'yyyy-mm-dd'); + break + end + end + end + end + if ESCI == 0 + % Cerco i multipli di 6 per identificare le temperature + Int = jj/6; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiPreConvLinkHR(1,jj)) < 500 + if rDR==1 && cDR==1 || NuovoZeroPCLHR == 0 + NAN = 0; + ESCI = 1; + if datenum(datainiPCLHR)+1 < now + datainiPCLHR = datestr(datenum(datainiPCLHR)+1,'yyyy-mm-dd'); + break + else + yesPCLHR = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiPCLHR = datestr(datenum(datainiPCLHR)-1,'yyyy-mm-dd'); + break + else + DatiPreConvLinkHR(1,jj-5) = cellstr(num2str(DatiRaw(RawDate(end),jj-4))); + DatiPreConvLinkHR(1,jj-4) = cellstr(num2str(DatiRaw(RawDate(end),jj-3))); + DatiPreConvLinkHR(1,jj-3) = cellstr(num2str(DatiRaw(RawDate(end),jj-2))); + DatiPreConvLinkHR(1,jj-2) = cellstr(num2str(DatiRaw(RawDate(end),jj-1))); + DatiPreConvLinkHR(1,jj-1) = cellstr(num2str(DatiRaw(RawDate(end),jj))); + DatiPreConvLinkHR(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrPreConvLinkHR(1,jj) = 1; + wardat = ['Data of PreConv Link HR nodes corrected using Raw Data of reference Csv file. '... + 'MEMS was read as an electrolytic cell']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiPreConvLinkHR(:,jj))); + idxND = find(strcmp('No Data',DatiPreConvLinkHR(:,jj))); + idxT = find(strcmp('---',DatiPreConvLinkHR(:,jj))); + idxT2 = find(strcmp('-',DatiPreConvLinkHR(:,jj))); + idxE2 = find(strcmp('Err2',DatiPreConvLinkHR(:,jj))); + idxE255 = find(strcmp('Err255',DatiPreConvLinkHR(:,jj))); + idxD = find(strcmp('DMUXe',DatiPreConvLinkHR(:,jj))); + idxE1F = find(strcmp('Err1File',DatiPreConvLinkHR(:,jj))); + idxN = find(strcmp('null',DatiPreConvLinkHR(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiPCLHR = datestr(datenum(datainiPCLHR)-1,'yyyy-mm-dd'); + break + end + DatiPreConvLinkHR(indice,jj) = DatiPreConvLinkHR(indice-1,jj); + ErrPreConvLinkHR(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r % date + check = isnan(cell2mat(DatiPreConvLinkHR(nnn,jj))); + if check == 1 + DatiPreConvLinkHR(nnn,jj) = DatiPreConvLinkHR(nnn-1,jj); + ErrPreConvLinkHR(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of PreConv Link HR data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiPreConvLinkHR = [DATiniPCLHR str2double(DatiPreConvLinkHR)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiPreConvLinkHR(a,1) == DatiPreConvLinkHR(a-1,1) + DatiPreConvLinkHR(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + if NuovoZeroPCLHR == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiPreConvLinkHR(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiPreConvLinkHR(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiPreConvLinkHR(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiPreConvLinkHR(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiPreConvLinkHR; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniPL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumPL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniPL = curs.Data; + Ntempo = DATiniPL; + [r,c] = size(DATiniPL); + saltoPL = 0; + if r==1 && c==1 + textdatPL = 'Warning: error reading Pressure Link (control unit data)!'; + fprintf(fileID,fmt,textdatPL); + saltoPL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiPL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = '''... + NodeType ''' and NodeNum = ''' NodeNumPL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2PL = curs.Data; + Ndate = DAT2PL; + if saltoPL == 1 + DATiniPL = DAT2PL; + end + Check = size(DAT2PL); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoPL == 0 + DATiniPL = [DATiniPL; DAT2PL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniPL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniPL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniPL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniPL = T; + else + DATiniPL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + if saltoPL == 0 + if Check(1,2) > 1 + % creo la matrice per i dati Pressure Link + DatiPressureLink = cell(rd+rt,rPrL); + else + DatiPressureLink = cell(rt,rPrL); + end + else + DatiPressureLink = cell(rd,rPrL); + end + NPressureLink = cell2mat(NodoPressureLink(:,2)); + col = 1; + ii = 1; + w = 0; + while ii <= rPrL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NPressureLink(ii,1); + nNodo = num2str(nN); + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiPL ''' and Time >= ''' tempoiniPL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiPL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPLd = curs.Data; + % Concateno i dati relativi a Step 1 e 2 per il nodo ii-esimo. + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoPL == 0 + DatiPressureLink(1:rt,col) = DATnodoPL(:,:); + else + DatiPressureLink(1:rd,col) = DATnodoPL(:,:); + end + + [rn,~] = size(DATnodoPLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoPLd(i,:) = DATnodoPLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Pressure Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoPL == 0 + DatiPressureLink(rt+1:rt+rd,col) = DATnodoPLd(:,:); + end + else + DatiPressureLink = DatiPressureLink(1:end,:); + end + okdatPL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rPrL) ' Pressure Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatPL); + ii = ii+1; + col = col+1; + end + if w == 0 + wardat = 'There are not warning for Pressure Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiPressureLink); + ErrPressureLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroPrL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiPL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + for jj=1:c + % Se il nodo è Dis., devo aumentare di uno la data (il nodo non + % è ancora stato installato!) + if strcmp('Dis.',DatiPressureLink(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',DatiPressureLink(dis,jj)) == 0 + DatiPressureLink = DatiPressureLink(dis:end,:); + DATiniPL = DATiniPL(dis:end,:); + [r,c] = size(DatiPressureLink); + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiPL)+1 < now + datainiPL = datestr(datenum(datainiPL)+1,'yyyy-mm-dd'); + break + else + yesPL = 0; + end + end + end + end + end + if DIS ~= 1 && yesPL == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiPressureLink(1,jj))); + idxT = find(strcmp('---',DatiPressureLink(1,jj))); + idxT2 = find(strcmp('-',DatiPressureLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiPressureLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiPressureLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiPressureLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiPressureLink(1,jj))); + idxN = find(strcmp('null',DatiPressureLink(1,jj))); + idxRX = find(strcmp('No RX',DatiPressureLink(1,jj))); + idxI = find(strcmp('id Error',DatiPressureLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiPressureLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiPressureLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiPressureLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiPressureLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiPressureLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiPressureLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiPressureLink(1,jj))); + idxND = find(strcmp('No Data',DatiPressureLink(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiPressureLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Pressure Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroPrL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiPL)+1 < now + datainiPL = datestr(datenum(datainiPL)+1,'yyyy-mm-dd'); + break + else + yesPL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiPL = datestr(datenum(datainiPL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiPressureLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrPressureLink(1,jj) = 1; + wardat = 'Data of Pressure Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiPL = datestr(datenum(datainiPL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiPressureLink(:,jj))); + idxT = find(strcmp('---',DatiPressureLink(:,jj))); + idxT2 = find(strcmp('-',DatiPressureLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiPressureLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiPressureLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiPressureLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiPressureLink(:,jj))); + idxN = find(strcmp('null',DatiPressureLink(:,jj))); + idxRX = find(strcmp('No RX',DatiPressureLink(:,jj))); + idxI = find(strcmp('id Error',DatiPressureLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiPressureLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiPressureLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiPressureLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiPressureLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiPressureLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiPressureLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiPressureLink(:,jj))); + idxND = find(strcmp('No Data',DatiPressureLink(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiPressureLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiPL = datestr(datenum(datainiPL)-1,'yyyy-mm-dd'); + break + else + DatiPressureLink(indice,jj) = DatiPressureLink(indice-1,jj); + ErrPressureLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiPressureLink(nnn,jj))); + if check == 1 + DatiPressureLink(nnn,jj) = DatiPressureLink(nnn-1,jj); + ErrPressureLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Pressure Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiPressureLink = [DATiniPL str2double(DatiPressureLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiPressureLink(a,1) == DatiPressureLink(a-1,1) + DatiPressureLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + end + if NuovoZeroPrL == 1 && yesPL == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiPressureLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiPressureLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiPressureLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiPressureLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiPressureLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniLL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumLL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniLL = curs.Data; + Ntempo = DATiniLL; + [r,c] = size(DATiniLL); + saltoLL = 0; + if r==1 && c==1 + textdatLL = 'Warning: error reading Load Link (control unit data)!'; + fprintf(fileID,fmt,textdatLL); + saltoLL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiLL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumLL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2LL = curs.Data; + Ndate = DAT2LL; + if saltoLL == 1 + DATiniLL = DAT2LL; + end + Check = size(DAT2LL); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoLL == 0 + DATiniLL = [DATiniLL; DAT2LL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniLL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniLL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniLL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniLL = T; + else + DATiniLL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + % creo la matrice per i dati Load Link + if saltoLL == 0 + if Check(1,2) > 1 + DatiLoadLink = cell(rd+rt,rLL); + else + DatiLoadLink = cell(rt,rLL); + end + else + DatiLoadLink = cell(rd,rLL); + end + NLoadLink = cell2mat(NodoLoadLink(:,2)); + col = 1; + ii = 1; + w = 0; + while ii <= rLL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NLoadLink(ii,1); + nNodo = num2str(nN); + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiLL ''' and Time >= ''' tempoiniLL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoLL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiLL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoLLd = curs.Data; + % Concateno i dati relativi a Step 1 e 2 per il nodo ii-esimo. + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoLL == 0 + DatiLoadLink(1:rt,col) = DATnodoLL(:,:); + else + DatiLoadLink(1:rd,col) = DATnodoLL(:,:); + end + + [rn,~] = size(DATnodoLLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoLLd(i,:) = DATnodoLLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Load Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoLL == 0 + DatiLoadLink(rt+1:rt+rd,col) = DATnodoLLd(:,:); + end + else + DatiLoadLink = DatiLoadLink(1:end,:); + end + okdatLL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rLL) ' Load Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatLL); + ii = ii+1; + col = col+1; + end + if w == 0 + wardat = 'There are not warning for Load Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiLoadLink); + ErrLoadLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroLL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiLL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + for jj=1:c + if strcmp('Dis.',DatiLoadLink(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',DatiLoadLink(dis,jj)) == 0 + DatiLoadLink = DatiLoadLink(dis:end,:); + DATiniLL = DATiniLL(dis:end,:); + [r,c] = size(DatiLoadLink); + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiLL)+1 < now + datainiLL = datestr(datenum(datainiLL)+1,'yyyy-mm-dd'); + break + else + yesLL = 0; + end + end + end + end + end + if DIS ~= 1 && yesLL == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiLoadLink(1,jj))); + idxT = find(strcmp('---',DatiLoadLink(1,jj))); + idxT2 = find(strcmp('-',DatiLoadLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiLoadLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiLoadLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiLoadLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiLoadLink(1,jj))); + idxN = find(strcmp('null',DatiLoadLink(1,jj))); + idxRX = find(strcmp('No RX',DatiLoadLink(1,jj))); + idxI = find(strcmp('id Error',DatiLoadLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiLoadLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiLoadLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiLoadLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiLoadLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiLoadLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiLoadLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiLoadLink(1,jj))); + idxND = find(strcmp('No Data',DatiLoadLink(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiLoadLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Load Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroLL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiLL)+1 < now + datainiLL = datestr(datenum(datainiLL)+1,'yyyy-mm-dd'); + break + else + yesLL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiLL = datestr(datenum(datainiLL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiLoadLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrLoadLink(1,jj) = 1; + wardat = 'Data of Load Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiLL = datestr(datenum(datainiLL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiLoadLink(:,jj))); + idxT = find(strcmp('---',DatiLoadLink(:,jj))); + idxT2 = find(strcmp('-',DatiLoadLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiLoadLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiLoadLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiLoadLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiLoadLink(:,jj))); + idxN = find(strcmp('null',DatiLoadLink(:,jj))); + idxRX = find(strcmp('No RX',DatiLoadLink(:,jj))); + idxI = find(strcmp('id Error',DatiLoadLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiLoadLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiLoadLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiLoadLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiLoadLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiLoadLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiLoadLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiLoadLink(:,jj))); + idxND = find(strcmp('No Data',DatiLoadLink(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiLoadLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiLL = datestr(datenum(datainiLL)-1,'yyyy-mm-dd'); + break + else + DatiLoadLink(indice,jj) = DatiLoadLink(indice-1,jj); + ErrLoadLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiLoadLink(nnn,jj))); + if check == 1 + DatiLoadLink(nnn,jj) = DatiLoadLink(nnn-1,jj); + ErrLoadLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Load Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiLoadLink = [DATiniLL str2double(DatiLoadLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiLoadLink(a,1) == DatiLoadLink(a-1,1) + DatiLoadLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + end + if NuovoZeroLL == 1 && yesLL == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiLoadLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiLoadLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiLoadLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiLoadLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiLoadLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniEL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumEL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniEL = curs.Data; + Ntempo = DATiniEL; + [r,c] = size(DATiniEL); + saltoEL = 0; + if r==1 && c==1 + textdatEL = 'Warning: error reading Extensometer Link (control unit data)!'; + fprintf(fileID,fmt,textdatEL); + saltoEL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiEL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumEL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2EL = curs.Data; + Ndate = DAT2EL; + if saltoEL == 1 + DATiniEL = DAT2EL; + end + Check = size(DAT2EL); + if Check(1,2) > 1 % ho superato il primo giorno + if saltoEL == 0 + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + DATiniEL = [DATiniEL; DAT2EL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniEL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniEL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniEL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniEL = T; + else + DATiniEL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + % creo la matrice per i dati Extensometer Link + col = 1; + ii = 1; + if saltoEL == 0 + if Check(1,2) > 1 + DatiExtensometerLink = cell(rd+rt,rEL); + DatiNTCExtensometerLink = cell(rd+rt,rEL); + else + DatiExtensometerLink = cell(rt,rEL); + DatiNTCExtensometerLink = cell(rt,rEL); + end + else + DatiExtensometerLink = cell(rd,rEL); + DatiNTCExtensometerLink = cell(rd,rEL); + end + DatiExtensometerLink_Rif = cell(150,rEL); + NExtensometerLink = cell2mat(NodoExtensometerLink(:,2)); + w = 0; + while ii <= rEL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NExtensometerLink(ii,1); + nNodo = num2str(nN); + % Dato + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiEL ''' and Time >= ''' tempoiniEL ''' and ToolNameID = ''' ... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoEL = curs.Data; + % Dato + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiEL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = '''... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoELd = curs.Data; + % Riferimento + comando = ['select Val0 from RawDataView where Date = ''' ... + datestr(Date_Rif_EL,'yyyy-mm-dd') ''' and Time >= ''' datestr(Date_Rif_EL,'HH:MM:SS')... + ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoEL_Rif = curs.Data; + if ChEL(ii,1) == 1 + % T + DATnodoEL_NTC = 0; + DATnodoELd_NTC = 0; + elseif ChEL(ii,1) >= 2 + if EL_NTC(ii,1)==1 + % Temperatura + comando = ['select Val1 from RawDataView where Date = ''' ... + datainiEL ''' and Time >= ''' tempoiniEL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoEL_NTC = curs.Data; + comando = ['select Val1 from RawDataView where Date > ''' ... + datainiEL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoELd_NTC = curs.Data; + else + DATnodoEL_NTC = 0; + DATnodoELd_NTC = 0; + end + end + % Concateno i dati relativi a Step 1 e 2 per il nodo ii-esimo. + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoEL == 0 + if ChEL(ii,1) >= 2 + if EL_NTC(ii,1)==1 + DatiExtensometerLink(1:rt,col) = DATnodoEL(:,:); + DatiNTCExtensometerLink(1:rt,col) = DATnodoEL_NTC(:,:); + else + DatiExtensometerLink(1:rt,col) = DATnodoEL(:,:); %#ok<*AGROW> + end + elseif ChEL(ii,1) == 1 + DatiExtensometerLink(1:rt,col) = DATnodoEL(:,:); %#ok<*AGROW> + end + else + if ChEL(ii,1) >= 2 + if EL_NTC(ii,1)==1 + DatiExtensometerLink(1:rd,col) = DATnodoEL(:,:); + DatiNTCExtensometerLink(1:rd,col) = DATnodoEL_NTC(:,:); + else + DatiExtensometerLink(1:rd,col) = DATnodoEL(:,:); %#ok<*AGROW> + end + elseif ChEL(ii,1) == 1 + DatiExtensometerLink(1:rd,col) = DATnodoEL(:,:); %#ok<*AGROW> + end + end + + % Riferimento + [dim,~] = size(DATnodoEL_Rif); % controllo date + DatiExtensometerLink_Rif(1:dim,col) = DATnodoEL_Rif; + if col == 1 + DatiExtensometerLink_Rif(dim+1:end,:) = []; + end + + [rn,~] = size(DATnodoELd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoELd(i,:) = DATnodoELd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Extensometer Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + [rnT,~] = size(DATnodoELd_NTC); % controllo date + if rnT < rd % normalmente sono uguali + for i = rnT+1:rd + DATnodoELd_NTC(i,:) = DATnodoELd_NTC(rnT,:); % se mancano dati, copio gli ultimi + end + wardat = ['NTC of Node Extensometer Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoEL == 0 + if ChEL(ii,1) == 1 + DatiExtensometerLink(rt+1:rt+rd,col) = DATnodoELd(:,:); + elseif EL_NTC(ii,1) == 0 + DatiExtensometerLink(rt+1:rt+rd,col) = DATnodoELd(:,:); + else + DatiExtensometerLink(rt+1:rt+rd,col) = DATnodoELd(:,:); + DatiNTCExtensometerLink(rt+1:rt+rd,col) = DATnodoELd_NTC(:,:); + end + end + else + DatiExtensometerLink = DatiExtensometerLink(1:end,:); + DatiNTCExtensometerLink = DatiNTCExtensometerLink(1:end,:); + end + okdatEL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rEL) ' Extensometer Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatEL); + ii = ii+1; + col = col+1; + end + if w == 0 + wardat = 'There are not warning for Extensometer Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + % Dati + [r,c] = size(DatiExtensometerLink); + ErrExtensometerLink = zeros(r,c); + Ncorr = 0; + NAN = 1; + ESCI = 0; + RIF = 0; + row = 1; + if NuovoZeroEL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiEL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + FileRif = ['' IDcentralina '-' DTcatena '-ExtensometerRif.csv']; + while RIF == 0 + if row <= dim + % Controllo la data di riferimento + idxE = find(strcmp('Err1',DatiExtensometerLink_Rif(row,:))); + idxT = find(strcmp('---',DatiExtensometerLink_Rif(row,:))); + idxT2 = find(strcmp('-',DatiExtensometerLink_Rif(row,:))); + idxE2 = find(strcmp('Err2',DatiExtensometerLink_Rif(row,:))); + idxE255 = find(strcmp('Err255',DatiExtensometerLink_Rif(row,:))); + idxD = find(strcmp('DMUXe',DatiExtensometerLink_Rif(row,:))); + idxE1F = find(strcmp('Err1File',DatiExtensometerLink_Rif(row,:))); + idxN = find(strcmp('null',DatiExtensometerLink_Rif(row,:))); + idxRX = find(strcmp('No RX',DatiExtensometerLink_Rif(row,:))); + idxI = find(strcmp('id Error',DatiExtensometerLink_Rif(row,:))); + idxM = find(strcmp('MUX id Error',DatiExtensometerLink_Rif(row,:))); + idxC = find(strcmp('CH n. Error',DatiExtensometerLink_Rif(row,:))); + idxU = find(strcmp('Unknown Error',DatiExtensometerLink_Rif(row,:))); + idxMC = find(strcmp('MsgCorrup',DatiExtensometerLink_Rif(row,:))); + idxNS = find(strcmp('NotSupp',DatiExtensometerLink_Rif(row,:))); + idxU2 = find(strcmp('Unknown',DatiExtensometerLink_Rif(row,:))); + idxNA = find(strcmp('NotAv',DatiExtensometerLink_Rif(row,:))); + idxDIS = find(strcmp('Dis.',DatiExtensometerLink_Rif(row,:))); + idxND = find(strcmp('No Data',DatiExtensometerLink_Rif(row,:))); + idxCE = find(strcmp('CH n. Er',DatiExtensometerLink_Rif(row,:))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxDIS); + idx = union(idx,idxND); + [~,ri] = size(idx); + if ri >= 1 && isempty(idx) == 0 % Se almeno uno è in errore, allora guardo la riga dopo + if isfile(FileRif) == 1 + DatiRif = csvread(FileRif); + if isnan(DatiRif(1,ri)) == 0 + DatiExtensometerLink_Rif(1,ri) = cellstr(num2str(DatiRif(1,ri))); + else + row = row+1; + end + else + row = row+1; + end + else + RIF = 1; + DatiExtensometerLink_Rif = DatiExtensometerLink_Rif(row,:); + end + else + Date_Rif_EL = datestr(datenum(Date_Rif_EL)+1,'yyyy-mm-dd'); + RIF = 1; + NAN = 0; + end + end + if NAN == 1 + for jj=1:c + % Se il nodo è Dis., devo aumentare di uno la data (il nodo non + % è ancora stato installato!) + if strcmp('Dis.',DatiExtensometerLink(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',DatiExtensometerLink(dis,jj)) == 0 + DatiExtensometerLink = DatiExtensometerLink(dis:end,:); + DATiniEL = DATiniEL(dis:end,:); + DatiNTCExtensometerLink = DatiNTCExtensometerLink(dis:end,:); + [r,c] = size(DatiExtensometerLink); + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiEL)+1 < now + datainiEL = datestr(datenum(datainiEL)+1,'yyyy-mm-dd'); + break + else + yesEL = 0; + end + end + end + end + end + + if DIS ~= 1 && yesEL == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiExtensometerLink(1,jj))); + idxT = find(strcmp('---',DatiExtensometerLink(1,jj))); + idxT2 = find(strcmp('-',DatiExtensometerLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiExtensometerLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiExtensometerLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiExtensometerLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiExtensometerLink(1,jj))); + idxN = find(strcmp('null',DatiExtensometerLink(1,jj))); + idxRX = find(strcmp('No RX',DatiExtensometerLink(1,jj))); + idxI = find(strcmp('id Error',DatiExtensometerLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiExtensometerLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiExtensometerLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiExtensometerLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiExtensometerLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiExtensometerLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiExtensometerLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiExtensometerLink(1,jj))); + idxND = find(strcmp('No Data',DatiExtensometerLink(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiExtensometerLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Extensometer Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroEL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiEL)+1 < now + datainiEL = datestr(datenum(datainiEL)+1,'yyyy-mm-dd'); + break + else + yesEL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiEL = datestr(datenum(datainiEL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiExtensometerLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrExtensometerLink(1,jj) = 1; + wardat = 'Data of Extensometer Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiEL = datestr(datenum(datainiEL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + idxE = find(strcmp('Err1',DatiExtensometerLink(:,jj))); + idxT = find(strcmp('---',DatiExtensometerLink(:,jj))); + idxT2 = find(strcmp('-',DatiExtensometerLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiExtensometerLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiExtensometerLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiExtensometerLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiExtensometerLink(:,jj))); + idxN = find(strcmp('null',DatiExtensometerLink(:,jj))); + idxRX = find(strcmp('No RX',DatiExtensometerLink(:,jj))); + idxI = find(strcmp('id Error',DatiExtensometerLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiExtensometerLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiExtensometerLink(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiExtensometerLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiExtensometerLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiExtensometerLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiExtensometerLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiExtensometerLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiExtensometerLink(:,jj))); + idxND = find(strcmp('No Data',DatiExtensometerLink(:,jj))); + idx = union(idxND,idxE); + idx = union(idx,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxCE); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiEL = datestr(datenum(datainiEL)-1,'yyyy-mm-dd'); + break + else + DatiExtensometerLink(indice,jj) = DatiExtensometerLink(indice-1,jj); + ErrExtensometerLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiExtensometerLink(nnn,jj))); + if check == 1 + DatiExtensometerLink(nnn,jj) = DatiExtensometerLink(nnn-1,jj); + ErrExtensometerLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Extensometer Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiExtensometerLink = [DATiniEL str2double(DatiExtensometerLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiExtensometerLink(a,1) == DatiExtensometerLink(a-1,1) + DatiExtensometerLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + if ESCI == 0 + if sum(EL_NTC(:,1))>0 + if DIS ~= 1 && yesEL == 1 + % T + [r,c] = size(DatiNTCExtensometerLink); + Ncorr = 0; + if NuovoZeroEL == 1 + if isfile(RawDataFile) == 1 + DatiRawNTC = csvread(RawDataFileNTC); + [rDR,cDR] = size(DatiRawNTC); + DatiRawNTC(:,1) = DatiRawNTC(:,1) + 730000; + RawDateNTC = find(DatiRawNTC(:,1)<=datenum(datainiEL)); + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTCExtensometerLink(1,jj))); + idxT = find(strcmp('---',DatiNTCExtensometerLink(1,jj))); + idxT2 = find(strcmp('-',DatiNTCExtensometerLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiNTCExtensometerLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiNTCExtensometerLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiNTCExtensometerLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiNTCExtensometerLink(1,jj))); + idxN = find(strcmp('null',DatiNTCExtensometerLink(1,jj))); + idxRX = find(strcmp('No RX',DatiNTCExtensometerLink(1,jj))); + idxI = find(strcmp('id Error',DatiNTCExtensometerLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiNTCExtensometerLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiNTCExtensometerLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiNTCExtensometerLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTCExtensometerLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiNTCExtensometerLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiNTCExtensometerLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiNTCExtensometerLink(1,jj))); + idxND = find(strcmp('No Data',DatiNTCExtensometerLink(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiNTCExtensometerLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of NTC of Extensometer Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroEL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiEL)+1 < now + datainiEL = datestr(datenum(datainiEL)+1,'yyyy-mm-dd'); + break + else + yesEL = 0; + end + else + if isempty(RawDateNTC) == 1 + NAN = 0; + ESCI = 1; + datainiEL = datestr(datenum(datainiEL)-1,'yyyy-mm-dd'); + break + else + DatiNTCExtensometerLink(1,jj) = cellstr(num2str(DatiRawNTC(RawDateNTC(end),jj+1))); + if ErrExtensometerLink(indice,jj) == 0 + ErrExtensometerLink(indice,jj) = 0.5; + else + ErrExtensometerLink(indice,jj) = 1; + end + wardat = 'Data of NTC of Extensometer Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTCExtensometerLink(:,jj))); + idxT = find(strcmp('-',DatiNTCExtensometerLink(:,jj))); + idxT3 = find(strcmp('---',DatiNTCExtensometerLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiNTCExtensometerLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiNTCExtensometerLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiNTCExtensometerLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiNTCExtensometerLink(:,jj))); + idxN = find(strcmp('null',DatiNTCExtensometerLink(:,jj))); + idxRX = find(strcmp('No RX',DatiNTCExtensometerLink(:,jj))); + idxI = find(strcmp('id Error',DatiNTCExtensometerLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiNTCExtensometerLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiNTCExtensometerLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiNTCExtensometerLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTCExtensometerLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiNTCExtensometerLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiNTCExtensometerLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiNTCExtensometerLink(:,jj))); + idxND = find(strcmp('No Data',DatiNTCExtensometerLink(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiNTCExtensometerLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT3); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiEL = datestr(datenum(datainiEL)-1,'yyyy-mm-dd'); + break + else + DatiNTCExtensometerLink(indice,jj) = DatiNTCExtensometerLink(indice-1,jj); + if ErrExtensometerLink(indice,jj) == 0 + ErrExtensometerLink(indice,jj) = 0.5; + else + ErrExtensometerLink(indice,jj) = 1; + end + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiNTCExtensometerLink(nnn,jj))); + if check == 1 + DatiNTCExtensometerLink(nnn,jj) = DatiNTCExtensometerLink(nnn-1,jj); + if ErrExtensometerLink(indice,jj) == 0 + ErrExtensometerLink(indice,jj) = 0.5; + else + ErrExtensometerLink(indice,jj) = 1; + end + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of NTC for Extensometer Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiNTCExtensometerLink = [DATiniEL str2double(DatiNTCExtensometerLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiNTCExtensometerLink(a,1) == DatiNTCExtensometerLink(a-1,1) + DatiNTCExtensometerLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + end + end + end + if NuovoZeroEL == 1 && yesEL == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiExtensometerLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiExtensometerLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiExtensometerLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiExtensometerLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiExtensometerLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)0 + [rDR,cDR] = size(DatiRawNTC); + if rDR~=1 && cDR~=1 && isempty(DatiRawNTC) == 0 + RawDate1 = find(DatiRawNTC(:,1)<=DatiNTCExtensometerLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiNTCExtensometerLink(:,1)>DatiRawNTC(end,1)); + else + RawDate2 = find(DatiNTCExtensometerLink(:,1)>DatiRawNTC(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + DatiNTC = [DatiRawNTC(1:RawDate1(end),:);DatiNTCExtensometerLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + DatiNTC = DatiNTCExtensometerLink; + else + DatiNTC = DatiRawNTC; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(DatiNTC(:,1)0 + DatiNTC = DatiNTCExtensometerLink; + end + end + Dati(:,1) = Dati(:,1) - 730000; + csvwrite(RawDataFile,Dati); + if sum(EL_NTC(:,1))>0 + DatiNTC(:,1) = DatiNTC(:,1) - 730000; + csvwrite(RawDataFileNTC,DatiNTC); + end + if isfile(FileRif) == 0 + csvwrite(FileRif,str2double(DatiExtensometerLink_Rif)); + end +end + +%% 3D Extensometer Link +if yes3DEL == 0 % Non ci sono 3D Extensometer Link + Dati3DExtensometerLink = []; + Dati3DExtensometerLink_Rif = []; + Err3DExtensometerLink = []; + DatiNTC3DExtensometerLink = []; + ErrNTC3DExtensometerLink = []; + Ch3DEL = []; + EL3D_NTC = []; + wardat = 'lettura function: there are not 3D Extensometer Link'; + fprintf(fileID,fmt,wardat); +else + RawDataFile = ['' IDcentralina '-' DTcatena '-3DExtensometer-RawData.csv']; % Specifico per 3D Extensometer Link + RawDataFileNTC = ['' IDcentralina '-' DTcatena '-3DExtensometerNTC-RawData.csv']; % Specifico per NTC 3D Extensometer Link + Ch3DEL = cell2mat(Nodo3DExtensometerLink(:,4)); + EL3D_NTC = cell2mat(Nodo3DExtensometerLink(:,5)); + NAN = 0; + DIS = 0; + while NAN == 0 + if datenum(dataini3DEL) == datenum(Data(1,1)) + tempoini3DEL = char(Data(1,2)); + end + NodeType = '3D Extensometer Link'; + NodeNum3DEL = num2str(cell2mat(Nodo3DExtensometerLink(1,2))); % scarico i dati del primo nodo + % Scarico dei dati relativi alla centralina con informazioni di Data e ora, livello batteria e temperatura + % Step 1 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date = ''' ... + dataini3DEL ''' and Time >= ''' tempoini3DEL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNum3DEL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATini3DEL = curs.Data; + Ntempo = DATini3DEL; + [r,c] = size(DATini3DEL); + salto3DEL = 0; + if r==1 && c==1 + textdat3DEL = 'Warning: error reading 3D Extensometer Link (control unit data)!'; + fprintf(fileID,fmt,textdat3DEL); + salto3DEL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + dataini3DEL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNum3DEL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT23DEL = curs.Data; + Ndate = DAT23DEL; + if salto3DEL == 1 + DATini3DEL = DAT23DEL; + end + Check = size(DAT23DEL); + if Check(1,2) > 1 % ho superato il primo giorno + if salto3DEL == 0 + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + DATini3DEL = [DATini3DEL; DAT23DEL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATini3DEL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATini3DEL(:,1)) repmat(' ', [rD,1]) cell2mat(DATini3DEL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATini3DEL = T; + else + DATini3DEL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + if salto3DEL == 0 + % creo la matrice per i dati 3D Extensometer Link + if Check(1,2) > 1 + Dati3DExtensometerLink = cell(rd+rt,3*r3DEL); + DatiNTC3DExtensometerLink = cell(rd+rt,r3DEL); + else + Dati3DExtensometerLink = cell(rt,3*r3DEL); + DatiNTC3DExtensometerLink = cell(rt,r3DEL); + end + else + Dati3DExtensometerLink = cell(rd,3*r3DEL); + DatiNTC3DExtensometerLink = cell(rd,r3DEL); + end + Dati3DExtensometerLink_Rif = cell(150,3*r3DEL); + N3DExtensometerLink = cell2mat(Nodo3DExtensometerLink(:,2)); + col = 1; + colT = 1; + ii = 1; + w = 0; + while ii <= r3DEL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = N3DExtensometerLink(ii,1); + nNodo = num2str(nN); + comando = ['select Val0, Val1, Val2 from RawDataView where Date = ''' ... + dataini3DEL ''' and Time >= ''' tempoini3DEL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo3DEL = curs.Data; + comando = ['select Val0, Val1, Val2 from RawDataView where Date > ''' ... + dataini3DEL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo3DELd = curs.Data; + % Riferimento + comando = ['select Val0, Val1, Val2 from RawDataView where Date = ''' ... + datestr(Date_Rif_3DEL,'yyyy-mm-dd') ''' and Time >= ''' datestr(Date_Rif_3DEL,'HH:MM:SS')... + ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo3DEL_Rif = curs.Data; + if Ch3DEL(ii,1) == 3 + % T + DATnodo3DEL_NTC = 0; + DATnodo3DELd_NTC = 0; + elseif Ch3DEL(ii,1) == 4 + if EL3D_NTC(ii,1)==1 + comando = ['select Val3 from RawDataView where Date = ''' ... + dataini3DEL ''' and Time >= ''' tempoini3DEL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo3DEL_NTC = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val3 from RawDataView where Date > ''' ... + dataini3DEL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType... + ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo3DELd_NTC = curs.Data; + else + DATnodo3DEL_NTC = 0; + DATnodo3DELd_NTC = 0; + end + end + % Concateno i dati relativi a Step 1 e 2 per il nodo ii-esimo. + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if salto3DEL == 0 + Dati3DExtensometerLink(1:rt,col:col+2) = DATnodo3DEL(:,:); + if Ch3DEL(ii,1) == 1 + DatiNTC3DExtensometerLink(1:rt,colT) = DATnodo3DEL_NTC(:,:); + end + else + Dati3DExtensometerLink(1:rd,col:col+2) = DATnodo3DEL(:,:); + if Ch3DEL(ii,1) == 1 + DatiNTC3DExtensometerLink(1:rd,colT) = DATnodo3DEL_NTC(:,:); + end + end + + % Riferimento + [dim,~] = size(DATnodo3DEL_Rif); % controllo date + Dati3DExtensometerLink_Rif(1:dim,col:col+2) = DATnodo3DEL_Rif; + if col == 1 + Dati3DExtensometerLink_Rif(dim+1:end,:) = []; + end + + [rn,~] = size(DATnodo3DELd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodo3DELd(i,:) = DATnodo3DELd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node 3D Extensometer Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + [rnT,~] = size(DATnodo3DELd_NTC); % controllo date + if rnT < rd % normalmente sono uguali + for i = rnT+1:rd + DATnodo3DELd_NTC(i,:) = DATnodo3DELd_NTC(rnT,:); % se mancano dati, copio gli ultimi + end + wardat = ['NTC of Node 3D Extensometer Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if salto3DEL == 0 + Dati3DExtensometerLink(rt+1:rt+rd,col:col+2) = DATnodo3DELd(:,:); + if EL3D_NTC(ii,1) == 1 % Si NTC + Dati3DExtensometerLink(rt+1:rt+rd,colT) = DATnodo3DELd_NTC(:,:); + end + end + else + Dati3DExtensometerLink = Dati3DExtensometerLink(1:end,:); + DatiNTC3DExtensometerLink = DatiNTC3DExtensometerLink(1:end,:); + end + okdat3DEL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(r3DEL) ' 3D Extensometer Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdat3DEL); + ii = ii+1; + col = col+3; + colT = colT+1; + end + if w == 0 + wardat = 'There are not warning for 3D Extensometer Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(Dati3DExtensometerLink); + Err3DExtensometerLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + RIF = 0; + row = 1; + if NuovoZero3DEL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(dataini3DEL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + while RIF == 0 + if row <= dim + % Controllo la data di riferimento + idxE = find(strcmp('Err1',Dati3DExtensometerLink_Rif(row,:))); + idxT = find(strcmp('---',Dati3DExtensometerLink_Rif(row,:))); + idxT2 = find(strcmp('-',Dati3DExtensometerLink_Rif(row,:))); + idxE2 = find(strcmp('Err2',Dati3DExtensometerLink_Rif(row,:))); + idxE255 = find(strcmp('Err255',Dati3DExtensometerLink_Rif(row,:))); + idxD = find(strcmp('DMUXe',Dati3DExtensometerLink_Rif(row,:))); + idxE1F = find(strcmp('Err1File',Dati3DExtensometerLink_Rif(row,:))); + idxN = find(strcmp('null',Dati3DExtensometerLink_Rif(row,:))); + idxRX = find(strcmp('No RX',Dati3DExtensometerLink_Rif(row,:))); + idxI = find(strcmp('id Error',Dati3DExtensometerLink_Rif(row,:))); + idxM = find(strcmp('MUX id Error',Dati3DExtensometerLink_Rif(row,:))); + idxC = find(strcmp('CH n. Error',Dati3DExtensometerLink_Rif(row,:))); + idxU = find(strcmp('Unknown Error',Dati3DExtensometerLink_Rif(row,:))); + idxMC = find(strcmp('MsgCorrup',Dati3DExtensometerLink_Rif(row,:))); + idxNS = find(strcmp('NotSupp',Dati3DExtensometerLink_Rif(row,:))); + idxU2 = find(strcmp('Unknown',Dati3DExtensometerLink_Rif(row,:))); + idxNA = find(strcmp('NotAv',Dati3DExtensometerLink_Rif(row,:))); + idxDIS = find(strcmp('Dis.',Dati3DExtensometerLink_Rif(row,:))); + idxND = find(strcmp('No Data',Dati3DExtensometerLink_Rif(row,:))); + idxCE = find(strcmp('CH n. Er',Dati3DExtensometerLink_Rif(row,:))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxDIS); + idx = union(idx,idxND); + [~,ri] = size(idx); + if ri >= 1 && isempty(idx) == 0 % Se almeno uno è in errore, allora guardo la riga dopo + row = row+1; + else + RIF = 1; + Dati3DExtensometerLink_Rif = Dati3DExtensometerLink_Rif(row,:); + end + else + Date_Rif_3DEL = datestr(datenum(Date_Rif_3DEL)+1,'yyyy-mm-dd'); + RIF = 1; + NAN = 0; + end + end + + for jj=1:c + % Se il nodo è Dis., devo aumentare di uno la data (il nodo non + % è ancora stato installato!) + if strcmp('Dis.',Dati3DExtensometerLink(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',Dati3DExtensometerLink(dis,jj)) == 0 + Dati3DExtensometerLink = Dati3DExtensometerLink(dis:end,:); + DatiNTC3DExtensometerLink = DatiNTC3DExtensometerLink(dis:end,:); + DATini3DEL = DATini3DEL(dis:end,:); + [r,c] = size(Dati3DExtensometerLink); + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(dataini3DEL)+1 < now + dataini3DEL = datestr(datenum(dataini3DEL)+1,'yyyy-mm-dd'); + break + else + yes3DEL = 0; + end + end + end + end + end + if DIS ~= 1 && yes3DEL == 1 + % --- Codice per il primo dato --- + for jj=1:c + idxE = find(strcmp('Err1',Dati3DExtensometerLink(1,jj))); + idxT = find(strcmp('---',Dati3DExtensometerLink(1,jj))); + idxT2 = find(strcmp('-',Dati3DExtensometerLink(1,jj))); + idxE2 = find(strcmp('Err2',Dati3DExtensometerLink(1,jj))); + idxE255 = find(strcmp('Err255',Dati3DExtensometerLink(1,jj))); + idxD = find(strcmp('DMUXe',Dati3DExtensometerLink(1,jj))); + idxE1F = find(strcmp('Err1File',Dati3DExtensometerLink(1,jj))); + idxN = find(strcmp('null',Dati3DExtensometerLink(1,jj))); + idxRX = find(strcmp('No RX',Dati3DExtensometerLink(1,jj))); + idxI = find(strcmp('id Error',Dati3DExtensometerLink(1,jj))); + idxM = find(strcmp('MUX id Error',Dati3DExtensometerLink(1,jj))); + idxC = find(strcmp('CH n. Error',Dati3DExtensometerLink(1,jj))); + idxU = find(strcmp('Unknown Error',Dati3DExtensometerLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',Dati3DExtensometerLink(1,jj))); + idxNS = find(strcmp('NotSupp',Dati3DExtensometerLink(1,jj))); + idxU2 = find(strcmp('Unknown',Dati3DExtensometerLink(1,jj))); + idxNA = find(strcmp('NotAv',Dati3DExtensometerLink(1,jj))); + idxND = find(strcmp('No Data',Dati3DExtensometerLink(1,jj))); + idxCE = find(strcmp('CH n. Er',Dati3DExtensometerLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of 3D Extensometer Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZero3DEL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(dataini3DEL)+1 < now + dataini3DEL = datestr(datenum(dataini3DEL)+1,'yyyy-mm-dd'); + break + else + yes3DEL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + dataini3DEL = datestr(datenum(dataini3DEL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + Dati3DExtensometerLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + Err3DExtensometerLink(1,jj) = 1; + wardat = 'Data of 3D Extensometer Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + dataini3DEL = datestr(datenum(dataini3DEL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + idxE = find(strcmp('Err1',Dati3DExtensometerLink(:,jj))); + idxT = find(strcmp('---',Dati3DExtensometerLink(:,jj))); + idxT2 = find(strcmp('-',Dati3DExtensometerLink(:,jj))); + idxE2 = find(strcmp('Err2',Dati3DExtensometerLink(:,jj))); + idxE255 = find(strcmp('Err255',Dati3DExtensometerLink(:,jj))); + idxD = find(strcmp('DMUXe',Dati3DExtensometerLink(:,jj))); + idxE1F = find(strcmp('Err1File',Dati3DExtensometerLink(:,jj))); + idxN = find(strcmp('null',Dati3DExtensometerLink(:,jj))); + idxRX = find(strcmp('No RX',Dati3DExtensometerLink(:,jj))); + idxI = find(strcmp('id Error',Dati3DExtensometerLink(:,jj))); + idxM = find(strcmp('MUX id Error',Dati3DExtensometerLink(:,jj))); + idxC = find(strcmp('CH n. Error',Dati3DExtensometerLink(:,jj))); + idxU = find(strcmp('Unknown Error',Dati3DExtensometerLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',Dati3DExtensometerLink(:,jj))); + idxNS = find(strcmp('NotSupp',Dati3DExtensometerLink(:,jj))); + idxU2 = find(strcmp('Unknown',Dati3DExtensometerLink(:,jj))); + idxNA = find(strcmp('NotAv',Dati3DExtensometerLink(:,jj))); + idxND = find(strcmp('No Data',Dati3DExtensometerLink(:,jj))); + idxCE = find(strcmp('CH n. Er',Dati3DExtensometerLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + dataini3DEL = datestr(datenum(dataini3DEL)+1,'yyyy-mm-dd'); + break + else + Dati3DExtensometerLink(indice,jj) = Dati3DExtensometerLink(indice-1,jj); + Err3DExtensometerLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(Dati3DExtensometerLink(nnn,jj))); + if check == 1 + Dati3DExtensometerLink(nnn,jj) = Dati3DExtensometerLink(nnn-1,jj); + Err3DExtensometerLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of 3D Extensometer Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + Dati3DExtensometerLink = [DATini3DEL str2double(Dati3DExtensometerLink)]; + Dati3DExtensometerLink_Rif = str2double(Dati3DExtensometerLink_Rif); + % Elimino eventuali date doppie + a = 2; + while a <= r + if Dati3DExtensometerLink(a,1) == Dati3DExtensometerLink(a-1,1) + Dati3DExtensometerLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + + if ESCI == 0 + if sum(EL3D_NTC(:,1))>0 + if DIS ~= 1 && yes3DEL == 1 + % T + [r,c] = size(DatiNTC3DExtensometerLink); + ErrNTC3DExtensometerLink = zeros(r,c); + Ncorr = 0; + if NuovoZero3DEL == 1 + if isfile(RawDataFile) == 1 + DatiRawNTC = csvread(RawDataFileNTC); + [rDR,cDR] = size(DatiRawNTC); + DatiRawNTC(:,1) = DatiRawNTC(:,1) + 730000; + RawDateNTC = find(DatiRawNTC(:,1)<=datenum(dataini3DEL)); + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTC3DExtensometerLink(1,jj))); + idxT = find(strcmp('---',DatiNTC3DExtensometerLink(1,jj))); + idxT2 = find(strcmp('-',DatiNTC3DExtensometerLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiNTC3DExtensometerLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiNTC3DExtensometerLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiNTC3DExtensometerLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiNTC3DExtensometerLink(1,jj))); + idxN = find(strcmp('null',DatiNTC3DExtensometerLink(1,jj))); + idxRX = find(strcmp('No RX',DatiNTC3DExtensometerLink(1,jj))); + idxI = find(strcmp('id Error',DatiNTC3DExtensometerLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiNTC3DExtensometerLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiNTC3DExtensometerLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiNTC3DExtensometerLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTC3DExtensometerLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiNTC3DExtensometerLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiNTC3DExtensometerLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiNTC3DExtensometerLink(1,jj))); + idxND = find(strcmp('No Data',DatiNTC3DExtensometerLink(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiNTC3DExtensometerLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = ['Warning on the correction of NTC of 3D Extensometer Link nodes: there are not data at '... + 'the beginning of the array!']; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZero3DEL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + dataini3DEL = datestr(datenum(dataini3DEL)-1,'yyyy-mm-dd'); + break + else + if isempty(RawDateNTC) == 1 + NAN = 0; + ESCI = 1; + if datenum(dataini3DEL)+1 < now + dataini3DEL = datestr(datenum(dataini3DEL)+1,'yyyy-mm-dd'); + break + else + yes3DEL = 0; + end + else + DatiNTC3DExtensometerLink(1,jj) = cellstr(num2str(DatiRawNTC(RawDateNTC(end),jj+1))); + if Err3DExtensometerLink(indice,jj) == 0 + Err3DExtensometerLink(indice,jj) = 0.5; + else + Err3DExtensometerLink(indice,jj) = 1; + end + wardat = 'Data of NTC of 3D Extensometer Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTC3DExtensometerLink(:,jj))); + idxT = find(strcmp('-',DatiNTC3DExtensometerLink(:,jj))); + idxT3 = find(strcmp('---',DatiNTC3DExtensometerLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiNTC3DExtensometerLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiNTC3DExtensometerLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiNTC3DExtensometerLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiNTC3DExtensometerLink(:,jj))); + idxN = find(strcmp('null',DatiNTC3DExtensometerLink(:,jj))); + idxRX = find(strcmp('No RX',DatiNTC3DExtensometerLink(:,jj))); + idxI = find(strcmp('id Error',DatiNTC3DExtensometerLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiNTC3DExtensometerLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiNTC3DExtensometerLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiNTC3DExtensometerLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTC3DExtensometerLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiNTC3DExtensometerLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiNTC3DExtensometerLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiNTC3DExtensometerLink(:,jj))); + idxND = find(strcmp('No Data',DatiNTC3DExtensometerLink(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiNTC3DExtensometerLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxCE); + idx = union(idx,idxT3); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + dataini3DEL = datestr(datenum(dataini3DEL)+1,'yyyy-mm-dd'); + else + DatiNTC3DExtensometerLink(indice,jj) = DatiNTC3DExtensometerLink(indice-1,jj); + if Err3DExtensometerLink(indice,jj) == 0 + ErrNTC3DExtensometerLink(indice,jj) = 0.5; + else + ErrNTC3DExtensometerLink(indice,jj) = 1; + end + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiNTC3DExtensometerLink(nnn,jj))); + if check == 1 + DatiNTC3DExtensometerLink(nnn,jj) = DatiNTC3DExtensometerLink(nnn-1,jj); + ErrNTC3DExtensometerLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of NTC for 3D Extensometer Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiNTC3DExtensometerLink = [DATini3DEL str2double(DatiNTC3DExtensometerLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiNTC3DExtensometerLink(a,1) == DatiNTC3DExtensometerLink(a-1,1) + DatiNTC3DExtensometerLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + else + ErrNTC3DExtensometerLink = 0; + end + end + end + if NuovoZero3DEL == 1 && yes3DEL == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=Dati3DExtensometerLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(Dati3DExtensometerLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(Dati3DExtensometerLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);Dati3DExtensometerLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = Dati3DExtensometerLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)0 + [rDR,cDR] = size(DatiRawNTC); + if rDR~=1 && cDR~=1 && isempty(DatiRawNTC) == 0 + RawDate1 = find(DatiRawNTC(:,1)<=DatiNTC3DExtensometerLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiNTC3DExtensometerLink(:,1)>DatiRawNTC(end,1)); + else + RawDate2 = find(DatiNTC3DExtensometerLink(:,1)>DatiRawNTC(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + DatiNTC = [DatiRawNTC(1:RawDate1(end),:);DatiNTC3DExtensometerLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + DatiNTC = DatiNTC3DExtensometerLink; + else + DatiNTC = DatiRawNTC; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(DatiNTC(:,1)0 + DatiNTC = DatiNTC3DExtensometerLink; + end + end + Dati(:,1) = Dati(:,1) - 730000; + csvwrite(RawDataFile,Dati); + if sum(EL3D_NTC(:,1))>0 + DatiNTC(:,1) = DatiNTC(:,1) - 730000; + csvwrite(RawDataFileNTC,DatiNTC); + end +end + +%% Wire Extensometer Link +if yesWEL == 0 % Non ci sono Wire Extensometer Link + DatiWireExtensometerLink = []; + DatiNTCWireExtensometerLink = []; + ErrWireExtensometerLink = []; + ChWEL = []; + WEL_NTC = []; + wardat = 'lettura function: there are not Wire Extensometer Link'; + fprintf(fileID,fmt,wardat); +else + RawDataFile = ['' IDcentralina '-' DTcatena '-Wire-RawData.csv']; % Specifico per Wire Extensometer Link + RawDataFileNTC = ['' IDcentralina '-' DTcatena '-NTCWire-RawData.csv']; + NAN = 0; + DIS = 0; + ChWEL = cell2mat(NodoWireExtensometerLink(:,4)); + WEL_NTC = cell2mat(NodoWireExtensometerLink(:,5)); + while NAN == 0 + if datenum(datainiWEL) == datenum(Data(1,1)) + tempoiniWEL = char(Data(1,2)); + end + NodeType = 'Wire Extensometer Link'; + NodeNumWEL = num2str(cell2mat(NodoWireExtensometerLink(1,2))); % scarico i dati del primo nodo + % Scarico dei dati relativi alla centralina con informazioni di Data e ora, livello batteria e temperatura + % Step 1 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date = ''' ... + datainiWEL ''' and Time >= ''' tempoiniWEL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumWEL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniWEL = curs.Data; + Ntempo = DATiniWEL; + [r,c] = size(DATiniWEL); + saltoWEL = 0; + if r==1 && c==1 + textdatWEL = 'Warning: error reading Wire Extensometer Link (control unit data)!'; + fprintf(fileID,fmt,textdatWEL); + saltoWEL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiWEL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumWEL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2WEL = curs.Data; + Ndate = DAT2WEL; + if saltoWEL == 1 + DATiniWEL = DAT2WEL; + end + Check = size(DAT2WEL); + if Check(1,2) > 1 % ho superato il primo giorno + if saltoWEL == 0 + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + DATiniWEL = [DATiniWEL; DAT2WEL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniWEL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniWEL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniWEL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniWEL = T; + else + DATiniWEL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + if saltoWEL == 0 + % creo la matrice per i dati Wire Extensometer Link + if Check(1,2) > 1 + DatiWireExtensometerLink = cell(rd+rt,rWEL); + DatiNTCWireExtensometerLink = cell(rd+rt,rWEL); + else + DatiWireExtensometerLink = cell(rt,rWEL); + DatiNTCWireExtensometerLink = cell(rt,rWEL); + end + else + DatiWireExtensometerLink = cell(rd,rWEL); + DatiNTCWireExtensometerLink = cell(rd,rWEL); + end + NWExtensometerLink = cell2mat(NodoWireExtensometerLink(:,2)); + col = 1; + ii = 1; + w = 0; + while ii <= rWEL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NWExtensometerLink(ii,1); + nNodo = num2str(nN); + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiWEL ''' and Time >= ''' tempoiniWEL ''' and ToolNameID = ''' ... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoWEL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiWEL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoWELd = curs.Data; + % Concateno i dati relativi a Step 1 e 2 per il nodo ii-esimo. + if ChWEL(ii,1) == 1 + % T + DATnodoWEL_NTC = cell(1,1); + DATnodoWELd_NTC = cell(1,1); + elseif ChWEL(ii,1) >= 2 + if WEL_NTC(ii,1)==1 + if ChWEL(ii,1) == 2 + comando = ['select Val1 from RawDataView where Date = ''' ... + datainiWEL ''' and Time >= ''' tempoiniWEL ''' and ToolNameID = ''' ... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + elseif ChWEL(ii,1) == 4 + comando = ['select Val2 from RawDataView where Date = ''' ... + datainiWEL ''' and Time >= ''' tempoiniWEL ''' and ToolNameID = ''' ... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + end + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoWEL_NTC = curs.Data; + % Dato + if ChWEL(ii,1) == 2 + comando = ['select Val1 from RawDataView where Date > ''' ... + datainiWEL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = '''... + NodeType ''' and NodeNum = ' nNodo '']; + elseif ChWEL(ii,1) == 4 + comando = ['select Val2 from RawDataView where Date > ''' ... + datainiWEL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = '''... + NodeType ''' and NodeNum = ' nNodo '']; + end + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoWELd_NTC = curs.Data; + else + DATnodoWEL_NTC = cell(1,1); + DATnodoWELd_NTC = cell(1,1); + end + end + + [rn,~] = size(DATnodoWELd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoWELd(i,:) = DATnodoWELd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Wire Extensometer Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + if WEL_NTC(ii,1)==1 + [rnT,~] = size(DATnodoWELd_NTC); % controllo date + if rnT < rd % normalmente sono uguali + for i = rnT+1:rd + DATnodoWELd_NTC(i,:) = DATnodoWELd_NTC(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['NTC of Node Wire Extensometer Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + end + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoWEL == 0 + if ChWEL(ii,1) >= 2 + if WEL_NTC(ii,1) == 1 + DatiWireExtensometerLink(1:rt,col) = DATnodoWEL(:,:); + DatiNTCWireExtensometerLink(1:rt,col) = DATnodoWEL_NTC(:,:); + if Check(1,2) > 1 + DatiWireExtensometerLink(rt+1:rt+rd,col) = DATnodoWELd(:,:); + DatiNTCWireExtensometerLink(rt+1:rt+rd,col) = DATnodoWELd_NTC(:,:); + end + else + DatiWireExtensometerLink(1:rt,col) = DATnodoWEL(:,:); + if Check(1,2) > 1 + DatiWireExtensometerLink(rt+1:rt+rd,col) = DATnodoWELd(:,:); + end + end + elseif ChWEL(ii,1) == 1 + DatiWireExtensometerLink(1:rt,col) = DATnodoWEL(:,:); + if Check(1,2) > 1 + DatiWireExtensometerLink(rt+1:rt+rd,col) = DATnodoWELd(:,:); + end + end + else + if ChWEL(ii,1) >= 2 + if WEL_NTC(ii,1) == 1 + DatiWireExtensometerLink(1:rd,col) = DATnodoWEL(:,:); + DatiNTCWireExtensometerLink(1:rd,col) = DATnodoWEL_NTC(:,:); + else + DatiWireExtensometerLink(1:rd,col) = DATnodoWEL(:,:); + end + elseif ChWEL(ii,1) == 1 + DatiWireExtensometerLink(1:rd,col) = DATnodoWEL(:,:); + end + end + + okdatWEL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rWEL) ' Wire Extensometer Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatWEL); + ii = ii+1; + col = col+1; + end + if w == 0 + wardat = 'There are not warning for Wire Extensometer Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + + % Dati + [r,c] = size(DatiWireExtensometerLink); + ErrWireExtensometerLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroWEL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiWEL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + for jj=1:c + % Se il nodo è Dis., devo aumentare di uno la data (il nodo non + % è ancora stato installato!) + if strcmp('Dis.',DatiWireExtensometerLink(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',DatiWireExtensometerLink(dis,jj)) == 0 + DatiWireExtensometerLink = DatiWireExtensometerLink(dis:end,:); + DatiNTCWireExtensometerLink = DatiNTCWireExtensometerLink(dis:end,:); + DATiniWEL = DATiniWEL(dis:end,:); + [r,c] = size(DatiWireExtensometerLink); + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiWEL)+1 < now + datainiWEL = datestr(datenum(datainiWEL)+1,'yyyy-mm-dd'); + break + else + yesWEL = 0; + end + end + end + end + end + if DIS ~= 1 && yesWEL == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiWireExtensometerLink(1,jj))); + idxT = find(strcmp('---',DatiWireExtensometerLink(1,jj))); + idxT2 = find(strcmp('-',DatiWireExtensometerLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiWireExtensometerLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiWireExtensometerLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiWireExtensometerLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiWireExtensometerLink(1,jj))); + idxN = find(strcmp('null',DatiWireExtensometerLink(1,jj))); + idxRX = find(strcmp('No RX',DatiWireExtensometerLink(1,jj))); + idxI = find(strcmp('id Error',DatiWireExtensometerLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiWireExtensometerLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiWireExtensometerLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiWireExtensometerLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiWireExtensometerLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiWireExtensometerLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiWireExtensometerLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiWireExtensometerLink(1,jj))); + idxND = find(strcmp('No Data',DatiWireExtensometerLink(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiWireExtensometerLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Wire Extensometer Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroWEL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiWEL)+1 < now + datainiWEL = datestr(datenum(datainiWEL)+1,'yyyy-mm-dd'); + break + else + yesWEL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiWEL = datestr(datenum(datainiWEL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiWireExtensometerLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrWireExtensometerLink(1,jj) = 1; + wardat = 'Data of Wire Extensometer Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + dataini3DEL = datestr(datenum(dataini3DEL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiWireExtensometerLink(:,jj))); + idxT = find(strcmp('---',DatiWireExtensometerLink(:,jj))); + idxT2 = find(strcmp('-',DatiWireExtensometerLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiWireExtensometerLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiWireExtensometerLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiWireExtensometerLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiWireExtensometerLink(:,jj))); + idxN = find(strcmp('null',DatiWireExtensometerLink(:,jj))); + idxRX = find(strcmp('No RX',DatiWireExtensometerLink(:,jj))); + idxI = find(strcmp('id Error',DatiWireExtensometerLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiWireExtensometerLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiWireExtensometerLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiWireExtensometerLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiWireExtensometerLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiWireExtensometerLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiWireExtensometerLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiWireExtensometerLink(:,jj))); + idxND = find(strcmp('No Data',DatiWireExtensometerLink(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiWireExtensometerLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + wardat = 'Warning on the correction of Wire Extensometer Link: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + NAN = 0; + ESCI = 1; + datainiWEL = datestr(datenum(datainiWEL)-1,'yyyy-mm-dd'); + else + DatiWireExtensometerLink(indice,jj) = DatiWireExtensometerLink(indice-1,jj); + ErrWireExtensometerLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiWireExtensometerLink(nnn,jj))); + if check == 1 + DatiWireExtensometerLink(nnn,jj) = DatiWireExtensometerLink(nnn-1,jj); + ErrWireExtensometerLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Wire Extensometer Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiWireExtensometerLink = [DATiniWEL str2double(DatiWireExtensometerLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiWireExtensometerLink(a,1) == DatiWireExtensometerLink(a-1,1) + DatiWireExtensometerLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + + if ESCI == 0 + if sum(WEL_NTC(:,1))>0 + % NTC + if DIS ~= 1 && yesWEL == 1 + [r,c] = size(DatiNTCWireExtensometerLink); + Ncorr = 0; + if NuovoZeroWEL == 1 + if isfile(RawDataFile) == 1 + DatiRawNTC = csvread(RawDataFileNTC); + [rDR,cDR] = size(DatiRawNTC); + DatiRawNTC(:,1) = DatiRawNTC(:,1) + 730000; + RawDateNTC = find(DatiRawNTC(:,1)<=datenum(datainiWEL)); + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTCWireExtensometerLink(1,jj))); + idxND = find(strcmp('No Data',DatiNTCWireExtensometerLink(1,jj))); + idxT3 = find(strcmp('---',DatiNTCWireExtensometerLink(1,jj))); + idxT = find(strcmp('-',DatiNTCWireExtensometerLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiNTCWireExtensometerLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiNTCWireExtensometerLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiNTCWireExtensometerLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiNTCWireExtensometerLink(1,jj))); + idxN = find(strcmp('null',DatiNTCWireExtensometerLink(1,jj))); + idxRX = find(strcmp('No RX',DatiNTCWireExtensometerLink(1,jj))); + idxI = find(strcmp('id Error',DatiNTCWireExtensometerLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiNTCWireExtensometerLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiNTCWireExtensometerLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiNTCWireExtensometerLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTCWireExtensometerLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiNTCWireExtensometerLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiNTCWireExtensometerLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiNTCWireExtensometerLink(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiNTCWireExtensometerLink(1,jj))); + idx = union(idxE,idxT3); + idx = union(idx,idxND); + idx = union(idx,idxCE); + idx = union(idx,idxT); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of NTC of Wire Extensometer Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroWEL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiWEL)+1 < now + datainiWEL = datestr(datenum(datainiWEL)+1,'yyyy-mm-dd'); + break + else + yesWEL = 0; + end + else + if isempty(RawDateNTC) == 1 + NAN = 0; + ESCI = 1; + datainiWEL = datestr(datenum(datainiWEL)-1,'yyyy-mm-dd'); + break + else + DatiNTCWireExtensometerLink(1,jj) = cellstr(num2str(DatiRawNTC(RawDateNTC(end),jj+1))); + if ErrWireExtensometerLink(indice,jj) == 0 + ErrWireExtensometerLink(indice,jj) = 0.5; + else + ErrWireExtensometerLink(indice,jj) = 1; + end + wardat = 'Data of NTC of Wire Extensometer Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTCWireExtensometerLink(:,jj))); + idxND = find(strcmp('No Data',DatiNTCWireExtensometerLink(:,jj))); + idxT3 = find(strcmp('---',DatiNTCWireExtensometerLink(:,jj))); + idxT = find(strcmp('-',DatiNTCWireExtensometerLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiNTCWireExtensometerLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiNTCWireExtensometerLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiNTCWireExtensometerLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiNTCWireExtensometerLink(:,jj))); + idxN = find(strcmp('null',DatiNTCWireExtensometerLink(:,jj))); + idxRX = find(strcmp('No RX',DatiNTCWireExtensometerLink(:,jj))); + idxI = find(strcmp('id Error',DatiNTCWireExtensometerLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiNTCWireExtensometerLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiNTCWireExtensometerLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiNTCWireExtensometerLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTCWireExtensometerLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiNTCWireExtensometerLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiNTCWireExtensometerLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiNTCWireExtensometerLink(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiNTCWireExtensometerLink(:,jj))); + idx = union(idxE,idxT3); + idx = union(idx,idxND); + idx = union(idx,idxCE); + idx = union(idx,idxT); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + if DIS == 1 + wardat = 'Warning on the correction of NTC of Wire Extensometer Link: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + NAN = 0; + ESCI = 1; + datainiWEL = datestr(datenum(datainiWEL)+1,'yyyy-mm-dd'); + break + else + wardat = 'Warning on the correction of NTC of Wire Extensometer Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 % il file non è mai stato scritto + NAN = 0; + ESCI = 1; + datainiWEL = datestr(datenum(datainiWEL)-1,'yyyy-mm-dd'); + break + else + if isempty(RawDateNTC) == 1 + NAN = 0; + ESCI = 1; + datainiWEL = datestr(datenum(datainiWEL)-1,'yyyy-mm-dd'); + break + else + DatiNTCWireExtensometerLink(indice,jj) = cellstr(num2str(DatiRawNTC(RawDateNTC(end),jj+1))); + if ErrWireExtensometerLink(indice,jj) == 0 + ErrWireExtensometerLink(indice,jj) = 0.5; + else + ErrWireExtensometerLink(indice,jj) = 1; + end + wardat = 'Data of Wire Extensometer Link nodes corrected using Raw Data of Excel file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + else + DatiNTCWireExtensometerLink(indice,jj) = DatiNTCWireExtensometerLink(indice-1,jj); + if ErrWireExtensometerLink(indice,jj) == 0 + ErrWireExtensometerLink(indice,jj) = 0.5; + else + ErrWireExtensometerLink(indice,jj) = 1; + end + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiNTCWireExtensometerLink(nnn,jj))); + if check == 1 + DatiNTCWireExtensometerLink(nnn,jj) = DatiNTCWireExtensometerLink(nnn-1,jj); + if ErrWireExtensometerLink(indice,jj) == 0 + ErrWireExtensometerLink(indice,jj) = 0.5; + else + ErrWireExtensometerLink(indice,jj) = 1; + end + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of NTC Wire Extensometer Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiNTCWireExtensometerLink = [DATiniWEL str2double(DatiNTCWireExtensometerLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiNTCWireExtensometerLink(a,1) == DatiNTCWireExtensometerLink(a-1,1) + DatiNTCWireExtensometerLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + end + end + if NuovoZeroWEL == 1 && yesWEL == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiWireExtensometerLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiWireExtensometerLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiWireExtensometerLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiWireExtensometerLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiWireExtensometerLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)0 + [rDR,cDR] = size(DatiRawNTC); + if rDR~=1 && cDR~=1 && isempty(DatiRawNTC) == 0 + RawDate1 = find(DatiRawNTC(:,1)<=DatiNTCWireExtensometerLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiNTCWireExtensometerLink(:,1)>DatiRawNTC(end,1)); + else + RawDate2 = find(DatiNTCWireExtensometerLink(:,1)>DatiRawNTC(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + DatiNTC = [DatiRawNTC(1:RawDate1(end),:);DatiNTCWireExtensometerLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + DatiNTC = DatiNTCWireExtensometerLink; + else + DatiNTC = DatiRawNTC; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(DatiNTC(:,1)0 + DatiNTC = DatiNTCWireExtensometerLink; + end + end + Dati(:,1) = Dati(:,1) - 730000; + csvwrite(RawDataFile,Dati); + if sum(WEL_NTC(:,1))>0 + DatiNTC(:,1) = DatiNTC(:,1) - 730000; + csvwrite(RawDataFileNTC,DatiNTC); + end +end + +%% MultiPoint Borehole Extensometer Link +if yesMPBEL == 0 % Non ci sono Multipoint borehole rod extensometer + DatiMultiPointExtensometer = []; + DatiNTCMultiPointExtensometer = []; + ErrMultiPointExtensometer = []; + ErrNTCMultiPointExtensometer = []; + ChMPBEL = []; + MPBEL_NTC = []; + wardat = 'lettura function: there are not Multi Point Extensometer Link'; + fprintf(fileID,fmt,wardat); +else + RawDataFile = ['' IDcentralina '-' DTcatena '-MPBEL-RawData.csv']; % Specifico per MPBE Link + RawDataFileNTC = ['' IDcentralina '-' DTcatena '-NTCMPBEL-RawData.csv']; % Specifico per NTC MPBE Link + ChMPBEL = cell2mat(NodoMultiPointRodExtensometer(:,4)); + MPBEL_NTC = cell2mat(NodoMultiPointRodExtensometer(:,5)); + NAN = 0; + DIS = 0; + while NAN == 0 + if datenum(datainiMPBEL) == datenum(Data(1,1)) + tempoiniMPBEL = char(Data(1,2)); + end + NodeType = 'Multipoint borehole rod extensometer'; + NodeNumMPBEL = num2str(cell2mat(NodoMultiPointRodExtensometer(1,2))); % scarico i dati del primo nodo + % Scarico dei dati relativi alla centralina con informazioni di Data e ora, livello batteria e temperatura + % Step 1 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date = ''' ... + datainiMPBEL ''' and Time >= ''' tempoiniMPBEL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumMPBEL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniMPBEL = curs.Data; + Ntempo = DATiniMPBEL; + [r,c] = size(DATiniMPBEL); + saltoMPBEL = 0; + if r==1 && c==1 + textdatMPBEL = 'Warning: error reading Multipoint borehole rod extensometer (control unit data)!'; + fprintf(fileID,fmt,textdatMPBEL); + saltoMPBEL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiMPBEL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumMPBEL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2MPBEL = curs.Data; + Ndate = DAT2MPBEL; + if saltoMPBEL == 1 + DATiniMPBEL = DAT2MPBEL; + end + Check = size(DAT2MPBEL); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoMPBEL == 0 + DATiniMPBEL = [DATiniMPBEL; DAT2MPBEL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniMPBEL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniMPBEL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniMPBEL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniMPBEL = T; + else + DATiniMPBEL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + % creo la matrice per i dati Multipoint borehole rod extensometer + if saltoMPBEL == 0 + if Check(1,2) > 1 + DatiMultiPointExtensometer = cell(rd+rt,rMPBEL*NumBasi); + DatiNTCMultiPointExtensometer = cell(rd+rt,rMPBEL*NumBasi); + else + DatiMultiPointExtensometer = cell(rt,rMPBEL*NumBasi); + DatiNTCMultiPointExtensometer = cell(rt,rMPBEL*NumBasi); + end + else + DatiMultiPointExtensometer = cell(rd,rMPBEL*NumBasi); + DatiNTCMultiPointExtensometer = cell(rd,rMPBEL*NumBasi); + end + NMPBExtensometerLink = cell2mat(NodoMultiPointRodExtensometer(:,2)); + col = 1; + ii = 1; + w = 0; + while ii <= rMPBEL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NMPBExtensometerLink(ii,1); + nNodo = num2str(nN); + % 1 Base + if NumBasi == 1 + % Dato + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiMPBEL ''' and Time >= ''' tempoiniMPBEL ''' and ToolNameID = '''... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBEL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiMPBEL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBELd = curs.Data; + if ChMPBEL(ii,1) >= 2 && MPBEL_NTC(ii,1) == 1 % leggo la temperatura + % T + comando = ['select Val1 from RawDataView where Date = ''' ... + datainiMPBEL ''' and Time >= ''' tempoiniMPBEL ''' and ToolNameID = '''... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBEL_NTC = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val1 from RawDataView where Date > ''' ... + datainiMPBEL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBELd_NTC = curs.Data; + else % non la leggo + DATnodoMPBEL_NTC = 0; + DATnodoMPBELd_NTC = 0; + end + % 2 Basi + elseif NumBasi == 2 + if ChMPBEL(ii,1) == 4 + % Dato + comando = ['select Val0, Val2 from RawDataView where Date = ''' ... + datainiMPBEL ''' and Time >= ''' tempoiniMPBEL ''' and ToolNameID = '''... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBEL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val2 from RawDataView where Date > ''' ... + datainiMPBEL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBELd = curs.Data; + else + % Dato + comando = ['select Val0, Val1 from RawDataView where Date = ''' ... + datainiMPBEL ''' and Time >= ''' tempoiniMPBEL ''' and ToolNameID = '''... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBEL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1 from RawDataView where Date > ''' ... + datainiMPBEL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBELd = curs.Data; + end + if ChMPBEL(ii,1) >= 3 && MPBEL_NTC(ii,1) == 1 % leggo la temperatura + % T + comando = ['select Val2 from RawDataView where Date = ''' ... + datainiMPBEL ''' and Time >= ''' tempoiniMPBEL ''' and ToolNameID = '''... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBEL_NTC = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val2 from RawDataView where Date > ''' ... + datainiMPBEL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBELd_NTC = curs.Data; + else % non la leggo + DATnodoMPBEL_NTC = 0; + DATnodoMPBELd_NTC = 0; + end + elseif NumBasi == 3 + if ChMPBEL(ii,1) == 6 + % Dato + comando = ['select Val0, Val2, Val4 from RawDataView where Date = ''' ... + datainiMPBEL ''' and Time >= ''' tempoiniMPBEL ''' and ToolNameID = '''... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBEL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val2, Val4 from RawDataView where Date > ''' ... + datainiMPBEL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBELd = curs.Data; + else + % Dato + comando = ['select Val0, Val1, Val2 from RawDataView where Date = ''' ... + datainiMPBEL ''' and Time >= ''' tempoiniMPBEL ''' and ToolNameID = '''... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBEL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2 from RawDataView where Date > ''' ... + datainiMPBEL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBELd = curs.Data; + end + if ChMPBEL(ii,1) >= 4 && MPBEL_NTC(ii,1) == 1 % leggo la temperatura della prima base + % T + comando = ['select Val3 from RawDataView where Date = ''' ... + datainiMPBEL ''' and Time >= ''' tempoiniMPBEL ''' and ToolNameID = '''... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBEL_NTC = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val3 from RawDataView where Date > ''' ... + datainiMPBEL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoMPBELd_NTC = curs.Data; + else + DATnodoMPBEL_NTC = 0; + DATnodoMPBELd_NTC = 0; + end + end + % Concateno i dati relativi a Step 1 e 2 per il nodo ii-esimo. + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if NumBasi == 1 + if saltoMPBEL == 0 + DatiMultiPointExtensometer(1:rt,col) = DATnodoMPBEL(:,:); + if ChMPBEL(ii) >= 2 && MPBEL_NTC(ii) == 1 + DatiNTCMultiPointExtensometer(1:rt,col) = DATnodoMPBEL_NTC(:,:); + end + else + DatiMultiPointExtensometer(1:rd,col) = DATnodoMPBEL(:,:); + if ChMPBEL(ii) >= 2 && MPBEL_NTC(ii) == 1 + DatiNTCMultiPointExtensometer(1:rd,col) = DATnodoMPBEL_NTC(:,:); + end + end + + elseif NumBasi == 2 + if saltoMPBEL == 0 + DatiMultiPointExtensometer(1:rt,col:col+1) = DATnodoMPBEL(:,:); + if ChMPBEL(ii) >= 3 && MPBEL_NTC(ii) == 1 || ChMPBEL(ii) == 4 && MPBEL_NTC(ii) == 1 + DatiNTCMultiPointExtensometer(1:rt,col) = DATnodoMPBEL_NTC(:,:); + end + else + DatiMultiPointExtensometer(1:rd,col:col+1) = DATnodoMPBEL(:,:); + if ChMPBEL(ii) >= 3 && MPBEL_NTC(ii) == 1 || ChMPBEL(ii) == 4 && MPBEL_NTC(ii) == 1 + DatiNTCMultiPointExtensometer(1:rd,col) = DATnodoMPBEL_NTC(:,:); + end + end + + elseif NumBasi == 3 + if saltoMPBEL == 0 + DatiMultiPointExtensometer(1:rt,col:col+2) = DATnodoMPBEL(:,:); + if ChMPBEL(ii) >= 4 && MPBEL_NTC(ii) == 1 + DatiNTCMultiPointExtensometer(1:rt,col) = DATnodoMPBEL_NTC(:,:); + end + else + DatiMultiPointExtensometer(1:rd,col:col+2) = DATnodoMPBEL(:,:); + if ChMPBEL(ii) >= 4 && MPBEL_NTC(ii) == 1 + DatiNTCMultiPointExtensometer(1:rd,col) = DATnodoMPBEL_NTC(:,:); + end + end + end + [rn,~] = size(DATnodoMPBELd); % controllo date + [rnT,~] = size(DATnodoMPBELd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoMPBELd(i,:) = DATnodoMPBELd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Multipoint Borehole Rod Extensometer ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + if rnT < rd % normalmente sono uguali + for i = rnT+1:rd + DATnodoMPBELd_NTC(i,:) = DATnodoMPBELd_NTC(rnT,:); % se mancano dati, copio gli ultimi + end + wardat = ['NTC of Node Multipoint Borehole Rod Extensometer ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoMPBEL == 0 + if NumBasi == 1 + DatiMultiPointExtensometer(rt+1:rt+rd,col) = DATnodoMPBELd(:,:); + if ChMPBEL(ii) >= 2 && MPBEL_NTC(ii) == 1 + DatiNTCMultiPointExtensometer(rt+1:rt+rd,col) = DATnodoMPBELd_NTC(:,:); + end + elseif NumBasi == 2 + DatiMultiPointExtensometer(rt+1:rt+rd,col:col+1) = DATnodoMPBELd(:,:); + if ChMPBEL(ii) >= 3 && MPBEL_NTC(ii) == 1 + DatiNTCMultiPointExtensometer(rt+1:rt+rd,col) = DATnodoMPBELd_NTC(:,:); + end + elseif NumBasi == 3 + DatiMultiPointExtensometer(rt+1:rt+rd,col:col+2) = DATnodoMPBELd(:,:); + if ChMPBEL(ii) >= 4 && MPBEL_NTC(ii) == 1 + DatiNTCMultiPointExtensometer(rt+1:rt+rd,col) = DATnodoMPBELd_NTC(:,:); + end + end + end + else + DatiMultiPointExtensometer = DatiMultiPointExtensometer(1:end,:); + DatiNTCMultiPointExtensometer = DatiNTCMultiPointExtensometer(1:end,:); + end + okdatMPBEL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rMPBEL) ' Multipoint Borehole Rod Extensometer nodes downloaded correctly']; + fprintf(fileID,fmt,okdatMPBEL); + ii = ii+1; + if NumBasi == 1 + col = col+1; + elseif NumBasi == 2 + col = col+2; + elseif NumBasi == 3 + col = col+3; + elseif NumBasi == 4 + col = col+4; + elseif NumBasi == 5 + col = col+5; + elseif NumBasi == 6 + col = col+6; + end + end + if w == 0 + wardat = 'There are not warning for Multipoint Borehole Rod Extensometer!'; + fprintf(fileID,fmt,wardat); + end + + % ---- Dati Multibase -------------- + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiMultiPointExtensometer); + ErrMultiPointExtensometer = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroMPBEL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiMPBEL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + for jj=1:c + % Se il nodo è Dis., devo aumentare di uno la data (il nodo non + % è ancora stato installato!) + if strcmp('Dis.',DatiMultiPointExtensometer(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',DatiMultiPointExtensometer(dis,jj)) == 0 + DatiMultiPointExtensometer = DatiMultiPointExtensometer(dis:end,:); + DatiNTCMultiPointExtensometer = DatiNTCMultiPointExtensometer(dis:end,:); + DATiniMPBEL = DATiniMPBEL(dis:end,:); + [r,c] = size(DatiMultiPointExtensometer); + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiMPBEL)+1 < now + datainiMPBEL = datestr(datenum(datainiMPBEL)+1,'yyyy-mm-dd'); + break + else + yesMPBEL = 0; + end + end + end + end + end + if DIS ~= 1 && yesMPBEL == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiMultiPointExtensometer(1,jj))); + idxT = find(strcmp('---',DatiMultiPointExtensometer(1,jj))); + idxT2 = find(strcmp('-',DatiMultiPointExtensometer(1,jj))); + idxE2 = find(strcmp('Err2',DatiMultiPointExtensometer(1,jj))); + idxE255 = find(strcmp('Err255',DatiMultiPointExtensometer(1,jj))); + idxD = find(strcmp('DMUXe',DatiMultiPointExtensometer(1,jj))); + idxE1F = find(strcmp('Err1File',DatiMultiPointExtensometer(1,jj))); + idxN = find(strcmp('null',DatiMultiPointExtensometer(1,jj))); + idxRX = find(strcmp('No RX',DatiMultiPointExtensometer(1,jj))); + idxI = find(strcmp('id Error',DatiMultiPointExtensometer(1,jj))); + idxM = find(strcmp('MUX id Error',DatiMultiPointExtensometer(1,jj))); + idxC = find(strcmp('CH n. Error',DatiMultiPointExtensometer(1,jj))); + idxU = find(strcmp('Unknown Error',DatiMultiPointExtensometer(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiMultiPointExtensometer(1,jj))); + idxNS = find(strcmp('NotSupp',DatiMultiPointExtensometer(1,jj))); + idxU2 = find(strcmp('Unknown',DatiMultiPointExtensometer(1,jj))); + idxNA = find(strcmp('NotAv',DatiMultiPointExtensometer(1,jj))); + idxND = find(strcmp('No Data',DatiMultiPointExtensometer(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiMultiPointExtensometer(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of MultiPoint Rod Extensometer Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroMPBEL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiMPBEL)+1 < now + datainiMPBEL = datestr(datenum(datainiMPBEL)+1,'yyyy-mm-dd'); + break + else + yesMPBEL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiMPBEL = datestr(datenum(datainiMPBEL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiMultiPointExtensometer(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrMultiPointExtensometer(1,jj) = 1; + wardat = 'Data of MultiPoint Rod Extensometer Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiMPBEL = datestr(datenum(datainiMPBEL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiMultiPointExtensometer(:,jj))); + idxT = find(strcmp('---',DatiMultiPointExtensometer(:,jj))); + idxT2 = find(strcmp('-',DatiMultiPointExtensometer(:,jj))); + idxE2 = find(strcmp('Err2',DatiMultiPointExtensometer(:,jj))); + idxE255 = find(strcmp('Err255',DatiMultiPointExtensometer(:,jj))); + idxD = find(strcmp('DMUXe',DatiMultiPointExtensometer(:,jj))); + idxE1F = find(strcmp('Err1File',DatiMultiPointExtensometer(:,jj))); + idxN = find(strcmp('null',DatiMultiPointExtensometer(:,jj))); + idxRX = find(strcmp('No RX',DatiMultiPointExtensometer(:,jj))); + idxI = find(strcmp('id Error',DatiMultiPointExtensometer(:,jj))); + idxM = find(strcmp('MUX id Error',DatiMultiPointExtensometer(:,jj))); + idxC = find(strcmp('CH n. Error',DatiMultiPointExtensometer(:,jj))); + idxU = find(strcmp('Unknown Error',DatiMultiPointExtensometer(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiMultiPointExtensometer(:,jj))); + idxNS = find(strcmp('NotSupp',DatiMultiPointExtensometer(:,jj))); + idxU2 = find(strcmp('Unknown',DatiMultiPointExtensometer(:,jj))); + idxNA = find(strcmp('NotAv',DatiMultiPointExtensometer(:,jj))); + idxND = find(strcmp('No Data',DatiMultiPointExtensometer(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiMultiPointExtensometer(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiMPBEL = datestr(datenum(datainiMPBEL)-1,'yyyy-mm-dd'); + else + DatiMultiPointExtensometer(indice,jj) = DatiMultiPointExtensometer(indice-1,jj); + ErrMultiPointExtensometer(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiMultiPointExtensometer(nnn,jj))); + if check == 1 + DatiMultiPointExtensometer(nnn,jj) = DatiMultiPointExtensometer(nnn-1,jj); + ErrMultiPointExtensometer(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Multipoint Borehole Rod Extensometer data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiMultiPointExtensometer = [DATiniMPBEL str2double(DatiMultiPointExtensometer)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiMultiPointExtensometer(a,1) == DatiMultiPointExtensometer(a-1,1) + DatiMultiPointExtensometer(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + + if ESCI == 0 + if sum(MPBEL_NTC(:,1))>0 + if DIS ~= 1 && yesMPBEL == 1 + % ---- Dati NTC Multibase -------------- + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiNTCMultiPointExtensometer); + ErrNTCMultiPointExtensometer = zeros(r,c); + Ncorr = 0; + if NuovoZeroMPBEL == 1 + if isfile(RawDataFile) == 1 + DatiRawNTC = csvread(RawDataFileNTC); + [rDR,cDR] = size(DatiRawNTC); + DatiRawNTC(:,1) = DatiRawNTC(:,1) + 730000; + RawDateNTC = find(DatiRawNTC(:,1)<=datenum(datainiMPBEL)); + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTCMultiPointExtensometer(1,jj))); + idxT = find(strcmp('---',DatiNTCMultiPointExtensometer(1,jj))); + idxT2 = find(strcmp('-',DatiNTCMultiPointExtensometer(1,jj))); + idxE2 = find(strcmp('Err2',DatiNTCMultiPointExtensometer(1,jj))); + idxE255 = find(strcmp('Err255',DatiNTCMultiPointExtensometer(1,jj))); + idxD = find(strcmp('DMUXe',DatiNTCMultiPointExtensometer(1,jj))); + idxE1F = find(strcmp('Err1File',DatiNTCMultiPointExtensometer(1,jj))); + idxN = find(strcmp('null',DatiNTCMultiPointExtensometer(1,jj))); + idxRX = find(strcmp('No RX',DatiNTCMultiPointExtensometer(1,jj))); + idxI = find(strcmp('id Error',DatiNTCMultiPointExtensometer(1,jj))); + idxM = find(strcmp('MUX id Error',DatiNTCMultiPointExtensometer(1,jj))); + idxC = find(strcmp('CH n. Error',DatiNTCMultiPointExtensometer(1,jj))); + idxU = find(strcmp('Unknown Error',DatiNTCMultiPointExtensometer(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTCMultiPointExtensometer(1,jj))); + idxNS = find(strcmp('NotSupp',DatiNTCMultiPointExtensometer(1,jj))); + idxU2 = find(strcmp('Unknown',DatiNTCMultiPointExtensometer(1,jj))); + idxNA = find(strcmp('NotAv',DatiNTCMultiPointExtensometer(1,jj))); + idxND = find(strcmp('No Data',DatiNTCMultiPointExtensometer(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiNTCMultiPointExtensometer(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of NTC of MultiPoint Rod Extensometer Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroMPBEL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiMPBEL)+1 < now + datainiMPBEL = datestr(datenum(datainiMPBEL)+1,'yyyy-mm-dd'); + break + else + yesMPBEL = 0; + end + else + if isempty(RawDateNTC) == 1 + NAN = 0; + ESCI = 1; + datainiMPBEL = datestr(datenum(datainiMPBEL)-1,'yyyy-mm-dd'); + break + else + DatiNTCMultiPointExtensometer(1,jj) = cellstr(num2str(DatiRawNTC(RawDateNTC(end),jj+1))); + if ErrMultiPointExtensometer(indice,jj) == 0 + ErrMultiPointExtensometer(indice,jj) = 0.5; + else + ErrMultiPointExtensometer(indice,jj) = 1; + end + wardat = 'Data of NTC of Multi Point Rod Extensometer Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTCMultiPointExtensometer(:,jj))); + idxT3 = find(strcmp('---',DatiNTCMultiPointExtensometer(:,jj))); + idxT = find(strcmp('-',DatiNTCMultiPointExtensometer(:,jj))); + idxE2 = find(strcmp('Err2',DatiNTCMultiPointExtensometer(:,jj))); + idxE255 = find(strcmp('Err255',DatiNTCMultiPointExtensometer(:,jj))); + idxD = find(strcmp('DMUXe',DatiNTCMultiPointExtensometer(:,jj))); + idxE1F = find(strcmp('Err1File',DatiNTCMultiPointExtensometer(:,jj))); + idxN = find(strcmp('null',DatiNTCMultiPointExtensometer(:,jj))); + idxRX = find(strcmp('No RX',DatiNTCMultiPointExtensometer(:,jj))); + idxI = find(strcmp('id Error',DatiNTCMultiPointExtensometer(:,jj))); + idxM = find(strcmp('MUX id Error',DatiNTCMultiPointExtensometer(:,jj))); + idxC = find(strcmp('CH n. Error',DatiNTCMultiPointExtensometer(:,jj))); + idxU = find(strcmp('Unknown Error',DatiNTCMultiPointExtensometer(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTCMultiPointExtensometer(:,jj))); + idxNS = find(strcmp('NotSupp',DatiNTCMultiPointExtensometer(:,jj))); + idxU2 = find(strcmp('Unknown',DatiNTCMultiPointExtensometer(:,jj))); + idxNA = find(strcmp('NotAv',DatiNTCMultiPointExtensometer(:,jj))); + idxND = find(strcmp('No Data',DatiNTCMultiPointExtensometer(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiNTCMultiPointExtensometer(:,jj))); + idx = union(idxE,idxT3); + idx = union(idx,idxND); + idx = union(idx,idxCE); + idx = union(idx,idxT); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiMPBEL = datestr(datenum(datainiMPBEL)-1,'yyyy-mm-dd'); + break + else + DatiNTCMultiPointExtensometer(indice,jj) = DatiNTCMultiPointExtensometer(indice-1,jj); + ErrNTCMultiPointExtensometer(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiNTCMultiPointExtensometer(nnn,jj))); + if check == 1 + DatiNTCMultiPointExtensometer(nnn,jj) = DatiNTCMultiPointExtensometer(nnn-1,jj); + if ErrMultiPointExtensometer(indice,jj) == 0 + ErrMultiPointExtensometer(indice,jj) = 0.5; + else + ErrMultiPointExtensometer(indice,jj) = 1; + end + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of NTC of Multipoint Borehole Rod Extensometer data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiNTCMultiPointExtensometer = [DATiniMPBEL str2double(DatiNTCMultiPointExtensometer)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiNTCMultiPointExtensometer(a,1) == DatiNTCMultiPointExtensometer(a-1,1) + DatiNTCMultiPointExtensometer(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + else + ErrNTCMultiPointExtensometer = 0; + end + end + end + if NuovoZeroMPBEL == 1 && yesMPBEL == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiMultiPointExtensometer(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiMultiPointExtensometer(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiMultiPointExtensometer(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiMultiPointExtensometer(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiMultiPointExtensometer; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)0 + [rDR,cDR] = size(DatiRawNTC); + if rDR~=1 && cDR~=1 && isempty(DatiRawNTC) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiNTCMultiPointExtensometer(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiNTCMultiPointExtensometer(:,1)>DatiRawNTC(end,1)); + else + RawDate2 = find(DatiNTCMultiPointExtensometer(:,1)>DatiRawNTC(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + DatiNTC = [DatiRawNTC(1:RawDate1(end),:);DatiNTCMultiPointExtensometer(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + DatiNTC = DatiNTCMultiPointExtensometer; + else + DatiNTC = DatiRawNTC; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(DatiNTC(:,1)0 + DatiNTC = DatiNTCMultiPointExtensometer; + end + end + Dati(:,1) = Dati(:,1) - 730000; + csvwrite(RawDataFile,Dati); + if sum(MPBEL_NTC(:,1))>0 + DatiNTC(:,1) = DatiNTC(:,1) - 730000; + csvwrite(RawDataFileNTC,DatiNTC); + end +end + +%% Analog Link +if yesAL == 0 % Non ci sono Analog Link + DatiAnalogLink = []; + ErrAnalogLink = []; + ChAL = []; + AL_NTC = []; + wardat = 'lettura function: there are not Analog Link'; + fprintf(fileID,fmt,wardat); +else + RawDataFile = ['' IDcentralina '-' DTcatena '-AL-RawData.csv']; % Specifico per An Link + ChAL = cell2mat(NodoAnalogLink(:,4)); + AL_NTC = cell2mat(NodoAnalogLink(:,5)); + NAN = 0; + DIS = 0; + while NAN == 0 + if datenum(datainiAL) == datenum(Data(1,1)) + tempoiniAL = char(Data(1,2)); + end + NodeType = 'Analog Link'; + NodeNumAL = num2str(cell2mat(NodoAnalogLink(1,2))); % scarico i dati del primo nodo + % Scarico dei dati relativi alla centralina con informazioni di Data e ora, livello batteria e temperatura + % Step 1 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date = ''' ... + datainiAL ''' and Time >= ''' tempoiniAL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumAL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniAL = curs.Data; + Ntempo = DATiniAL; + [r,c] = size(DATiniAL); + saltoAL = 0; + if r==1 && c==1 + textdatAL = 'Warning: error reading Analog Link (control unit data)!'; + fprintf(fileID,fmt,textdatAL); + saltoAL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiAL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumAL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2AL = curs.Data; + Ndate = DAT2AL; + if saltoAL == 1 + DATiniAL = DAT2AL; + end + Check = size(DAT2AL); + if Check(1,2) > 1 % ho superato il primo giorno + if saltoAL == 0 + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + DATiniAL = [DATiniAL; DAT2AL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniAL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniAL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniAL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniAL = T; + else + DATiniAL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + % creo la matrice per i dati Analog Link + if saltoAL == 0 + if Check(1,2) > 1 + DatiAnalogLink = cell(rd+rt,rAL*ChAL); + else + DatiAnalogLink = cell(rt,rAL*ChAL); + end + else + DatiAnalogLink = cell(rd,rAL*ChAL); + end + NAnalogLink = cell2mat(NodoAnalogLink(:,2)); + col = ChAL; + ii = 1; + w = 0; + while ii <= rAL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NAnalogLink(ii,1); + nNodo = num2str(nN); + if ChAL == 1 + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiAL ''' and Time >= ''' tempoiniAL ''' and ToolNameID = '''... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = '''... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoAL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiAL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoALd = curs.Data; + elseif AnalogCh == 2 + comando = ['select Val0, Val1 from RawDataView where Date = ''' ... + datainiAL ''' and Time >= ''' tempoiniAL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoAL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1 from RawDataView where Date > ''' ... + datainiAL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoALd = curs.Data; + elseif AnalogCh == 3 + comando = ['select Val0, Val1, Val2 from RawDataView where Date = ''' ... + datainiAL ''' and Time >= ''' tempoiniAL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoAL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2 from RawDataView where Date > ''' ... + datainiAL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoALd = curs.Data; + elseif AnalogCh == 4 + comando = ['select Val0, Val1, Val2, Val3 from RawDataView where Date = ''' ... + datainiAL ''' and Time >= ''' tempoiniAL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoAL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val3 from RawDataView where Date > ''' ... + datainiAL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoALd = curs.Data; + elseif AnalogCh == 5 + comando = ['select Val0, Val1, Val2, Val3, Val4 from RawDataView where Date = ''' ... + datainiAL ''' and Time >= ''' tempoiniAL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoAL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val3, Val4 from RawDataView where Date > ''' ... + datainiAL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoALd = curs.Data; + elseif AnalogCh == 6 + comando = ['select Val0, Val1, Val2, Val3, Val4, Val5 from RawDataView where Date = ''' ... + datainiAL ''' and Time >= ''' tempoiniAL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoAL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val3, Val4, Val5 from RawDataView where Date > ''' ... + datainiAL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoALd = curs.Data; + end + % Concateno i dati relativi a Step 1 e 2 per il nodo ii-esimo. + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoAL == 0 + if AnalogCh == 1 + DatiAnalogLink(1:rt,col) = DATnodoAL(:,:); + elseif AnalogCh == 2 + ini_col = col-1; + DatiAnalogLink(1:rt,ini_col:col) = DATnodoAL(:,:); + elseif AnalogCh == 3 + ini_col = col-2; + DatiAnalogLink(1:rt,ini_col:col) = DATnodoAL(:,:); + elseif AnalogCh == 4 + ini_col = col-3; + DatiAnalogLink(1:rt,ini_col:col) = DATnodoAL(:,:); + elseif AnalogCh == 5 + ini_col = col-4; + DatiAnalogLink(1:rt,ini_col:col) = DATnodoAL(:,:); + elseif AnalogCh == 6 + ini_col = col-5; + DatiAnalogLink(1:rt,ini_col:col) = DATnodoAL(:,:); + end + else + if AnalogCh == 1 + DatiAnalogLink(1:rd,col) = DATnodoAL(:,:); + elseif AnalogCh == 2 + ini_col = col-1; + DatiAnalogLink(1:rd,ini_col:col) = DATnodoAL(:,:); + elseif AnalogCh == 3 + ini_col = col-2; + DatiAnalogLink(1:rd,ini_col:col) = DATnodoAL(:,:); + elseif AnalogCh == 4 + ini_col = col-3; + DatiAnalogLink(1:rd,ini_col:col) = DATnodoAL(:,:); + elseif AnalogCh == 5 + ini_col = col-4; + DatiAnalogLink(1:rd,ini_col:col) = DATnodoAL(:,:); + elseif AnalogCh == 6 + ini_col = col-5; + DatiAnalogLink(1:rd,ini_col:col) = DATnodoAL(:,:); + end + end + [rn,~] = size(DATnodoALd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoALd(i,:) = DATnodoALd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Analog Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoAL == 0 + if ChAL == 1 + DatiAnalogLink(rt+1:rt+rd,col) = DATnodoALd(:,:); + else + DatiAnalogLink(rt+1:rt+rd,ini_col:col) = DATnodoALd(:,:); + end + end + else + DatiAnalogLink = DatiAnalogLink(1:end,:); + end + okdatAL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rAL) ' Analog Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatAL); + ii = ii+1; + if ChAL == 1 + col = col+1; + elseif ChAL == 2 + col = col+2; + elseif ChAL == 3 + col = col+3; + elseif ChAL == 4 + col = col+4; + elseif ChAL == 5 + col = col+5; + elseif ChAL == 6 + col = col+6; + end + end + if w == 0 + wardat = 'There are not warning for Analog Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiAnalogLink); + ErrAnalogLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroAL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiAL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + for jj=1:c + % Se il nodo è Dis., devo aumentare di uno la data (il nodo non + % è ancora stato installato!) + if strcmp('Dis.',DatiAnalogLink(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',DatiAnalogLink(dis,jj)) == 0 + DatiAnalogLink = DatiAnalogLink(dis:end,:); + DATiniAL = DATiniAL(dis:end,:); + [r,c] = size(DatiAnalogLink); + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiAL)+1 < now + datainiAL = datestr(datenum(datainiAL)+1,'yyyy-mm-dd'); + break + else + yesAL = 0; + end + end + end + end + end + if DIS ~= 1 && yesAL == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiAnalogLink(1,jj))); + idxT = find(strcmp('---',DatiAnalogLink(1,jj))); + idxT2 = find(strcmp('-',DatiAnalogLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiAnalogLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiAnalogLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiAnalogLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiAnalogLink(1,jj))); + idxN = find(strcmp('null',DatiAnalogLink(1,jj))); + idxRX = find(strcmp('No RX',DatiAnalogLink(1,jj))); + idxI = find(strcmp('id Error',DatiAnalogLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiAnalogLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiAnalogLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiAnalogLink(1,jj))); + idxDis = find(strcmp('Dis.',DatiAnalogLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiAnalogLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiAnalogLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiAnalogLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiAnalogLink(1,jj))); + idxND = find(strcmp('No Data',DatiAnalogLink(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiAnalogLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxCE); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxDis); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Analog Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroAL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiAL)+1 < now + datainiAL = datestr(datenum(datainiAL)+1,'yyyy-mm-dd'); + break + else + yesAL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiAL = datestr(datenum(datainiAL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiAnalogLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrAnalogLink(1,jj) = 1; + wardat = 'Data of Analog Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiAL = datestr(datenum(datainiAL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiAnalogLink(:,jj))); + idxT = find(strcmp('---',DatiAnalogLink(:,jj))); + idxT2 = find(strcmp('-',DatiAnalogLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiAnalogLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiAnalogLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiAnalogLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiAnalogLink(:,jj))); + idxN = find(strcmp('null',DatiAnalogLink(:,jj))); + idxRX = find(strcmp('No RX',DatiAnalogLink(:,jj))); + idxI = find(strcmp('id Error',DatiAnalogLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiAnalogLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiAnalogLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiAnalogLink(:,jj))); + idxDis = find(strcmp('Dis.',DatiAnalogLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiAnalogLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiAnalogLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiAnalogLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiAnalogLink(:,jj))); + idxND = find(strcmp('No Data',DatiAnalogLink(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiAnalogLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxCE); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxDis); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiAL = datestr(datenum(datainiAL)-1,'yyyy-mm-dd'); + else + DatiAnalogLink(indice,jj) = DatiAnalogLink(indice-1,jj); + ErrAnalogLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiAnalogLink(nnn,jj))); + if check == 1 + DatiAnalogLink(nnn,jj) = DatiAnalogLink(nnn-1,jj); + ErrAnalogLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Analog Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiAnalogLink = [DATiniAL str2double(DatiAnalogLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiAnalogLink(a,1) == DatiAnalogLink(a-1,1) + DatiAnalogLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + end + if NuovoZeroAL == 1 && yesAL == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiAnalogLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiAnalogLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiAnalogLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiAnalogLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiAnalogLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniCrL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumCrL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniCrL = curs.Data; + Ntempo = DATiniCrL; + [r,c] = size(DATiniCrL); + saltoCrL = 0; + if r==1 && c==1 + textdatCrL = 'Warning: error reading Crack Link (control unit data)!'; + fprintf(fileID,fmt,textdatCrL); + saltoCrL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiCrL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumCrL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2CrL = curs.Data; + Ndate = DAT2CrL; + if saltoCrL == 1 + DATiniCrL = DAT2CrL; + end + Check = size(DAT2CrL); + if Check(1,2) > 1 % ho superato il primo giorno + if saltoCrL == 0 + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + DATiniCrL = [DATiniCrL; DAT2CrL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniCrL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniCrL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniCrL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniCrL = T; + else + DATiniCrL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + % creo la matrice per i dati Extensometer Link + if saltoCrL == 0 + if Check(1,2) > 1 + DatiCrackLink = cell(rd+rt,rCrL); + DatiNTCCrackLink = cell(rd+rt,rCrL); + else + DatiCrackLink = cell(rt,rCrL); + DatiNTCCrackLink = cell(rt,rCrL); + end + else + DatiCrackLink = cell(rd,rCrL); + DatiNTCCrackLink = cell(rd,rCrL); + end + NCrackLink = cell2mat(NodoCrackLink(:,2)); + col = 1; + ii = 1; + w = 0; + while ii <= rCrL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NCrackLink(ii,1); + nNodo = num2str(nN); + % Dato + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiCrL ''' and Time >= ''' tempoiniCrL ''' and ToolNameID = ''' ... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoCrL = curs.Data; + % Dato + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiCrL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = '''... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoCrLd = curs.Data; + if ChCrL(ii,1) == 1 + % T + DATnodoCrL_NTC = cell(1,1); + DATnodoCrLd_NTC = cell(1,1); + elseif ChCrL(ii,1) == 2 + if CrL_NTC(ii,1)==1 + comando = ['select Val1 from RawDataView where Date = ''' ... + datainiCrL ''' and Time >= ''' tempoiniCrL ''' and ToolNameID = ''' ... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoCrL_NTC = curs.Data; + % Dato + comando = ['select Val1 from RawDataView where Date > ''' ... + datainiCrL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = '''... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoCrLd_NTC = curs.Data; + else + DATnodoCrL_NTC = cell(1,1); + DATnodoCrLd_NTC = cell(1,1); + end + end + + [rn,~] = size(DATnodoCrLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoCrLd(i,:) = DATnodoCrLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Crack Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + [rnT,~] = size(DATnodoCrLd_NTC); % controllo date + if rnT < rd % normalmente sono uguali + for i = rnT+1:rd + DATnodoCrLd_NTC(i,:) = DATnodoCrLd_NTC(rnT,:); % se mancano dati, copio gli ultimi + end + wardat = ['NTC of Node Crack Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoCrL == 0 + if ChCrL(ii,1) >= 2 + if CrL_NTC(ii,1)==1 + DatiCrackLink(1:rt,col) = DATnodoCrL(:,:); %#ok<*AGROW> + DatiNTCCrackLink(1:rt,col) = DATnodoCrL_NTC(:,:); %#ok<*AGROW> + if Check(1,2) > 1 + DatiCrackLink(rt+1:rt+rd,col) = DATnodoCrLd(:,:); + DatiNTCCrackLink(rt+1:rt+rd,col) = DATnodoCrLd_NTC(:,:); %#ok<*AGROW> + end + else + DatiCrackLink(1:rt,col) = DATnodoCrL(:,:); %#ok<*AGROW> + if Check(1,2) > 1 + DatiCrackLink(rt+1:rt+rd,col) = DATnodoCrLd(:,:); + end + end + elseif ChCrL(ii,1) == 1 + DatiCrackLink(1:rt,col) = DATnodoCrL(:,:); %#ok<*AGROW> + if Check(1,2) > 1 + DatiCrackLink(rt+1:rt+rd,col) = DATnodoCrLd(:,:); + end + end + else + if ChCrL(ii,1) >= 2 + if CrL_NTC(ii,1)==1 + DatiCrackLink(1:rd,col) = DATnodoCrL(:,:); %#ok<*AGROW> + DatiNTCCrackLink(1:rd,col) = DATnodoCrL_NTC(:,:); %#ok<*AGROW> + else + DatiCrackLink(1:rd,col) = DATnodoCrL(:,:); %#ok<*AGROW> + end + elseif ChCrL(ii,1) == 1 + DatiCrackLink(1:rd,col) = DATnodoCrL(:,:); %#ok<*AGROW> + end + end + + okdatCrL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rCrL) ' Crack Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatCrL); + ii = ii+1; + col = col+1; + end + if w == 0 + wardat = 'There are not warning for Crack Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + + % Dati + [r,c] = size(DatiCrackLink); + ErrCrackLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroCrL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiCrL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + for jj=1:c + % Se il nodo è Dis., devo aumentare di uno la data (il nodo non + % è ancora stato installato!) + if strcmp('Dis.',DatiCrackLink(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',DatiCrackLink(dis,jj)) == 0 + DatiCrackLink = DatiCrackLink(dis:end,:); + DatiNTCCrackLink = DatiNTCCrackLink(dis:end,:); + DATiniCrL = DATiniCrL(dis:end,:); + [r,c] = size(DatiCrackLink); + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiCrL)+1 < now + datainiCrL = datestr(datenum(datainiCrL)+1,'yyyy-mm-dd'); + break + else + yesCrL = 0; + end + end + end + + end + end + if DIS ~= 1 && yesCrL == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiCrackLink(1,jj))); + idxT = find(strcmp('---',DatiCrackLink(1,jj))); + idxT2 = find(strcmp('-',DatiCrackLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiCrackLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiCrackLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiCrackLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiCrackLink(1,jj))); + idxN = find(strcmp('null',DatiCrackLink(1,jj))); + idxRX = find(strcmp('No RX',DatiCrackLink(1,jj))); + idxI = find(strcmp('id Error',DatiCrackLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiCrackLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiCrackLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiCrackLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiCrackLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiCrackLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiCrackLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiCrackLink(1,jj))); + idxND = find(strcmp('No Data',DatiCrackLink(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiCrackLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Crack Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroCrL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiCrL)+1 < now + datainiCrL = datestr(datenum(datainiCrL)+1,'yyyy-mm-dd'); + break + else + yesCrL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiCrL = datestr(datenum(datainiCrL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiCrackLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrCrackLink(1,jj) = 1; + wardat = 'Data of Crack Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiCrL = datestr(datenum(datainiCrL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiCrackLink(:,jj))); + idxT = find(strcmp('---',DatiCrackLink(:,jj))); + idxT2 = find(strcmp('-',DatiCrackLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiCrackLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiCrackLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiCrackLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiCrackLink(:,jj))); + idxN = find(strcmp('null',DatiCrackLink(:,jj))); + idxRX = find(strcmp('No RX',DatiCrackLink(:,jj))); + idxI = find(strcmp('id Error',DatiCrackLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiCrackLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiCrackLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiCrackLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiCrackLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiCrackLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiCrackLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiCrackLink(:,jj))); + idxND = find(strcmp('No Data',DatiCrackLink(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiCrackLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + for kk = 1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiCrL = datestr(datenum(datainiCrL)+1,'yyyy-mm-dd'); + break + else + DatiCrackLink(indice,jj) = DatiCrackLink(indice-1,jj); + ErrCrackLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiCrackLink(nnn,jj))); + if check == 1 + DatiCrackLink(nnn,jj) = DatiCrackLink(nnn-1,jj); + ErrCrackLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Crack Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiCrackLink = [DATiniCrL str2double(DatiCrackLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiCrackLink(a,1) == DatiCrackLink(a-1,1) + DatiCrackLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + + if ESCI == 0 + if sum(CrL_NTC(:,1))>0 + if DIS ~= 1 && yesCrL == 1 + % NTC + [r,c] = size(DatiNTCCrackLink); + Ncorr = 0; + if NuovoZeroCrL == 1 + if isfile(RawDataFile) == 1 + DatiRawNTC = csvread(RawDataFileNTC); + [rDR,cDR] = size(DatiRawNTC); + DatiRawNTC(:,1) = DatiRawNTC(:,1) + 730000; + RawDateNTC = find(DatiRawNTC(:,1)<=datenum(datainiCrL)); + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTCCrackLink(1,jj))); + idxND = find(strcmp('No Data',DatiNTCCrackLink(1,jj))); + idxT3 = find(strcmp('---',DatiNTCCrackLink(1,jj))); + idxT = find(strcmp('-',DatiNTCCrackLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiNTCCrackLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiNTCCrackLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiNTCCrackLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiNTCCrackLink(1,jj))); + idxN = find(strcmp('null',DatiNTCCrackLink(1,jj))); + idxRX = find(strcmp('No RX',DatiNTCCrackLink(1,jj))); + idxI = find(strcmp('id Error',DatiNTCCrackLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiNTCCrackLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiNTCCrackLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiNTCCrackLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTCCrackLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiNTCCrackLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiNTCCrackLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiNTCCrackLink(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiNTCCrackLink(1,jj))); + idx = union(idxE,idxT3); + idx = union(idx,idxND); + idx = union(idx,idxCE); + idx = union(idx,idxT); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of NTC of Crack Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroCrL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiCrL)+1 < now + datainiCrL = datestr(datenum(datainiCrL)+1,'yyyy-mm-dd'); + break + else + yesCrL = 0; + end + else + if isempty(RawDateNTC) == 1 + NAN = 0; + ESCI = 1; + datainiCrL = datestr(datenum(datainiCrL)-1,'yyyy-mm-dd'); + break + else + DatiNTCCrackLink(1,jj) = cellstr(num2str(DatiRawNTC(RawDateNTC(end),jj+1))); + if ErrCrackLink(indice,jj) == 0 + ErrCrackLink(indice,jj) = 0.5; + else + ErrCrackLink(indice,jj) = 1; + end + wardat = 'Data of NTC of Crack Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTCCrackLink(:,jj))); + idxND = find(strcmp('No Data',DatiNTCCrackLink(:,jj))); + idxT3 = find(strcmp('---',DatiNTCCrackLink(:,jj))); + idxT = find(strcmp('-',DatiNTCCrackLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiNTCCrackLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiNTCCrackLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiNTCCrackLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiNTCCrackLink(:,jj))); + idxN = find(strcmp('null',DatiNTCCrackLink(:,jj))); + idxRX = find(strcmp('No RX',DatiNTCCrackLink(:,jj))); + idxI = find(strcmp('id Error',DatiNTCCrackLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiNTCCrackLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiNTCCrackLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiNTCCrackLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTCCrackLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiNTCCrackLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiNTCCrackLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiNTCCrackLink(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiNTCCrackLink(:,jj))); + idx = union(idxE,idxT3); + idx = union(idx,idxND); + idx = union(idx,idxCE); + idx = union(idx,idxT); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + if DIS == 1 + wardat = 'Warning on the correction of NTC of Crack Link: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + NAN = 0; + ESCI = 1; + datainiCrL = datestr(datenum(datainiCrL)+1,'yyyy-mm-dd'); + break + else + wardat = 'Warning on the correction of NTC of Crack Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 % il file non è mai stato scritto + NAN = 0; + ESCI = 1; + datainiCrL = datestr(datenum(datainiCrL)-1,'yyyy-mm-dd'); + break + else + if isempty(RawDateNTC) == 1 + NAN = 0; + ESCI = 1; + datainiCrL = datestr(datenum(datainiCrL)-1,'yyyy-mm-dd'); + break + else + DatiNTCCrackLink(indice,jj) = cellstr(num2str(DatiRawNTC(RawDateNTC(end),jj+1))); + if ErrCrackLink(indice,jj) == 0 + ErrCrackLink(indice,jj) = 0.5; + else + ErrCrackLink(indice,jj) = 1; + end + wardat = 'Data of Crack Link nodes corrected using Raw Data of Excel file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + else + DatiNTCCrackLink(indice,jj) = DatiNTCCrackLink(indice-1,jj); + if ErrCrackLink(indice,jj) == 0 + ErrCrackLink(indice,jj) = 0.5; + else + ErrCrackLink(indice,jj) = 1; + end + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiNTCCrackLink(nnn,jj))); + if check == 1 + DatiNTCCrackLink(nnn,jj) = DatiNTCCrackLink(nnn-1,jj); + if ErrCrackLink(indice,jj) == 0 + ErrCrackLink(indice,jj) = 0.5; + else + ErrCrackLink(indice,jj) = 1; + end + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of NTC Crack Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiNTCCrackLink = [DATiniCrL str2double(DatiNTCCrackLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiNTCCrackLink(a,1) == DatiNTCCrackLink(a-1,1) + DatiNTCCrackLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + end + end + if NuovoZeroCrL == 1 && yesCrL == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiCrackLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiCrackLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiCrackLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiCrackLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiCrackLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)0 + [rDR,cDR] = size(DatiRawNTC); + if rDR~=1 && cDR~=1 && isempty(DatiRawNTC) == 0 + RawDate1 = find(DatiRawNTC(:,1)<=DatiNTCCrackLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiNTCCrackLink(:,1)>DatiRawNTC(end,1)); + else + RawDate2 = find(DatiNTCCrackLink(:,1)>DatiRawNTC(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + DatiNTC = [DatiRawNTC(1:RawDate1(end),:);DatiNTCCrackLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + DatiNTC = DatiNTCCrackLink; + else + DatiNTC = DatiRawNTC; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(DatiNTC(:,1)0 + DatiNTC = DatiNTCCrackLink; + end + end + Dati(:,1) = Dati(:,1) - 730000; + csvwrite(RawDataFile,Dati); + if sum(CrL_NTC(:,1))>0 + DatiNTC(:,1) = DatiNTC(:,1) - 730000; + csvwrite(RawDataFileNTC,DatiNTC); + end +end + +%% 3D Crack Link +if yes3DCrL == 0 % Non ci sono 3D Crack Link + Dati3DCrackLink = []; + DatiNTC3DCrackLink = []; + Err3DCrackLink = []; + ErrNTC3DCrackLink = []; + Ch3DCrL = []; + CrL3D_NTC = []; + wardat = 'lettura function: there are not 3D Crack Link'; + fprintf(fileID,fmt,wardat); +else + RawDataFile = ['' IDcentralina '-' DTcatena '-3DCrack-RawData.csv']; % Specifico per 3D Crack Link + RawDataFileNTC = ['' IDcentralina '-' DTcatena '-3DCrackNTC-RawData.csv']; % Specifico per 3D Crack Link + Ch3DCrL = cell2mat(Nodo3DCrackLink(:,4)); + CrL3D_NTC = cell2mat(Nodo3DCrackLink(:,5)); + NAN = 0; + DIS = 0; + while NAN == 0 + if datenum(dataini3DCrL) == datenum(Data(1,1)) + tempoini3DCrL = char(Data(1,2)); + end + NodeType = '3D Crack Link'; + NodeNum3DCrL = num2str(cell2mat(Nodo3DCrackLink(1,2))); % scarico i dati del primo nodo + % Scarico dei dati relativi alla centralina con informazioni di Data e ora, livello batteria e temperatura + % Step 1 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date = ''' ... + dataini3DCrL ''' and Time >= ''' tempoini3DCrL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNum3DCrL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATini3DCrL = curs.Data; + Ntempo = DATini3DCrL; + [r,c] = size(DATini3DCrL); + salto3DCrL = 0; + if r==1 && c==1 + textdat3DCrL = 'Warning: error reading 3D Crack Link (control unit data)!'; + fprintf(fileID,fmt,textdat3DCrL); + salto3DCrL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + dataini3DCrL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNum3DCrL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT23DCrL = curs.Data; + Ndate = DAT23DCrL; + if salto3DCrL == 1 + DATini3DCrL = DAT23DCrL; + end + Check = size(DAT23DCrL); + if Check(1,2) > 1 % ho superato il primo giorno + if salto3DCrL == 0 + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + DATini3DCrL = [DATini3DCrL; DAT23DCrL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATini3DCrL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATini3DCrL(:,1)) repmat(' ', [rD,1]) cell2mat(DATini3DCrL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATini3DCrL = T; + else + DATini3DCrL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + if salto3DCrL == 0 + % creo la matrice per i dati 3D Crack Link + if Check(1,2) > 1 + Dati3DCrackLink = cell(rd+rt,3*r3DCrL); + DatiNTC3DCrackLink = cell(rd+rt,r3DCrL); + else + Dati3DCrackLink = cell(rt,3*r3DCrL); + DatiNTC3DCrackLink = cell(rt,r3DCrL); + end + else + Dati3DCrackLink = cell(rd,3*r3DCrL); + DatiNTC3DCrackLink = cell(rd,r3DCrL); + end + col = 1; + ii = 1; + w = 0; + N3DCrackLink = cell2mat(Nodo3DCrackLink(:,2)); + while ii <= r3DCrL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = N3DCrackLink(ii,1); + nNodo = num2str(nN); + if Ch3DCrL(ii,1) == 3 || Ch3DCrL(ii,1) == 4 + comando = ['select Val0, Val1, Val2 from RawDataView where Date = ''' ... + dataini3DCrL ''' and Time >= ''' tempoini3DCrL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo3DCrL = curs.Data; + comando = ['select Val0, Val1, Val2 from RawDataView where Date > ''' ... + dataini3DCrL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo3DCrLd = curs.Data; + if Ch3DCrL(ii,1) == 4 % Termometro + comando = ['select Val3 from RawDataView where Date = ''' ... + dataini3DCrL ''' and Time >= ''' tempoini3DCrL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo3DCrL_NTC = curs.Data; + comando = ['select Val3 from RawDataView where Date > ''' ... + dataini3DCrL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo3DCrL_NTCd = curs.Data; + else + DATnodo3DCrL_NTC = 0; + DATnodo3DCrL_NTCd = 0; + end + elseif Ch3DCrL(ii,1) >= 6 + comando = ['select Val0, Val2, Val4 from RawDataView where Date = ''' ... + dataini3DCrL ''' and Time >= ''' tempoini3DCrL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo3DCrL = curs.Data; + comando = ['select Val0, Val2, Val4 from RawDataView where Date > ''' ... + dataini3DCrL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo3DCrLd = curs.Data; + DATnodo3DCrL_NTC = 0; + DATnodo3DCrL_NTCd = 0; + end + + % Concateno i dati relativi a Step 1 e 2 per il nodo ii-esimo. + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + [rn,~] = size(DATnodo3DCrLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodo3DCrLd(i,:) = DATnodo3DCrLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node 3D Crack Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + [rn,~] = size(DATnodo3DCrL_NTCd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodo3DCrL_NTCd(i,:) = DATnodo3DCrL_NTCd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['NTC of Node 3D Crack Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if salto3DCrL == 0 + if Ch3DCrL(ii,1) == 4 + if CrL3D_NTC(ii,1) == 1 + Dati3DCrackLink(1:rt,col:col+2) = DATnodo3DCrL; %#ok<*AGROW> + DatiNTC3DCrackLink(1:rt,ii) = DATnodo3DCrL_NTC; %#ok<*AGROW> + if Check(1,2) > 1 + Dati3DCrackLink(rt+1:rt+rd,col:col+2) = DATnodo3DCrLd; + DatiNTC3DCrackLink(rt+1:rt+rd,ii) = DATnodo3DCrL_NTCd; %#ok<*AGROW> + end + else + Dati3DCrackLink(1:rt,col:col+2) = DATnodo3DCrL; %#ok<*AGROW> + if Check(1,2) > 1 + Dati3DCrackLink(rt+1:rt+rd,col:col+2) = DATnodo3DCrLd; + end + end + elseif Ch3DCrL(ii,1) == 3 || Ch3DCrL(ii,1) >= 6 + Dati3DCrackLink(1:rt,col:col+2) = DATnodo3DCrL; %#ok<*AGROW> + if Check(1,2) > 1 + Dati3DCrackLink(rt+1:rt+rd,col:col+2) = DATnodo3DCrLd; + end + end + else + if Ch3DCrL(ii,1) == 4 + if CrL3D_NTC(ii,1)==1 + Dati3DCrackLink(1:rd,col:col+2) = DATnodo3DCrL; %#ok<*AGROW> + DatiNTC3DCrackLink(1:rd,ii) = DATnodo3DCrL_NTC; %#ok<*AGROW> + else + Dati3DCrackLink(1:rd,col:col+2) = DATnodo3DCrL; %#ok<*AGROW> + end + elseif Ch3DCrL(ii,1) == 1 + Dati3DCrackLink(1:rd,col:col+2) = DATnodo3DCrL; %#ok<*AGROW> + end + end + + okdat3DCrL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(r3DCrL) ' 3D Crack Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdat3DCrL); + ii = ii+1; + col = col+3; + end + if w == 0 + wardat = 'There are not warning for 3D Crack Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(Dati3DCrackLink); + Err3DCrackLink = zeros(r,c); + Ncorr = 0; + NAN = 1; + ESCI = 0; + if NuovoZero3DCrL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(dataini3DCrL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + for jj=1:c + % Se il nodo è Dis., devo aumentare di uno la data (il nodo non + % è ancora stato installato!) + if strcmp('Dis.',Dati3DCrackLink(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',Dati3DCrackLink(dis,jj)) == 0 + Dati3DCrackLink = Dati3DCrackLink(dis:end,:); + DatiNTC3DCrackLink = DatiNTC3DCrackLink(dis:end,:); + DATini3DCrL = DATini3DCrL(dis:end,:); + [r,c] = size(Dati3DCrackLink); + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(dataini3DCrL)+1 < now + dataini3DCrL = datestr(datenum(dataini3DCrL)+1,'yyyy-mm-dd'); + break + else + yes3DCrL = 0; + end + end + end + end + end + if NAN == 1 + if DIS ~= 1 && yes3DCrL == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',Dati3DCrackLink(1,jj))); + idxT = find(strcmp('---',Dati3DCrackLink(1,jj))); + idxT2 = find(strcmp('-',Dati3DCrackLink(1,jj))); + idxE2 = find(strcmp('Err2',Dati3DCrackLink(1,jj))); + idxE255 = find(strcmp('Err255',Dati3DCrackLink(1,jj))); + idxD = find(strcmp('DMUXe',Dati3DCrackLink(1,jj))); + idxE1F = find(strcmp('Err1File',Dati3DCrackLink(1,jj))); + idxN = find(strcmp('null',Dati3DCrackLink(1,jj))); + idxRX = find(strcmp('No RX',Dati3DCrackLink(1,jj))); + idxI = find(strcmp('id Error',Dati3DCrackLink(1,jj))); + idxM = find(strcmp('MUX id Error',Dati3DCrackLink(1,jj))); + idxC = find(strcmp('CH n. Error',Dati3DCrackLink(1,jj))); + idxU = find(strcmp('Unknown Error',Dati3DCrackLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',Dati3DCrackLink(1,jj))); + idxNS = find(strcmp('NotSupp',Dati3DCrackLink(1,jj))); + idxU2 = find(strcmp('Unknown',Dati3DCrackLink(1,jj))); + idxNA = find(strcmp('NotAv',Dati3DCrackLink(1,jj))); + idxND = find(strcmp('No Data',Dati3DCrackLink(1,jj))); + idxCE = find(strcmp('CH n. Er',Dati3DCrackLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of 3D Crack Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZero3DCrL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(dataini3DCrL)+1 < now + dataini3DCrL = datestr(datenum(dataini3DCrL)+1,'yyyy-mm-dd'); + break + else + yes3DCrL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + dataini3DCrL = datestr(datenum(dataini3DCrL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + Dati3DCrackLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + Err3DCrackLink(1,jj) = 1; + wardat = 'Data of 3D Crack Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + dataini3DCrL = datestr(datenum(dataini3DCrL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',Dati3DCrackLink(:,jj))); + idxT = find(strcmp('---',Dati3DCrackLink(:,jj))); + idxT2 = find(strcmp('-',Dati3DCrackLink(:,jj))); + idxE2 = find(strcmp('Err2',Dati3DCrackLink(:,jj))); + idxE255 = find(strcmp('Err255',Dati3DCrackLink(:,jj))); + idxD = find(strcmp('DMUXe',Dati3DCrackLink(:,jj))); + idxE1F = find(strcmp('Err1File',Dati3DCrackLink(:,jj))); + idxN = find(strcmp('null',Dati3DCrackLink(:,jj))); + idxRX = find(strcmp('No RX',Dati3DCrackLink(:,jj))); + idxI = find(strcmp('id Error',Dati3DCrackLink(:,jj))); + idxM = find(strcmp('MUX id Error',Dati3DCrackLink(:,jj))); + idxC = find(strcmp('CH n. Error',Dati3DCrackLink(:,jj))); + idxU = find(strcmp('Unknown Error',Dati3DCrackLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',Dati3DCrackLink(:,jj))); + idxNS = find(strcmp('NotSupp',Dati3DCrackLink(:,jj))); + idxU2 = find(strcmp('Unknown',Dati3DCrackLink(:,jj))); + idxNA = find(strcmp('NotAv',Dati3DCrackLink(:,jj))); + idxND = find(strcmp('No Data',Dati3DCrackLink(:,jj))); + idxCE = find(strcmp('CH n. Er',Dati3DCrackLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + dataini3DCrL = datestr(datenum(dataini3DCrL)-1,'yyyy-mm-dd'); + break + else + Dati3DCrackLink(indice,jj) = Dati3DCrackLink(indice-1,jj); + Err3DCrackLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(Dati3DCrackLink(nnn,jj))); + if check == 1 + Dati3DCrackLink(nnn,jj) = Dati3DCrackLink(nnn-1,jj); + Err3DCrackLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of 3D Crack Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + Dati3DCrackLink = [DATini3DCrL str2double(Dati3DCrackLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if Dati3DCrackLink(a,1) == Dati3DCrackLink(a-1,1) + Dati3DCrackLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + end + + if ESCI == 0 + if sum(CrL3D_NTC(:,1))>0 + % NTC + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiNTC3DCrackLink); + Ncorr = 0; + ErrNTC3DCrackLink = zeros(r,c); + if NuovoZero3DCrL == 1 + if isfile(RawDataFile) == 1 + DatiRawNTC = csvread(RawDataFileNTC); + [rDR,cDR] = size(DatiRawNTC); + DatiRawNTC(:,1) = DatiRawNTC(:,1) + 730000; + RawDateNTC = find(DatiRawNTC(:,1)<=datenum(dataini3DCrL)); + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTC3DCrackLink(1,jj))); + idxT3 = find(strcmp('---',DatiNTC3DCrackLink(1,jj))); + idxT = find(strcmp('-',DatiNTC3DCrackLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiNTC3DCrackLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiNTC3DCrackLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiNTC3DCrackLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiNTC3DCrackLink(1,jj))); + idxN = find(strcmp('null',DatiNTC3DCrackLink(1,jj))); + idxRX = find(strcmp('No RX',DatiNTC3DCrackLink(1,jj))); + idxI = find(strcmp('id Error',DatiNTC3DCrackLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiNTC3DCrackLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiNTC3DCrackLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiNTC3DCrackLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTC3DCrackLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiNTC3DCrackLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiNTC3DCrackLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiNTC3DCrackLink(1,jj))); + idxND = find(strcmp('No Data',DatiNTC3DCrackLink(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiNTC3DCrackLink(1,jj))); + idx = union(idxE,idxT3); + idx = union(idx,idxND); + idx = union(idx,idxCE); + idx = union(idx,idxT); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of 3D Crack Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZero3DCrL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(dataini3DCrL)+1 < now + dataini3DCrL = datestr(datenum(dataini3DCrL)+1,'yyyy-mm-dd'); + break + else + yes3DCrL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + dataini3DCrL = datestr(datenum(dataini3DCrL)-1,'yyyy-mm-dd'); + break + else + Dati3DCrackLink(1,jj) = cellstr(num2str(DatiRaw(RawDateNTC(end),jj+1))); + Err3DCrackLink(1,jj) = 1; + wardat = 'Data of 3D Crack Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTC3DCrackLink(:,jj))); + idxT3 = find(strcmp('---',DatiNTC3DCrackLink(:,jj))); + idxT = find(strcmp('-',DatiNTC3DCrackLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiNTC3DCrackLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiNTC3DCrackLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiNTC3DCrackLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiNTC3DCrackLink(:,jj))); + idxN = find(strcmp('null',DatiNTC3DCrackLink(:,jj))); + idxRX = find(strcmp('No RX',DatiNTC3DCrackLink(:,jj))); + idxI = find(strcmp('id Error',DatiNTC3DCrackLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiNTC3DCrackLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiNTC3DCrackLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiNTC3DCrackLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTC3DCrackLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiNTC3DCrackLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiNTC3DCrackLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiNTC3DCrackLink(:,jj))); + idxND = find(strcmp('No Data',DatiNTC3DCrackLink(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiNTC3DCrackLink(:,jj))); + idx = union(idxE,idxT3); + idx = union(idx,idxND); + idx = union(idx,idxCE); + idx = union(idx,idxT); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + dataini3DCrL = datestr(datenum(dataini3DCrL)-1,'yyyy-mm-dd'); + else + DatiNTC3DCrackLink(indice,jj) = DatiNTC3DCrackLink(indice-1,jj); + ErrNTC3DCrackLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiNTC3DCrackLink(nnn,jj))); + if check == 1 + DatiNTC3DCrackLink(nnn,jj) = DatiNTC3DCrackLink(nnn-1,jj); + ErrNTC3DCrackLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of NTC of 3D Crack Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiNTC3DCrackLink = [DATini3DCrL str2double(DatiNTC3DCrackLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiNTC3DCrackLink(a,1) == DatiNTC3DCrackLink(a-1,1) + DatiNTC3DCrackLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + else + ErrNTC3DCrackLink = 0; + end + end + end + if NuovoZero3DCrL == 1 && yes3DCrL == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=Dati3DCrackLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(Dati3DCrackLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(Dati3DCrackLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);Dati3DCrackLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = Dati3DCrackLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)0 + [rDR,cDR] = size(DatiRawNTC); + if rDR~=1 && cDR~=1 && isempty(DatiRawNTC) == 0 + RawDate1 = find(DatiRawNTC(:,1)<=DatiNTC3DCrackLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiNTC3DCrackLink(:,1)>DatiRawNTC(end,1)); + else + RawDate2 = find(DatiNTC3DCrackLink(:,1)>DatiRawNTC(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + DatiNTC = [DatiRawNTC(1:RawDate1(end),:);DatiNTC3DCrackLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + DatiNTC = DatiNTC3DCrackLink; + else + DatiNTC = DatiRawNTC; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(DatiNTC(:,1)0 + DatiNTC = DatiNTC3DCrackLink; + end + end + Dati(:,1) = Dati(:,1) - 730000; + csvwrite(RawDataFile,Dati); + if sum(CrL3D_NTC(:,1))>0 + DatiNTC(:,1) = DatiNTC(:,1) - 730000; + csvwrite(RawDataFileNTC,DatiNTC); + end +end + +%% 2D Crack Link +if yes2DCrL == 0 % Non ci sono 2D Crack Link + Dati2DCrackLink = []; + DatiNTC2DCrackLink = []; + Err2DCrackLink = []; + ErrNTC2DCrackLink = []; + Ch2DCrL = []; + CrL2D_NTC = []; + wardat = 'lettura function: there are not 2D Crack Link'; + fprintf(fileID,fmt,wardat); +else + RawDataFile = ['' IDcentralina '-' DTcatena '-2DCrack-RawData.csv']; % Specifico per 2D Crack Link + RawDataFileNTC = ['' IDcentralina '-' DTcatena '-2DCrackNTC-RawData.csv']; % Specifico per 2D Crack Link + Ch2DCrL = cell2mat(Nodo2DCrackLink(:,4)); + CrL2D_NTC = cell2mat(Nodo2DCrackLink(:,5)); + NAN = 0; + DIS = 0; + while NAN == 0 + if datenum(dataini2DCrL) == datenum(Data(1,1)) + tempoini2DCrL = char(Data(1,2)); + end + NodeType = '2D Crack Link'; + NodeNum2DCrL = num2str(cell2mat(Nodo2DCrackLink(1,2))); % scarico i dati del primo nodo + % Scarico dei dati relativi alla centralina con informazioni di Data e ora, livello batteria e temperatura + % Step 1 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date = ''' ... + dataini2DCrL ''' and Time >= ''' tempoini2DCrL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNum2DCrL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATini2DCrL = curs.Data; + Ntempo = DATini2DCrL; + [r,c] = size(DATini2DCrL); + salto2DCrL = 0; + if r==1 && c==1 + textdat2DCrL = 'Warning: error reading 2D Crack Link (control unit data)!'; + fprintf(fileID,fmt,textdat2DCrL); + salto2DCrL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + dataini2DCrL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNum2DCrL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT22DCrL = curs.Data; + Ndate = DAT22DCrL; + if salto2DCrL == 1 + DATini2DCrL = DAT22DCrL; + end + Check = size(DAT22DCrL); + if Check(1,2) > 1 % ho superato il primo giorno + if salto2DCrL == 0 + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + DATini2DCrL = [DATini2DCrL; DAT22DCrL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATini2DCrL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATini2DCrL(:,1)) repmat(' ', [rD,1]) cell2mat(DATini2DCrL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATini2DCrL = T; + else + DATini2DCrL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + if salto2DCrL == 0 + % creo la matrice per i dati 2D Crack Link + if Check(1,2) > 1 + Dati2DCrackLink = cell(rd+rt,2*r2DCrL); + DatiNTC2DCrackLink = cell(rd+rt,r2DCrL); + else + Dati2DCrackLink = cell(rt,2*r2DCrL); + DatiNTC2DCrackLink = cell(rt,r2DCrL); + end + else + Dati2DCrackLink = cell(rd,2*r2DCrL); + DatiNTC2DCrackLink = cell(rd,r2DCrL); + end + col = 1; + ii = 1; + w = 0; + N2DCrackLink = cell2mat(Nodo2DCrackLink(:,2)); + Ch2DCrL = cell2mat(Ch2DCrL); + while ii <= r2DCrL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = N2DCrackLink(ii,1); + nNodo = num2str(nN); + if Ch2DCrL(ii,1) == 2 || Ch2DCrL(ii,1) == 3 + comando = ['select Val0, Val1 from RawDataView where Date = ''' ... + dataini2DCrL ''' and Time >= ''' tempoini2DCrL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo2DCrL = curs.Data; + comando = ['select Val0, Val1 from RawDataView where Date > ''' ... + dataini2DCrL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo2DCrLd = curs.Data; + if Ch2DCrL(ii,1) == 3 % Termometro + comando = ['select Val2 from RawDataView where Date = ''' ... + dataini2DCrL ''' and Time >= ''' tempoini2DCrL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo2DCrL_NTC = curs.Data; + comando = ['select Val2 from RawDataView where Date > ''' ... + dataini2DCrL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo2DCrL_NTCd = curs.Data; + else + DATnodo2DCrL_NTC = 0; + DATnodo2DCrL_NTCd = 0; + end + elseif Ch2DCrL(ii,1) >= 4 + comando = ['select Val0, Val2 from RawDataView where Date = ''' ... + dataini32CrL ''' and Time >= ''' tempoini2DCrL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo2DCrL = curs.Data; + comando = ['select Val0, Val2 from RawDataView where Date > ''' ... + dataini2DCrL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodo2DCrLd = curs.Data; + DATnodo2DCrL_NTC = 0; + DATnodo2DCrL_NTCd = 0; + end + + % Concateno i dati relativi a Step 1 e 2 per il nodo ii-esimo. + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + [rn,~] = size(DATnodo2DCrLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodo2DCrLd(i,:) = DATnodo2DCrLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node 2D Crack Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + [rn,~] = size(DATnodo2DCrL_NTCd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodo2DCrL_NTCd(i,:) = DATnodo2DCrL_NTCd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['NTC of Node 2D Crack Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if salto2DCrL == 0 + if Ch2DCrL(ii,1) == 3 + if CrL2D_NTC(ii,1) == 1 + Dati2DCrackLink(1:rt,col:col+1) = DATnodo2DCrL; %#ok<*AGROW> + Dati2DCrackLink_NTC(1:rt,ii) = DATnodo2DCrL_NTC; %#ok<*AGROW> + if Check(1,2) > 1 + Dati2DCrackLink(rt+1:rt+rd,col:col+1) = DATnodo2DCrLd; + Dati2DCrackLink_NTC(rt+1:rt+rd,ii) = DATnodo2DCrL_NTCd; %#ok<*AGROW> + end + else + Dati2DCrackLink(1:rt,col:col+1) = DATnodo2DCrL; %#ok<*AGROW> + if Check(1,2) > 1 + Dati2DCrackLink(rt+1:rt+rd,col:col+1) = DATnodo3DCrLd; + end + end + elseif Ch3DCrL(ii,1) == 2 || Ch3DCrL(ii,1) >= 4 + Dati2DCrackLink(1:rt,col:col+1) = DATnodo2DCrL; %#ok<*AGROW> + if Check(1,2) > 1 + Dati2DCrackLink(rt+1:rt+rd,col:col+1) = DATnodo2DCrLd; + end + end + else + if Ch2DCrL(ii,1) == 3 + if CrL2D_NTC(ii,1)==1 + Dati2DCrackLink(1:rd,col:col+1) = DATnodo2DCrL; %#ok<*AGROW> + Dati2DCrackLink_NTC(1:rd,ii) = DATnodo2DCrL_NTC; %#ok<*AGROW> + else + Dati2DCrackLink(1:rd,col:col+1) = DATnodo2DCrL; %#ok<*AGROW> + end + elseif Ch2DCrL(ii,1) == 1 + Dati2DCrackLink(1:rd,col:col+1) = DATnodo2DCrL; %#ok<*AGROW> + end + end + + okdat2DCrL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(r2DCrL) ' 2D Crack Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdat2DCrL); + ii = ii+1; + col = col+2; + end + if w == 0 + wardat = 'There are not warning for 2D Crack Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(Dati2DCrackLink); + Err2DCrackLink = zeros(r,c); + Ncorr = 0; + NAN = 1; + ESCI = 0; + if NuovoZero2DCrL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(dataini2DCrL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + for jj=1:c + % Se il nodo è Dis., devo aumentare di uno la data (il nodo non + % è ancora stato installato!) + if strcmp('Dis.',Dati2DCrackLink(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',Dati2DCrackLink(dis,jj)) == 0 + Dati2DCrackLink = Dati2DCrackLink(dis:end,:); + DatiNTC2DCrackLink = DatiNTC2DCrackLink(dis:end,:); + DATini2DCrL = DATini2DCrL(dis:end,:); + [r,c] = size(Dati2DCrackLink); + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(dataini2DCrL)+1 < now + dataini2DCrL = datestr(datenum(dataini2DCrL)+1,'yyyy-mm-dd'); + break + else + yes2DCrL = 0; + end + end + end + end + end + if NAN == 1 + if DIS ~= 1 && yes2DCrL == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',Dati2DCrackLink(1,jj))); + idxT = find(strcmp('---',Dati2DCrackLink(1,jj))); + idxT2 = find(strcmp('-',Dati2DCrackLink(1,jj))); + idxE2 = find(strcmp('Err2',Dati2DCrackLink(1,jj))); + idxE255 = find(strcmp('Err255',Dati2DCrackLink(1,jj))); + idxD = find(strcmp('DMUXe',Dati2DCrackLink(1,jj))); + idxE1F = find(strcmp('Err1File',Dati2DCrackLink(1,jj))); + idxN = find(strcmp('null',Dati2DCrackLink(1,jj))); + idxRX = find(strcmp('No RX',Dati2DCrackLink(1,jj))); + idxI = find(strcmp('id Error',Dati2DCrackLink(1,jj))); + idxM = find(strcmp('MUX id Error',Dati2DCrackLink(1,jj))); + idxC = find(strcmp('CH n. Error',Dati2DCrackLink(1,jj))); + idxU = find(strcmp('Unknown Error',Dati2DCrackLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',Dati2DCrackLink(1,jj))); + idxNS = find(strcmp('NotSupp',Dati2DCrackLink(1,jj))); + idxU2 = find(strcmp('Unknown',Dati2DCrackLink(1,jj))); + idxNA = find(strcmp('NotAv',Dati2DCrackLink(1,jj))); + idxND = find(strcmp('No Data',Dati2DCrackLink(1,jj))); + idxCE = find(strcmp('CH n. Er',Dati2DCrackLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of 2D Crack Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZero2DCrL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(dataini2DCrL)+1 < now + dataini2DCrL = datestr(datenum(dataini2DCrL)+1,'yyyy-mm-dd'); + break + else + yes2DCrL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + dataini2DCrL = datestr(datenum(dataini2DCrL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + Dati2DCrackLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + Err2DCrackLink(1,jj) = 1; + wardat = 'Data of 2D Crack Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + dataini2DCrL = datestr(datenum(dataini2DCrL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',Dati2DCrackLink(:,jj))); + idxT = find(strcmp('---',Dati2DCrackLink(:,jj))); + idxT2 = find(strcmp('-',Dati2DCrackLink(:,jj))); + idxE2 = find(strcmp('Err2',Dati2DCrackLink(:,jj))); + idxE255 = find(strcmp('Err255',Dati2DCrackLink(:,jj))); + idxD = find(strcmp('DMUXe',Dati2DCrackLink(:,jj))); + idxE1F = find(strcmp('Err1File',Dati2DCrackLink(:,jj))); + idxN = find(strcmp('null',Dati2DCrackLink(:,jj))); + idxRX = find(strcmp('No RX',Dati2DCrackLink(:,jj))); + idxI = find(strcmp('id Error',Dati2DCrackLink(:,jj))); + idxM = find(strcmp('MUX id Error',Dati2DCrackLink(:,jj))); + idxC = find(strcmp('CH n. Error',Dati2DCrackLink(:,jj))); + idxU = find(strcmp('Unknown Error',Dati2DCrackLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',Dati2DCrackLink(:,jj))); + idxNS = find(strcmp('NotSupp',Dati2DCrackLink(:,jj))); + idxU2 = find(strcmp('Unknown',Dati2DCrackLink(:,jj))); + idxNA = find(strcmp('NotAv',Dati2DCrackLink(:,jj))); + idxND = find(strcmp('No Data',Dati2DCrackLink(:,jj))); + idxCE = find(strcmp('CH n. Er',Dati2DCrackLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + dataini2DCrL = datestr(datenum(dataini2DCrL)-1,'yyyy-mm-dd'); + break + else + Dati2DCrackLink(indice,jj) = Dati2DCrackLink(indice-1,jj); + Err2DCrackLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(Dati2DCrackLink(nnn,jj))); + if check == 1 + Dati2DCrackLink(nnn,jj) = Dati2DCrackLink(nnn-1,jj); + Err2DCrackLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of 2D Crack Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + Dati2DCrackLink = [DATini2DCrL str2double(Dati2DCrackLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if Dati2DCrackLink(a,1) == Dati2DCrackLink(a-1,1) + Dati2DCrackLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + end + + if ESCI == 0 + if sum(CrL2D_NTC(:,1))>0 + % NTC + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiNTC2DCrackLink); + Ncorr = 0; + ErrNTC2DCrackLink = zeros(r,c); + if NuovoZero2DCrL == 1 + if isfile(RawDataFile) == 1 + DatiRawNTC = csvread(RawDataFileNTC); + [rDR,cDR] = size(DatiRawNTC); + DatiRawNTC(:,1) = DatiRawNTC(:,1) + 730000; + RawDateNTC = find(DatiRawNTC(:,1)<=datenum(dataini2DCrL)); + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTC2DCrackLink(1,jj))); + idxT3 = find(strcmp('---',DatiNTC2DCrackLink(1,jj))); + idxT = find(strcmp('-',DatiNTC2DCrackLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiNTC2DCrackLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiNTC2DCrackLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiNTC2DCrackLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiNTC2DCrackLink(1,jj))); + idxN = find(strcmp('null',DatiNTC2DCrackLink(1,jj))); + idxRX = find(strcmp('No RX',DatiNTC2DCrackLink(1,jj))); + idxI = find(strcmp('id Error',DatiNTC2DCrackLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiNTC2DCrackLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiNTC2DCrackLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiNTC2DCrackLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTC2DCrackLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiNTC2DCrackLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiNTC2DCrackLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiNTC2DCrackLink(1,jj))); + idxND = find(strcmp('No Data',DatiNTC2DCrackLink(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiNTC2DCrackLink(1,jj))); + idx = union(idxE,idxT3); + idx = union(idx,idxND); + idx = union(idx,idxCE); + idx = union(idx,idxT); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of 2D Crack Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZero2DCrL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(dataini2DCrL)+1 < now + dataini2DCrL = datestr(datenum(dataini2DCrL)+1,'yyyy-mm-dd'); + break + else + yes2DCrL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + dataini2DCrL = datestr(datenum(dataini2DCrL)-1,'yyyy-mm-dd'); + break + else + Dati2DCrackLink(1,jj) = cellstr(num2str(DatiRaw(RawDateNTC(end),jj+1))); + Err2DCrackLink(1,jj) = 1; + wardat = 'Data of 2D Crack Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTC2DCrackLink(:,jj))); + idxT3 = find(strcmp('---',DatiNTC2DCrackLink(:,jj))); + idxT = find(strcmp('-',DatiNTC2DCrackLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiNTC2DCrackLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiNTC2DCrackLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiNTC2DCrackLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiNTC2DCrackLink(:,jj))); + idxN = find(strcmp('null',DatiNTC2DCrackLink(:,jj))); + idxRX = find(strcmp('No RX',DatiNTC2DCrackLink(:,jj))); + idxI = find(strcmp('id Error',DatiNTC2DCrackLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiNTC2DCrackLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiNTC2DCrackLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiNTC2DCrackLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTC2DCrackLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiNTC2DCrackLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiNTC2DCrackLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiNTC2DCrackLink(:,jj))); + idxND = find(strcmp('No Data',DatiNTC2DCrackLink(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiNTC2DCrackLink(:,jj))); + idx = union(idxE,idxT3); + idx = union(idx,idxND); + idx = union(idx,idxCE); + idx = union(idx,idxT); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + dataini2DCrL = datestr(datenum(dataini2DCrL)-1,'yyyy-mm-dd'); + else + DatiNTC2DCrackLink(indice,jj) = DatiNTC2DCrackLink(indice-1,jj); + ErrNTC2DCrackLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiNTC2DCrackLink(nnn,jj))); + if check == 1 + DatiNTC2DCrackLink(nnn,jj) = DatiNTC2DCrackLink(nnn-1,jj); + ErrNTC2DCrackLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of NTC of 2D Crack Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiNTC2DCrackLink = [DATini2DCrL str2double(DatiNTC2DCrackLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiNTC2DCrackLink(a,1) == DatiNTC2DCrackLink(a-1,1) + DatiNTC2DCrackLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + else + ErrNTC2DCrackLink = 0; + end + end + end + if NuovoZero2DCrL == 1 && yes2DCrL == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=Dati2DCrackLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(Dati2DCrackLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(Dati2DCrackLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);Dati2DCrackLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = Dati2DCrackLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)0 + [rDR,cDR] = size(DatiRawNTC); + if rDR~=1 && cDR~=1 && isempty(DatiRawNTC) == 0 + RawDate1 = find(DatiRawNTC(:,1)<=DatiNTC2DCrackLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiNTC2DCrackLink(:,1)>DatiRawNTC(end,1)); + else + RawDate2 = find(DatiNTC2DCrackLink(:,1)>DatiRawNTC(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + DatiNTC = [DatiRawNTC(1:RawDate1(end),:);DatiNTC2DCrackLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + DatiNTC = DatiNTC2DCrackLink; + else + DatiNTC = DatiRawNTC; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(DatiNTC(:,1)0 + DatiNTC = DatiNTC2DCrackLink; + end + end + Dati(:,1) = Dati(:,1) - 730000; + csvwrite(RawDataFile,Dati); + if sum(CrL2D_NTC(:,1))>0 + DatiNTC(:,1) = DatiNTC(:,1) - 730000; + csvwrite(RawDataFileNTC,DatiNTC); + end +end + +%% Stress Meter +attiva_SM = zeros(1,rSM); +if yesSM == 0 % Non ci sono Stress Meter + DatiStressMeter = []; + DatiNTCStressMeter = []; + DatiStressMeter_Rif = []; + DatiNTCStressMeter_Rif = []; + ErrStressMeter = []; + ChSM = []; + SM_NTC = []; + wardat = 'lettura function: there are not Stress Meter'; + fprintf(fileID,fmt,wardat); +else + RawDataFile = ['' IDcentralina '-' DTcatena '-Stress-RawData.csv']; % Specifico per Stress Meter + RawDataFileNTC = ['' IDcentralina '-' DTcatena '-NTCStress-RawData.csv']; + ChSM = cell2mat(NodoStressMeter(:,4)); + SM_NTC = cell2mat(NodoStressMeter(:,5)); + NAN = 0; + DIS = 0; + while NAN == 0 + if datenum(datainiSM) == datenum(Data(1,1)) + tempoiniSM = char(Data(1,2)); + end + NodeType = 'Stress Meter'; + NodeNumSM = num2str(cell2mat(NodoStressMeter(1,2))); % scarico i dati del primo nodo + % Scarico dei dati relativi alla centralina con informazioni di Data e ora, livello batteria e temperatura + % Step 1 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date = ''' ... + datainiSM ''' and Time >= ''' tempoiniSM ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumSM ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniSM = curs.Data; + Ntempo = DATiniSM; + [r,c] = size(DATiniSM); + saltoSM = 0; + if r==1 && c==1 + textdatSM = 'Warning: error reading Stress Meter (control unit data)!'; + fprintf(fileID,fmt,textdatSM); + saltoSM = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiSM ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumSM ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2SM = curs.Data; + Ndate = DAT2SM; + if saltoSM == 1 + DATiniSM = DAT2SM; + end + Check = size(DAT2SM); + if Check(1,2) > 1 % ho superato il primo giorno + if saltoSM == 0 + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + DATiniSM = [DATiniSM; DAT2SM]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniSM); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniSM(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniSM(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniSM = T; + else + DATiniSM = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + % creo la matrice per i dati Extensometer Link + if saltoSM == 0 + if Check(1,2) > 1 + DatiStressMeter = cell(rd+rt,rSM); + DatiNTCStressMeter = cell(rd+rt,rSM); + else + DatiStressMeter = cell(rt,rSM); + DatiNTCStressMeter = cell(rt,rSM); + end + else + DatiStressMeter = cell(rd,rSM); + DatiNTCStressMeter = cell(rd,rSM); + end + DatiStressMeter_Rif = cell(150,rSM); + DatiNTCStressMeter_Rif = cell(150,rSM); + NStress = cell2mat(NodoStressMeter(:,2)); + col = 1; + ii = 1; + w = 0; + while ii <= rSM + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NStress(ii,1); + nNodo = num2str(nN); + % Dato + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiSM ''' and Time >= ''' tempoiniSM ''' and ToolNameID = ''' ... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoSM = curs.Data; + % Dato + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiSM ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = '''... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoSMd = curs.Data; + % Riferimento + comando = ['select Val0 from RawDataView where Date = ''' ... + datestr(Date_Rif_SM,'yyyy-mm-dd') ''' and Time >= ''' datestr(Date_Rif_SM,'HH:MM:SS')... + ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoSM_Rif = curs.Data; + if ChSM(ii,1) == 1 + % T + DATnodoSM_NTC = 0; + DATnodoSMd_NTC = 0; + elseif ChSM(ii,1) == 2 + if SM_NTC(ii,1)==1 + comando = ['select Val1 from RawDataView where Date = ''' ... + datainiSM ''' and Time >= ''' tempoiniSM ''' and ToolNameID = ''' ... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoSM_NTC = curs.Data; + % Dato + comando = ['select Val1 from RawDataView where Date > ''' ... + datainiSM ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = '''... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoSMd_NTC = curs.Data; + % Riferimento + comando = ['select Val1 from RawDataView where Date = ''' ... + datestr(Date_Rif_SM,'yyyy-mm-dd') ''' and Time >= ''' datestr(Date_Rif_SM,'HH:MM:SS')... + ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoNTCSM_Rif = curs.Data; + else + DATnodoSM_NTC = 0; + DATnodoSMd_NTC = 0; + end + end + + [rn,~] = size(DATnodoSMd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoSMd(i,:) = DATnodoSMd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Stress Meter ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + [rnT,~] = size(DATnodoSMd_NTC); % controllo date + if rnT < rd % normalmente sono uguali + for i = rnT+1:rd + DATnodoSMd_NTC(i,:) = DATnodoSMd_NTC(rnT,:); % se mancano dati, copio gli ultimi + end + wardat = ['NTC of Node Stress Meter ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoSM == 0 + if ChSM(ii,1) >= 2 + if SM_NTC(ii,1)==1 + DatiStressMeter(1:rt,col) = DATnodoSM(:,:); %#ok<*AGROW> + DatiNTCStressMeter(1:rt,col) = DATnodoSM_NTC(:,:); %#ok<*AGROW> + if Check(1,2) > 1 + [rrr,~] = size(DATnodoSMd); + if rrr ~= rd + DatiStressMeter(rt+rd-rrr+1:rt+rd,col) = DATnodoSMd; + DatiNTCStressMeter(rt+rd-rrr+1:rt+rd,col) = DATnodoSMd_NTC; %#ok<*AGROW> + else + DatiStressMeter(rt+1:rt+rd,col) = DATnodoSMd(:,:); + DatiNTCStressMeter(rt+1:rt+rd,col) = DATnodoSMd_NTC(:,:); %#ok<*AGROW> + end + end + else + DatiStressMeter(1:rt,col) = DATnodoSM(:,:); %#ok<*AGROW> + if Check(1,2) > 1 + DatiStressMeter(rt+1:rt+rd,col) = DATnodoSMd(:,:); + end + end + elseif ChSM(ii,1) == 1 + DatiStressMeter(1:rt,col) = DATnodoSM(:,:); %#ok<*AGROW> + if Check(1,2) > 1 + DatiStressMeter(rt+1:rt+rd,col) = DATnodoSMd(:,:); + end + end + else + if ChSM(ii,1) >= 2 + if SM_NTC(ii,1)==1 + DatiStressMeter(1:rd,col) = DATnodoSM(:,:); %#ok<*AGROW> + DatiNTCStressMeter(1:rd,col) = DATnodoSM_NTC(:,:); %#ok<*AGROW> + else + DatiStressMeter(1:rd,col) = DATnodoSM(:,:); %#ok<*AGROW> + end + elseif ChSM(ii,1) == 1 + DatiStressMeter(1:rd,col) = DATnodoSM(:,:); %#ok<*AGROW> + end + end + + % Riferimento + [dim,~] = size(DATnodoSM_Rif); % controllo date + DatiStressMeter_Rif(1:dim,col) = DATnodoSM_Rif; + if col == 1 + DatiStressMeter_Rif(dim+1:end,:) = []; + end + [dimT,~] = size(DATnodoNTCSM_Rif); % controllo date + DatiNTCStressMeter_Rif(1:dimT,col) = DATnodoNTCSM_Rif; + if col == 1 + DatiNTCStressMeter_Rif(dim+1:end,:) = []; + end + + okdatSM = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rSM) ' Stress Meter nodes downloaded correctly']; + fprintf(fileID,fmt,okdatSM); + ii = ii+1; + col = col+1; + end + if w == 0 + wardat = 'There are not warning for Stress Meter!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + + % Dati + [r,c] = size(DatiStressMeter); + ErrStressMeter = zeros(r,c); + Ncorr = 0; + ESCI = 0; + Rilancia = 0; + NAN = 1; + if NuovoZeroSM == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiSM)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + [dim,numS] = size(DatiStressMeter_Rif); + for SM = 1:numS + RIF = 0; + row = 1; + rompi = 0; + while RIF == 0 + if attiva_SM(1,SM) == 0 + if row <= dim + % Controllo la data di riferimento + idxE = find(strcmp('Err1',DatiStressMeter_Rif(row,SM))); + idxT = find(strcmp('---',DatiStressMeter_Rif(row,SM))); + idxE2 = find(strcmp('Err2',DatiStressMeter_Rif(row,SM))); + idxE255 = find(strcmp('Err255',DatiStressMeter_Rif(row,SM))); + idxD = find(strcmp('DMUXe',DatiStressMeter_Rif(row,SM))); + idxE1F = find(strcmp('Err1File',DatiStressMeter_Rif(row,SM))); + idxN = find(strcmp('null',DatiStressMeter_Rif(row,SM))); + idxRX = find(strcmp('No RX',DatiStressMeter_Rif(row,SM))); + idxI = find(strcmp('id Error',DatiStressMeter_Rif(row,SM))); + idxM = find(strcmp('MUX id Error',DatiStressMeter_Rif(row,SM))); + idxC = find(strcmp('CH n. Error',DatiStressMeter_Rif(row,SM))); + idxU = find(strcmp('Unknown Error',DatiStressMeter_Rif(row,SM))); + idxMC = find(strcmp('MsgCorrup',DatiStressMeter_Rif(row,SM))); + idxNS = find(strcmp('NotSupp',DatiStressMeter_Rif(row,SM))); + idxU2 = find(strcmp('Unknown',DatiStressMeter_Rif(row,SM))); + idxNA = find(strcmp('NotAv',DatiStressMeter_Rif(row,SM))); + idxDIS = find(strcmp('Dis.',DatiStressMeter_Rif(row,SM))); + idxND = find(strcmp('No Data',DatiStressMeter_Rif(row,SM))); + idxPP = find(strcmp('[]',DatiStressMeter_Rif(row,SM))); + idxCE = find(strcmp('CH n. Er',DatiStressMeter_Rif(row,SM))); + idx = union(idxE,idxT); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxDIS); + idx = union(idx,idxND); + idx = union(idx,idxPP); + [~,ri] = size(idx); + if isempty(idx) == 0 || isempty(cell2mat(DatiStressMeter_Rif(row,SM))) == 1 + if ri >= 1 % Se almeno uno è in errore, allora guardo la riga dopo + row = row+1; + else + RIF = 1; + if attiva_SM(1,SM) == 0 + DatiStress_Rif(1,SM) = DatiStressMeter_Rif(row,SM); + DatiNTCStress_Rif(1,SM) = str2double(DatiNTCStressMeter_Rif(row,SM)); + end + attiva_SM(1,SM) = 1; + end + else + RIF = 1; + if attiva_SM(1,SM) == 0 + DatiStress_Rif(1,SM) = DatiStressMeter_Rif(row,SM); + DatiNTCStress_Rif(1,SM) = str2double(DatiNTCStressMeter_Rif(row,SM)); + end + attiva_SM(1,SM) = 1; + end + else + Date_Rif_SM = floor(Date_Rif_SM)+1; + if Date_Rif_SM > now + Rilancia = 0; + RIF = 1; + DatiStress_Rif(1,SM) = num2cell(0); + DatiNTCStress_Rif(1,SM) = 0; + attiva_SM(1,SM) = 0; + else + RIF = 1; + NAN = 0; + Rilancia = 1; + end + rompi = 1; + end + else + break + end + end + if rompi == 1 + break + end + end + + if Rilancia == 0 + for jj=1:c + % Se il nodo è Dis., devo aumentare di uno la data (il nodo non + % è ancora stato installato!) + if strcmp('Dis.',DatiStressMeter(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',DatiStressMeter(dis,jj)) == 0 + DatiStressMeter = DatiStressMeter(dis:end,:); + DATiniSM = DATiniSM(dis:end,:); + [r,c] = size(DatiStressMeter); + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiSM)+1 < now + datainiSM = datestr(datenum(datainiSM)+1,'yyyy-mm-dd'); + break + else + yesSM = 0; + end + end + end + + end + end + if DIS ~= 1 && yesSM == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiStressMeter(1,jj))); + idxT = find(strcmp('---',DatiStressMeter(1,jj))); + idxT2 = find(strcmp('-',DatiStressMeter(1,jj))); + idxE2 = find(strcmp('Err2',DatiStressMeter(1,jj))); + idxE255 = find(strcmp('Err255',DatiStressMeter(1,jj))); + idxD = find(strcmp('DMUXe',DatiStressMeter(1,jj))); + idxE1F = find(strcmp('Err1File',DatiStressMeter(1,jj))); + idxN = find(strcmp('null',DatiStressMeter(1,jj))); + idxRX = find(strcmp('No RX',DatiStressMeter(1,jj))); + idxI = find(strcmp('id Error',DatiStressMeter(1,jj))); + idxM = find(strcmp('MUX id Error',DatiStressMeter(1,jj))); + idxC = find(strcmp('CH n. Error',DatiStressMeter(1,jj))); + idxU = find(strcmp('Unknown Error',DatiStressMeter(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiStressMeter(1,jj))); + idxNS = find(strcmp('NotSupp',DatiStressMeter(1,jj))); + idxU2 = find(strcmp('Unknown',DatiStressMeter(1,jj))); + idxNA = find(strcmp('NotAv',DatiStressMeter(1,jj))); + idxND = find(strcmp('No Data',DatiStressMeter(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Stress Meter nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroSM == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiSM)+1 < now + datainiSM = datestr(datenum(datainiSM)+1,'yyyy-mm-dd'); + break + else + yesSM = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiSM = datestr(datenum(datainiSM)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiStressMeter(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrStressMeter(1,jj) = 1; + wardat = 'Data of Stress Meter nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiSM = datestr(datenum(datainiSM)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiStressMeter(:,jj))); + idxT = find(strcmp('---',DatiStressMeter(:,jj))); + idxT2 = find(strcmp('-',DatiStressMeter(:,jj))); + idxE2 = find(strcmp('Err2',DatiStressMeter(:,jj))); + idxE255 = find(strcmp('Err255',DatiStressMeter(:,jj))); + idxD = find(strcmp('DMUXe',DatiStressMeter(:,jj))); + idxE1F = find(strcmp('Err1File',DatiStressMeter(:,jj))); + idxN = find(strcmp('null',DatiStressMeter(:,jj))); + idxRX = find(strcmp('No RX',DatiStressMeter(:,jj))); + idxI = find(strcmp('id Error',DatiStressMeter(:,jj))); + idxM = find(strcmp('MUX id Error',DatiStressMeter(:,jj))); + idxC = find(strcmp('CH n. Error',DatiStressMeter(:,jj))); + idxU = find(strcmp('Unknown Error',DatiStressMeter(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiStressMeter(:,jj))); + idxNS = find(strcmp('NotSupp',DatiStressMeter(:,jj))); + idxU2 = find(strcmp('Unknown',DatiStressMeter(:,jj))); + idxNA = find(strcmp('NotAv',DatiStressMeter(:,jj))); + idxND = find(strcmp('No Data',DatiStressMeter(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiSM = datestr(datenum(datainiSM)-1,'yyyy-mm-dd'); + break + else + DatiStressMeter(indice,jj) = DatiStressMeter(indice-1,jj); + ErrStressMeter(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiStressMeter(nnn,jj))); + if check == 1 + DatiStressMeter(nnn,jj) = DatiStressMeter(nnn-1,jj); + ErrStressMeter(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Stress Meter data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiStressMeter = [DATiniSM str2double(DatiStressMeter)]; + DatiStress_Rif = str2double(DatiStress_Rif); + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiStressMeter(a,1) == DatiStressMeter(a-1,1) + DatiStressMeter(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + + if ESCI == 0 + if sum(SM_NTC(:,1))>0 + if DIS ~= 1 && yesSM == 1 + % NTC + [r,c] = size(DatiNTCStressMeter); + Ncorr = 0; + if NuovoZeroSM == 1 + if isfile(RawDataFile) == 1 + DatiRawNTC = csvread(RawDataFileNTC); + [rDR,cDR] = size(DatiRawNTC); + DatiRawNTC(:,1) = DatiRawNTC(:,1) + 730000; + RawDateNTC = find(DatiRawNTC(:,1)<=datenum(datainiSM)); + else + rDR = 1; + cDR = 1; + DatiRawNTC = []; + RawDateNTC = []; + end + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTCStressMeter(1,jj))); + idxND = find(strcmp('No Data',DatiNTCStressMeter(1,jj))); + idxT3 = find(strcmp('---',DatiNTCStressMeter(1,jj))); + idxT = find(strcmp('-',DatiNTCStressMeter(1,jj))); + idxE2 = find(strcmp('Err2',DatiNTCStressMeter(1,jj))); + idxE255 = find(strcmp('Err255',DatiNTCStressMeter(1,jj))); + idxD = find(strcmp('DMUXe',DatiNTCStressMeter(1,jj))); + idxE1F = find(strcmp('Err1File',DatiNTCStressMeter(1,jj))); + idxN = find(strcmp('null',DatiNTCStressMeter(1,jj))); + idxRX = find(strcmp('No RX',DatiNTCStressMeter(1,jj))); + idxI = find(strcmp('id Error',DatiNTCStressMeter(1,jj))); + idxM = find(strcmp('MUX id Error',DatiNTCStressMeter(1,jj))); + idxC = find(strcmp('CH n. Error',DatiNTCStressMeter(1,jj))); + idxU = find(strcmp('Unknown Error',DatiNTCStressMeter(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTCStressMeter(1,jj))); + idxNS = find(strcmp('NotSupp',DatiNTCStressMeter(1,jj))); + idxU2 = find(strcmp('Unknown',DatiNTCStressMeter(1,jj))); + idxNA = find(strcmp('NotAv',DatiNTCStressMeter(1,jj))); + idx = union(idxE,idxT3); + idx = union(idx,idxT); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of NTC of Stress Meter nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroSM == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiSM)+1 < now + datainiSM = datestr(datenum(datainiSM)+1,'yyyy-mm-dd'); + break + else + yesSM = 0; + end + else + if isempty(RawDateNTC) == 1 + NAN = 0; + ESCI = 1; + datainiSM = datestr(datenum(datainiSM)-1,'yyyy-mm-dd'); + break + else + DatiNTCStressMeter(1,jj) = cellstr(num2str(DatiRawNTC(RawDateNTC(end),jj+1))); + if ErrStressMeter(indice,jj) == 0 + ErrStressMeter(indice,jj) = 0.5; + else + ErrStressMeter(indice,jj) = 1; + end + wardat = 'Data of NTC of Stress Meter nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTCStressMeter(:,jj))); + idxND = find(strcmp('No Data',DatiNTCStressMeter(:,jj))); + idxT3 = find(strcmp('---',DatiNTCStressMeter(:,jj))); + idxT = find(strcmp('-',DatiNTCStressMeter(:,jj))); + idxE2 = find(strcmp('Err2',DatiNTCStressMeter(:,jj))); + idxE255 = find(strcmp('Err255',DatiNTCStressMeter(:,jj))); + idxD = find(strcmp('DMUXe',DatiNTCStressMeter(:,jj))); + idxE1F = find(strcmp('Err1File',DatiNTCStressMeter(:,jj))); + idxN = find(strcmp('null',DatiNTCStressMeter(:,jj))); + idxRX = find(strcmp('No RX',DatiNTCStressMeter(:,jj))); + idxI = find(strcmp('id Error',DatiNTCStressMeter(:,jj))); + idxM = find(strcmp('MUX id Error',DatiNTCStressMeter(:,jj))); + idxC = find(strcmp('CH n. Error',DatiNTCStressMeter(:,jj))); + idxU = find(strcmp('Unknown Error',DatiNTCStressMeter(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTCStressMeter(:,jj))); + idxNS = find(strcmp('NotSupp',DatiNTCStressMeter(:,jj))); + idxU2 = find(strcmp('Unknown',DatiNTCStressMeter(:,jj))); + idxNA = find(strcmp('NotAv',DatiNTCStressMeter(:,jj))); + idx = union(idxE,idxT3); + idx = union(idx,idxND); + idx = union(idx,idxT); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiSM = datestr(datenum(datainiSM)-1,'yyyy-mm-dd'); + break + else + DatiNTCStressMeter(indice,jj) = DatiNTCStressMeter(indice-1,jj); + if ErrStressMeter(indice,jj) == 0 + ErrStressMeter(indice,jj) = 0.5; + else + ErrStressMeter(indice,jj) = 1; + end + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiNTCStressMeter(nnn,jj))); + if check == 1 + DatiNTCStressMeter(nnn,jj) = DatiNTCStressMeter(nnn-1,jj); + if ErrStressMeter(indice,jj) == 0 + ErrStressMeter(indice,jj) = 0.5; + else + ErrStressMeter(indice,jj) = 1; + end + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of NTC Stress Meter data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiNTCStressMeter = [DATiniSM str2double(DatiNTCStressMeter)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiNTCStressMeter(a,1) == DatiNTCStressMeter(a-1,1) + DatiNTCStressMeter(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + end + end + end + if NuovoZeroSM == 1 && yesSM == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiStressMeter(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiStressMeter(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiStressMeter(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiStressMeter(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiStressMeter; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)0 + [rDR,cDR] = size(DatiRawNTC); + if rDR~=1 && cDR~=1 && isempty(DatiRawNTC) == 0 + RawDate1 = find(DatiRawNTC(:,1)<=DatiNTCStressMeter(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiNTCStressMeter(:,1)>DatiRawNTC(end,1)); + else + RawDate2 = find(DatiNTCStressMeter(:,1)>DatiRawNTC(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + DatiNTC = [DatiRawNTC(1:RawDate1(end),:);DatiNTCStressMeter(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + DatiNTC = DatiNTCStressMeter; + else + DatiNTC = DatiRawNTC; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(DatiNTC(:,1)0 + DatiNTC = DatiNTCStressMeter; + end + end + Dati(:,1) = Dati(:,1) - 730000; + csvwrite(RawDataFile,Dati); + if sum(SM_NTC(:,1))>0 + DatiNTC(:,1) = DatiNTC(:,1) - 730000; + csvwrite(RawDataFileNTC,DatiNTC); + end + DatiStressMeter_Rif = DatiStress_Rif; + DatiNTCStressMeter_Rif = DatiNTCStress_Rif; +end + +corrdat = 'lettura function executed'; +fprintf(fileID,fmt,corrdat); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/matrici_vuote_PCL.m b/ATD/matrici_vuote_PCL.m new file mode 100755 index 0000000..7b39664 --- /dev/null +++ b/ATD/matrici_vuote_PCL.m @@ -0,0 +1,23 @@ +function [Y_PCL,Z_PCL,Ylocal_PCL,Zlocal_PCL,AlfaX_PCL,AlfaY_PCL,TempDef_PCL,... + speed_PCL,speed_local_PCL,acceleration_PCL,acceleration_local_PCL] = matrici_vuote_PCL(FileName) + +Y_PCL = []; +Z_PCL = []; +Ylocal_PCL = []; +Zlocal_PCL = []; +AlfaX_PCL = []; +AlfaY_PCL = []; +TempDef_PCL = []; +speed_PCL = []; +speed_local_PCL = []; +acceleration_PCL = []; +acceleration_local_PCL = []; + +text = 'PreConv Link analysis did not run'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end + diff --git a/ATD/matrici_vuote_PCLHR.m b/ATD/matrici_vuote_PCLHR.m new file mode 100755 index 0000000..e7f573e --- /dev/null +++ b/ATD/matrici_vuote_PCLHR.m @@ -0,0 +1,23 @@ +function [Y_PCLHR,Z_PCLHR,Ylocal_PCLHR,Zlocal_PCLHR,AlfaX_PCLHR,AlfaY_PCLHR,TempDef_PCLHR,... + speed_PCLHR,speed_local_PCLHR,acceleration_PCLHR,acceleration_local_PCLHR] = matrici_vuote_PCLHR(FileName) + +Y_PCLHR = []; +Z_PCLHR = []; +Ylocal_PCLHR = []; +Zlocal_PCLHR = []; +AlfaX_PCLHR = []; +AlfaY_PCLHR = []; +TempDef_PCLHR = []; +speed_PCLHR = []; +speed_local_PCLHR = []; +acceleration_PCLHR = []; +acceleration_local_PCLHR = []; + +text = 'PreConv Link HR analysis did not run'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end + diff --git a/ATD/matrici_vuote_RL.m b/ATD/matrici_vuote_RL.m new file mode 100755 index 0000000..95fc190 --- /dev/null +++ b/ATD/matrici_vuote_RL.m @@ -0,0 +1,18 @@ +function [X_RL,Y_RL,Z_RL,Xlocal_RL,Ylocal_RL,Zlocal_RL,TempDef_RL] = matrici_vuote_RL(FileName) + +X_RL = []; +Y_RL = []; +Z_RL = []; +Xlocal_RL = []; +Ylocal_RL = []; +Zlocal_RL = []; +TempDef_RL = []; + +text19 = 'Radial Link analysis did not run'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text19); +fclose(fileID); + +end + diff --git a/ATD/matrici_vuote_TLH.m b/ATD/matrici_vuote_TLH.m new file mode 100755 index 0000000..b0ce98c --- /dev/null +++ b/ATD/matrici_vuote_TLH.m @@ -0,0 +1,22 @@ +function [Y_TLH,Z_TLH,Ylocal_TLH,Zlocal_TLH,AlfaX_TLH,AlfaY_TLH,TempDef_TLH,... + speed_TLH,speed_local_TLH,acceleration_TLH,acceleration_local_TLH] = matrici_vuote_TLH(FileName) + +Y_TLH = []; +Z_TLH = []; +Ylocal_TLH = []; +Zlocal_TLH = []; +AlfaX_TLH = []; +AlfaY_TLH = []; +TempDef_TLH = []; +speed_TLH = []; +speed_local_TLH = []; +acceleration_TLH = []; +acceleration_local_TLH = []; + +text = 'Tilt Link H analysis did not run'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/ATD/matrici_vuote_TLHRH.m b/ATD/matrici_vuote_TLHRH.m new file mode 100755 index 0000000..cc08832 --- /dev/null +++ b/ATD/matrici_vuote_TLHRH.m @@ -0,0 +1,22 @@ +function [Y_TLHRH,Z_TLHRH,Ylocal_TLHRH,Zlocal_TLHRH,AlfaX_TLHRH,AlfaY_TLHRH,TempDef_TLHRH,... + speed_TLHRH,speed_local_TLHRH,acceleration_TLHRH,acceleration_local_TLHRH] = matrici_vuote_TLHRH(FileName) + +Y_TLHRH = []; +Z_TLHRH = []; +Ylocal_TLHRH = []; +Zlocal_TLHRH = []; +AlfaX_TLHRH = []; +AlfaY_TLHRH = []; +TempDef_TLHRH = []; +speed_TLHRH = []; +speed_local_TLHRH = []; +acceleration_TLHRH = []; +acceleration_local_TLHRH = []; + +text = 'Tilt Link HR H analysis did not run'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/matrici_vuote_TuL.m b/ATD/matrici_vuote_TuL.m new file mode 100755 index 0000000..ce5a97a --- /dev/null +++ b/ATD/matrici_vuote_TuL.m @@ -0,0 +1,25 @@ +function [X_TuL,Xstar_TuL,Y_TuL,Z_TuL,Zstar_TuL,Xlocal_TuL,Ylocal_TuL,Zlocal_TuL,... + SegStar,HShift_local_TuL,TempDef_TuL,Area_TuL,Speed_local_TuL,Acceleration_local_TuL] = matrici_vuote_TuL(FileName) + +X_TuL = []; +Xstar_TuL = []; +Y_TuL = []; +Z_TuL = []; +Zstar_TuL = []; +Xlocal_TuL = []; +Ylocal_TuL = []; +Zlocal_TuL = []; +HShift_local_TuL = []; +TempDef_TuL = []; +SegStar = []; +Area_TuL = []; +Speed_local_TuL = []; +Acceleration_local_TuL = []; + +text = 'Tunnel Link analysis did not run'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); +end + diff --git a/ATD/pos_ini_PCL.m b/ATD/pos_ini_PCL.m new file mode 100755 index 0000000..a838f10 --- /dev/null +++ b/ATD/pos_ini_PCL.m @@ -0,0 +1,7 @@ +% Funzione che impone la posizione iniziale come da progetto +function [shiftY_PCL,shiftZ_PCL] = pos_ini_PCL(cYo,cZo,Y_PCL,Z_PCL) + +shiftY_PCL = Y_PCL(:,1) - cYo'; % trovo lo shift lungo Y da applicare per riavere i punti noti +shiftZ_PCL = Z_PCL(:,1) - cZo'; % trovo lo shift lungo Z da applicare per riavere i punti noti + +end \ No newline at end of file diff --git a/ATD/pos_ini_PCLHR.m b/ATD/pos_ini_PCLHR.m new file mode 100755 index 0000000..41aa7ec --- /dev/null +++ b/ATD/pos_ini_PCLHR.m @@ -0,0 +1,7 @@ +% Funzione che impone la posizione iniziale come da progetto +function [shiftY_PCLHR,shiftZ_PCLHR] = pos_ini_PCLHR(cYo,cZo,Y_PCLHR,Z_PCLHR) + +shiftY_PCLHR = Y_PCLHR(:,1) - cYo'; % trovo lo shift lungo Y da applicare per riavere i punti noti +shiftZ_PCLHR = Z_PCLHR(:,1) - cZo'; % trovo lo shift lungo Z da applicare per riavere i punti noti + +end \ No newline at end of file diff --git a/ATD/pos_ini_RL.m b/ATD/pos_ini_RL.m new file mode 100755 index 0000000..7a774e4 --- /dev/null +++ b/ATD/pos_ini_RL.m @@ -0,0 +1,8 @@ +% Funzione che impone la posizione iniziale come da progetto +function [shiftX_RL,shiftY_RL,shiftZ_RL] = pos_ini_RL(cXo,cYo,cZo,X_RL,Y_RL,Z_RL) + +shiftX_RL = X_RL(:,1) - cXo'; % trovo lo shift lungo X da applicare per riavere i punti noti +shiftY_RL = Y_RL(:,1) - cYo'; % trovo lo shift lungo Y da applicare per riavere i punti noti +shiftZ_RL = Z_RL(:,1) - cZo'; % trovo lo shift lungo Z da applicare per riavere i punti noti + +end \ No newline at end of file diff --git a/ATD/pos_ini_TuL.m b/ATD/pos_ini_TuL.m new file mode 100755 index 0000000..ea5926c --- /dev/null +++ b/ATD/pos_ini_TuL.m @@ -0,0 +1,24 @@ +% Funzione che impone la posizione iniziale come da progetto +function [shiftX,shiftY,shiftZ,shiftXstar,shiftYstar,shiftZstar] = pos_ini_TuL(cXo,... + cXoStar,cYo,cZo,cZoStar,X_TuL,Y_TuL,Z_TuL,Xstar_TuL,Ystar_TuL,Zstar_TuL,NuovoZeroTuL) + +%% Calcolo orario +shiftX = X_TuL(:,1) - cXo'; % trovo lo shift lungo X da applicare per riavere i punti noti +shiftY = Y_TuL(:,1) - cYo'; % trovo lo shift lungo Y da applicare per riavere i punti noti +shiftZ = Z_TuL(:,1) - cZo'; % trovo lo shift lungo Z da applicare per riavere i punti noti + +%% Calcolo antiorario +if NuovoZeroTuL == 0 + cXoS = [fliplr(cXo(1:end-1)) cXo(end)]; + cYoS = [fliplr(cYo(1:end-1)) cYo(end)]; + cZoS = [fliplr(cZo(1:end-1)) cZo(end)]; + shiftXstar = Xstar_TuL(:,1) - cXoS'; % trovo lo shift lungo X da applicare per riavere i punti noti + shiftYstar = Ystar_TuL(:,1) - cYoS'; % trovo lo shift lungo Y da applicare per riavere i punti noti + shiftZstar = Zstar_TuL(:,1) - cZoS'; % trovo lo shift lungo Z da applicare per riavere i punti noti +elseif NuovoZeroTuL == 1 + shiftXstar = Xstar_TuL(:,1) - cXoStar'; % trovo lo shift lungo X da applicare per riavere i punti noti + shiftYstar = 0; % AD OGGI NON SI CALCOLA% trovo lo shift lungo Y da applicare per riavere i punti noti + shiftZstar = Zstar_TuL(:,1) - cZoStar'; % trovo lo shift lungo Z da applicare per riavere i punti noti +end + +end \ No newline at end of file diff --git a/ATD/punti_noti_PCL.m b/ATD/punti_noti_PCL.m new file mode 100755 index 0000000..55c23ff --- /dev/null +++ b/ATD/punti_noti_PCL.m @@ -0,0 +1,28 @@ +function [cYo,cZo,asseY_Rif_PCL,asseZ_Rif_PCL] = punti_noti_PCL(elab_option,... + IDcentralina,DTcatena,FileName) + +Punti_Noti = xlsread([IDcentralina,'-',DTcatena,'.xlsx'],1); + +%% Y +cYo = Punti_Noti(:,1); +asseY_Rif_PCL(:,1) = diff(cYo); + +%% Z +cZo = Punti_Noti(:,2); +asseZ_Rif_PCL(:,1) = diff(cZo); + +if elab_option == 1 + cYo = cYo(2:end)'; + cZo = cZo(2:end)'; +else + cYo = cYo(1:end-1)'; + cZo = cZo(1:end-1)'; +end + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'punti_noti_PCL function worked correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/ATD/punti_noti_PCLHR.m b/ATD/punti_noti_PCLHR.m new file mode 100755 index 0000000..8e5775f --- /dev/null +++ b/ATD/punti_noti_PCLHR.m @@ -0,0 +1,22 @@ +function [cYo,cZo,asseY_Rif_PCLHR,asseZ_Rif_PCLHR] = punti_noti_PCLHR(... + IDcentralina,DTcatena,FileName) + +Punti_Noti = xlsread([IDcentralina,'-',DTcatena,'.xlsx'],2); + +%% Y +cYo = Punti_Noti(:,1); +asseY_Rif_PCLHR(:,1) = diff(cYo); +cYo = cYo(2:end)'; + +%% Z +cZo = Punti_Noti(:,2); +asseZ_Rif_PCLHR(:,1) = diff(cZo); +cZo = cZo(2:end)'; + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'punti_noti_PCLHR function worked correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/ATD/punti_noti_RL.m b/ATD/punti_noti_RL.m new file mode 100755 index 0000000..6ad550b --- /dev/null +++ b/ATD/punti_noti_RL.m @@ -0,0 +1,37 @@ +% Funzione che contiene i punti noti in cui si impone il passaggio della +% catena. +% In particolare: +% - cXo rappresenta le coordinate X di tutti i punti nodi imposte dal +% progetto per la correzione di offset; +% - cYo rappresenta le coordinate Y di tutti i punti nodi imposte dal +% progetto per la correzione di offset; +% - cZo rappresenta le coordinate Z di tutti i punti nodi imposte dal +% progetto per la correzione di offset; + +function [cXo,cYo,cZo,asseX_RL,asseY_RL,asseZ_RL] = punti_noti_RL(IDcentralina,... + DTcatena,asseX_RL,asseY_RL,asseZ_RL,FileName) + +Punti_Noti = xlsread([IDcentralina,'-',DTcatena,'.xlsx'],1); + +%% X +cXo = Punti_Noti(:,1); +asseX_RL(:,1) = diff(cXo); +cXo = cXo(2:end)'; + +%% Y +cYo = Punti_Noti(:,2); +asseY_RL(:,1) = diff(cYo); +cYo = cYo(2:end)'; + +%% Z +cZo = Punti_Noti(:,3); +asseZ_RL(:,1) = diff(cZo); +cZo = cZo(2:end)'; + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'punti_noti_RL function worked correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/ATD/punti_noti_TuL.m b/ATD/punti_noti_TuL.m new file mode 100755 index 0000000..bd0a593 --- /dev/null +++ b/ATD/punti_noti_TuL.m @@ -0,0 +1,34 @@ +% Funzione che contiene i punti noti in cui si impone il passaggio della +% catena. +% In particolare: +% - cXo rappresenta le coordinate X di tutti i punti nodi imposte dal +% progetto per la correzione di offset; +% - cYo rappresenta le coordinate Y di tutti i punti nodi imposte dal +% progetto per la correzione di offset; +% - cZo rappresenta le coordinate Z di tutti i punti nodi imposte dal +% progetto per la correzione di offset; + + +function [cXo,cYo,cZo,asseX_TuL,asseY_TuL,asseZ_TuL,asseZstar_TuL] = punti_noti_TuL... + (asseX_TuL,asseY_TuL,asseZ_TuL,Punti_Noti,PosIniEnd) + +%% X +cXo = Punti_Noti(:,1); +asseX_TuL(:,1) = diff(cXo); +cXo = cXo(2:end)'; + +%% Y +cYo = Punti_Noti(:,2); +asseY_TuL(:,1) = diff(cYo); +cYo = cYo(2:end)'; + +%% Z +cZo = Punti_Noti(:,3); +asseZ_TuL(:,1) = diff(cZo); +cZo = cZo(2:end)'; + +%% Zstar +cZoStar = [PosIniEnd(2,3); flipud(Punti_Noti(2:end-1,3)); Punti_Noti(1,3)]; +asseZstar_TuL(:,1) = diff(cZoStar); + +end diff --git a/ATD/punti_noti_exe_PCL.m b/ATD/punti_noti_exe_PCL.m new file mode 100755 index 0000000..d750c49 --- /dev/null +++ b/ATD/punti_noti_exe_PCL.m @@ -0,0 +1,48 @@ +% Funzione che contiene i punti di partenza per il calcolo +% In particolare: +% - cYo rappresenta le coordinate Y di tutti i punti nodi imposte dal +% progetto per la correzione di offset; +% - cZo rappresenta le coordinate Z di tutti i punti nodi imposte dal +% progetto per la correzione di offset; + +function [cYo,cZo,asseY_Rif_PCL,asseZ_Rif_PCL] = punti_noti_exe_PCL(asseY_PCL,... + DatiElabPreConvLink,elab_option,FileName) + +[~,cE] = size(DatiElabPreConvLink); +[num,~] = size(asseY_PCL); +cont = 5; +if elab_option == 1 + n = 2; +elseif elab_option == -1 + n = 1; +end +cYo = zeros(num+1,1); +cZo = zeros(num+1,1); + +while cont<=cE + %% Y + cYo(n,1) = cell2mat(DatiElabPreConvLink(1,cont)); + %% Z + cZo(n,1) = cell2mat(DatiElabPreConvLink(1,cont+1)); + cont = cont+13; + n = n+1; +end + +asseY_Rif_PCL(:,1) = diff(cYo); +asseZ_Rif_PCL(:,1) = diff(cZo); + +if elab_option == 1 + cYo = cYo(2:end)'; + cZo = cZo(2:end)'; +elseif elab_option == -1 + cYo = cYo(1:end-1)'; + cZo = cZo(1:end-1)'; +end + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'punti_noti_exe_PCL function worked correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/ATD/punti_noti_exe_PCLHR.m b/ATD/punti_noti_exe_PCLHR.m new file mode 100755 index 0000000..e11017a --- /dev/null +++ b/ATD/punti_noti_exe_PCLHR.m @@ -0,0 +1,39 @@ +% Funzione che contiene i punti di partenza per il calcolo +% In particolare: +% - cYo rappresenta le coordinate Y di tutti i punti nodi imposte dal +% progetto per la correzione di offset; +% - cZo rappresenta le coordinate Z di tutti i punti nodi imposte dal +% progetto per la correzione di offset; + +function [cYo,cZo,asseY_Rif_PCLHR,asseZ_Rif_PCLHR] = punti_noti_exe_PCLHR(... + asseY_PCLHR,DatiElabPreConvLinkHR,FileName) + +[~,cE] = size(DatiElabPreConvLinkHR); +[num,~] = size(asseY_PCLHR); +cont = 5; +n = 2; +cYo = zeros(num+1,1); +cZo = zeros(num+1,1); + +while cont<=cE + %% Y + cYo(n,1) = cell2mat(DatiElabPreConvLinkHR(1,cont)); + %% Z + cZo(n,1) = cell2mat(DatiElabPreConvLinkHR(1,cont+1)); + cont = cont+13; + n = n+1; +end + +asseY_Rif_PCLHR(:,1) = diff(cYo); +asseZ_Rif_PCLHR(:,1) = diff(cZo); + +cYo = cYo(2:end)'; +cZo = cZo(2:end)'; + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'punti_noti_exe_PCLHR function worked correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/ATD/punti_noti_exe_RL.m b/ATD/punti_noti_exe_RL.m new file mode 100755 index 0000000..83c5bca --- /dev/null +++ b/ATD/punti_noti_exe_RL.m @@ -0,0 +1,49 @@ +% Funzione che contiene i punti di partenza per il calcolo +% In particolare: +% - cXo rappresenta le coordinate X di tutti i punti nodi imposte dal +% progetto per la correzione di offset; +% - cYo rappresenta le coordinate Y di tutti i punti nodi imposte dal +% progetto per la correzione di offset; +% - cZo rappresenta le coordinate Z di tutti i punti nodi imposte dal +% progetto per la correzione di offset; + +function [cXo,cYo,cZo,asseX_RL,asseY_RL,asseZ_RL] =... + punti_noti_exe_RL(asseX_RL,asseY_RL,asseZ_RL,DatiElabRadialLink,FileName) + +[~,cE] = size(DatiElabRadialLink); +[num,~] = size(asseX_RL); +cont = 6; +n = 2; +cXo = zeros(num+1,1); +cYo = zeros(num+1,1); +cZo = zeros(num+1,1); + +while cont<=cE + %% X + cXo(n,1) = cell2mat(DatiElabRadialLink(1,cont)); + + %% Y + cYo(n,1) = cell2mat(DatiElabRadialLink(1,cont+1)); + + %% Z + cZo(n,1) = cell2mat(DatiElabRadialLink(1,cont+2)); + + cont=cont+9; + n = n+1; +end + +asseX_RL(:,1) = diff(cXo); +asseY_RL(:,1) = diff(cYo); +asseZ_RL(:,1) = diff(cZo); + +cXo = cXo(2:end)'; +cYo = cYo(2:end)'; +cZo = cZo(2:end)'; + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'punti_noti_exe_RL function worked correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/ATD/punti_noti_exe_TuL.m b/ATD/punti_noti_exe_TuL.m new file mode 100755 index 0000000..2421f7c --- /dev/null +++ b/ATD/punti_noti_exe_TuL.m @@ -0,0 +1,66 @@ +% Funzione che contiene i punti di partenza per il calcolo +% In particolare: +% - cXo rappresenta le coordinate X di tutti i punti nodi imposte dal +% progetto per la correzione di offset; +% - cYo rappresenta le coordinate Y di tutti i punti nodi imposte dal +% progetto per la correzione di offset; +% - cZo rappresenta le coordinate Z di tutti i punti nodi imposte dal +% progetto per la correzione di offset; + + +function [cXo,cXo_ini,cXoStar,cYo,cYo_ini,cZo,cZo_ini,cZoStar,asseX_TuL,... + asseXstar_TuL,asseY_TuL,asseZ_TuL,asseZstar_TuL] = punti_noti_exe_TuL(asseX_TuL,... + asseY_TuL,asseZ_TuL,DatiElabTunnelLink,PosIniEnd,IDcentralina,DTcatena) + +NomeFile = strcat(IDcentralina,'-',DTcatena,'.xlsx'); +Punti_Noti = xlsread(NomeFile,5); + +[~,cE] = size(DatiElabTunnelLink); +[num,~] = size(asseX_TuL); +cont = 6; +n = 2; +cXo = zeros(num+1,1); +cYo = zeros(num+1,1); +cZo = zeros(num+1,1); +cXoStar = zeros(num+1,1); +cZoStar = zeros(num+1,1); +cXo(1,1) = PosIniEnd(1,1); +cYo(1,1) = PosIniEnd(1,2); +cZo(1,1) = PosIniEnd(1,3); +cXoStar(1,1) = PosIniEnd(2,1); +cZoStar(1,1) = PosIniEnd(2,3); +while cont<=cE + %% X + cXo(n,1) = cell2mat(DatiElabTunnelLink(1,cont)); + cXoStar(n,1) = cell2mat(DatiElabTunnelLink(1,cont+3)); + cXo_ini = Punti_Noti(:,1); + cXo_ini = cXo_ini(2:end); + + %% Y + cYo(n,1) = cell2mat(DatiElabTunnelLink(1,cont+1)); + cYo_ini = Punti_Noti(:,2); + cYo_ini = cYo_ini(2:end); + + %% Z + cZo(n,1) = cell2mat(DatiElabTunnelLink(1,cont+2)); + cZoStar(n,1) = cell2mat(DatiElabTunnelLink(1,cont+4)); + cZo_ini = Punti_Noti(:,3); + cZo_ini = cZo_ini(2:end); + + cont=cont+16; + n = n+1; +end + +asseX_TuL(:,1) = diff(cXo); +asseY_TuL(:,1) = diff(cYo); +asseZ_TuL(:,1) = diff(cZo); +asseXstar_TuL(:,1) = diff(cXoStar); +asseZstar_TuL(:,1) = diff(cZoStar); + +cXo = cXo(2:end)'; +cYo = cYo(2:end)'; +cZo = cZo(2:end)'; +cXoStar = cXoStar(2:end)'; +cZoStar = cZoStar(2:end)'; + +end diff --git a/ATD/report_2DCrL.m b/ATD/report_2DCrL.m new file mode 100755 index 0000000..fcdec99 --- /dev/null +++ b/ATD/report_2DCrL.m @@ -0,0 +1,442 @@ +function [battANALOG,ATTIVA,FIG,FIG_ENG] = report_2DCrL(r2DCrL,m,Nodo2DCrackLink,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_2DCrL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +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 + Cr3D = Section(); + sez2DCrack = Heading3('2D Crack Link'); + sez2DCrack.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + Cr3D.Title = sez2DCrack; + 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 + Cr2D_ENG = Section(); + sez2DCrL_ENG = Heading3('2D Crack Link'); + sez2DCrL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + Cr2D_ENG.Title = sez2DCrL_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,sez2DCrack); + if activeEN == 1 + add(DT_ENG,sez2DCrL_ENG); + end + for cr = 1:r2DCrL(m,1) + NodeNum = num2str(Nodo2DCrackLink(cr,m)); + comando = ['select EventDate, EventTime, XShift, YShift 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 + X = cell2mat(Dati(:,3)); % Fessura + Y = cell2mat(Dati(:,4)); % Fessura + sX = X-X(1); + sY = Y-Y(1); + + % grafico deformazioni NELL'ULTIMO MESE + figure(5); + plot(Date,sX); + hold on + plot(Date,sY); + apertura = plot(Date,sZ); + title(['Apertura/chiusura del fessurimetro numero ' NodeNum]); + xlabel('Data [gg/mm/aaaa]'); + ylabel('Deformazione [mm]'); + controlX = abs(max(sX)-min(sX)); + controlY = abs(max(sY)-min(sY)); + controlXY = [controlX; controlY]; + control = max(controlXY); + if control < 0.5 % mm + ylim([-0.5 0.5]); + 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 + str(1,1) = cellstr('X'); + str(2,1) = cellstr('Y'); + MX(1) = max(sX(1:10)); + MX(2) = max(sY(1:10)); + MN(1) = min(sX(1:10)); + MN(2) = min(sY(1:10)); + VAR(1) = max(MX); + VAR(2) = min(MN); + MAX = max(abs(VAR)); + IN = find(abs(VAR)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-2DCrack', NodeNum, '.png')); + saveas(apertura,TempName); + Chart2DCrL = Image(TempName); + Chart2DCrL.Style = {Height('7.5cm'),HAlign('center')}; + Chart2DCrL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Andamento '... + 'dell''apertura (valori crescenti) o chiusura (valori decrescenti) '... + 'registrata lungo i due assi strumentali del fessurimetro, nodo numero ' NodeNum ... + ', durante il periodo temporale di riferimento']); + FIG = FIG+1; + Chart2DCrL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['Nei grafici seguenti sono rappresentati i dati relativi '... + 'alla deformazione differenziale registrata lungo i due assi strumentali '... + 'dai fessurimetri bidimensionali che compongono l''Analog Array.']); + testo2 = Paragraph(['Durante il periodo temporale di riferimento, il nodo numero ' NodeNum ' ha '... + 'registrato i seguenti valori di apertura assoluta dello strumento: ']); + testoX = Paragraph(['- Asse X - Valore Massimo assoluto: ' num2str(round(max(X),2), '%0.2f') ... + ' mm, valore minimo: ' num2str(round(min(X),2), '%0.2f') ' mm, variazione: ' ... + num2str(round(max(X),2)-round(min(X),2),'%0.2f') ' mm; ']); + testoY = Paragraph(['- Asse Y - Valore Massimo assoluto: ' num2str(round(max(Y),2), '%0.2f') ... + ' mm, valore minimo: ' num2str(round(min(Y),2), '%0.2f') ' mm, variazione: ' ... + num2str(round(max(Y),2)-round(min(Y),2),'%0.2f') ' mm; ']); + spazio = Paragraph(''); + + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if cr == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,testoX); + add(DT,testoY); + add(DT,Chart2DCrL); + add(DT,Chart2DCrL_cap); + add(DT,spazio); + if cr == r2DCrL(m,1) + add(DT,br); + end + close(figure(19)); + close(figure(5)); + + %---ENG--- + if activeEN == 1 + % grafico deformazioni NELL'ULTIMO MESE + figure(15); + plot(Date,sX); + hold on + plot(Date,sY); + apertura = plot(Date,sZ); + title(['Crack meter deformation - node ' NodeNum]); + xlabel('Date [dd/mm/yyyy]'); + ylabel('Deformation [mm]'); + controlX = abs(max(sX)-min(sX)); + controlY = abs(max(sY)-min(sY)); + controlZ = abs(max(sZ)-min(sZ)); + controlXY = [controlX; controlY; controlZ]; + control = max(controlXY); + if control < 0.5 % mm + ylim([-0.5 0.5]); + 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 + str(1,1) = cellstr('X'); + str(2,1) = cellstr('Y'); + MX(1) = max(sX(1:10)); + MX(2) = max(sY(1:10)); + MN(1) = min(sX(1:10)); + MN(2) = min(sY(1:10)); + VAR(1) = max(MX); + VAR(2) = min(MN); + MAX = max(abs(VAR)); + IN = find(abs(VAR)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-2DCrack', NodeNum, '_ENG.png')); + saveas(apertura,TempName); + Chart3DCrL_ENG = Image(TempName); + Chart3DCrL_ENG.Style = {Height('7.5cm'),HAlign('center')}; + Chart3DCrL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - 2D Crack link '... + 'opening measured along the three instrumental axes by node ' ... + NodeNum ' during the reference time period']); + FIG_ENG = FIG_ENG+1; + Chart3DCrL_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graphs present differential deformation data '... + 'recorded along the three instrumental axes by 2D crack meters '... + 'integrated in the Analog Array.']); + testo2 = Paragraph(['During the reference time period, node ' NodeNum ... + ' recorded the following values of crack opening: ']); + testoX = Paragraph(['- X axis - Maximum absolute value: ' num2str(round(max(X),2), '%0.2f') ... + ' mm, minimum value: ' num2str(round(min(X),2), '%0.2f') ' mm, variation: ' ... + num2str(round(max(X),2)-round(min(X),2),'%0.2f') ' mm; ']); + testoY = Paragraph(['- Y axis - Maximum absolute value: ' num2str(round(max(Y),2), '%0.2f') ... + ' mm, minimum value: ' num2str(round(min(Y),2), '%0.2f') ' mm, variation: ' ... + num2str(round(max(Y),2)-round(min(Y),2),'%0.2f') ' mm; ']);; + spazio = Paragraph(''); + + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if cr == 1 + add(DT_ENG,testo); + end + add(DT_ENG,testo2); + add(DT_ENG,testoX); + add(DT_ENG,testoY); + add(DT_ENG,Chart3DCrL_ENG); + add(DT_ENG,Chart3DCrL_ENG_cap); + add(DT_ENG,spazio); + if cr == r2DCrL(m,1) + add(DT_ENG,br); + end + close(figure(15)); + end + else + if ATTIVA == 1 + ATTIVA = 0; + Cr2D = Section(); + sez2DCrack = Heading3('2D Crack Link'); + sez2DCrack.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + Cr2D.Title = sez2DCrack; + add(DT,sez2DCrack); + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + add(DT,testo); + add(DT,br); + if activeEN == 1 + Cr2D_ENG = Section(); + sez2DCrL_ENG = Heading3('2D Crack Link'); + sez2DCrL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + Cr2D_ENG.Title = sez2DCrL_ENG; + add(DT_ENG,sez2DCrL_ENG); + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + add(DT_ENG,br); + end + end + end + end +end + +text = 'report_2DCrL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_3DCrL.m b/ATD/report_3DCrL.m new file mode 100755 index 0000000..c519c44 --- /dev/null +++ b/ATD/report_3DCrL.m @@ -0,0 +1,459 @@ +function [battANALOG,ATTIVA,FIG,FIG_ENG] = report_3DCrL(r3DCrL,m,Nodo3DCrackLink,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_3DCrL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +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 + Cr3D = Section(); + sez3DCrack = Heading3('3D Crack Link'); + sez3DCrack.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + Cr3D.Title = sez3DCrack; + 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 + Cr3D_ENG = Section(); + sez3DCrL_ENG = Heading3('3D Crack Link'); + sez3DCrL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + Cr3D_ENG.Title = sez3DCrL_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,sez3DCrack); + if activeEN == 1 + add(DT_ENG,sez3DCrL_ENG); + end + for cr = 1:r3DCrL(m,1) + NodeNum = num2str(Nodo3DCrackLink(cr,m)); + comando = ['select EventDate, EventTime, XShift, YShift, ZShift 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 + X = cell2mat(Dati(:,3)); % Fessura + Y = cell2mat(Dati(:,4)); % Fessura + Z = cell2mat(Dati(:,5)); % Fessura + sX = X-X(1); + sY = Y-Y(1); + sZ = Z-Z(1); + + % grafico deformazioni NELL'ULTIMO MESE + figure(5); + plot(Date,sX); + hold on + plot(Date,sY); + apertura = plot(Date,sZ); + title(['Apertura/chiusura del fessurimetro numero ' NodeNum]); + xlabel('Data [gg/mm/aaaa]'); + ylabel('Deformazione [mm]'); + controlX = abs(max(sX)-min(sX)); + controlY = abs(max(sY)-min(sY)); + controlZ = abs(max(sZ)-min(sZ)); + controlXYZ = [controlX; controlY; controlZ]; + control = max(controlXYZ); + if control < 0.5 % mm + ylim([-0.5 0.5]); + 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 + str(1,1) = cellstr('X'); + str(2,1) = cellstr('Y'); + str(3,1) = cellstr('Z'); + MX(1) = max(sX(1:10)); + MX(2) = max(sY(1:10)); + MX(3) = max(sZ(1:10)); + MN(1) = min(sX(1:10)); + MN(2) = min(sY(1:10)); + MN(3) = min(sZ(1:10)); + VAR(1) = max(MX); + VAR(2) = min(MN); + MAX = max(abs(VAR)); + IN = find(abs(VAR)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-3DCrack', NodeNum, '.png')); + saveas(apertura,TempName); + Chart3DCrL = Image(TempName); + Chart3DCrL.Style = {Height('7.5cm'),HAlign('center')}; + Chart3DCrL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Andamento '... + 'dell''apertura (valori crescenti) o chiusura (valori decrescenti) '... + 'registrata lungo i tre assi strumentali del fessurimetro, nodo numero ' NodeNum ... + ', durante il periodo temporale di riferimento']); + FIG = FIG+1; + Chart3DCrL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['Nei grafici seguenti sono rappresentati i dati relativi '... + 'alla deformazione differenziale registrata lungo i tre assi strumentali '... + 'dai fessurimetri tridimensionali che compongono l''Analog Array.']); + testo2 = Paragraph(['Durante il periodo temporale di riferimento, il nodo numero ' NodeNum ' ha '... + 'registrato i seguenti valori di apertura assoluta dello strumento: ']); + testoX = Paragraph(['- Asse X - Valore Massimo assoluto: ' num2str(round(max(X),2), '%0.2f') ... + ' mm, valore minimo: ' num2str(round(min(X),2), '%0.2f') ' mm, variazione: ' ... + num2str(round(max(X),2)-round(min(X),2),'%0.2f') ' mm; ']); + testoY = Paragraph(['- Asse Y - Valore Massimo assoluto: ' num2str(round(max(Y),2), '%0.2f') ... + ' mm, valore minimo: ' num2str(round(min(Y),2), '%0.2f') ' mm, variazione: ' ... + num2str(round(max(Y),2)-round(min(Y),2),'%0.2f') ' mm; ']); + testoZ = Paragraph(['- Asse Z - Valore Massimo assoluto: ' num2str(round(max(Z),2), '%0.2f') ... + ' mm, valore minimo: ' num2str(round(min(Z),2), '%0.2f') ' mm, variazione: ' ... + num2str(round(max(Z),2)-round(min(Z),2),'%0.2f') ' mm. ']); + spazio = Paragraph(''); + + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if cr == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,testoX); + add(DT,testoY); + add(DT,testoZ); + add(DT,Chart3DCrL); + add(DT,Chart3DCrL_cap); + add(DT,spazio); + if cr == r3DCrL(m,1) + add(DT,br); + end + close(figure(19)); + close(figure(5)); + + %---ENG--- + if activeEN == 1 + % grafico deformazioni NELL'ULTIMO MESE + figure(15); + plot(Date,sX); + hold on + plot(Date,sY); + apertura = plot(Date,sZ); + title(['Crack meter opening - node ' NodeNum]); + xlabel('Date [dd/mm/yyyy]'); + ylabel('Deformation [mm]'); + controlX = abs(max(sX)-min(sX)); + controlY = abs(max(sY)-min(sY)); + controlZ = abs(max(sZ)-min(sZ)); + controlXYZ = [controlX; controlY; controlZ]; + control = max(controlXYZ); + if control < 0.5 % mm + ylim([-0.5 0.5]); + 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 + str(1,1) = cellstr('X'); + str(2,1) = cellstr('Y'); + str(3,1) = cellstr('Z'); + MX(1) = max(sX(1:10)); + MX(2) = max(sY(1:10)); + MX(3) = max(sZ(1:10)); + MN(1) = min(sX(1:10)); + MN(2) = min(sY(1:10)); + MN(3) = min(sZ(1:10)); + VAR(1) = max(MX); + VAR(2) = min(MN); + MAX = max(abs(VAR)); + IN = find(abs(VAR)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-3DCrack', NodeNum, '_ENG.png')); + saveas(apertura,TempName); + Chart3DCrL_ENG = Image(TempName); + Chart3DCrL_ENG.Style = {Height('7.5cm'),HAlign('center')}; + Chart3DCrL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Crack link '... + 'opening measured along the three instrumental axes by node ' ... + NodeNum ' during the reference time period']); + FIG_ENG = FIG_ENG+1; + Chart3DCrL_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graphs present differential deformation data '... + 'recorded along the three instrumental axes by 3D crack meters '... + 'integrated in the Analog Array.']); + testo2 = Paragraph(['During the reference time period, node ' NodeNum ... + ' recorded the following values of crack opening: ']); + testoX = Paragraph(['- X axis - Maximum absolute value: ' num2str(round(max(X),2), '%0.2f') ... + ' mm, minimum value: ' num2str(round(min(X),2), '%0.2f') ' mm, variation: ' ... + num2str(round(max(X),2)-round(min(X),2),'%0.2f') ' mm; ']); + testoY = Paragraph(['- Y axis - Maximum absolute value: ' num2str(round(max(Y),2), '%0.2f') ... + ' mm, minimum value: ' num2str(round(min(Y),2), '%0.2f') ' mm, variation: ' ... + num2str(round(max(Y),2)-round(min(Y),2),'%0.2f') ' mm; ']); + testoZ = Paragraph(['- Z axis - Maximum absolute value: ' num2str(round(max(Z),2), '%0.2f') ... + ' mm, minimum value: ' num2str(round(min(Z),2), '%0.2f') ' mm, variation: ' ... + num2str(round(max(Z),2)-round(min(Z),2),'%0.2f') ' mm; ']); + spazio = Paragraph(''); + + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if cr == 1 + add(DT_ENG,testo); + end + add(DT_ENG,testo2); + add(DT_ENG,testoX); + add(DT_ENG,testoY); + add(DT_ENG,testoZ); + add(DT_ENG,Chart3DCrL_ENG); + add(DT_ENG,Chart3DCrL_ENG_cap); + add(DT_ENG,spazio); + if cr == r3DCrL(m,1) + add(DT_ENG,br); + end + close(figure(15)); + end + else + if ATTIVA == 1 + ATTIVA = 0; + CrE = Section(); + sez3DCrack = Heading3('3D Crack Link'); + sez3DCrack.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + CrE.Title = sez3DCrack; + add(DT,sez3DCrack); + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + add(DT,testo); + add(DT,br); + if activeEN == 1 + Cr3D_ENG = Section(); + sez3DCrL_ENG = Heading3('3D Crack Link'); + sez3DCrL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + Cr3D_ENG.Title = sez3DCrL_ENG; + add(DT_ENG,sez3DCrL_ENG); + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + add(DT_ENG,br); + end + end + end + end +end + +text = 'report_3DCrL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_3DCrL_ENG.m b/ATD/report_3DCrL_ENG.m new file mode 100755 index 0000000..aa2f813 --- /dev/null +++ b/ATD/report_3DCrL_ENG.m @@ -0,0 +1,259 @@ +function [battANALOG,ATTIVA,FIG] = report_3DCrL_ENG(r3DCrL,m,Nodo3DCrackLink,toolrif,... + unitrif,contunit,datarif,Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,... + FIG,br,status,conn,FileName) + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('GMUX not installed or inactive.'); + add(DT,testo); + end +elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoring completed. Please log into the web-based platoform '... + 'to access the complete dataset.']); + add(DT,testo); + end +else + Cr3D = Section(); + sez3DCrack = Heading3('3D Crack Link'); + sez3DCrack.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + Cr3D.Title = sez3DCrack; + 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(['The following chart reports the battery level trend recorded during the reference time period. '... + 'The correct functioning of the GMUX module is guaranteed for a minimum level of 12 V. The last '... + 'available data is equal to ' num2str(Batteria(end,1)) ' V.']); + testoB2 = Paragraph(['The GMUX module equips also a thermometer that allows the monitoring of the working '... + 'temperature and the identification of eventual malfunctioning. The following chart reports temperature '... + 'data recorded by the GMUX module.']); + testoB1.HAlign = 'justify'; + testoB2.HAlign = 'justify'; + + % grafico batteria + figure(19) + plot(Date,Batteria); + hold on + title('Battery level and GMUX temperature'); + xlabel('Date [dd/mm/yyyy]'); + ylabel('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')}; + + if Batteria(end,1) >= 13 + TempName = char(strcat('B_13.jpg')); + elseif Batteria(end,1) >= 12 + TempName = char(strcat('B_12.jpg')); + elseif Batteria(end,1) >= 11 + 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) ' - Battery level and GMUX temperature recorded '... + 'during the reference time period']); + FIG = FIG+1; + lot_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + Batt = Section(); + sezBATT = Heading3('GMUX - Battery level and temperature'); + 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)); + battANALOG = 1; + end + end + add(DT,sez3DCrack); + for cr = 1:r3DCrL(m,1) + NodeNum = num2str(Nodo3DCrackLink(cr,m)); + comando = ['select EventDate, EventTime, XShift, YShift, ZShift 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 + X = cell2mat(Dati(:,3)); % Fessura + Y = cell2mat(Dati(:,4)); % Fessura + Z = cell2mat(Dati(:,5)); % Fessura + sX = X-X(1); + sY = Y-Y(1); + sZ = Z-Z(1); + + % grafico pressione atmosferica NELL'ULTIMO MESE + figure(5); + plot(Date,sX); + hold on + plot(Date,sY); + apertura = plot(Date,sZ); + title(['Opening/closing of the crack meter - node number ' NodeNum]); + xlabel('Date [dd/mm/yyyy]'); + ylabel('Deformation [mm]'); + controlX = abs(max(sX)-min(sX)); + controlY = abs(max(sY)-min(sY)); + controlZ = abs(max(sZ)-min(sZ)); + controlXYZ = [controlX; controlY; controlZ]; + control = max(controlXYZ); + if control < 0.5 % mm + ylim([-0.5 0.5]); + 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 + str(1,1) = cellstr('X'); + str(2,1) = cellstr('Y'); + str(3,1) = cellstr('Z'); + MX(1) = max(sX(1:10)); + MX(2) = max(sY(1:10)); + MX(3) = max(sZ(1:10)); + MN(1) = min(sX(1:10)); + MN(2) = min(sY(1:10)); + MN(3) = min(sZ(1:10)); + VAR(1) = max(MX); + VAR(2) = min(MN); + MAX = max(abs(VAR)); + IN = find(abs(VAR)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-3DCrack', NodeNum, '_ENG.png')); + saveas(apertura,TempName); + Chart3DCrL = Image(TempName); + Chart3DCrL.Style = {Height('7.5cm'),HAlign('center')}; + Chart3DCrL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Opening (increasing trend) and closing (decreasing trend) '... + 'over time, recorded along instrumental axes by the crack meter, node number ' NodeNum ... + ', during the reference time period']); + FIG = FIG+1; + Chart3DCrL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['Following graphs report differential deformation data recorded along the three instrumental axes '... + 'by 3D crack meters composing the Analog Array.']); + testo2 = Paragraph(['During the reference time period, node number ' NodeNum ... + 'recorded absolute opening values reported below: ']); + testoX = Paragraph(['- X axis - Maximum absolute value: ' num2str(round(max(X),2), '%0.2f') ... + ' mm, minimum value: ' num2str(round(min(X),2), '%0.2f') ' mm, variation: ' ... + num2str(round(max(X),2)-round(min(X),2),'%0.2f') ' mm; ']); + testoY = Paragraph(['- Y axis - Maximum absolute value: ' num2str(round(max(Y),2), '%0.2f') ... + ' mm, valore minimo: ' num2str(round(min(Y),2), '%0.2f') ' mm, variation: ' ... + num2str(round(max(Y),2)-round(min(Y),2),'%0.2f') ' mm; ']); + testoZ = Paragraph(['- Z axis - Maximum absolute value: ' num2str(round(max(Z),2), '%0.2f') ... + ' mm, minimum value: ' num2str(round(min(Z),2), '%0.2f') ' mm, variation: ' ... + num2str(round(max(Z),2)-round(min(Z),2),'%0.2f') ' mm. ']); + spazio = Paragraph(''); + + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if cr == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,testoX); + add(DT,testoY); + add(DT,testoZ); + add(DT,Chart3DCrL); + add(DT,Chart3DCrL_cap); + add(DT,spazio); + if cr == r3DCrL(m,1) + add(DT,br); + end + close(figure(19)); + close(figure(5)); + else + if ATTIVA == 1 + ATTIVA = 0; + CrE = Section(); + sez3DCrack = Heading3('3D Crack Link'); + sez3DCrack.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + CrE.Title = sez3DCrack; + add(DT,sez3DCrack); + testo = Paragraph('c'); + add(DT,testo); + add(DT,br); + end + end + end +end + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_3DCrL_ENG function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_3DEL.m b/ATD/report_3DEL.m new file mode 100755 index 0000000..d44ec2c --- /dev/null +++ b/ATD/report_3DEL.m @@ -0,0 +1,459 @@ +function [FIG,FIG_ENG,battANALOG,ATTIVA] = report_3DEL(r3DEL,m,Nodo3DExtensometerLink,toolrif,... + unitrif,contunit,datarif,Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,DT_ENG,... + FIG,FIG_ENG,activeEN,br,status,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_3DEL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +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 + E3DE = Section(); + sez3DExtensometer = Heading3('3D Extensometer Link'); + sez3DExtensometer.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + E3DE.Title = sez3DExtensometer; + 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)); + + if activeEN == 1 + E3DE_ENG = Section(); + sez3DExtensometer_ENG = Heading3('3D Extensometer Link'); + sez3DExtensometer_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + E3DE_ENG.Title = sez3DExtensometer_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,sez3DExtensometer); + if activeEN ==1 + add(DT_ENG,sez3DExtensometer_ENG); + end + + for ex = 1:r3DEL(m,1) + NodeNum = num2str(Nodo3DExtensometerLink(ex,m)); + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, T_node 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 + dX = cell2mat(Dati(:,3)); % deformazioni X + dsX = dX-dX(1); + dY = cell2mat(Dati(:,4)); % deformazioni Y + dsY = dY-dY(1); + dZ = cell2mat(Dati(:,5)); % deformazioni Z + dsZ = dZ-dZ(1); + Temp3DEL = cell2mat(Dati(:,6)); % temperatura + + % grafico deformazioni NELL'ULTIMO MESE + figure(5); + if isnan(Temp3DEL(1)) == 0 + yyaxis left + end + plot(Date,dsX); + hold on + plot(Date,dsY); + extens = plot(Date,dsZ); + ylabel('Deformazione [{\mu}{\epsilon}]'); + xlabel('Data [gg/mm/aaaa]'); + set(gca,'YColor','k'); + str(1,1) = cellstr('X'); + str(2,1) = cellstr('Y'); + str(3,1) = cellstr('Z'); + if isnan(Temp3DEL(1)) == 0 + yyaxis right + plot(Date,Temp3DEL,':','LineWidth',1.1); + ylabel(['Temperatura [' char(176) 'C]']); + set(gca,'YColor','k'); + str(4,1) = cellstr('T'); + end + title(['Deformazioni misurate dal nodo numero ' NodeNum]); + MX(1) = max(dsX(1:10)); + MX(2) = max(dsY(1:10)); + MX(3) = max(dsZ(1:10)); + MN(1) = min(dsX(1:10)); + MN(2) = min(dsY(1:10)); + MN(3) = min(dsZ(1:10)); + VAR(1) = max(MX); + VAR(2) = min(MN); + MAX = max(abs(VAR)); + IN = find(abs(VAR)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + xlim([Date(1)-1 Date(end)+1]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + hold off + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-3DExt', NodeNum, '.png')); + saveas(extens,TempName); + Chart3DEL = Image(TempName); + Chart3DEL.Style = {Height('8cm'),HAlign('center')}; + Chart3DEL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Deformazioni '... + 'misurate dall''estensimetro, nodo numero ' NodeNum... + ' nel periodo temporale di riferimento']); + FIG = FIG+1; + Chart3DEL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['Nei grafici seguenti sono rappresentati i dati relativi '... + 'alla deformazione differenziale rilevata durante il periodo temporale '... + 'di riferimento dalle terne di barrette estensimetriche appartenenti all''Analog Array.']); + testo2 = Paragraph(['In particolare, il nodo numero ' NodeNum ' ha registrato i seguenti valori '... + 'di deformazione adimensionale: ']); + testoX = Paragraph(['- Asse X - Valore Massimo assoluto: ' num2str(round(max(dX),2), '%0.2f') ... + ' ' char(181) '' char(949) ', valore minimo: ' num2str(round(min(dX),2), '%0.2f') ... + ' ' char(181) '' char(949) ', variazione: ' ... + num2str(round(max(dX),2)-round(min(dX),2),'%0.2f') ' ' char(181) '' char(949) '; ']); + testoY = Paragraph(['- Asse Y - Valore Massimo assoluto: ' num2str(round(max(dY),2), '%0.2f') ... + ' ' char(181) '' char(949) ', valore minimo: ' num2str(round(min(dY),2), '%0.2f') ... + ' ' char(181) '' char(949) ', variazione: ' ... + num2str(round(max(dY),2)-round(min(dY),2),'%0.2f') ' ' char(181) '' char(949) '; ']); + testoZ = Paragraph(['- Asse Z - Valore Massimo assoluto: ' num2str(round(max(dZ),2), '%0.2f') ... + ' ' char(181) '' char(949) ', valore minimo: ' num2str(round(min(dZ),2), '%0.2f') ... + ' ' char(181) '' char(949) ', variazione: ' ... + num2str(round(max(dZ),2)-round(min(dZ),2),'%0.2f') ' ' char(181) '' char(949) '. ']);... + spazio = Paragraph(''); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if ex == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,testoX); + add(DT,testoY); + add(DT,testoZ); + add(DT,Chart3DEL); + add(DT,Chart3DEL_cap); + add(DT,spazio); + if ex == r3DEL(m,1) + add(DT,br); + end + close(figure(5)); + + %---ENG--- + if activeEN == 1 + + % grafico deformazioni NELL'ULTIMO MESE + figure(15); + if isnan(Temp3DEL(1)) == 0 + yyaxis left + end + plot(Date,dsX); + hold on + plot(Date,dsY); + extens = plot(Date,dsZ); + ylabel('Deformation [{\mu}{\epsilon}]'); + xlabel('Date [d/mm/yyyy]'); + set(gca,'YColor','k'); + str(1,1) = cellstr('X'); + str(2,1) = cellstr('Y'); + str(3,1) = cellstr('Z'); + if isnan(Temp3DEL(1)) == 0 + yyaxis right + plot(Date,Temp3DEL,':','LineWidth',1.1); + ylabel(['Temperature [' char(176) 'C]']); + set(gca,'YColor','k'); + str(4,1) = cellstr('T'); + end + title(['Deformation - Node ' NodeNum]); + MX(1) = max(dsX(1:10)); + MX(2) = max(dsY(1:10)); + MX(3) = max(dsZ(1:10)); + MN(1) = min(dsX(1:10)); + MN(2) = min(dsY(1:10)); + MN(3) = min(dsZ(1:10)); + VAR(1) = max(MX); + VAR(2) = min(MN); + MAX = max(abs(VAR)); + IN = find(abs(VAR)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + xlim([Date(1)-1 Date(end)+1]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + hold off + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-3DExt', NodeNum, '_ENG.png')); + saveas(extens,TempName); + Chart3DEL_ENG = Image(TempName); + Chart3DEL_ENG.Style = {Height('8cm'),HAlign('center')}; + Chart3DEL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Deformation values '... + 'by the 3D extensometer ' NodeNum... + ' during the reference time period']); + FIG_ENG = FIG_ENG+1; + Chart3DEL_ENG_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graphs present deformation data '... + 'recorded by 3D extensometers integrated in the Analog Array.']); + testo2 = Paragraph(['In particular, node ' NodeNum ' recorded the following '... + 'deformation values: ']); + testoX = Paragraph(['- X axis - Maximum absolute value: ' num2str(round(max(dX),2), '%0.2f') ... + ' ' char(181) '' char(949) ', minimum absolute value: ' num2str(round(min(dX),2), '%0.2f') ... + ' ' char(181) '' char(949) ', variation: ' ... + num2str(round(max(dX),2)-round(min(dX),2),'%0.2f') ' ' char(181) '' char(949) '; ']); + testoY = Paragraph(['- Y axis - Maximum absolute value: ' num2str(round(max(dY),2), '%0.2f') ... + ' ' char(181) '' char(949) ', minimum absolute value: ' num2str(round(min(dY),2), '%0.2f') ... + ' ' char(181) '' char(949) ', variation: ' ... + num2str(round(max(dY),2)-round(min(dY),2),'%0.2f') ' ' char(181) '' char(949) '; ']); + testoZ = Paragraph(['- Z axis - Maximum absolute value: ' num2str(round(max(dZ),2), '%0.2f') ... + ' ' char(181) '' char(949) ', minimum absolute value: ' num2str(round(min(dZ),2), '%0.2f') ... + ' ' char(181) '' char(949) ', variation: ' ... + num2str(round(max(dZ),2)-round(min(dZ),2),'%0.2f') ' ' char(181) '' char(949) '. ']);... + spazio = Paragraph(''); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if ex == 1 + add(DT_ENG,testo); + end + add(DT_ENG,testo2); + add(DT_ENG,testoX); + add(DT_ENG,testoY); + add(DT_ENG,testoZ); + add(DT_ENG,Chart3DEL_ENG); + add(DT_ENG,Chart3DEL_ENG_cap); + add(DT_ENG,spazio); + if ex == r3DEL(m,1) + add(DT_ENG,br); + end + close(figure(15)); + end + + %pulisco variabili da riutilizzare per catena successiva + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + end + end + end + end +end + +text = 'report_3DEL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_3DEL_ENG.m b/ATD/report_3DEL_ENG.m new file mode 100755 index 0000000..f7e7cac --- /dev/null +++ b/ATD/report_3DEL_ENG.m @@ -0,0 +1,260 @@ +function [FIG,battANALOG,ATTIVA] = report_3DEL_ENG(r3DEL,m,Nodo3DExtensometerLink,toolrif,... + unitrif,contunit,datarif,Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,... + FIG,br,status,conn,FileName) + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('GMUX not installed or inactive.'); + add(DT,testo); + end +elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoring completed. Please log into the web-based platoform '... + 'to access the complete dataset.']); + add(DT,testo); + end +else + E3DE = Section(); + sez3DExtensometer = Heading3('3D Extensometer Link'); + sez3DExtensometer.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + E3DE.Title = sez3DExtensometer; + 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(['The following chart reports the battery level trend recorded during the reference time period. '... + 'The correct functioning of the GMUX module is guaranteed for a minimum level of 12 V. The last '... + 'available data is equal to ' num2str(Batteria(end,1)) ' V.']); + testoB2 = Paragraph(['The GMUX module equips also a thermometer that allows the monitoring of the working '... + 'temperature and the identification of eventual malfunctioning. The following chart reports temperature '... + 'data recorded by the GMUX module.']); + testoB1.HAlign = 'justify'; + testoB2.HAlign = 'justify'; + + % grafico batteria + figure(19) + plot(Date,Batteria); + hold on + title('Battery level and GMUX temperature'); + xlabel('Date [dd/mm/yyyy]'); + ylabel('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')}; + + if Batteria(end,1) >= 13 + TempName = char(strcat('B_13.jpg')); + elseif Batteria(end,1) >= 12 + TempName = char(strcat('B_12.jpg')); + elseif Batteria(end,1) >= 11 + 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) ' - Battery level and GMUX temperature recorded '... + 'during the reference time period']); + FIG = FIG+1; + lot_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + Batt = Section(); + sezBATT = Heading3('GMUX - Battery level and temperature'); + 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)); + battANALOG = 1; + end + end + add(DT,sez3DExtensometer); + for ex = 1:r3DEL(m,1) + NodeNum = num2str(Nodo3DExtensometerLink(ex,m)); + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, T_node 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 + dX = cell2mat(Dati(:,3)); % deformazioni X + dsX = dX-dX(1); + dY = cell2mat(Dati(:,4)); % deformazioni Y + dsY = dY-dY(1); + dZ = cell2mat(Dati(:,5)); % deformazioni Z + dsZ = dZ-dZ(1); + Temp3DEL = cell2mat(Dati(:,6)); % temperatura + + % grafico deformazioni NELL'ULTIMO MESE + figure(5); + if isnan(Temp3DEL(1)) == 0 + yyaxis left + end + plot(Date,dsX); + hold on + plot(Date,dsY); + extens = plot(Date,dsZ); + ylabel('Deformation [{\mu}{\epsilon}]'); + xlabel('Date [dd/mm/yyyy]'); + set(gca,'YColor','k'); + str(1,1) = cellstr('X'); + str(2,1) = cellstr('Y'); + str(3,1) = cellstr('Z'); + if isnan(Temp3DEL(1)) == 0 + yyaxis right + plot(Date,Temp3DEL,':','LineWidth',1.1); + ylabel(['Temperature [' char(176) 'C]']); + set(gca,'YColor','k'); + str(4,1) = cellstr('T'); + end + title(['Deformation values recorded by node ' NodeNum]); + MX(1) = max(dsX(1:10)); + MX(2) = max(dsY(1:10)); + MX(3) = max(dsZ(1:10)); + MN(1) = min(dsX(1:10)); + MN(2) = min(dsY(1:10)); + MN(3) = min(dsZ(1:10)); + VAR(1) = max(MX); + VAR(2) = min(MN); + MAX = max(abs(VAR)); + IN = find(abs(VAR)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + xlim([Date(1)-1 Date(end)+1]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + hold off + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-3DExt', NodeNum, '_ENG.png')); + saveas(extens,TempName); + Chart3DEL = Image(TempName); + Chart3DEL.Style = {Height('8cm'),HAlign('center')}; + Chart3DEL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Deformation values '... + 'recorded by extensometer, node number ' NodeNum... + ', during the reference time period']); + FIG = FIG+1; + Chart3DEL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['Following graphs report differential deformation values recorded '... + 'during the reference time period by 3D extensometer composing the Analog Array.']); + testo2 = Paragraph(['In particular, node ' NodeNum ' measured deformation values (dimensionless data) '... + 'listed below: ']); + testoX = Paragraph(['- X axis - Maximum absolute value: ' num2str(round(max(dX),2), '%0.2f') ... + ' ' char(181) '' char(949) ', minimum value: ' num2str(round(min(dX),2), '%0.2f') ... + ' ' char(181) '' char(949) ', variation: ' ... + num2str(round(max(dX),2)-round(min(dX),2),'%0.2f') ' ' char(181) '' char(949) '; ']); + testoY = Paragraph(['- Y axis - Maximum absolute value: ' num2str(round(max(dY),2), '%0.2f') ... + ' ' char(181) '' char(949) ', minimum value: ' num2str(round(min(dY),2), '%0.2f') ... + ' ' char(181) '' char(949) ', variation: ' ... + num2str(round(max(dY),2)-round(min(dY),2),'%0.2f') ' ' char(181) '' char(949) '; ']); + testoZ = Paragraph(['- Z axis - Maximum absolute value: ' num2str(round(max(dZ),2), '%0.2f') ... + ' ' char(181) '' char(949) ', minimum value: ' num2str(round(min(dZ),2), '%0.2f') ... + ' ' char(181) '' char(949) ', variation: ' ... + num2str(round(max(dZ),2)-round(min(dZ),2),'%0.2f') ' ' char(181) '' char(949) '. ']);... + spazio = Paragraph(''); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if ex == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,testoX); + add(DT,testoY); + add(DT,testoZ); + add(DT,Chart3DEL); + add(DT,Chart3DEL_cap); + add(DT,spazio); + if ex == r3DEL(m,1) + add(DT,br); + end + close(figure(5)); + %pulisco variabili da riutilizzare per catena successiva + else + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('No data available for the reference time period.'); + add(DT,testo); + add(DT,br); + end + end + end +end + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_3DEL_ENG function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_AR.m b/ATD/report_AR.m new file mode 100755 index 0000000..cb0ee98 --- /dev/null +++ b/ATD/report_AR.m @@ -0,0 +1,925 @@ +function [PL_A,PL_D,FIG,FIG_ENG] = report_AR(chainID,unitID,tipoarray,contunit,... + siteID,FIG,FIG_ENG,rpt,rpt_ENG,Font_caption,Font_Chapter,Font_section,... + Font_tools,datarif,yesKLHR3D,rTL,rTLHR,rTLH,rTLHRH,rPL,rBL,rLL,rRL,rKL,... + rKLHR,rThL,rPT100,rIPL,rIPLHR,rTuL,rRaL,rPCL,rPCLHR,rPrL,rEL,r3DEL,rWEL,rMPBEL,... + rCrL,r2DCrL,r3DCrL,rBML,rHL,rLuxL,rCO2,rRSN,rRSNHR,rTrL,rPE,rWL,rGF,rGS,... + NodoTiltLink,NodoTiltLinkH,NodoPiezoLink,NodoBaroLink,NodoLoadLink,... + NodoRainLink,NodoKlinoLink,NodoKlinoLinkHR,NodoThermLink,NodoPT100Link,... + NodoInPlaceLink,NodoInPlaceLinkHR,NodoTunnelLink,NodoRadialLink,NodoPreConvLink,... + NodoPressureLink,NodoExtensometerLink,Nodo3DExtensometerLink,... + NodoWireExtensometerLink,NodoMultiPointExtensometerLink,NodoCrackLink,... + Nodo2DCrackLink,Nodo3DCrackLink,NodoBaroMusaLink,NodoHumidityLink,NodoLuxLink,... + NodoCO2Link,NodoRSNLink,NodoRSNHRLink,NodoTriggerLink,NodoStressMeter,NodoWeirLink,... + NodoPendulum,MUMS,MUMS_ENG,colonna2,colonna2bis,colonna4,firstdata_num,activeEN,IDscaduta,... + status,br,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_AR function started'; +fprintf(fileID,fmt,text); +fclose(fileID); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +% Inizializzo +[rAR,~] = size(chainID); +[GI_Disp_TL,GI_Date_TL,GI_Prof_TL,GI_Disp_IPL,GI_Date_IPL,GI_Prof_IPL,... + GI_Disp_IPLHR,GI_Date_IPLHR,GI_Prof_IPLHR,GI_Level_PL,GI_Prof_PL,GI_Date_PL,... + GI_Rain_RL,GI_Date_RL,GI_Angolo_KL,GI_Date_KL,GI_Num_KL,GI_Disp_CrL,GI_Date_CrL,... + GI_Num_CrL,PL_A,PL_D,GI_Q1_TuL,GI_Q2_TuL,GI_Q3_TuL,GI_Q4_TuL,GI_Q1_Num_TuL,... + GI_Q2_Num_TuL,GI_Q3_Num_TuL,GI_Q4_Num_TuL,GI_Seg_TuL,GI_NumSeg_TuL,GI_Z_TuL,... + GI_Date_TuL,GI_XYZ_Rad,GI_Num_Rad,GI_dS_RL_MPB,GI_dS_RL_TuL,GI_dS_TuL_RL,... + GI_Date_Rad,GI_Z_PCL,GI_Date_PCL,GI_Date_MPB,GI_dS_MPB,GI_MPB_Base,GI_dS_MPB_RL] = report_ini; + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_ini function executed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +kl = 1; +s = 1; % Usato nei Cir +TR = 1; % usato nei Cir-Rad +TP = 1; % Usato nei Cir-PCL +MR = 1; % usato nei multibase-Rad + +%% Analizzo i singoli Array e li riporto nel Report +for m = 1:rAR % creo una sottosezione per ciascuna catena + % Cerco se alcune centraline (e i relativi Array) sono scaduti + IDcentralina = char(chainID(m,2)); % Centralina dell'Array in analisi + [rCU,~] = size(chainID); + for indCU = 1:rCU + if strcmp(char(unitID(indCU,2)),IDcentralina) == 1 + u = indCU; + break + end + end + if IDscaduta(u,1) == 1 + escludi = 1; + IDcentralina = char(chainID(m,2)); + DTcatena = char(chainID(m,4)); + DT = Section(); + app = Heading2(strcat(IDcentralina, '-', DTcatena)); + app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + DT.Title = app; + else + escludi = 0; + end + if escludi == 0 + battANALOG = 0; % indicatore per riportare batteria GMUX una sola volta per catena + toolrif = chainID(m,4); + DTcatena = char(toolrif); + toolrifID = chainID(m,3); + ID801 = chainID(m,1); + comando = ['select prod_date from tools where unit_ID like ''' num2str(cell2mat(ID801)) ''' and name like ''' char(toolrif) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + data_ini = curs.Data; + stringa = cell2mat(data_ini); + [~,cst] = size(stringa); + if cst > 10 + date = stringa(1,1:10); + time = stringa(1,11:21); + dataora_sito(1,1) = cellstr(date); + dataora_sito(1,2) = cellstr(time); + datasito = [cell2mat(dataora_sito(1,1)) repmat(' ', [1,1]) cell2mat(dataora_sito(1,2))]; % Data definita sul sito + if datenum(datasito) > datenum(datarif) + datarif = datestr(datenum(datasito),'yyyy-mm-dd'); + end + end + for ind = 1:rAR + if strcmp(chainID(ind,4),cellstr(toolrif)) == 1 + unitrif = char(chainID(ind,2)); + break + else + end + end + DT = Section(); + app = Heading2(char(strcat(unitrif, '-', toolrif))); + app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + DT.Title = app; + if activeEN == 1 + DT_ENG = Section(); + app_ENG = Heading2(char(strcat(unitrif, '-', toolrif))); + app_ENG.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + DT_ENG.Title = app_ENG; + else + DT_ENG = []; + end + ATTIVA = 1; + + %% TILT LINK V + if rTL(m,1) > 0 + [GI_MaxDispMESE,GI_DateTL,GI_MaxDispProf,ATTIVA,FIG,FIG_ENG] = report_TL(... + rTL,rTLHR,m,NodoTiltLink,toolrif,unitrif,datarif,firstdata_num,... + Font_caption,Font_tools,siteID,toolrifID,DT,DT_ENG,FIG,FIG_ENG,br,... + colonna2,colonna2bis,status,ATTIVA,activeEN,conn,FileName); + [rControl_1,~] = size(GI_MaxDispMESE); + [rControl_2,~] = size(GI_Disp_TL); + if rControl_1 <= rControl_2 || rControl_2 == 0 + if rControl_1 ~= 0 && rControl_2 == 0 + clear GI_Disp_TL + clear GI_Prof_TL + clear GI_Date_TL + GI_Disp_TL(:,m) = GI_MaxDispMESE; + GI_Prof_TL(1,m) = GI_MaxDispProf; + GI_Date_TL(:,m) = GI_DateTL; + elseif rControl_1 == 0 + GI_Disp_TL(1,m) = 0; + GI_Prof_TL(1,m) = 0; + GI_Date_TL(1,m) = 0; + else + GI_Disp_TL(1:rControl_1,m) = GI_MaxDispMESE; + GI_Prof_TL(1,m) = GI_MaxDispProf; + GI_Date_TL(1:rControl_1,m) = GI_DateTL; + end + else + if rControl_2 ~= 0 + clear BackUp + BackUp = GI_Disp_TL(1:rControl_2,:); + [~,cBck] = size(BackUp); + GI_Disp_TL(1:rControl_1,m) = GI_MaxDispMESE; + GI_Disp_TL(1:rControl_2,1:cBck) = BackUp; + GI_Prof_TL(1,m) = GI_MaxDispProf; + BackUp = GI_Date_TL (1:rControl_2,:); + GI_Date_TL(1:rControl_1,m) = GI_DateTL; + GI_Date_TL(1:rControl_2,1:cBck) = BackUp; + end + end + end + + %% TILT LINK H + if rTLH(m,1) > 0 + wip = Paragraph('Sezione non ancora disponibile per dati del Tilt Link H'); + add(DT,wip); + if activeEN == 1 + wip = Paragraph('Section for Tilt Link H is not yet available.'); + add(DT_ENG,wip); + end + end + + %% IN PLACE LINK + if rIPL(m,1) > 0 + [GI_MaxDispMESE,GI_DateIPL,GI_MaxDispProf,ATTIVA,FIG,FIG_ENG] = report_IPL(... + rIPL,rIPLHR,m,NodoInPlaceLink,toolrif,unitrif,datarif,firstdata_num,Font_caption,... + Font_tools,siteID,toolrifID,DT,DT_ENG,FIG,FIG_ENG,br,colonna2,colonna2bis,status,... + ATTIVA,activeEN,conn,FileName); + [rControl_1,~] = size(GI_MaxDispMESE); + [rControl_2,~] = size(GI_Disp_IPL); + if rControl_1 <= rControl_2 || rControl_2 == 0 + if rControl_1 ~= 0 && rControl_2 == 0 + clear GI_Disp_IPL + clear GI_Prof_IPL + clear GI_Date_IPL + GI_Disp_IPL(:,m) = GI_MaxDispMESE; + GI_Prof_IPL(:,m) = GI_MaxDispProf; + GI_Date_IPL(:,m) = GI_DateIPL; + elseif rControl_1 == 0 + GI_Disp_IPL(1,m) = 0; + GI_Prof_IPL(1,m) = 0; + GI_Date_IPL(1,m) = 0; + else + GI_Disp_IPL(1:rControl_1,m) = GI_MaxDispMESE; + GI_Prof_IPL(1:rControl_1,m) = GI_MaxDispProf; + GI_Date_IPL(1:rControl_1,m) = GI_DateIPL; + end + else + if rControl_2 ~= 0 + clear BackUp + BackUp = GI_Disp_IPL(1:rControl_2,:); + [~,cBck] = size(BackUp); + GI_Disp_IPL(1:rControl_1,m) = GI_MaxDispMESE; + GI_Disp_IPL(1:rControl_2,1:cBck) = BackUp; + GI_Prof_IPL(1,m) = GI_MaxDispProf; + BackUp = GI_Date_IPL(1:rControl_2,:); + GI_Date_IPL(1:rControl_1,m) = GI_DateIPL; + GI_Date_IPL(1:rControl_2,1:cBck) = BackUp; + end + end + end + + %% IN PLACE LINK HR + if rIPL(m,1) == 0 && rIPLHR(m,1) > 0 + [GI_MaxDispMESE,GI_DateIPLHR,GI_MaxDispProf,ATTIVA,FIG,FIG_ENG] = report_IPLHR(... + rIPLHR,m,NodoInPlaceLinkHR,toolrif,unitrif,datarif,firstdata_num,Font_caption,... + Font_tools,siteID,toolrifID,DT,DT_ENG,FIG,FIG_ENG,br,colonna2,colonna2bis,status,... + ATTIVA,activeEN,conn,FileName); + [rControl_1,~] = size(GI_MaxDispMESE); + [rControl_2,~] = size(GI_Disp_IPLHR); + if rControl_1 <= rControl_2 || rControl_2 == 0 + if rControl_1 ~= 0 && rControl_2 == 0 + clear GI_Disp_IPLHR + clear GI_Prof_IPLHR + clear GI_Date_IPLHR + GI_Disp_IPLHR(:,m) = GI_MaxDispMESE; + GI_Prof_IPLHR(:,m) = GI_MaxDispProf; + GI_Date_IPLHR(:,m) = GI_DateIPLHR; + elseif rControl_1 == 0 + GI_Disp_IPLHR(1,m) = 0; + GI_Prof_IPLHR(1,m) = 0; + GI_Date_IPLHR(1,m) = 0; + else + GI_Disp_IPLHR(1:rControl_1,m) = GI_MaxDispMESE; + GI_Prof_IPLHR(1:rControl_1,m) = GI_MaxDispProf; + GI_Date_IPLHR(1:rControl_1,m) = GI_DateIPLHR; + end + else + if rControl_2 ~= 0 + clear BackUp + BackUp = GI_Disp_IPLHR(1:rControl_2,:); + [~,cBck] = size(BackUp); + GI_Disp_IPLHR(1:rControl_1,m) = GI_MaxDispMESE; + GI_Disp_IPLHR(1:rControl_2,1:cBck) = BackUp; + GI_Prof_IPLHR(1,m) = GI_MaxDispProf; + BackUp = GI_Date_IPLHR(1:rControl_2,:); + GI_Date_IPLHR(1:rControl_1,m) = GI_DateIPLHR; + GI_Date_IPLHR(1:rControl_2,1:cBck) = BackUp; + end + end + end + + %% PIEZO LINK + if rPL(m,1) > 0 + [GI_LivelloFaldaPL,GI_ProfPL,GI_DatePL,PL_A,PL_D,ATTIVA,FIG,FIG_ENG] = report_PL(... + rPL,rTL,rIPL,m,NodoPiezoLink,PL_A,PL_D,toolrif,unitrif,datarif,Font_caption,... + Font_tools,toolrifID,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,activeEN,conn,FileName); + [rControl_1,~] = size(GI_LivelloFaldaPL); + [rControl_2,~] = size(GI_Level_PL); + if rControl_1 <= rControl_2 || rControl_2 == 0 + if rControl_1 ~= 0 && rControl_2 == 0 + clear GI_Level_PL + clear GI_Prof_PL + clear GI_Date_PL + GI_Level_PL(:,m) = GI_LivelloFaldaPL; + GI_Prof_PL(1,m) = GI_ProfPL; + GI_Date_PL(:,m) = GI_DatePL; + elseif rControl_1 == 0 + GI_Level_PL(1,m) = 0; + GI_Prof_PL(1,m) = 0; + GI_Date_PL(1,m) = 0; + else + GI_Level_PL(1:rControl_1,m) = GI_LivelloFaldaPL(:,1); + GI_Prof_PL(1:rControl_1,m) = GI_ProfPL(:,1); + GI_Date_PL(1:rControl_1,m) = GI_DatePL(:,1); + end + else + if rControl_2 ~= 0 + clear BackUp + BackUp = GI_Level_PL(1:rControl_2,:); + [~,cBck] = size(BackUp); + GI_Level_PL(1:rControl_1,m) = GI_LivelloFaldaPL; + GI_Level_PL(1:rControl_2,1:cBck) = BackUp; + GI_Prof_PL(1,m) = GI_ProfPL; + BackUp = GI_Date_PL(1:rControl_2,:); + GI_Date_PL(1:rControl_1,m) = GI_DatePL; + GI_Date_PL(1:rControl_2,1:cBck) = BackUp; + end + end + end + + %% BARO LINK + if rBL(m,1) > 0 + [ATTIVA,FIG,FIG_ENG] = report_BL(rBL,m,NodoBaroLink,toolrif,unitrif,datarif,... + Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,activeEN,... + conn,FileName); + end + + %% LOAD LINK + if rLL(m,1) > 0 + [FIG,FIG_ENG,battANALOG,ATTIVA] = report_LL(rLL,m,NodoLoadLink,toolrif,... + unitrif,datarif,contunit,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,... + br,colonna4,status,ATTIVA,battANALOG,activeEN,conn,FileName); + end + + %% PRESSURE LINK + if rPrL(m,1) > 0 + [FIG,FIG_ENG,battANALOG,ATTIVA] = report_PrL(rPrL,m,NodoPressureLink,toolrif,... + unitrif,datarif,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,... + battANALOG,activeEN,conn,FileName); + end + + %% KLINO LINK + if rKL(m,1) > 0 + [GI_AngoloKL,GI_NumKL,GI_DateKL,ATTIVA,FIG,FIG_ENG] = report_KL(rKL,m,... + NodoKlinoLink,toolrif,unitrif,datarif,contunit,Font_caption,Font_tools,... + siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,activeEN,colonna4,conn,FileName); + [rControl_1,~] = size(GI_AngoloKL); + [rControl_2,~] = size(GI_Angolo_KL); + if rControl_1 <= rControl_2 || rControl_2 == 0 + if rControl_1 ~= 0 && rControl_2 == 0 + clear GI_Angolo_KL + clear GI_Num_KL + clear GI_Date_KL + GI_Angolo_KL(:,kl:kl+1) = GI_AngoloKL; + GI_Num_KL(1,m) = GI_NumKL; + GI_Date_KL(:,m) = GI_DateKL; + kl = kl+2; + elseif rControl_1 == 0 + GI_Angolo_KL(1,kl:kl+1) = 0; + GI_Num_KL(1,m) = 0; + GI_Date_KL(1,m) = 0; + kl = kl+2; + else + GI_Angolo_KL(1:rControl_1,kl:kl+1) = GI_AngoloKL; + GI_Num_KL(1:rControl_1,m) = GI_NumKL; + GI_Date_KL(1:rControl_1,m) = GI_DateKL; + kl = kl+2; + end + else + if rControl_2 ~= 0 + clear BackUp + BackUp = GI_Angolo_KL(1:rControl_2,:); + [~,cBck] = size(BackUp); + GI_Angolo_KL(1:rControl_1,kl:kl+1) = GI_AngoloKL; + GI_Angolo_KL(1:rControl_2,1:cBck) = BackUp; + kl = kl+2; + GI_Num_KL(1,m) = GI_NumKL; + BackUp = GI_Date_KL (1:rControl_2,:); + [~,cBck] = size(BackUp); + GI_Date_KL(1:rControl_1,m) = GI_DateKL; + GI_Date_KL(1:rControl_2,1:cBck) = BackUp; + end + end + end + + %% KLINO LINK HR + if rKLHR(m,1) > 0 + if yesKLHR3D(m,1) == 0 + [ATTIVA,FIG,FIG_ENG] = report_KLHR(rKLHR,m,NodoKlinoLinkHR,toolrif,unitrif,... + datarif,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,... + activeEN,conn,FileName); + end + end + + %% THERM LINK + if rThL(m,1) > 0 + [ATTIVA,FIG,FIG_ENG] = report_ThL(rThL,m,NodoThermLink,toolrif,... + unitrif,datarif,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,... + activeEN,br,status,ATTIVA,conn,FileName); + end + + %% PT100 LINK + if rPT100(m,1) > 0 + [FIG,FIG_ENG,battANALOG,ATTIVA] = report_PT100(rPT100,m,NodoPT100Link,... + toolrif,unitrif,datarif,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,... + battANALOG,ATTIVA,activeEN,contunit,br,status,conn,FileName); + end + + %% TUNNEL LINK + if rTuL(m,1) > 0 + [GI_Cir_Q1,GI_Cir_Q2,GI_Cir_Q3,GI_Cir_Q4,GI_Cir_Q1_Num,GI_Cir_Q2_Num,... + GI_Cir_Q3_Num,GI_Cir_Q4_Num,GI_Cir_Seg,GI_Cir_Z,GI_Cir_Date,GI_TuL_RL,... + ATTIVA,FIG,FIG_ENG] = report_TuL(IDcentralina,DTcatena,rTuL,m,NodoTunnelLink,toolrif,... + unitrif,datarif,firstdata_num,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,... + colonna2,colonna2bis,status,ATTIVA,activeEN,conn,FileName); + [rControl_1,~] = size(GI_Cir_Date); + [rControl_2,~] = size(GI_Date_TuL); + if rControl_1 <= rControl_2 || rControl_2 == 0 + if rControl_1 ~= 0 && rControl_2 == 0 + clear GI_Q1_TuL + clear GI_Q2_TuL + clear GI_Q3_TuL + clear GI_Q4_TuL + clear GI_Q1_Num_TuL + clear GI_Q2_Num_TuL + clear GI_Q3_Num_TuL + clear GI_Q4_Num_TuL + clear GI_Date_TuL + clear GI_Seg_TuL + GI_Q1_TuL(:,m) = GI_Cir_Q1; + GI_Q2_TuL(:,m) = GI_Cir_Q2; + GI_Q3_TuL(:,m) = GI_Cir_Q3; + GI_Q4_TuL(:,m) = GI_Cir_Q4; + GI_Q1_Num_TuL(:,m) = GI_Cir_Q1_Num; + GI_Q2_Num_TuL(:,m) = GI_Cir_Q2_Num; + GI_Q3_Num_TuL(:,m) = GI_Cir_Q3_Num; + GI_Q4_Num_TuL(:,m) = GI_Cir_Q4_Num; + GI_Date_TuL(:,m) = GI_Cir_Date; + [~,num_s] = size(GI_Cir_Seg); + GI_Seg_TuL(1,s:s+num_s-1) = GI_Cir_Seg; + s = s+num_s; + GI_NumSeg_TuL(m,1) = num_s; + if isempty(GI_Cir_Z) == 0 + clear GI_Z_TuL + [~,num_T] = size(GI_Cir_Z); + GI_Z_TuL(:,TP:TP+num_T-1) = GI_Cir_Z; + TP = TP+num_T; + end + if isempty(GI_TuL_RL) == 0 + clear GI_dS_TuL_RL + [~,num_TR] = size(GI_TuL_RL); + GI_dS_TuL_RL(:,TR:TR+num_TR-1) = GI_TuL_RL; + TR = TR+num_TR; + end + elseif rControl_1 == 0 + GI_Q1_TuL(1,m) = 0; + GI_Q2_TuL(1,m) = 0; + GI_Q3_TuL(1,m) = 0; + GI_Q4_TuL(1,m) = 0; + GI_Q1_Num_TuL(1,m) = 0; + GI_Q2_Num_TuL(1,m) = 0; + GI_Q3_Num_TuL(1,m) = 0; + GI_Q4_Num_TuL(1,m) = 0; + GI_Date_TuL(1:rControl_1,m) = 0; + GI_NumSeg_TuL(m,1) = 0; + else + GI_Q1_TuL(1,m) = GI_Cir_Q1; + GI_Q2_TuL(1,m) = GI_Cir_Q2; + GI_Q3_TuL(1,m) = GI_Cir_Q3; + GI_Q4_TuL(1,m) = GI_Cir_Q4; + GI_Q1_Num_TuL(1,m) = GI_Cir_Q1_Num; + GI_Q2_Num_TuL(1,m) = GI_Cir_Q2_Num; + GI_Q3_Num_TuL(1,m) = GI_Cir_Q3_Num; + GI_Q4_Num_TuL(1,m) = GI_Cir_Q4_Num; + GI_Date_TuL(1:rControl_1,m) = GI_Cir_Date; + [~,num_s] = size(GI_Cir_Seg); + GI_Seg_TuL(1,s:s+num_s-1) = GI_Cir_Seg; + s = s+num_s; + GI_NumSeg_TuL(m,1) = num_s; + if isempty(GI_Cir_Z) == 0 + [~,num_T] = size(GI_Cir_Z); + GI_Z_TuL(1:rControl_1,TP:TP+num_T-1) = GI_Cir_Z; + TP = TP+num_T; + end + if isempty(GI_TuL_RL) == 0 + [~,num_TR] = size(GI_TuL_RL); + GI_dS_TuL_RL(1:rControl_1,TR:TR+num_TR-1) = GI_TuL_RL; + TR = TR+num_TR; + end + end + else + if rControl_2 ~= 0 + clear BackUp + GI_Q1_TuL(1,m) = GI_Cir_Q1; + GI_Q2_TuL(1,m) = GI_Cir_Q2; + GI_Q3_TuL(1,m) = GI_Cir_Q3; + GI_Q4_TuL(1,m) = GI_Cir_Q4; + GI_Q1_Num_TuL(1,m) = GI_Cir_Q1_Num; + GI_Q2_Num_TuL(1,m) = GI_Cir_Q2_Num; + GI_Q3_Num_TuL(1,m) = GI_Cir_Q3_Num; + GI_Q4_Num_TuL(1,m) = GI_Cir_Q4_Num; + BackUp = GI_Date_TuL(1:rControl_2,:); + [~,cBck] = size(BackUp); + GI_Date_TuL(1:rControl_1,m) = GI_Cir_Date; + GI_Date_TuL(1:rControl_2,1:cBck) = BackUp; + [~,num_s] = size(GI_Cir_Seg); + GI_Seg_TuL(1,s:s+num_s-1) = GI_Cir_Seg; + GI_NumSeg_TuL(m,1) = num_s; + s = s+num_s; + if isempty(GI_Cir_Z) == 0 + BackUp = GI_Z_TuL(1:rControl_2,:); + [~,cBck] = size(BackUp); + [~,num_T] = size(GI_Cir_Z); + GI_Z_TuL(1:rControl_1,TP:TP+num_T-1) = GI_Cir_Z; + TP = TP+num_T; + GI_Z_TuL(1:rControl_2,1:cBck) = BackUp; + end + if isempty(GI_TuL_RL) == 0 + BackUp = GI_dS_TuL_RL(1:rControl_2,:); + [~,cBck] = size(BackUp); + [~,num_TR] = size(GI_TuL_RL); + GI_dS_TuL_RL(1:rControl_1,TR:TR+num_TR-1) = GI_TuL_RL; + GI_dS_TuL_RL(1:rControl_2,1:cBck) = BackUp; + TR = TR+num_TR; + end + end + end + end + + %% RADIAL LINK + if rRaL(m,1) > 0 + [GI_Rad_XYZ,GI_Rad_Num,GI_Rad_MPBEL,GI_Rad_Cir,GI_Rad_Date,ATTIVA,FIG,FIG_ENG] = report_RaL(... + DTcatena,rRaL,m,NodoRadialLink,toolrif,unitrif,datarif,firstdata_num,Font_caption,... + Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,colonna2,colonna2bis,status,ATTIVA,activeEN,... + conn,FileName); + [rControl_1,~] = size(GI_Rad_Date); + [rControl_2,~] = size(GI_Date_Rad); + if rControl_1 <= rControl_2 || rControl_2 == 0 + if rControl_1 ~= 0 && rControl_2 == 0 + clear GI_XYZ_Rad + clear GI_Num_Rad + clear GI_Date_Rad + GI_XYZ_Rad(:,m) = GI_Rad_XYZ; + GI_Num_Rad(:,m) = GI_Rad_Num; + if isempty(GI_Rad_MPBEL) == 0 + clear GI_dS_RL_MPB + GI_dS_RL_MPB(:,m) = GI_Rad_MPBEL; + else + GI_dS_RL_MPB(:,m) = 0; + end + if isempty(GI_Rad_Cir) == 0 + clear GI_dS_RL_TuL + GI_dS_RL_TuL(:,m) = GI_Rad_Cir; + else + GI_dS_RL_TuL(:,m) = 0; + end + GI_Date_Rad(:,m) = GI_Rad_Date; + elseif rControl_1 == 0 + GI_XYZ_Rad(:,m) = 0; + GI_Num_Rad(:,m) = 0; + GI_Date_Rad(:,m) = 0; + else + GI_XYZ_Rad(1,m) = GI_Rad_XYZ; + GI_Num_Rad(1,m) = GI_Rad_Num; + if isempty(GI_Rad_MPBEL) == 0 + GI_dS_RL_MPB(1:rControl_1,m) = GI_Rad_MPBEL; + else + GI_dS_RL_MPB(1:rControl_1,m) = 0; + end + if isempty(GI_Rad_Cir) == 0 + GI_dS_RL_TuL(1:rControl_1,m) = GI_Rad_Cir; + else + GI_dS_RL_TuL(1:rControl_1,m) = 0; + end + GI_Date_Rad(1:rControl_1,m) = GI_Rad_Date; + end + else + if rControl_2 ~= 0 + clear BackUp + GI_XYZ_Rad(1,m) = GI_Rad_XYZ; + GI_Num_Rad(1,m) = GI_Rad_Num; + BackUp = GI_dS_RL_MPB(1:rControl_2,:); + [~,cBck] = size(BackUp); + if isempty(GI_Rad_MPBEL) == 0 + GI_dS_RL_MPB(1:rControl_1,m) = GI_Rad_MPBEL; + GI_dS_RL_MPB(1:rControl_2,1:cBck) = BackUp; + else + GI_dS_RL_MPB(:,m) = 0; + end + BackUp = GI_dS_RL_TuL(1:rControl_2,:); + [~,cBck] = size(BackUp); + if isempty(GI_Rad_Cir) == 0 + GI_dS_RL_TuL(1:rControl_1,m) = GI_Rad_Cir; + GI_dS_RL_TuL(1:rControl_2,1:cBck) = BackUp; + else + GI_dS_RL_TuL(:,m) = 0; + end + BackUp = GI_Date_Rad(1:rControl_2,:); + [~,cBck] = size(BackUp); + GI_Date_Rad(1:rControl_1,m) = GI_Rad_Date; + GI_Date_Rad(1:rControl_2,1:cBck) = BackUp; + end + end + end + + %% PRECONV LINK + if rPCL(m,1) > 0 + [GI_PCL_Z,GI_PCL_Date,ATTIVA,FIG,FIG_ENG] = report_PCL(DTcatena,rPCL,m,NodoPreConvLink,... + toolrif,unitrif,datarif,firstdata_num,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,... + colonna2,colonna2bis,status,ATTIVA,activeEN,conn,FileName); + [rControl_1,~] = size(GI_PCL_Date); + [rControl_2,~] = size(GI_Date_PCL); + if rControl_1 <= rControl_2 || rControl_2 == 0 + if rControl_1 ~= 0 && rControl_2 == 0 + clear GI_Date_PCL; + GI_Date_PCL = GI_PCL_Date; + if isempty(GI_PCL_Z) == 0 + clear GI_Z_PCL; + GI_Z_PCL(:,m) = GI_PCL_Z; + end + else + GI_Date_PCL(1:rControl_1,m) = GI_PCL_Date; + if isempty(GI_PCL_Z) == 0 + GI_Z_PCL(1:rControl_1,m) = GI_PCL_Z; + end + end + else + if rControl_2 ~= 0 + clear BackUp + BackUp = GI_Date_PCL(1:rControl_2,:); + [~,cBck] = size(BackUp); + GI_Date_PCL(1:rControl_1,m) = GI_PCL_Date; + GI_Date_PCL(1:rControl_2,1:cBck) = BackUp; + if isempty(GI_PCL_Z) == 0 + BackUp = GI_Z_PCL(1:rControl_2,:); + [~,cBck] = size(BackUp); + GI_Z_PCL(1:rControl_1,m) = GI_PCL_Z; + GI_Z_PCL(1:rControl_2,1:cBck) = BackUp; + end + end + end + end + + %% RAIN LINK + if rRL(m,1) > 0 + [GI_rainloc,GI_DateRL,ATTIVA,FIG,FIG_ENG] = report_RL(rRL,m,NodoRainLink,toolrif,... + unitrif,datarif,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,... + activeEN,conn,FileName); + [rControl_1,~] = size(GI_DateRL); + [rControl_2,~] = size(GI_Date_RL); + if rControl_1 <= rControl_2 || rControl_2 == 0 + if rControl_1 ~= 0 && rControl_2 == 0 + clear GI_Date_RL; + GI_Date_RL = GI_DateRL; + clear GI_Rain_RL; + GI_Rain_RL = GI_rainloc; + else + GI_Date_RL(1:rControl_1,m) = GI_DateRL; + GI_Rain_RL(1:rControl_1,m) = GI_rainloc; + end + else + if rControl_2 ~= 0 + clear BackUp + BackUp = GI_Date_RL(1:rControl_2,:); + [~,cBck] = size(BackUp); + GI_Date_RL(1:rControl_1,m) = GI_DateRL; + GI_Date_RL(1:rControl_2,1:cBck) = BackUp; + BackUp = GI_Rain_RL(1:rControl_2,:); + [~,cBck] = size(BackUp); + GI_Rain_RL(1:rControl_1,m) = GI_rainloc; + GI_Rain_RL(1:rControl_2,1:cBck) = BackUp; + end + end + end + + %% EXTENSOMETER LINK + if rEL(m,1) > 0 + [FIG,FIG_ENG,battANALOG,ATTIVA] = report_EL(rEL,m,NodoExtensometerLink,toolrif,... + unitrif,contunit,datarif,Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,... + DT_ENG,FIG,FIG_ENG,activeEN,br,status,conn,FileName); + end + + %% 3D EXTENSOMETER LINK + if r3DEL(m,1) > 0 + [FIG,FIG_ENG,battANALOG,ATTIVA] = report_3DEL(r3DEL,m,Nodo3DExtensometerLink,toolrif,... + unitrif,contunit,datarif,Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,DT_ENG,... + FIG,FIG_ENG,activeEN,br,status,conn,FileName); + end + + %% WIRE EXTENSOMETER LINK + if rWEL(m,1) > 0 + [FIG,FIG_ENG,battANALOG,ATTIVA] = report_WEL(rWEL,m,NodoWireExtensometerLink,toolrif,... + unitrif,contunit,datarif,Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,DT_ENG,... + FIG,FIG_ENG,br,activeEN,status,conn,FileName); + end + + %% MULTI POINT BOREHOLE LINK + if rMPBEL(m,1) > 0 + [GI_MPB_RL,GI_MPB,GI_Base,GI_Date,FIG,FIG_ENG,battANALOG,ATTIVA] = report_MPBEL(DTcatena,... + rMPBEL,m,NodoMultiPointExtensometerLink,toolrif,unitrif,contunit,datarif,... + Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,DT_ENG,FIG,FIG_ENG,br,... + activeEN,status,conn,FileName); + [rControl_1,~] = size(GI_Date); + [rControl_2,~] = size(GI_Date_MPB); + if rControl_1 <= rControl_2 || rControl_2 == 0 + if rControl_1 ~= 0 && rControl_2 == 0 + GI_Date_MPB(:,m) = GI_Date(:,1); + GI_dS_MPB = GI_MPB; + GI_MPB_Base = GI_Base; + [~,num_M] = size(GI_MPB_RL); + GI_dS_MPB_RL(:,MR:MR+num_M-1) = GI_MPB_RL; + MR = MR+num_M; + elseif rControl_1 == 0 + GI_Date_MPB(:,m) = 0; + GI_dS_MPB(:,m) = 0; + GI_MPB_Base(:,m) = 0; + else + Num_Basi = rMPBEL(m); + BackUp = GI_Date_MPB; + [~,cBck] = size(BackUp); + GI_Date_MPB(1:rControl_1,m) = GI_Date(:,1); + GI_dS_MPB(1:rControl_1,cBck+1:cBck+Num_Basi) = GI_MPB; + GI_MPB_Base(1,cBck+1:cBck+Num_Basi) = GI_Base; + [~,num_M] = size(GI_MPB_RL); + GI_dS_MPB_RL(1:rControl_1,MR:MR+num_M-1) = GI_MPB_RL; + MR = MR+num_M; + end + else + if rControl_2 ~= 0 + clear BackUp + BackUp = GI_Date_MPB(1:rControl_2,:); + [~,cBck] = size(BackUp); + clear GI_Date_MPB + Num_Basi = rMPBEL(m); + GI_Date_MPB(1:rControl_1,m) = GI_Date(:,1); + GI_Date_MPB(1:rControl_2,1:cBck) = BackUp; + BackUp = GI_dS_MPB(1:rControl_2,:); + [~,cBck] = size(BackUp); + clear GI_dS_MPB + GI_dS_MPB(1:rControl_1,cBck+1:cBck+Num_Basi) = GI_MPB; + GI_dS_MPB(1:rControl_2,1:cBck) = BackUp; + BackUp = GI_MPB_Base(1,:); + [~,cBck] = size(BackUp); + GI_MPB_Base(1,cBck+1:cBck+Num_Basi) = GI_Base; + BackUp = GI_dS_MPB_RL(1:rControl_2,:); + [~,cBck] = size(BackUp); + clear GI_dS_MPB_RL + [~,num_M] = size(GI_MPB_RL); + GI_dS_MPB_RL(1:rControl_1,MR:MR+num_M-1) = GI_MPB_RL; + GI_dS_MPB_RL(1:rControl_2,1:cBck) = BackUp; + MR = MR+num_M; + end + end + end + + %% CRACK LINK + if rCrL(m,1) > 0 + [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); + [rControl_1,~] = size(GI_DispCrL); + [rControl_2,~] = size(GI_Disp_CrL); + if rControl_1 <= rControl_2 || rControl_2 == 0 + if rControl_1 ~= 0 && rControl_2 == 0 + clear GI_Disp_CrL + clear GI_Num_CrL + clear GI_Date_CrL + GI_Disp_CrL(:,m) = GI_DispCrL; + GI_Num_CrL(:,m) = GI_NumCrL; + GI_Date_CrL(:,m) = GI_DateCrL; + elseif rControl_1 == 0 + GI_Disp_CrL(:,m) = 0; + GI_Num_CrL(:,m) = 0; + GI_Date_CrL(:,m) = 0; + else + GI_Disp_CrL(1:rControl_1,m) = GI_DispCrL; + GI_Num_CrL(1:rControl_1,m) = GI_NumCrL; + GI_Date_CrL(1:rControl_1,m) = GI_DateCrL; + end + else + if rControl_2 ~= 0 + clear BackUp + [~,cBck] = size(BackUp); + BackUp = GI_Disp_CrL(1:rControl_2,:); + GI_Disp_CrL(1:rControl_1,m) = GI_DispCrL; + GI_Disp_CrL(1:rControl_2,1:cBck) = BackUp; + BackUp = GI_Num_CrL(1:rControl_2,:); + GI_Num_CrL(1:rControl_1,m) = GI_NumCrL; + GI_Num_CrL(1:rControl_2,1:cBck) = BackUp; + BackUp = GI_Date_CrL (1:rControl_2,:); + GI_Date_CrL(1:rControl_1,m) = GI_DateCrL; + GI_Date_CrL(1:rControl_2,1:cBck) = BackUp; + end + end + end + + %% 2D CRACK LINK + if r2DCrL(m,1) > 0 + [battANALOG,ATTIVA,FIG,FIG_ENG] = report_2DCrL(r2DCrL,m,Nodo2DCrackLink,toolrif,... + unitrif,contunit,datarif,Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,DT_ENG,... + FIG,FIG_ENG,br,status,activeEN,conn,FileName); + end + + %% 3D CRACK LINK + if r3DCrL(m,1) > 0 + [battANALOG,ATTIVA,FIG,FIG_ENG] = report_3DCrL(r3DCrL,m,Nodo3DCrackLink,toolrif,... + unitrif,contunit,datarif,Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,DT_ENG,... + FIG,FIG_ENG,br,status,activeEN,conn,FileName); + end + + %% RSN LINK + if rRSN(m,1) > 0 + [ATTIVA,FIG,FIG_ENG] = report_RSN(rRSN,m,NodoRSNLink,toolrif,unitrif,datarif,... + Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,activeEN,conn,FileName); + end + + %% RSN LINK HR + if rRSNHR(m,1) > 0 + [ATTIVA,FIG,FIG_ENG] = report_RSNHR(rRSNHR,m,NodoRSNHRLink,toolrif,unitrif,... + datarif,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,activeEN,conn,FileName); + end + + %% TRIGGER SYSTEM + if rTrL(m,1) > 0 + ATTIVA = report_TrL(NodoTriggerLink,rTrL,m,Font_tools,br,datarif,toolrif,... + unitrif,DT,DT_ENG,activeEN,status,ATTIVA,conn,FileName); + end + + %% G-Flow SYSTEM + if rGF(m,1) > 0 + sezGflow = Paragraph('G-Flow Link'); + sezGflow.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + GF = Section(); + GF.Title = sezGflow; + add(DT,sezGflow); + if activeEN == 1 + add(DT_ENG,sezGflow); + end + + wip = Paragraph('Sezione non ancora disponibile per dati del G-Flow'); + add(DT,wip); + if activeEN == 1 + wip = Paragraph('Section for G-Flow is not yet available.'); + add(DT_ENG,wip); + end + end + + %% G-Shock SYSTEM + if rGS(m,1) > 0 + sezGshock = Paragraph('G-Shock Link'); + sezGshock.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + GS = Section(); + GS.Title = sezGshock; + add(DT,sezGshock); + if activeEN == 1 + add(DT_ENG,sezGshock); + end + + wip = Paragraph('Sezione non ancora disponibile per dati del G-Shock'); + add(DT,wip); + if activeEN == 1 + wip = Paragraph('Section for G-Shock is not yet available.'); + add(DT_ENG,wip); + end + end + + %% Weir Link + if rWL(m,1) > 0 + [FIG,FIG_ENG,battANALOG,ATTIVA] = report_WL(rWL,m,NodoWeirLink,toolrif,... + unitrif,contunit,datarif,Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,... + DT_ENG,FIG,FIG_ENG,activeEN,br,status,conn,FileName); + end + + %% Pendulum + if rPE(m,1) > 0 + [battANALOG,ATTIVA,FIG,FIG_ENG] = report_PE(rPE,m,NodoPendulum,toolrif,unitrif,... + datarif,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,battANALOG,ATTIVA,... + activeEN,conn,FileName); + end + + %% MUSA + if strcmp(tipoarray(m),'MUSA') == 1 % la catena è un MUSA + sezMusa = Paragraph('Musa'); + sezMusa.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + MU = Section(); + MU.Title = sezMusa; + add(DT,sezMusa); + if activeEN == 1 + add(DT_ENG,sezMusa); + end + + wip = Paragraph('Sezione non ancora disponibile per dati del sistema Musa'); + add(DT,wip); + if activeEN == 1 + wip = Paragraph('Section for Musa is not yet available.'); + add(DT_ENG,wip); + end + end + + %% Grafici Integrati + [Site,Site_ENG,FIG,FIG_ENG] = report_CrossGraphs(rTL,rIPL,rTuL,rRaL,... + rPCL,rPL,rRL,rKL,rCrL,rMPBEL,GI_Disp_TL,GI_Date_TL,GI_Prof_TL,GI_Disp_IPL,... + GI_Date_IPL,GI_Prof_IPL,GI_Level_PL,GI_Prof_PL,GI_Date_PL,GI_Rain_RL,GI_Date_RL,... + GI_Angolo_KL,GI_Num_KL,GI_Date_KL,GI_Disp_CrL,GI_Num_CrL,GI_Date_CrL,GI_Q1_TuL,... + GI_Q2_TuL,GI_Q3_TuL,GI_Q4_TuL,GI_Q1_Num_TuL,GI_Q2_Num_TuL,GI_Q3_Num_TuL,... + GI_Q4_Num_TuL,GI_Z_TuL,GI_Seg_TuL,GI_NumSeg_TuL,GI_Date_TuL,GI_Z_PCL,GI_Date_PCL,... + GI_XYZ_Rad,GI_Num_Rad,GI_dS_RL_MPB,GI_dS_RL_TuL,GI_dS_TuL_RL,GI_Date_Rad,... + GI_Date_MPB,GI_dS_MPB,GI_MPB_Base,GI_dS_MPB_RL,siteID,toolrif,chainID,Font_Chapter,... + Font_caption,Font_tools,m,rAR,br,FIG,FIG_ENG,DT,DT_ENG,activeEN,FileName); + + add(MUMS,DT); + if activeEN == 1 + add(MUMS_ENG,DT_ENG); + end + else + testo = Paragraph(['I dati dell''Array ' DTcatena ' letto dalla centralina '... + IDcentralina ' non sono disponibili in quanto ' char(232) ' scaduto '... + 'l''abbonamento ai dati della stessa. I dati torneranno ad essere '... + 'disponibili non appena sar' char(224) ' rinnovato il canone annuo.']); + testo.HAlign = 'justify'; + add(DT,testo); + add(MUMS,DT); + if activeEN == 1 + end + Site = []; + toolrifID = chainID(m,3); + for p = 1:rPL(m,1) + NodeNum = num2str(NodoPiezoLink(p,m)); + comando = ['select measurment from nodes where tool_id = ''' num2str(cell2mat(toolrifID))... + ''' and num = ''' NodeNum ''' and nodetype_id = 2 ']; + curs = exec(conn,comando); + curs = fetch(curs); + Leggo = curs.Data; + misuraPL(1,p) = Leggo(1,1); % unità di misura del piezometro + % pressione assoluta vs relativa + PL_A(p) = 0; + PL_D(p) = 0; + if strcmp(misuraPL(1,p),'VW kPa') == 1 || strcmp(misuraPL(1,p),'VW kg/cm2') == 1 + PL_A(p) = PL_A(p)+1; + else + PL_D(p) = PL_D(p)+1; + end + end + end +end +add(rpt,MUMS); +add(rpt,Site); +template(rpt); +if activeEN == 1 + add(rpt_ENG,MUMS_ENG); + add(rpt_ENG,Site_ENG); + template(rpt_ENG); +end + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_AR function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_BL.m b/ATD/report_BL.m new file mode 100755 index 0000000..f83bcb6 --- /dev/null +++ b/ATD/report_BL.m @@ -0,0 +1,157 @@ +function [ATTIVA,FIG,FIG_ENG] = report_BL(rBL,m,NodoBaroLink,toolrif,unitrif,datarif,... + Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,activeEN,... + conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_BL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() +titolo = 1; +if status(m,1) == 1 + if ATTIVA == 1 + testo = Paragraph('Catena non ancora installata o inattiva.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array 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 + SE = Section(); + if activeEN == 1 + SE_ENG = Section(); + end + for b = 1:rBL(m,1) + NodeNum = num2str(NodoBaroLink(b,m)); + comando = ['select EventDate, EventTime, pressure 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 + pressatm = cell2mat(Dati(:,3)); % pressione atmosferica + + % grafico pressione atmosferica NELL'ULTIMO MESE + figure(4) + atm = plot(Date,pressatm); + title('Pressione atmosferica'); + xlabel('Data [gg/mm/aaaa]'); + ylabel('Pressione [Pa]'); + 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),'-Baro.png')); + saveas(atm,TempName); + ChartBL = Image(TempName); + ChartBL.Style = {Height('8cm'),HAlign('center')}; + ChartBL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Andamento della '... + 'pressione atmosferica misurata dal barometro nel periodo temporale di riferimento']); + FIG = FIG+1; + ChartBL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph('Il grafico seguente riporta i valori relativi alla pressione atmosferica misurati dal sensore barometrico nel periodo temporale di riferimento.'); + testo.HAlign = 'justify'; + if titolo == 1 + sezBaro = Heading3('Baro Link'); + sezBaro.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SE.Title = sezBaro; + add(DT,sezBaro); + if activeEN == 0 + titolo = 0; + end + end + add(DT,testo); + add(DT,ChartBL); + add(DT,ChartBL_cap); + add(DT,br); + close(figure(4)); + + if activeEN == 1 + figure(4) + atm = plot(Date,pressatm); + title('Atmospheric pressure'); + xlabel('Date [dd/mm/yyyy]'); + ylabel('Pressure [Pa]'); + 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),'-Baro_ENG.png')); + saveas(atm,TempName); + ChartBL = Image(TempName); + ChartBL.Style = {Height('8cm'),HAlign('center')}; + ChartBL_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Atmospheric pressure recorded during '... + 'the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartBL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graph shows the atmospheric pressure recorded by the '... + 'Barometer sensor during the reference monitoring period.']); + testo.HAlign = 'justify'; + if titolo == 1 + sezBaro = Heading3('Baro Link'); + sezBaro.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SE_ENG.Title = sezBaro; + add(DT_ENG,sezBaro); + titolo = 0; + end + add(DT_ENG,testo); + add(DT_ENG,ChartBL); + add(DT_ENG,ChartBL_cap); + add(DT_ENG,br); + close(figure(4)); + end + %pulisco variabili da riutilizzare per catena successiva + clear pressatm; + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + end + end + end + end +end + +text = 'report_BL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_BL_ENG.m b/ATD/report_BL_ENG.m new file mode 100755 index 0000000..91a7e6d --- /dev/null +++ b/ATD/report_BL_ENG.m @@ -0,0 +1,96 @@ +function [ATTIVA,FIG] = report_BL_ENG(rBL,m,NodoBaroLink,toolrif,unitrif,datarif,... + Font_caption,Font_tools,siteID,DT,FIG,br,status,ATTIVA,conn,FileName) + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +if status(m,1) == 1 + if ATTIVA == 1 + testo = Paragraph('Array not installed or inactive.'); + ATTIVA = 0; + add(DT,testo); + end +elseif status(m,1) == 3 + if ATTIVA == 1 + testo = Paragraph(['Monitoring completed. Please log into the web-based platoform '... + 'to access the complete dataset.']); + ATTIVA = 0; + add(DT,testo); + end +else + SE = Section(); + titolo = 1; + for b = 1:rBL(m,1) + NodeNum = num2str(NodoBaroLink(b,m)); + comando = ['select EventDate, EventTime, pressure 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 + pressatm = cell2mat(Dati(:,3)); % pressione atmosferica + + % grafico pressione atmosferica NELL'ULTIMO MESE + figure(4) + atm = plot(Date,pressatm); + title('Atmospheric pressure'); + xlabel('Date [dd/mm/yyyy]'); + ylabel('Pressure [Pa]'); + 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),'-Baro_ENG.png')); + saveas(atm,TempName); + ChartBL = Image(TempName); + ChartBL.Style = {Height('8cm'),HAlign('center')}; + ChartBL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Atmospheric pressure recorded by the barometer during the reference time period']); + FIG = FIG+1; + ChartBL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graph represents atmospheric pressure values recorded during the reference time period '... + 'by the barometer installed on-site.']); + testo.HAlign = 'justify'; + if titolo == 1 + sezBaro = Heading3('Baro Link'); + sezBaro.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SE.Title = sezBaro; + add(DT,sezBaro); + titolo = 0; + end + add(DT,testo); + add(DT,ChartBL); + add(DT,ChartBL_cap); + add(DT,br); + close(figure(4)); + %pulisco variabili da riutilizzare per catena successiva + clear pressatm; + else + if ATTIVA == 1 + testo = Paragraph('No data available for the reference time period.'); + ATTIVA = 0; + add(DT,testo); + end + end + end +end + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_BL_ENG function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_CT.m b/ATD/report_CT.m new file mode 100755 index 0000000..02e2acb --- /dev/null +++ b/ATD/report_CT.m @@ -0,0 +1,200 @@ +function [FIG,FIG_ENG] = report_CT(c1trigger,c6trigger,alarms,nCT,rpt,Font_caption,... + Font_table,Font_section,datarif,CT,CT_ENG,FIG,FIG_ENG,activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_CT function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +CT_Att = zeros(1,nCT); +att = cell(1,nCT); +for A = 1:nCT + array = char(alarms(A,2)); + comando = ['select EventDate, EventTime, XShift, X from ELABDATACTRL where EventDate > ''' ... + datestr(datenum(datarif),'yyyy-mm-dd') ''' and CtrlToolName = ''' ... + array ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Dati = curs.Data; + CTS = Section(); + app = Heading2(array); + app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + CTS.Title = app; + if activeEN == 1 + CTS_ENG = Section(); + appENG = Heading2(array); + appENG.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + CTS_ENG.Title = appENG; + end + + % Modifico il formato di data e ora + [rD,rC] = size(Dati); + if rC ~= 1 + + % Camera + if cell2mat(alarms(A,3)) == 4 + ftpobj = ftp('160.78.30.106','asega','mums'); % connessione FTP + percorso = ['/ctrlToolsImages/' array]; + cd(ftpobj, percorso); % vado alla cartella con le immagini della camera elaborata + cartella = dir(ftpobj); % elenco file nella cartella + infoPIC = struct2cell(cartella(end)); % estraggo info ultima foto + mget(ftpobj, infoPIC(1)); % scarico foto + close(ftpobj) + + IMGCam = Image(char(infoPIC(1))); + IMGCam.Style = [IMGCam.Style {ScaleToFit}]; + IMGCam_cap = Paragraph(['Fig. ' num2str(FIG) ' - Immagine acquisita dalla '... + 'videocamera ASECam ' array ' presente in sito']); + FIG = FIG+1; + IMGCam_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + timePIC = cell2mat(infoPIC(5)); + +% % check ora legale +% if isdst(datetime(infoPIC(4),'Timezone','Europe/Zurich')) == 1 +% timePIC = cell2mat(infoPIC(5))-(1/24); +% end + + testoC = Paragraph(['Di seguito viene riportata l''ultima immagine acquisita in data '... + datestr(timePIC,'dd/mm/yyyy') ' dalla videocamera ASECam ' array '.']); + testoC.HAlign = 'justify'; + add(CTS,testoC); + add(CTS,IMGCam); + add(CTS,IMGCam_cap); + + % -- ENG -- + if activeEN == 1 + IMGCam_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Image acquired by the '... + 'ASECam video camera ' array ' installed on site']); + FIG_ENG = FIG_ENG+1; + IMGCam_ENG_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testoC_ENG = Paragraph(['The following figure displays the last image acquired by ASECam '... + array ' installe on site, referring to the following date:' datestr(cell2mat(infoPIC(5)),'dd/mm/yyyy HH:MM:SS') '.']); + testoC_ENG.HAlign = 'justify'; + add(CTS_ENG,testoC_ENG); + add(CTS_ENG,IMGCam); + add(CTS_ENG,IMGCam_ENG_cap); + end + else + T = [cell2mat(Dati(:,1)) repmat(' ', [rD,1]) cell2mat(Dati(:,2))]; + Date = datenum(T); % Data + Att_Loc = cell2mat(Dati(:,3)); % Attivazioni Locali + Att_Cum = cell2mat(Dati(:,4)); % Attivazioni Cumulate + Att_Loc_Tot = cumsum(Att_Loc); + testo = Paragraph(['Durante il periodo temporale di riferimento, '... + 'sono state registrate ' num2str(Att_Loc_Tot(end)) ' attivazioni del dispositivo.' ]); + testo2 = Paragraph(['Il numero di attivazioni totali dalla data di inizio monitoraggio ' char(232) ' pari '... + 'a ' num2str(Att_Cum(end)) '.' ]); + if Att_Loc_Tot(end) > 1 + CT_Att(1,A) = A; + end + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + att_temp = find(Att_Loc); + if isempty(att_temp) == 0 + att{1,A} = splitlines(strjoin(cellstr(Date(att_temp)), '\n')); + end + add(CTS,testo); + add(CTS,testo2); + + %--- ENG --- + if activeEN == 1 + testo = Paragraph(['During the reference time period, '... + 'the Control Tool recorded a total of ' num2str(Att_Loc_Tot(end)) ' activations.' ]); + testo2 = Paragraph(['The total number of activations since the beginning of the monitoring '... + 'activity amounts to ' num2str(Att_Cum(end)) '.' ]); + if Att_Loc_Tot(end) > 1 + CT_Att(1,A) = A; + end + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + add(CTS_ENG,testo); + add(CTS_ENG,testo2); + att_temp = find(Att_Loc); + if isempty(att_temp) == 0 + att{1,A} = splitlines(strjoin(cellstr(Date(att_temp)), '\n')); + end + end + end + % elseif + else + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + add(CTS,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(CTS,testo); + end + end + br = PageBreak(); + add(CTS,br); + add(CT,CTS); +end +clear A +A = find(CT_Att); % Cerco eventuali attivazioni nei singoli dispositivi CT +if isempty(A) == 0 + colonna1(1,1) = {'ID'}; + colonna2(1,1) = {'Tipologia di dispositivo'}; + colonna3(1,1) = {'Attivazioni [gg-mm-aaaa OO:MM:SS]'}; + disp = c1trigger(A); + type = c6trigger(A); + [num,~] = size(disp); + for n = 1:num + colonna1(n+1,1) = {disp}; + colonna2(n+1,1) = {type}; + colonna3(n+1,1) = {att}; + end + tab = FormalTable([colonna1,colonna2,colonna3]); + % formattazione tabella + tab.TableEntriesStyle = {HAlign('center'),VAlign('middle'),FontSize(Font_table),InnerMargin('0.5mm')}; + tab.Style = {ResizeToFitContents(true),Width("100%"),RowSep('solid','black','1px'),... + ColSep('solid','black','1px'),Hyphenation(false),BackgroundColor('#E0F1FF')}; + tab.Border = 'single'; + tabCaption = Paragraph('Tab. 2 - Tipologia di control tools e relative attivazioni durante il periodo analizzato'); + tabCaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + bodyFirstRow = tab.Body.Children(1); + bodyFirstRow.Style = [bodyFirstRow.Style {Bold()}]; + + add(CT,tabCaption); + add(CT,tab); + % --- ENG --- + if activeEN == 1 + colonna1_ENG(1,1) = {'ID'}; + colonna2_ENG(1,1) = {'Control Tool typology'}; + colonna3_ENG(1,1) = {'Activation [dd-mm-yyyy HH:MM:SS]'}; + disp = c1trigger(A); + type = c6trigger(A); + [num,~] = size(disp); + for n = 1:num + colonna1_ENG(n+1,1) = {disp}; + colonna2_ENG(n+1,1) = {type}; + colonna3_ENG(n+1,1) = {att}; + end + tab_ENG = FormalTable([colonna1_ENG,colonna2_ENG,colonna3_ENG]); + % formattazione tabella + tab_ENG.TableEntriesStyle = {HAlign('center'),VAlign('middle'),FontSize(Font_table),InnerMargin('0.5mm')}; + tab_ENG.Style = {ResizeToFitContents(true),Width("100%"),RowSep('solid','black','1px'),... + ColSep('solid','black','1px'),Hyphenation(false),BackgroundColor('#E0F1FF')}; + tab_ENG.Border = 'single'; + tabCaption_ENG = Paragraph('Tab. 2 - Control Tools typology and relative activations recorded during the reference time period'); + tabCaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + bodyFirstRow = tab_ENG.Body.Children(1); + bodyFirstRow.Style = [bodyFirstRow.Style {Bold()}]; + + add(CT_ENG,tabCaption_ENG); + add(CT_ENG,tab_ENG); + end +end + +add(rpt,CT); +template(rpt); + +text = 'report_CT function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_CT_ENG.m b/ATD/report_CT_ENG.m new file mode 100755 index 0000000..c2e0017 --- /dev/null +++ b/ATD/report_CT_ENG.m @@ -0,0 +1,88 @@ +function report_CT_ENG(c1trigger,c6trigger,alarms,rA,rpt,Font_caption,... + Font_table,datarif,CT,conn,FileName) + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +CT_Att = zeros(1,rA); +att = cell(1,rA); +for A = 1:rA + array = char(alarms(A,2)); + comando = ['select EventDate, EventTime, XShift, X from ELABDATACTRL where EventDate > ''' ... + datestr(datenum(datarif),'yyyy-mm-dd') ''' and CtrlToolName = ''' ... + array ''' ']; + 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 + Att_Loc = cell2mat(Dati(:,3)); % Attivazioni Locali + Att_Cum = cell2mat(Dati(:,4)); % Attivazioni Cumulate + Att_Loc_Tot = cumsum(Att_Loc); + testo = Paragraph(['During the reference time period, '... + 'the control tool was activated ' num2str(Att_Loc_Tot(end)) ' times.' ]); + testo2 = Paragraph(['The same device has been activated a total of '... + num2str(Att_Cum(end)) ' times since the beginning of the monitoring activity.' ]); + if Att_Loc_Tot(end) > 1 + CT_Att(1,A) = A; + end + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + add(CT,testo); + add(CT,testo2); + att_temp = find(Att_Loc); + if isempty(att_temp) == 0 + att{1,A} = splitlines(strjoin(cellstr(Date(att_temp)), '\n')); + end + else + testo = Paragraph('No data available for the reference time period.'); + add(CT,testo); + end +end +clear A +A = find(CT_Att); % Cerco eventuali attivazioni nei singoli dispositivi CT +if isempty(A) == 0 + colonna1(1,1) = {'ID'}; + colonna2(1,1) = {'Control tool typology'}; + colonna3(1,1) = {'Activations [dd-mm-yyyy hh:MM:ss]'}; + disp = c1trigger(A); + type = c6trigger(A); + [num,~] = size(disp); + for n = 1:num + colonna1(n+1,1) = {disp}; + colonna2(n+1,1) = {type}; + colonna3(n+1,1) = {att}; + end + tab = FormalTable([colonna1,colonna2,colonna3]); + % formattazione tabella + tab.TableEntriesStyle = {HAlign('center'),VAlign('middle'),FontSize(Font_table),InnerMargin('0.5mm')}; + tab.Style = {ResizeToFitContents(true),Width("100%"),RowSep('solid','black','1px'),... + ColSep('solid','black','1px'),Hyphenation(false),BackgroundColor('#E0F1FF')}; + tab.Border = 'single'; + tabCaption = Paragraph('Tab. 2 - Control tools typology and activations number during the reference time period'); + tabCaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + bodyFirstRow = tab.Body.Children(1); + bodyFirstRow.Style = [bodyFirstRow.Style {Bold()}]; + + add(CT,tabCaption); + add(CT,tab); +end +br = PageBreak(); +add(CT,br); +add(rpt,CT); +template(rpt); + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_CT_ENG function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_CU.m b/ATD/report_CU.m new file mode 100755 index 0000000..3d08970 --- /dev/null +++ b/ATD/report_CU.m @@ -0,0 +1,430 @@ +function [FIG,FIG_ENG,datarif,contunit,IDscaduta] = report_CU(unitID,chainID,adesso,datainvio,numgiorni,... + datasample,tipoarray,firstdata_num,siteID,datalogger,datalogger_ENG,FIG,FIG_ENG,rpt,rpt_ENG,... + Font_caption,Font_section,activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_CU function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +br = PageBreak(); +[rC,~] = size(unitID); +[rAR,~] = size(chainID); +activeT = 1; +if numgiorni == 30 % report mensile + day = '01'; + if adesso == 1 % gennaio + month = '12-'; + year = datestr(today-31,'yyyy-'); % anno precedente + else % altri mesi + month = strcat(num2str(adesso-1),'-'); % Report del mese precedente a quello attuale + year = datestr(today,'yyyy-'); + IDscaduta = zeros(rC,1); + end +else % report con cadenza personalizzata + day = datestr(datainvio,'dd'); + month = datestr(datainvio,'mm-'); + year = datestr(datainvio,'yyyy-'); +end +ar_tot = 1; +UNIT = zeros(rC,1); % Metto uno zero se la centralina ha solo ANALOG ARRAY, 1 se ha almeno un MUMS +for G = 1:rC % creo una sottosezione per ciascuna centralina + lastsample = 0; % inizializzo con data "nulla" (ultima lettura) + firstsample = 9*10^10; %inizializzo con data "lontanissima" (prima lettura) + contunit = unitID(G,2); + IDcentralina = char(contunit); + + % Cerco la data di scadenza della centralina + comando = ['select duedate from units where name = ''' IDcentralina ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Date = curs.Data; + Check = cell2mat(Date); + if strcmp(Check,'null') || strcmp(Check,'No Data') + analisi = 1; % La data di scadenza centralina non è impostata + else + if datenum(Date) < now % Centralina scaduta + analisi = 0; + else + analisi = 1; + end + end + + ID = Section(); + app = Heading2(['Centralina ', IDcentralina]); + app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + ID.Title = app; + if activeEN == 1 + ID_ENG = Section(); + app_ENG = Heading2(['Control Unit ', IDcentralina]); + app_ENG.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + ID_ENG.Title = app_ENG; + end + num_array = zeros(rC,1); + if analisi == 0 + testo = Paragraph(['I dati della centralina ' IDcentralina ' non '... + 'sono disponibili in quanto ' char(232) ' scaduto l''abbonamento ai dati della stessa. '... + 'I dati torneranno ad essere disponibili non appena sar' char(224) ... + ' rinnovato il canone annuo.']); + testo.HAlign = 'justify'; + add(ID,testo); + add(datalogger,ID) + IDscaduta(G,1) = 1; + datarif = strcat(year, month, day); + UNIT(G,1) = 99999; + if activeEN == 1 + testo = Paragraph(['Data recorded by control unit' IDcentralina ' are not '... + 'available due to the expiration of the data management subscription for this data logger. '... + 'Access to monitoring data will be resumed following the payment of the annual fee. ']); + testo.HAlign = 'justify'; + add(ID_ENG,testo); + add(datalogger_ENG,ID_ENG) + end + else + contunitID = num2str(cell2mat(unitID(G,1))); + IDscaduta(G,1) = 0; + datarif = strcat(year, month, day); + cen = 1; + for kk = 1:rAR + comando = ['select prod_date from tools where unit_ID like ''' contunitID ''' and name like ''' char(chainID(kk,4)) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + data_ini = curs.Data; + stringa = cell2mat(data_ini); + [~,cst] = size(stringa); + if cst > 10 + date = stringa(1,1:10); + time = stringa(1,11:21); + dataora_sito(1,1) = cellstr(date); + dataora_sito(1,2) = cellstr(time); + datasito{cen,1} = datestr(data_ini, 'yyyy-mm-dd HH:MM'); % Data definita sul sito + cen = cen+1; + end + end + datasito801 = min(datenum(datasito)); + if datenum(datasito801) > datenum(datarif) + datarif = datestr(datenum(datasito801),'yyyy-mm-dd'); + end + + Indici = []; + for rr = 1:rAR + if strcmp(char(chainID(rr,2)),char(unitID(G,2))) == 1 + Indici = [Indici; rr]; + end + end + IN = size(Indici); + num_array(G) = IN(1); + ARRAY = tipoarray(Indici,1); + for NUM = 1:num_array(G) + if strcmp(ARRAY(NUM,1),'Analog Array') == 1 + UNIT(G,1) = 0; + elseif strcmp(ARRAY(NUM,1),'MUSA') == 1 || strcmp(ARRAY(NUM,1),'RSN') == 1 || strcmp(ARRAY(NUM,1),'Klino Array D2W') == 1 + UNIT(G,1) = 0.5; + else + UNIT(G,1) = 1; + break + end + end + end + + if UNIT(G,1) == 1 + for arr = 1:num_array(G) + datasample_num = cell2mat(datasample(ar_tot+arr,1)); + if datasample_num ~= 9999 + if datasample_num >= lastsample && cell2mat(firstdata_num(arr+1)) <= firstsample || ... + datasample_num >= lastsample && firstsample == 0 % ultima lettura più recente, prima lettura più vecchia + Indici = []; + for rr = 1:rAR + if strcmp(char(chainID(rr,2)),char(unitID(G,2))) == 1 + Indici = [Indici; rr]; + end + end + catenarif = char(chainID(Indici(arr),4)); + lastsample = datasample_num; + firstsample = cell2mat(firstdata_num(arr+1)); + end + end + end + + if exist('catenarif','var') + % Scarico dati batteria + comando = ['select Date, Time, UnitName, ToolNameID, BatLevel, Temperature from RawDataView where Date >= ''' ... + datarif ''' and UnitName = ''' char(contunit) ''' and ToolNameID = '''... + catenarif ''' and NodeNum = 1 ']; + curs = exec(conn,comando); + curs = fetch(curs); + BatTemp = curs.Data; + [~,cc] = size(BatTemp); + else + cc = 1; + end + 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 + testo = Paragraph(['Di seguito sono riportati i valori di tensione '... + 'di alimentazione registrati durante il periodo di riferimento. '... + 'L''ultimo dato disponibile ' char(232) ' pari '... + 'a ' num2str(Batteria(end,1)) ' V.']); + if activeT == 1 + testo = Paragraph(['Di seguito sono riportati i valori di tensione '... + 'di alimentazione registrati durante il periodo di riferimento. '... + '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.']); + testo2 = Paragraph(['La medesima centralina dispone al proprio interno '... + 'di un termometro per monitorare la temperatura di esercizio ed identificare '... + 'eventuali anomalie. I dati di temperatura registrati sono riportati di seguito.']); + testo2.HAlign = 'justify'; + end + testo.HAlign = 'justify'; + % grafico batteria + figure(1) + plot(Date,Batteria); + hold on + title('Livello di carica e temperatura'); + xlabel('Data [gg/mm/aaaa]'); + ylabel('Livello della Batteria [V]'); + xlim([Date(1)-1 Date(end)+1]); + ylim([floor(min(Batteria(:,1))) ceil(max(Batteria(:,1)))]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + yyaxis right + CEN = 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,'.png')); + saveas(CEN,TempName); + Chart = Image(TempName); + Chart.Style = {Height('7.5cm'),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); + Batt2 = Image(TempName); + Batt.Style = {Height('4cm'),HAlign('center')}; + Batt2.Style = {Height('4cm'),HAlign('center')}; + + lot = Table({Chart, 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 della '... + 'centralina registrati durante il periodo di riferimento']); + FIG = FIG+1; + lot_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + close(figure(1)); + + add(ID,testo); + if cc ~= 1 + if activeT == 1 + add(ID,testo2); + end + add(ID,lot); + add(ID,lot_cap); + if G == rC || activeT == 1 + add(ID,br); + activeT = 0; + end + add(datalogger,ID) + end + else + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + add(ID,testo); + if G == rC + add(ID,br); + end + add(datalogger,ID) + end + + if activeEN == 1 % --- INGLESE --- + if cc ~= 1 + % testo introduttivo + testo = Paragraph(['The following chart reports the battery level trend recorded '... + 'during the reference time period. The last available data is equal to ' num2str(Batteria(end,1)) ' V.']); + if activeT == 1 + testo = Paragraph(['The following chart reports the 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.']); + testo2 = Paragraph(['The control unit 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 control unit.']); + testo2.HAlign = 'justify'; + end + testo.HAlign = 'justify'; + % grafico batteria + figure(1) + plot(Date,Batteria); + hold on + title('Battery level and temperature'); + xlabel('Date [dd/mm/yyyy]'); + ylabel('Level [V]'); + xlim([Date(1)-1 Date(end)+1]); + ylim([floor(min(Batteria(:,1))) ceil(max(Batteria(:,1)))]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + yyaxis right + CEN = 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,'_ENG.png')); + saveas(CEN,TempName); + Chart = Image(TempName); + Chart.Style = {Height('7.5cm'),HAlign('center')}; + + lot = Table({Chart, Batt2}); + 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 control unit temperature recorded '... + 'during the reference time period']); + FIG_ENG = FIG_ENG+1; + lot_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + close(figure(1)); + + add(ID_ENG,testo); + if cc ~= 1 + if activeT == 1 + add(ID_ENG,testo2); + end + add(ID_ENG,lot); + add(ID_ENG,lot_cap); + if G == rC || activeT == 1 + add(ID_ENG,br); + activeT = 0; + end + add(datalogger_ENG,ID_ENG) + end + else + testo = Paragraph('No data available for the reference time period.'); + add(ID_ENG,testo); + if G == rC + add(ID_ENG,br); + end + add(datalogger_ENG,ID_ENG) + end + end + elseif UNIT(G,1) == 0 % SOLO Analog Array + testo = Paragraph(['Questa centralina legge solo sensori analogici (Analog Array): i dati di batteria e temperatura '... + 'faranno quindi riferimento ai valori registrati dai singoli moduli GMUX e verranno pertanto '... + 'riportati nelle apposite sezioni.']); + testo.Style = {HAlign('justify')}; + add(ID,testo); + if G == rC + add(ID,br); + end + add(datalogger,ID) + if activeEN == 1 % SOLO Analog Array + testo = Paragraph(['This control unit read Analog Arrays only: for this reason, '... + 'battery level and temperature data should be referred to each single GMUX '... + 'module, and they will be presented in the appropriate section of the report.']); + testo.Style = {HAlign('justify')}; + add(ID_ENG,testo); + if G == rC + add(ID_ENG,br); + end + add(datalogger_ENG,ID_ENG) + end + elseif UNIT(G,1) == 0.5 % SOLO MUSA o RSN + testo = Paragraph(['Questa centralina legge solo sensori MUSA, RSN o D2W: i dati di batteria e temperatura '... + 'presentati in questo report faranno riferimento ai singoli moduli e verranno '... + 'riportati nelle apposite sezioni.']); + testo.Style = {HAlign('justify')}; + add(ID,testo); + if G == rC + add(ID,br); + end + add(datalogger,ID) + if activeEN == 1 + testo = Paragraph(['This control unit read MUSA, RSN or D2W sensors: for this reason, '... + 'battery level and temperature data should be referred to each single module, '... + 'and they will be presented in the appropriate section of the report.']); + testo.Style = {HAlign('justify')}; + add(ID_ENG,testo); + if G == rC + add(ID_ENG,br); + end + add(datalogger_ENG,ID_ENG) + end + end + ar_tot = ar_tot+num_array(G); +end +add(rpt,datalogger); +template(rpt); +add(rpt_ENG,datalogger_ENG); +template(rpt_ENG); + +text = 'report_CU function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_CrL.m b/ATD/report_CrL.m new file mode 100755 index 0000000..4dd69a4 --- /dev/null +++ b/ATD/report_CrL.m @@ -0,0 +1,412 @@ +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 \ No newline at end of file diff --git a/ATD/report_CrL_ENG.m b/ATD/report_CrL_ENG.m new file mode 100755 index 0000000..65862a3 --- /dev/null +++ b/ATD/report_CrL_ENG.m @@ -0,0 +1,249 @@ +function [GI_DispCrL,GI_NumCrL,GI_DateCrL,battANALOG,ATTIVA,FIG] = report_CrL_ENG(rCrL,... + m,NodoCrackLink,toolrif,unitrif,contunit,datarif,Font_caption,... + Font_tools,battANALOG,ATTIVA,siteID,DT,FIG,br,status,conn,FileName) + +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 not installed or inactive.'); + add(DT,testo); + ATTIVA = 0; + end +elseif status(m,1) == 3 + if ATTIVA == 1 + testo = Paragraph(['Monitoring completed. Please log into the web-based platoform '... + 'to access the complete dataset.']); + add(DT,testo); + ATTIVA = 0; + 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(['The following chart reports the battery level trend recorded during the reference time period. '... + 'The correct functioning of the GMUX module is guaranteed for a minimum level of 12 V. The last '... + 'available data is equal to ' num2str(Batteria(end,1)) ' V.']); + testoB2 = Paragraph(['The GMUX module equips also a thermometer that allows the monitoring of the working '... + 'temperature and the identification of eventual malfunctioning. The following chart reports temperature '... + 'data recorded by the GMUX module.']); + testoB1.HAlign = 'justify'; + testoB2.HAlign = 'justify'; + + % grafico batteria + figure(19) + plot(Date,Batteria); + hold on + title('Battery level and GMUX temperature'); + xlabel('Date [dd/mm/yyyy]'); + ylabel('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')}; + if Batteria(end,1) >= 13 + TempName = char(strcat('B_13.jpg')); + elseif Batteria(end,1) >= 12 + TempName = char(strcat('B_12.jpg')); + elseif Batteria(end,1) >= 11 + 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) ' - Battery level and GMUX temperature recorded '... + 'during the reference time period']); + FIG = FIG+1; + lot_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + FIG = FIG+1; + Chart_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + Batt = Section(); + sezBATT = Heading3('GMUX - Battery level and temperature'); + 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)); + 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 pressione atmosferica NELL'ULTIMO MESE + figure(5); + apertura = plot(Date,dS); + title(['Opening/closing of the crack meter - node number ' 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 = Image(TempName); + ChartCrL.Style = {Height('7.1cm'),HAlign('center')}; + ChartCrL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Opening (increasing trend) and closing (decreasing trend) '... + 'over time, recorded by the crack meter, node number ' NodeNum ' ']); + FIG = FIG+1; + ChartCrL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + if cr == 1 + testo = Paragraph(['The following graph reports deformation data recorded by the crack meter '... + 'installed on site, represented as opening and/or closing of the monitoring tool. In particular, increasing '... + 'values respresent a crack opening, while a decreasing trend corresponds to a closing behaviour.']); + testo.HAlign = 'justify'; + add(DT,testo); + end + testo2 = Paragraph(['Durign the reference time period, node ' NodeNum ' recorded a maximum and minimum value '... + 'of absolute deformation equal to ' num2str(round(max(open),2), '%0.2f') ' mm and '... + num2str(round(min(open),2), '%0.2f') ' mm respectively, with a '... + 'maximum variation of ' 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(19)); + close(figure(5)); + %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('No data available for the reference time period.'); + add(DT,testo); + br = PageBreak(); + add(DT,br); + 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 + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_CrL_ENG function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_CrossGraphs.m b/ATD/report_CrossGraphs.m new file mode 100755 index 0000000..3649559 --- /dev/null +++ b/ATD/report_CrossGraphs.m @@ -0,0 +1,3102 @@ +function [Site,Site_ENG,FIG,FIG_ENG] = report_CrossGraphs(rTL,rIPL,rTuL,rRaL,... + rPCL,rPL,rRL,rKL,rCrL,rMPBEL,GI_Disp_TL,GI_Date_TL,GI_Prof_TL,GI_Disp_IPL,... + GI_Date_IPL,GI_Prof_IPL,GI_Level_PL,GI_Prof_PL,GI_Date_PL,GI_Rain_RL,GI_Date_RL,... + GI_Angolo_KL,GI_Num_KL,GI_Date_KL,GI_Disp_CrL,GI_Num_CrL,GI_Date_CrL,GI_Q1_TuL,... + GI_Q2_TuL,GI_Q3_TuL,GI_Q4_TuL,GI_Q1_Num_TuL,GI_Q2_Num_TuL,GI_Q3_Num_TuL,... + GI_Q4_Num_TuL,GI_Z_TuL,GI_Seg_TuL,GI_NumSeg_TuL,GI_Date_TuL,GI_Z_PCL,GI_Date_PCL,... + GI_XYZ_Rad,GI_Num_Rad,GI_dS_RL_MPB,GI_dS_RL_TuL,GI_dS_TuL_RL,GI_Date_Rad,... + GI_Date_MPB,GI_dS_MPB,GI_MPB_Base,GI_dS_MPB_RL,siteID,toolrif,chainID,Font_Chapter,... + Font_caption,Font_tools,m,rAR,br,FIG,FIG_ENG,DT,DT_ENG,activeEN,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_CrossGraphs function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +%% --- TILT LINK + PIEZO LINK --- +% Tilt Link V + Piezo Link : Spostamento massimo locale vs Falda +if rTL(m,1) > 0 && rPL(m,1) > 0 && exist( 'GI_Disp_TL','var') + if isempty(GI_Level_PL(:,m)) == 0 && GI_Date_PL(1,m) ~= 0 && isempty(GI_Disp_TL(:,m)) == 0 && GI_Date_TL(1,m) ~= 0 + ind_PL = find(GI_Date_PL(:,m)); + ind_TL = find(GI_Date_TL(:,m)); + sezGrafTLvsPL = Paragraph('Correlazioni tra sensori - Tilt Link vs Piezo Link'); + sezGrafTLvsPL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + GI_VarFaldaPL = GI_Level_PL(:,m)-GI_Level_PL(1,m); + figure(21) + yyaxis left + GI_TiltLink = plot(GI_Date_TL(1:ind_TL(end),m),GI_Disp_TL(1:ind_TL(end),m),'Color','red'); + set(gca,'YColor','k') + LIM = ylim; + if max(GI_Disp_TL(:,m)) < 10 + ylim([-inf 10]); + elseif 1-max(GI_Disp_TL(:,m))/LIM(1,2) < 0.2 + if max(GI_Disp_TL(:,m)) < 1 + newlim = LIM(1,2)+LIM(1,2)*0.3; + else + newlim = LIM(1,2)+LIM(1,2)*0.1; + end + ylim([-inf newlim]); + end + ylabel('Spostamento [mm]'); + yyaxis right + GI_PiezoLink = plot(GI_Date_PL(1:ind_PL(end),m),GI_VarFaldaPL(1:ind_PL(end)),':','Color','blue'); + var = max(abs(GI_VarFaldaPL(1:ind_PL(end)))); + media = mean(GI_VarFaldaPL(1:ind_PL(end))); + LIM = ylim; + if var < 0.7 + ylim([media-0.5 media+0.5]); + elseif 1-max(GI_VarFaldaPL(1:ind_PL(end)))/LIM(1,2) < 0.2 + if max(GI_VarFaldaPL(1:ind_PL(end))) < 1 + newlim = LIM(1,2)+LIM(1,2)*0.3; + else + newlim = LIM(1,2)+LIM(1,2)*0.1; + end + ylim([-inf newlim]); + end + ylabel('Variazione del livello idrico [m]'); + set(gca,'YColor','k') + title('Correlazione spostamenti - variazioni di falda'); + xlabel('Data [gg/mm/aaaa]'); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + yyaxis left + lgdTL = (['Spostamenti (' num2str(GI_Prof_TL(1,m)) ' m)']); + lgdPL = ('Variazione Falda'); + str(1,1) = {['Spostamenti (' num2str(GI_Prof_TL(1,m)) ' m)']}; + str(2,1) = {'Variazione Falda'}; + lgd = legend(lgdTL,lgdPL, 'Location','north'); + numcolumns = 2; + [legend_h,object_h,plot_h,text_strings] = columnlegend(numcolumns,str); + clear str + + testoTLvsPL = Paragraph(['Il grafico seguente ha l''obiettivo di evidenziare '... + 'eventuali correlazioni presenti tra variazioni del livello di falda e '... + 'spostamenti registrati dai sensori di tipo inclinometrico. '... + 'In particolare, con riferimento al periodo temporale considerato, '... + 'vengono presi in considerazione il nodo che ha registrato '... + 'il maggior spostamento differenziale locale in direzione di massima pendenza '... + 'ed il piezometro che ha misurato una variazione di falda maggiore '... + '(nel caso la catena presenti un singolo piezometro, i dati riportati sono riferiti '... + 'all''unico sensore disponibile).']); + testoTLvsPL2 = Paragraph(['In questo caso, gli spostamenti riportati nel grafico '... + 'si riferiscono al sensore posizionato a ' num2str(GI_Prof_TL(1,m)) ' m di profondit' char(224) ', '... + 'mentre l''andamento della falda ' char(232) ' riferito alle misure del piezometro ' ... + 'collocato ad una profondit' char(224) ' di ' num2str((GI_Prof_PL(1,m))) ' metri.']); + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-TLvsPL.png')); + saveas(GI_PiezoLink,TempName); + ChartTLvsPL = Image(TempName); + ChartTLvsPL.Style = {ScaleToFit}; + ChartTLvsPL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto tra i dati di massimo '... + 'spostamento differenziale locale in direzione di massima pendenza e variazione '... + 'del livello idrico nel periodo temporale di riferimento']); + FIG = FIG+1; + ChartTLvsPL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testoTLvsPL.HAlign = 'justify'; + testoTLvsPL2.HAlign = 'justify'; + add(DT,sezGrafTLvsPL); + add(DT,testoTLvsPL); + add(DT,testoTLvsPL2); + add(DT,ChartTLvsPL); + add(DT,ChartTLvsPL_cap); + add(DT,br); + close(figure(21)); + + %--ENG-- + if activeEN == 1 + sezGrafTLvsPL_ENG = Paragraph('Correlations between sensors - Tilt Link vs Piezo Link'); + sezGrafTLvsPL_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + GI_VarFaldaPL = GI_Level_PL(:,m)-GI_Level_PL(1,m); + figure(22) + yyaxis left + GI_TiltLink = plot(GI_Date_TL(1:ind_TL(end),m),GI_Disp_TL(1:ind_TL(end),m),'Color','red'); + set(gca,'YColor','k') + LIM = ylim; + if max(GI_Disp_TL(:,m)) < 10 + ylim([-inf 10]); + elseif 1-max(GI_Disp_TL(:,m))/LIM(1,2) < 0.2 + if max(GI_Disp_TL(:,m)) < 1 + newlim = LIM(1,2)+LIM(1,2)*0.3; + else + newlim = LIM(1,2)+LIM(1,2)*0.1; + end + ylim([-inf newlim]); + end + ylabel('Displacement [mm]'); + yyaxis right + GI_PiezoLink = plot(GI_Date_PL(1:ind_PL(end),m),GI_VarFaldaPL(1:ind_PL(end)),':','Color','blue'); + var = max(abs(GI_VarFaldaPL(1:ind_PL(end)))); + media = mean(GI_VarFaldaPL(1:ind_PL(end))); + LIM = ylim; + if var < 0.7 + ylim([media-0.5 media+0.5]); + elseif 1-max(GI_VarFaldaPL(1:ind_PL(end)))/LIM(1,2) < 0.2 + if max(GI_VarFaldaPL(1:ind_PL(end))) < 1 + newlim = LIM(1,2)+LIM(1,2)*0.3; + else + newlim = LIM(1,2)+LIM(1,2)*0.1; + end + ylim([-inf newlim]); + end + ylabel('Water level variation [m]'); + set(gca,'YColor','k') + title('Correlation between displacements and water level variation'); + xlabel('Date [dd/mm/yyyy]'); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + yyaxis left + lgdTL = (['Displacements (' num2str(GI_Prof_TL(1,m)) ' m)']); + lgdPL = ('Water level variation'); + str(1,1) = {['Displacements (' num2str(GI_Prof_TL(1,m)) ' m)']}; + str(2,1) = {'Water level variation'}; + lgd = legend(lgdTL,lgdPL, 'Location','north'); + numcolumns = 2; + [legend_h,object_h,plot_h,text_strings] = columnlegend(numcolumns,str); + clear str + + testoTLvsPL = Paragraph(['The following graph aims to highlight the presence of '... + 'correlations between displacement data and water level variations. '... + 'In particular, for what concern the reference time period, the comparison '... + 'will focus on the sensor that measured the maximum local differential '... + 'displacement and the piezometer that recorded the largest water level variation. '... + 'If the Array includes only one piezometer, the graph is going to include monitoring '... + 'data measured by the only sensor available.']); + + testoTLvsPL2 = Paragraph(['In this case, displacement data reported in the graph '... + 'refer to the sensor located at ' num2str(GI_Prof_TL(1,m)) ' m of depth, while '... + 'the represented water level variation derives from the piezometer installed ' ... + 'at ' num2str((GI_Prof_PL(1,m))) ' m of depth.']); + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-TLvsPL_ENG.png')); + saveas(GI_PiezoLink,TempName); + ChartTLvsPL_ENG = Image(TempName); + ChartTLvsPL_ENG.Style = {ScaleToFit}; + ChartTLvsPL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between the '... + 'maximum local differential displacement and the water level variation '... + 'measured during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartTLvsPL_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testoTLvsPL.HAlign = 'justify'; + testoTLvsPL2.HAlign = 'justify'; + add(DT_ENG,sezGrafTLvsPL_ENG); + add(DT_ENG,testoTLvsPL); + add(DT_ENG,testoTLvsPL2); + add(DT_ENG,ChartTLvsPL_ENG); + add(DT_ENG,ChartTLvsPL_ENG_cap); + add(DT_ENG,br); + close(figure(22)); + end + % pulisco variabili da riutilizzare per catena successiva + clear GI_VarFaldaPL; + end +end + +%% --- IN PLACE LINK + PIEZO LINK --- +% In Place Link + Piezo Link : Spostamento massimo locale vs Falda +if rIPL(m,1) > 0 && rPL(m,1) > 0 && exist( 'GI_Disp_IPL','var') + if isempty(GI_Level_PL(:,m)) == 0 && GI_Date_PL(1,m) ~= 0 && ... + isempty(GI_Disp_IPL(:,m)) == 0 && GI_Date_IPL(1,m) ~= 0 + ind_PL = find(GI_Date_PL(:,m)); + ind_IPL = find(GI_Date_IPL(:,m)); + sezGrafIPLvsPL = Paragraph('Correlazioni tra sensori - In Place Link vs Piezo Link'); + sezGrafIPLvsPL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + GI_VarFaldaPL = GI_Level_PL(:,m)-GI_Level_PL(1,m); + figure(21) + yyaxis left + GI_InPlaceLink = plot(GI_Date_IPL(1:ind_IPL(end),m),GI_Disp_IPL(1:ind_IPL(end),m),'Color','red'); + set(gca,'YColor','k') + LIM = ylim; + if max(GI_Disp_IPL(:,m)) < 10 + ylim([-inf 10]); + elseif 1-max(GI_Disp_IPL(:,m))/LIM(1,2) < 0.2 + if max(GI_Disp_IPL(:,m)) < 1 + newlim = LIM(1,2)+LIM(1,2)*0.3; + else + newlim = LIM(1,2)+LIM(1,2)*0.1; + end + ylim([-inf newlim]); + end + ylabel('Spostamento [mm]'); + yyaxis right + GI_PiezoLink = plot(GI_Date_PL(1:ind_PL(end),m),GI_VarFaldaPL(1:ind_PL(end)),':','Color','blue'); + var = max(abs(GI_VarFaldaPL(1:ind_PL(end)))); + media = mean(GI_VarFaldaPL(1:ind_PL(end))); + LIM = ylim; + if var < 0.7 + ylim([media-0.5 media+0.5]); + elseif 1-max(GI_VarFaldaPL(1:ind_PL(end)))/LIM(1,2) < 0.2 + if max(GI_VarFaldaPL(1:ind_PL(end))) < 1 + newlim = LIM(1,2)+LIM(1,2)*0.3; + else + newlim = LIM(1,2)+LIM(1,2)*0.1; + end + ylim([-inf newlim]); + end + ylabel('Variazione del livello idrico [m]'); + set(gca,'YColor','k') + title('Correlazione spostamenti - variazioni di falda'); + xlabel('Data [gg/mm/aaaa]'); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + lgdIPL = (['Spostamenti (' num2str(GI_Prof_IPL(1,m)) ' m)']); + lgdPL = ('Variazione Falda'); + str(1,1) = {['Spostamenti (' num2str(GI_Prof_IPL(1,m)) ' m)']}; + str(2,1) = {'Variazione Falda'}; + lgd = legend(lgdIPL,lgdPL, 'Location','north'); + numcolumns = 2; + [legend_h,object_h,plot_h,text_strings] = columnlegend(numcolumns,str); + clear str + + testoIPLvsPL = Paragraph(['Il grafico seguente ha l''obiettivo di evidenziare '... + 'eventuali correlazioni presenti tra variazioni del livello di falda e '... + 'spostamenti registrati dai sensori di tipo inclinometrico. '... + 'In particolare, con riferimento al periodo temporale considerato, '... + 'vengono presi in considerazione il nodo che ha registrato '... + 'il maggior spostamento differenziale locale in direzione di massima pendenza '... + 'ed il piezometro che ha misurato una variazione di falda maggiore '... + '(nel caso la catena presenti un singolo piezometro, i dati riportati sono riferiti '... + 'all''unico sensore disponibile).']); + testoIPLvsPL2 = Paragraph(['In questo caso, gli spostamenti riportati nel grafico '... + 'si riferiscono al sensore posizionato a ' num2str(GI_Prof_IPL(1,m)) ... + ' m di profondit' char(224) ', mentre l''andamento della falda ' ... + char(232) ' riferito alle misure del piezometro collocato ad una '... + 'profondit' char(224) ' di ' num2str((GI_Prof_PL(1,m))) ' metri.']); + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-IPLvsPL.png')); + saveas(GI_PiezoLink,TempName); + ChartIPLvsPL = Image(TempName); + ChartIPLvsPL.Style = {ScaleToFit}; + ChartIPLvsPL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto tra i dati di massimo '... + 'spostamento differenziale locale in direzione di massima pendenza e variazione '... + 'del livello idrico nel periodo temporale di riferimento']); + FIG = FIG+1; + ChartIPLvsPL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testoIPLvsPL.HAlign = 'justify'; + testoIPLvsPL2.HAlign = 'justify'; + add(DT,sezGrafIPLvsPL); + add(DT,testoIPLvsPL); + add(DT,testoIPLvsPL2); + add(DT,ChartIPLvsPL); + add(DT,ChartIPLvsPL_cap); + add(DT,br); + close(figure(21)); + + %--ENG-- + if activeEN == 1 + sezGrafIPLvsPL_ENG = Paragraph('Correlations between sensors - In Place Link vs Piezo Link'); + sezGrafIPLvsPL_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + GI_VarFaldaPL = GI_Level_PL(:,m)-GI_Level_PL(1,m); + figure(22) + yyaxis left + GI_InPlaceLink = plot(GI_Date_IPL(1:ind_IPL(end),m),GI_Disp_IPL(1:ind_IPL(end),m),'Color','red'); + set(gca,'YColor','k') + LIM = ylim; + if max(GI_Disp_IPL(:,m)) < 10 + ylim([-inf 10]); + elseif 1-max(GI_Disp_IPL(:,m))/LIM(1,2) < 0.2 + if max(GI_Disp_IPL(:,m)) < 1 + newlim = LIM(1,2)+LIM(1,2)*0.3; + else + newlim = LIM(1,2)+LIM(1,2)*0.1; + end + ylim([-inf newlim]); + end + ylabel('Displacement [mm]'); + yyaxis right + GI_PiezoLink = plot(GI_Date_PL(1:ind_PL(end),m),GI_VarFaldaPL(1:ind_PL(end)),':','Color','blue'); + var = max(abs(GI_VarFaldaPL(1:ind_PL(end)))); + media = mean(GI_VarFaldaPL(1:ind_PL(end))); + LIM = ylim; + if var < 0.7 + ylim([media-0.5 media+0.5]); + elseif 1-max(GI_VarFaldaPL(1:ind_PL(end)))/LIM(1,2) < 0.2 + if max(GI_VarFaldaPL(1:ind_PL(end))) < 1 + newlim = LIM(1,2)+LIM(1,2)*0.3; + else + newlim = LIM(1,2)+LIM(1,2)*0.1; + end + ylim([-inf newlim]); + end + ylabel('Water level variation [m]'); + set(gca,'YColor','k') + title('Correlation between displacements and water level variation'); + xlabel('Date [dd/mm/yyyy]'); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + lgdIPL = (['Displacements (' num2str(GI_Prof_IPL(1,m)) ' m)']); + lgdPL = ('Water level variation'); + str(1,1) = {['Displacements (' num2str(GI_Prof_IPL(1,m)) ' m)']}; + str(2,1) = {'Water level variation'}; + lgd = legend(lgdIPL,lgdPL, 'Location','north'); + numcolumns = 2; + [legend_h,object_h,plot_h,text_strings] = columnlegend(numcolumns,str); + clear str + + testoIPLvsPL = Paragraph(['The following graph aims to highlight the presence of '... + 'correlations between displacement data and water level variations. '... + 'In particular, for what concern the reference time period, the comparison '... + 'will focus on the sensor that measured the maximum local differential '... + 'displacement and the piezometer that recorded the largest water level variation. '... + 'If the Array includes only one piezometer, the graph is going to include monitoring '... + 'data measured by the only sensor available.']); + + testoIPLvsPL2 = Paragraph(['In this case, displacement data reported in the graph '... + 'refer to the sensor located at ' num2str(GI_Prof_IPL(1,m)) ' m of depth, while '... + 'the represented water level variation derives from the piezometer installed ' ... + 'at ' num2str((GI_Prof_PL(1,m))) ' m of depth.']); + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-IPLvsPL_ENG.png')); + saveas(GI_PiezoLink,TempName); + ChartIPLvsPL_ENG = Image(TempName); + ChartIPLvsPL_ENG.Style = {ScaleToFit}; + ChartIPLvsPL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between the '... + 'maximum local differential displacement and the water level variation '... + 'measured during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartIPLvsPL_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testoIPLvsPL.HAlign = 'justify'; + testoIPLvsPL2.HAlign = 'justify'; + add(DT_ENG,sezGrafIPLvsPL_ENG); + add(DT_ENG,testoIPLvsPL); + add(DT_ENG,testoIPLvsPL2); + add(DT_ENG,ChartIPLvsPL_ENG); + add(DT_ENG,ChartIPLvsPL_ENG_cap); + add(DT_ENG,br); + close(figure(22)); + end + % pulisco variabili da riutilizzare per catena successiva + clear GI_VarFaldaPL; + end +end + +Site = Chapter; +if activeEN == 1 + Site_ENG = Chapter; +else + Site_ENG = []; +end +%% Grafici riassuntivi del SITO +if m == rAR && rAR > 1 + titleCha = 0; + % --- Piogge vs falda --- + if sum(rRL) > 0 && sum(rPL) > 0 && exist('GI_Rain_RL','var') && exist('GI_Level_PL','var') + if isempty(GI_Level_PL) == 0 && isempty(GI_Rain_RL) == 0 + if titleCha == 0 + sezSITE = Heading1('Correlazioni fra i diversi sensori presenti in sito'); + sezSITE.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site.Title = sezSITE; + spazio = Paragraph(''); + add(Site,spazio); + if activeEN == 1 + sezSITE_ENG = Heading1('Correlations between different sensors installed on site'); + sezSITE_ENG.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site_ENG.Title = sezSITE_ENG; + spazio = Paragraph(''); + add(Site_ENG,spazio); + end + titleCha = 1; + end + sezGrafRLvsPL = Heading2('Correlazioni tra sensori - Rain Link vs Piezo Link'); + sezGrafRLvsPL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + GI_VarFaldaPL = GI_Level_PL-GI_Level_PL(1,:); + testoRLvsPL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra il piezometro '... + 'che ha registrato le maggiori variazioni di falda per ogni Array '... + 'presente in sito e le precipitazioni locali rilevate dal pluviometro.']); + add(Site,sezGrafRLvsPL); + add(Site,testoRLvsPL); + testoRLvsPL.HAlign = 'justify'; + figure(22) + GI_RainLink = bar(GI_Date_RL,GI_Rain_RL,75,'k'); + yyaxis left + ylabel('Precipitazioni [mm]'); + set(gca,'YColor','k') + yyaxis right + ylabel('Variazione di falda [m]'); + set(gca,'YColor','k') + title('Correlazione piogge - variazioni di falda'); + xlabel('Data [gg/mm/aaaa]'); + strRL(1,1) = cellstr('Precipitazioni'); + legend(strRL,'Location','northwest'); + [~,colPL] = size(GI_Level_PL); + num = 2; + index = []; + hold on + grid on + cmap = lines(colPL); + for p = 1:colPL + if GI_Date_PL(1,p) ~= 0 + ind_PL = find(GI_Date_PL(:,p)); + index = [index; p]; + GI_RainLink = plot(GI_Date_PL(1:ind_PL(end),p),GI_VarFaldaPL(1:ind_PL(end),p),'-','Color',cmap(p,:)); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(p,4)) ' -' num2str(GI_Prof_PL(1,p)) 'm']); + str(1,1) = cellstr('Precipitazioni'); + legend(str,'Location','northwest'); + num = num+1; + end + end + leg = legend(str,'Location','best'); + clear str + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-RLvsPL.png')); + saveas(GI_RainLink,TempName); + ChartRLvsPL = Image(TempName); + ChartRLvsPL.Style = {ScaleToFit}; + ChartRLvsPL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto tra i dati di precipitazione e variazione '... + 'di falda registrati nel periodo temporale di riferimento']); + FIG = FIG+1; + ChartRLvsPL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = (['In questo caso, l''andamento della falda ' char(232) ' riferito alle misure dei sensori riportati di seguito: ']); + testoRLvsPL2 = Paragraph(text); + testoRLvsPL2.HAlign = 'justify'; + add(Site,testoRLvsPL2); + I = size(index); + for a = 1:I(1) + text = ['- Array ',char(chainID(index(a),4)),' - Piezometro a ',num2str(GI_Prof_PL(1,index(a))),' m da P.C.']; + testoRLvsPL2 = Paragraph(text); + add(Site,testoRLvsPL2); + end + add(Site,ChartRLvsPL); + add(Site,ChartRLvsPL_cap); + add(Site,br); + close(figure(22)); + % -- ENG -- + if activeEN == 1 + sezGrafRLvsPL_ENG = Heading2('Correlation between sensors - Rain Link vs Piezo Link'); + sezGrafRLvsPL_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + GI_VarFaldaPL = GI_Level_PL-GI_Level_PL(1,:); + testoRLvsPL = Paragraph(['The following graph aims to highlight '... + 'the presence of correlations between the piezometer that recorded the '... + 'the maximum water level variation for each Array present on site, and the '... + 'local rainfall data measured by the rain gauge.']); + add(Site_ENG,sezGrafRLvsPL_ENG); + add(Site_ENG,testoRLvsPL); + testoRLvsPL.HAlign = 'justify'; + figure(23) + GI_RainLink = bar(GI_Date_RL,GI_Rain_RL,75,'k'); + yyaxis left + ylabel('Rainfall [mm]'); + set(gca,'YColor','k') + yyaxis right + ylabel('Water level variation [m]'); + set(gca,'YColor','k') + title('Correlations between rainfall and water level variation'); + xlabel('Date [dd/mm/yyyy]'); + strRL(1,1) = cellstr('Rainfall'); + legend(strRL,'Location','northwest'); + [~,colPL] = size(GI_Level_PL); + num = 2; + index = []; + hold on + grid on + cmap = lines(colPL); + for p = 1:colPL + if GI_Date_PL(1,p) ~= 0 + ind_PL = find(GI_Date_PL(:,p)); + index = [index; p]; + GI_RainLink = plot(GI_Date_PL(1:ind_PL(end),p),GI_VarFaldaPL(1:ind_PL(end),p),'-','Color',cmap(p,:)); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(p,4)) ' -' num2str(GI_Prof_PL(1,p)) 'm']); + str(1,1) = cellstr('Rainfall'); + legend(str,'Location','northwest'); + num = num+1; + end + end + leg = legend(str,'Location','best'); + clear str + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-RLvsPL_ENG.png')); + saveas(GI_RainLink,TempName); + ChartRLvsPL_ENG = Image(TempName); + ChartRLvsPL_ENG.Style = {ScaleToFit}; + ChartRLvsPL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between '... + 'rainfall data and water level variation during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartRLvsPL_ENG_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = ('In this case, the water level variation data derive from the sensors listed below: '); + testoRLvsPL2 = Paragraph(text); + testoRLvsPL2.HAlign = 'justify'; + add(Site_ENG,testoRLvsPL2); + I = size(index); + for a = 1:I(1) + text = ['- Array ',char(chainID(index(a),4)),' - Piezometer located ',num2str(GI_Prof_PL(1,index(a))),' m b.g.l.']; + testoRLvsPL2 = Paragraph(text); + add(Site_ENG,testoRLvsPL2); + end + add(Site_ENG,ChartRLvsPL_ENG); + add(Site_ENG,ChartRLvsPL_ENG_cap); + add(Site_ENG,br); + close(figure(23)); + end + end + end + + escludiTL = 0; + escludiIPL = 0; + % --- Piogge vs Max Spostamento Tilt Link --- + if sum(rRL) > 0 && sum(rTL) > 0 && exist('GI_Rain_RL','var') && exist('GI_Disp_TL','var') + if isempty(GI_Disp_TL) == 0 && isempty(GI_Rain_RL) == 0 + if titleCha == 0 + sezSITE = Heading1('Correlazioni fra i diversi sensori presenti in sito'); + sezSITE.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site.Title = sezSITE; + spazio = Paragraph(''); + add(Site,spazio); + if activeEN == 1 + sezSITE_ENG = Heading1('Correlations between different sensors installed on site'); + sezSITE_ENG.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site_ENG.Title = sezSITE_ENG; + spazio = Paragraph(''); + add(Site_ENG,spazio); + end + titleCha = 1; + end + sezGrafRLvsTL = Heading2('Correlazioni tra sensori - Rain Link vs Tilt Link V'); + sezGrafRLvsTL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoRLvsTL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra il sensore MEMS 3D '... + 'che ha registrato i maggiori spostamenti per ogni Array '... + 'presente in sito e le precipitazioni locali rilevate dal pluviometro.']); + add(Site,sezGrafRLvsTL); + add(Site,testoRLvsTL); + testoRLvsTL.HAlign = 'justify'; + figure(23) + GI_RainLink = bar(GI_Date_RL,GI_Rain_RL,75,'k'); + yyaxis left + ylabel('Precipitazioni [mm]'); + set(gca,'YColor','k') + yyaxis right + ylabel('Spostamento [mm]'); + set(gca,'YColor','k') + title('Correlazione piogge - spostamenti'); + xlabel('Data [gg/mm/aaaa]'); + strRL(1,1) = cellstr('Precipitazioni'); + legend(strRL,'Location','northwest'); + [~,colTL] = size(GI_Disp_TL); + num = 2; + hold on + grid on + index = []; + cmap = lines(colTL); + for t = 1:colTL + if GI_Date_TL(1,t) ~= 0 + ind_TL = find(GI_Date_TL(:,t)); + index = [index; t]; + GI_RainLink = plot(GI_Date_TL(1:ind_TL(end),t),GI_Disp_TL(1:ind_TL(end),t),'-','Color',cmap(t,:)); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,1) = cellstr('Precipitazioni'); + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_TL(1,t)) 'm']); + legend(str,'Location','northwest'); + num = num+1; + end + end + clear str + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-RLvsTL.png')); + saveas(GI_RainLink,TempName); + ChartRLvsTL = Image(TempName); + ChartRLvsTL.Style = {ScaleToFit}; + ChartRLvsTL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'tra i dati di precipitazione e spostamento registrati nel periodo temporale di riferimento']); + FIG = FIG+1; + ChartRLvsTL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = 'Gli spostamenti sono riferiti alle misure dei sensori riportati di seguito: '; + testoRLvsTL2 = Paragraph(text); + testoRLvsTL2.HAlign = 'justify'; + add(Site,testoRLvsTL2); + I = size(index); + for a = 1:I(1) + text = ['- Array ',char(chainID(index(a),4)),' - MEMS a ',num2str(abs(GI_Prof_TL(1,index(a)))),' m da P.C.']; + testoRLvsTL2 = Paragraph(text); + add(Site,testoRLvsTL2); + end + add(Site,ChartRLvsTL); + add(Site,ChartRLvsTL_cap); + add(Site,br); + close(figure(23)); + + % -- ENG -- + if activeEN == 1 + sezGrafRLvsTL_ENG = Heading2('Correlation between sensors - Rain Link vs Tilt Link V'); + sezGrafRLvsTL_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoRLvsTL = Paragraph(['The following graph aims to highlight the presence '... + 'of correlations between the maximum displacement measured by the MEMS 3D '... + 'sensors for each Array installed on site, and the local rainfall data recorded '... + 'by the rain gauge.']); + add(Site_ENG,sezGrafRLvsTL_ENG); + add(Site_ENG,testoRLvsTL); + testoRLvsTL.HAlign = 'justify'; + figure(24) + GI_RainLink = bar(GI_Date_RL,GI_Rain_RL,75,'k'); + yyaxis left + ylabel('Rainfall [mm]'); + set(gca,'YColor','k') + yyaxis right + ylabel('Displacement [mm]'); + set(gca,'YColor','k') + title('Correlation between rainfall and displacements'); + xlabel('Date [dd/mm/yyyy]'); + strRL(1,1) = cellstr('Rainfall'); + legend(strRL,'Location','northwest'); + [~,colTL] = size(GI_Disp_TL); + num = 2; + hold on + grid on + index = []; + cmap = lines(colTL); + for t = 1:colTL + if GI_Date_TL(1,t) ~= 0 + ind_TL = find(GI_Date_TL(:,t)); + index = [index; t]; + GI_RainLink = plot(GI_Date_TL(1:ind_TL(end),t),GI_Disp_TL(1:ind_TL(end),t),'-','Color',cmap(t,:)); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,1) = cellstr('Rainfall'); + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_TL(1,t)) 'm']); + legend(str,'Location','northwest'); + num = num+1; + end + end + clear str + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-RLvsTL_ENG.png')); + saveas(GI_RainLink,TempName); + ChartRLvsTL_ENG = Image(TempName); + ChartRLvsTL_ENG.Style = {ScaleToFit}; + ChartRLvsTL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between '... + 'rainfall and displacement data recorded during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartRLvsTL_ENG_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = 'The analyzed displacements refer to monitoring data recorded by the following sensors: '; + testoRLvsTL2 = Paragraph(text); + testoRLvsTL2.HAlign = 'justify'; + add(Site_ENG,testoRLvsTL2); + I = size(index); + for a = 1:I(1) + text = ['- Array ',char(chainID(index(a),4)),' - MEMS located ',num2str(abs(GI_Prof_TL(1,index(a)))),' m b.g.l.']; + testoRLvsTL2 = Paragraph(text); + add(Site_ENG,testoRLvsTL2); + end + add(Site_ENG,ChartRLvsTL_ENG); + add(Site_ENG,ChartRLvsTL_ENG_cap); + add(Site_ENG,br); + close(figure(24)); + end + escludiTL = 1; + end + end + % --- Piogge vs Max Spostamento In Place Link --- + if sum(rRL) > 0 && sum(rIPL) > 0 && exist('GI_Rain_RL','var') && exist('GI_Disp_IPL','var') + if isempty(GI_Disp_IPL) == 0 && isempty(GI_Rain_RL) == 0 + if titleCha == 0 + sezSITE = Heading1('Correlazioni fra i diversi sensori presenti in sito'); + sezSITE.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site.Title = sezSITE; + spazio = Paragraph(''); + add(Site,spazio); + if activeEN == 1 + sezSITE_ENG = Heading1('Correlations between different sensors installed on site'); + sezSITE_ENG.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site_ENG.Title = sezSITE_ENG; + spazio = Paragraph(''); + add(Site_ENG,spazio); + end + titleCha = 1; + end + sezGrafRLvsIPL = Heading2('Correlazioni tra sensori - Rain Link vs In Place Link'); + sezGrafRLvsIPL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoRLvsIPL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra il sensore MEMS 3D '... + 'che ha registrato i maggiori spostamenti per ogni Array '... + 'presente in sito e le precipitazioni locali rilevate dal pluviometro.']); + add(Site,sezGrafRLvsIPL); + add(Site,testoRLvsIPL); + testoRLvsIPL.HAlign = 'justify'; + figure(23) + GI_RainLink = bar(GI_Date_RL,GI_Rain_RL,75,'k'); + yyaxis left + ylabel('Precipitazioni [mm]'); + set(gca,'YColor','k') + yyaxis right + ylabel('Spostamento [mm]'); + set(gca,'YColor','k') + title('Correlazione piogge - spostamenti'); + xlabel('Data [gg/mm/aaaa]'); + strRL(1,1) = cellstr('Precipitazioni'); + legend(strRL,'Location','northwest'); + [~,colIPL] = size(GI_Disp_IPL); + num = 2; + hold on + grid on + index = []; + cmap = lines(colIPL); + for t = 1:colIPL + if GI_Date_IPL(1,t) ~= 0 + ind_IPL = find(GI_Date_IPL(:,t)); + index = [index; t]; + GI_RainLink = plot(GI_Date_IPL(1:ind_IPL(end),t),GI_Disp_IPL(1:ind_IPL(end),t),'-','Color',cmap(t,:)); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_IPL(1,t)) 'm']); + num = num+1; + end + end + leg = legend(str,'Location','northwest'); + clear str + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-RLvsIPL.png')); + saveas(GI_RainLink,TempName); + ChartRLvsIPL = Image(TempName); + ChartRLvsIPL.Style = {ScaleToFit}; + ChartRLvsIPL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'tra i dati di precipitazione e spostamento registrati nel periodo '... + 'temporale di riferimento']); + FIG = FIG+1; + ChartRLvsIPL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = 'Gli spostamenti sono riferiti alle misure dei sensori riportati di seguito: '; + testoRLvsIPL2 = Paragraph(text); + testoRLvsIPL2.HAlign = 'justify'; + add(Site,testoRLvsIPL2); + I = size(index); + for a = 1:I(1) + text = ['- Array ',char(chainID(index(a),4)),' - MEMS a ',num2str(abs(GI_Prof_IPL(1,index(a)))),' m da P.C.']; + testoRLvsIPL2 = Paragraph(text); + add(Site,testoRLvsIPL2); + end + add(Site,ChartRLvsIPL); + add(Site,ChartRLvsIPL_cap); + add(Site,br); + close(figure(23)); + + % -- ENG -- + if activeEN == 1 + sezGrafRLvsIPL_ENG = Heading2('Correlation between sensors - Rain Link vs In Place Link'); + sezGrafRLvsIPL_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoRLvsIPL = Paragraph(['The following graph aims to highlight the presence '... + 'of correlations between the maximum displacement measured by the MEMS 3D '... + 'sensors for each Array installed on site, and the local rainfall data recorded '... + 'by the rain gauge.']); + add(Site_ENG,sezGrafRLvsIPL_ENG); + add(Site_ENG,testoRLvsIPL); + testoRLvsIPL.HAlign = 'justify'; + figure(23) + GI_RainLink = bar(GI_Date_RL,GI_Rain_RL,75,'k'); + yyaxis left + ylabel('Rainfall [mm]'); + set(gca,'YColor','k') + yyaxis right + ylabel('Displacement [mm]'); + set(gca,'YColor','k') + title('Correlation between rainfall and displacements'); + xlabel('Date [dd/mm/yyyy]'); + strRL(1,1) = cellstr('Rainfall'); + legend(strRL,'Location','northwest'); + [~,colIPL] = size(GI_Disp_IPL); + num = 2; + hold on + grid on + index = []; + cmap = lines(colIPL); + for t = 1:colIPL + if GI_Date_IPL(1,t) ~= 0 + ind_IPL = find(GI_Date_IPL(:,t)); + index = [index; t]; + GI_RainLink = plot(GI_Date_IPL(1:ind_IPL(end),t),GI_Disp_IPL(1:ind_IPL(end),t),'-','Color',cmap(t,:)); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_IPL(1,t)) 'm']); + num = num+1; + end + end + leg = legend(str,'Location','northwest'); + clear str + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-RLvsIPL_ENG.png')); + saveas(GI_RainLink,TempName); + ChartRLvsIPL_ENG = Image(TempName); + ChartRLvsIPL_ENG.Style = {ScaleToFit}; + ChartRLvsIPL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between '... + 'rainfall and displacement data recorded during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartRLvsIPL_ENG_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = 'The analyzed displacements refer to monitoring data recorded by the following sensors: '; + testoRLvsIPL2 = Paragraph(text); + testoRLvsIPL2.HAlign = 'justify'; + add(Site_ENG,testoRLvsIPL2); + I = size(index); + for a = 1:I(1) + text = ['- Array ',char(chainID(index(a),4)),' - MEMS located ',num2str(abs(GI_Prof_IPL(1,index(a)))),' m b.g.l.']; + testoRLvsIPL2 = Paragraph(text); + add(Site_ENG,testoRLvsIPL2); + end + add(Site_ENG,ChartRLvsIPL_ENG); + add(Site_ENG,ChartRLvsIPL_ENG_cap); + add(Site_ENG,br); + close(figure(23)); + end + escludiIPL = 1; + end + end + % --- Spostamenti Tilt Link o In Place Link - clinometri - fessurimetri --- + if sum(rTL) > 0 && exist('GI_Disp_TL','var') && sum(rKL) > 0 && exist('GI_Angolo_KL','var') || ... + sum(rIPL) > 0 && exist('GI_Disp_IPL','var') && sum(rKL) > 0 && exist('GI_Angolo_KL','var') || ... + sum(rTL) > 0 && exist('GI_Disp_TL','var') && sum(rCrL) > 0 && exist('GI_Disp_CrL','var') || ... + sum(rIPL) > 0 && exist('GI_Disp_IPL','var') && sum(rCrL) > 0 && exist('GI_Disp_CrL','var') || ... + sum(rCrL) > 0 && exist('GI_Disp_CrL','var') && sum(rKL) > 0 && exist('GI_Angolo_KL','var') + if isempty(GI_Disp_TL) == 0 && isempty(GI_Angolo_KL) == 0 || ... + isempty(GI_Disp_IPL) == 0 && isempty(GI_Angolo_KL) == 0 || ... + isempty(GI_Disp_TL) == 0 && isempty(GI_Disp_CrL) == 0 || ... + isempty(GI_Disp_IPL) == 0 && isempty(GI_Disp_CrL) == 0 || ... + isempty(GI_Disp_CrL) == 0 && isempty(GI_Angolo_KL) == 0 + figure(25) + hold on + grid on + if sum(rTL) > 0 && sum(rKL) > 0 && sum(rCrL) > 0 % Ci sono Tilt + Klino + Crack + sezGrafTLvsKL = Heading2('Correlazioni tra sensori Tilt Link V, Klino Link e Crack Link'); + testoTLvsKL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra '... + 'i maggiori spostamenti differenziali registrati per ogni Array dai sensori MEMS 3D, '... + 'la massima inclinazione differenziale lungo gli assi strumentali registrata '... + 'dai clinometri e la maggior apertura o chiusura rilevata dai fessurimetri presenti in sito.']); + title('Valori massimi dei sensori Tilt, Klino e Crack Link'); + ChartTLvsKL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'tra i dati differenziali massimi di spostamento, inclinazione ed apertura '... + 'o chiusura di fessure registrati rispettivamente dai sensori inclinometrici, '... + 'clinometrici e fessurimetri di ogni singolo Array, nel periodo temporale di riferimento']); + elseif sum(rIPL) > 0 && sum(rKL) > 0 && sum(rCrL) > 0 % Ci sono In Place + Klino + Crack + sezGrafTLvsKL = Heading2('Correlazioni tra sensori In Place Link, Klino Link e Crack Link'); + testoTLvsKL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra '... + 'i maggiori spostamenti differenziali registrati per ogni Array dai sensori MEMS 3D, '... + 'la massima inclinazione differenziale lungo gli assi strumentali registrata '... + 'dai clinometri e la maggior apertura o chiusura rilevata dai fessurimetri presenti in sito.']); + title('Valori massimi dei sensori In Place, Klino e Crack Link'); + ChartTLvsKL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'tra i dati differenziali massimi di spostamento, inclinazione ed apertura '... + 'o chiusura di fessure registrati rispettivamente dai sensori inclinometrici, '... + 'clinometrici e fessurimetri di ogni singolo Array, nel periodo temporale di riferimento']); + elseif sum(rTL) > 0 && sum(rKL) > 0 % Tilt + Klino + sezGrafTLvsKL = Heading2('Correlazioni tra sensori Tilt Link V e Klino Link'); + testoTLvsKL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra '... + 'i maggiori spostamenti differenziali registrati per ogni Array dai sensori MEMS 3D '... + 'e la massima inclinazione differenziale lungo gli assi strumentali registrata '... + 'dai clinometri presenti in sito.']); + title('Valori massimi dei sensori Tilt e Klino Link'); + ChartTLvsKL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'tra i dati differenziali massimi di spostamento e di inclinazione '... + 'registrati rispettivamente dai sensori inclinometrici e '... + 'clinometrici di ogni singolo Array, nel periodo temporale di riferimento']); + elseif sum(rIPL) > 0 && sum(rKL) > 0 % In Place + Klino + sezGrafTLvsKL = Heading2('Correlazioni tra sensori In Place Link e Klino Link'); + testoTLvsKL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra '... + 'i maggiori spostamenti differenziali registrati per ogni Array dai sensori MEMS 3D '... + 'e la massima inclinazione differenziale lungo gli assi strumentali registrata '... + 'dai clinometri presenti in sito.']); + title('Valori massimi dei sensori In Place e Klino Link'); + ChartTLvsKL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'tra i dati differenziali massimi di spostamento e di inclinazione '... + 'registrati rispettivamente dai sensori inclinometrici e '... + 'clinometrici di ogni singolo Array, nel periodo temporale di riferimento']); + elseif sum(rTL) > 0 && sum(rCrL) > 0 % Tilt e Crack + sezGrafTLvsKL = Heading2('Correlazioni tra sensori Tilt Link V e Crack Link'); + testoTLvsKL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra '... + 'i maggiori spostamenti differenziali registrati per ogni Array dai sensori MEMS 3D '... + 'e la maggior apertura o chiusura rilevata dai fessurimetri presenti in sito.']); + title('Valori massimi dei sensori Tilt e Crack Link'); + ChartTLvsKL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'tra i dati differenziali massimi di spostamento ed apertura '... + 'o chiusura di fessure registrati rispettivamente dai sensori inclinometrici '... + 'e fessurimetri di ogni singolo Array, nel periodo temporale di riferimento']); + elseif sum(rIPL) > 0 && sum(rCrL) > 0 % In Place e Crack + sezGrafTLvsKL = Heading2('Correlazioni tra sensori In Place Link e Crack Link'); + testoTLvsKL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra '... + 'i maggiori spostamenti differenziali registrati per ogni Array dai sensori MEMS 3D '... + 'e la maggior apertura o chiusura rilevata dai fessurimetri presenti in sito.']); + title('Valori massimi dei sensori Tilt e Crack Link'); + ChartTLvsKL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'tra i dati differenziali massimi di spostamento ed apertura '... + 'o chiusura di fessure registrati rispettivamente dai sensori inclinometrici '... + 'e fessurimetri di ogni singolo Array, nel periodo temporale di riferimento']); + elseif sum(rKL) > 0 && sum(rCrL) > 0 + sezGrafTLvsKL = Heading2('Correlazioni tra sensori Klino Link e Crack Link'); + testoTLvsKL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra '... + 'la massima inclinazione differenziale rilevata lungo gli assi strumentali '... + 'dei clinometri e la maggior apertura o chiusura rilevata dai fessurimetri presenti in sito.']); + title('Valori massimi dei sensori Klino e Crack Link'); + ChartTLvsKL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'tra i dati differenziali massimi di inclinazione ed apertura '... + 'o chiusura di fessure registrati rispettivamente dai sensori '... + 'clinometrici e fessurimetri di ogni singolo Array, nel periodo temporale di riferimento']); + end + sezGrafTLvsKL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoTLvsKL.HAlign = 'justify'; + + yyaxis left + ylabel('Spostamento [mm]'); + set(gca,'YColor','k') + yyaxis right + ylabel(['Inclinazione [' char(176) ']']); + set(gca,'YColor','k') + xlabel('Data [gg/mm/aaaa]'); + [~,colTL] = size(GI_Disp_TL); + [~,colIPL] = size(GI_Disp_IPL); + [~,colKL] = size(GI_Date_KL); + [~,colCrL] = size(GI_Date_CrL); + num = 1; + cmap = lines(2*colKL+colTL+colIPL+colCrL); + cont = 1; + % Tilt Link V + indexTL = []; + if sum(rTL) > 0 + yyaxis left + for t = 1:colTL + if GI_Date_TL(1,t) ~= 0 + ind_TL = find(GI_Date_TL(:,t)); + indexTL = [indexTL; t]; + plot(GI_Date_TL(1:ind_TL(end),t),GI_Disp_TL(1:ind_TL(end),t),'-','Color',cmap(cont,:)); + cont = cont+1; + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_TL(1,t)) ' m']); + num = num+1; + end + end + MIN(1) = min(min(GI_Disp_TL)); + MAX(1) = max(max(GI_Disp_TL)); + end + % In Place Link + indexIPL = []; + if sum(rIPL) > 0 + yyaxis left + for t = 1:colIPL + if GI_Date_IPL(1,t) ~= 0 + ind_IPL = find(GI_Date_IPL(:,t)); + indexIPL = [indexIPL; t]; + plot(GI_Date_IPL(1:ind_IPL(end),t),GI_Disp_IPL(1:ind_IPL(end),t),'-','Color',cmap(cont,:)); + cont = cont+1; + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_IPL(1,t)) ' m']); + num = num+1; + end + end + MIN(2) = min(min(GI_Disp_IPL)); + MAX(2) = max(max(GI_Disp_IPL)); + end + % Crack Link + indexCrL = []; + if sum(rCrL) > 0 + yyaxis left + for c = 1:colCrL + if GI_Date_CrL(1,c) ~= 0 + var = GI_Disp_CrL-GI_Disp_CrL(1,:); + ind_CrL = find(GI_Date_CrL(:,c)); + indexCrL = [indexCrL; c]; + if sum(rKL) > 0 + plot(GI_Date_CrL(1:ind_CrL(end),c),var(1:ind_CrL(end),c),'-','Color',cmap(cont,:)); + else + GI_KlinoLink = plot(GI_Date_CrL(1:ind_CrL(end),c),var(1:ind_CrL(end),c),'-','Color',cmap(cont,:)); + end + cont = cont+1; + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(c,4)) ' nodo ' num2str(GI_Num_CrL(1,c))]); + num = num+1; + end + end + MIN(3) = min(min(var)); + MAX(3) = max(max(var)); + ylim([floor(min(min(MIN))) ceil(max(max(MAX)))]); + end + + % Klino Link + indexKL = []; + if sum(rKL) > 0 + yyaxis right + kk = 1; + for k = 1:colKL + if GI_Date_KL(1,k) ~= 0 + ind_KL = find(GI_Date_KL(:,k)); + indexKL = [indexKL; k]; + plot(GI_Date_KL(1:ind_KL(end),k),GI_Angolo_KL(1:ind_KL(end),kk)... + -GI_Angolo_KL(1,kk),'-','Color',cmap(cont,:)); + GI_KlinoLink = plot(GI_Date_KL(1:ind_KL(end),k),GI_Angolo_KL(1:ind_KL(end)... + ,kk+1)-GI_Angolo_KL(1,kk+1),'-','Color',cmap(cont+1,:)); + cont = cont+2; + kk = kk+2; + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(k,4)) ' nodo ' num2str(GI_Num_KL(1,k)) ' asse X']); + str(1,num+1) = cellstr([char(chainID(k,4)) ' nodo ' num2str(GI_Num_KL(1,k)) ' asse Y']); + num = num+2; + end + end + yyaxis right + ylim([floor(min(min(GI_Angolo_KL))) ceil(max(max(GI_Angolo_KL)))]); + end + + numcolumns = 1; + [legend_h,object_h,plot_h,text_strings] = columnlegend(numcolumns,str,'Location','NorthWest'); + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-TLvsKL.png')); + if titleCha == 0 + sezSITE = Heading1('Correlazioni fra i diversi sensori presenti in sito'); + sezSITE.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site.Title = sezSITE; + spazio = Paragraph(''); + add(Site,spazio); + if activeEN == 1 + sezSITE_ENG = Heading1('Correlations between different sensors installed on site'); + sezSITE_ENG.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site_ENG.Title = sezSITE_ENG; + spazio = Paragraph(''); + add(Site_ENG,spazio); + end + titleCha = 1; + end + add(Site,sezGrafTLvsKL); + add(Site,testoTLvsKL); + saveas(GI_KlinoLink,TempName); + ChartTLvsKL = Image(TempName); + ChartTLvsKL.Style = {ScaleToFit}; + + FIG = FIG+1; + ChartTLvsKL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = 'I dati sono riferiti alle misure dei sensori riportati di seguito: '; + testoTL2 = Paragraph(text); + testoTL2.HAlign = 'justify'; + add(Site,testoTL2); + % Tilt Link + I = size(indexTL); + for a = 1:I(1) + text = ['- Array ',char(chainID(indexTL(a),4)),' - MEMS a ',num2str(abs(GI_Prof_TL(1,indexTL(a)))),' m da P.C.']; + testoTL2 = Paragraph(text); + add(Site,testoTL2); + end + % In Place Link + I = size(indexIPL); + for a = 1:I(1) + text = ['- Array ',char(chainID(indexIPL(a),4)),' - MEMS a ',num2str(abs(GI_Prof_IPL(1,indexIPL(a)))),' m da P.C.']; + testoTL2 = Paragraph(text); + add(Site,testoTL2); + end + % Klino Link + I = size(indexKL); + for a = 1:I(1) + text = ['- Array ',char(chainID(indexKL(a),4)),' - Clinometro numero ',num2str(GI_Num_KL(1,indexKL(a)))]; + testoTL2 = Paragraph(text); + add(Site,testoTL2); + end + % Crack Link + I = size(indexCrL); + for a = 1:I(1) + text = ['- Array ',char(chainID(indexCrL(a),4)),' - Fessurimetro numero ',num2str(GI_Num_CrL(1,indexCrL(a)))]; + testoTL2 = Paragraph(text); + add(Site,testoTL2); + end + add(Site,ChartTLvsKL); + add(Site,ChartTLvsKL_cap); + add(Site,br); + close(figure(25)); + + % --- ENG --- + if activeEN == 1 + figure(35) + hold on + grid on + if sum(rTL) > 0 && sum(rKL) > 0 && sum(rCrL) > 0 % Ci sono Tilt + Klino + Crack + sezGrafTLvsKL_ENG = Heading2('Correlation between sensors: Tilt Link V, Klino Link, and Crack Link'); + testoTLvsKL = Paragraph(['The following graph has the objective to '... + 'highlight the presence of correlations between '... + 'the maximum differential displacements recorded for each Array by 3D MEMS sensors, '... + 'the maximum differential tilt recorded by tilt meters along the instrumental axes, '... + 'and the maximum crack opening variation measured by crack meters installed on site.']); + title('Maximum values recorded by Tilt, Klino, and Crack Links'); + ChartTLvsKL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between '... + 'maximum differential displacements, tilt, and crack opening data'... + 'recorded during the reference time period respectively by '... + 'Tilt Link, Klino Link, and Crack Link sensors integrated in each single Array']); + elseif sum(rIPL) > 0 && sum(rKL) > 0 && sum(rCrL) > 0 % Ci sono In Place + Klino + Crack + sezGrafTLvsKL_ENG = Heading2('Correlation between sensors: In Place Link, Klino Link, and Crack Link'); + testoTLvsKL = Paragraph(['The following graph has the objective to '... + 'highlight the presence of correlations between '... + 'the maximum differential displacements recorded for each Array by 3D MEMS sensors, '... + 'the maximum differential tilt recorded by tilt meters along the instrumental axes, '... + 'and the maximum crack opening variation measured by crack meters installed on site.']); + title('Maximum values recorded by In Place, Klino, and Crack Links'); + ChartTLvsKL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between '... + 'maximum differential displacements, tilt, and crack opening data'... + 'recorded during the reference time period respectively by '... + 'In Place Link, Klino Link, and Crack Link sensors integrated in each single Array']); + elseif sum(rTL) > 0 && sum(rKL) > 0 % Tilt + Klino + sezGrafTLvsKL_ENG = Heading2('Correlation between sensors: Tilt Link V and Klino Link'); + testoTLvsKL = Paragraph(['The following graph has the objective to '... + 'highlight the presence of correlations between '... + 'the maximum differential displacements recorded for each Array by 3D MEMS sensors, and '... + 'the maximum differential tilt recorded along the instrumental axes by the tilt meters '... + 'installed on site.']); + title('Maximum values recorded by Tilt Link and Klino Link'); + ChartTLvsKL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between '... + 'maximum differential displacements and tilt data'... + 'recorded during the reference time period respectively by '... + 'Tilt Link and Klino Link sensors integrated in each single Array']); + elseif sum(rIPL) > 0 && sum(rKL) > 0 % In Place + Klino + sezGrafTLvsKL_ENG = Heading2('Correlation between sensors: In Place Link and Klino Link'); + testoTLvsKL = Paragraph(['The following graph has the objective to '... + 'highlight the presence of correlations between '... + 'the maximum differential displacements recorded for each Array by 3D MEMS sensors, and '... + 'the maximum differential tilt recorded along the instrumental axes by the tilt meters '... + 'installed on site.']); + title('Maximum values recorded by In Place Link and Klino Link'); + ChartTLvsKL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between '... + 'maximum differential displacements and tilt data'... + 'recorded during the reference time period respectively by '... + 'In Place Link and Klino Link sensors integrated in each single Array']); + elseif sum(rTL) > 0 && sum(rCrL) > 0 % Tilt e Crack + sezGrafTLvsKL_ENG = Heading2('Correlation between sensors: Tilt Link V and Crack Link'); + testoTLvsKL = Paragraph(['The following graph has the objective to '... + 'highlight the presence of correlations between '... + 'the maximum differential displacements recorded for each Array by 3D MEMS sensors, '... + 'and the maximum crack opening variation measured by crack meters installed on site.']); + title('Maximum values recorded by Tilt and Crack Links'); + ChartTLvsKL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between '... + 'maximum differential displacements and crack opening data'... + 'recorded during the reference time period respectively by '... + 'Tilt Link and Crack Link sensors integrated in each single Array']); + elseif sum(rIPL) > 0 && sum(rCrL) > 0 % In Place e Crack + sezGrafTLvsKL_ENG = Heading2('Correlation between sensors: In Place and Crack Link'); + testoTLvsKL = Paragraph(['The following graph has the objective to '... + 'highlight the presence of correlations between '... + 'the maximum differential displacements recorded for each Array by 3D MEMS sensors, '... + 'and the maximum crack opening variation measured by crack meters installed on site.']); + title('Maximum values recorded by In Place and Crack Links'); + ChartTLvsKL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between '... + 'maximum differential displacements and crack opening data'... + 'recorded during the reference time period respectively by '... + 'In Place Link and Crack Link sensors integrated in each single Array']); + elseif sum(rKL) > 0 && sum(rCrL) > 0 + sezGrafTLvsKL_ENG = Heading2('Correlation between sensors: Klino Link and Crack Link'); + testoTLvsKL = Paragraph(['The following graph has the objective to '... + 'highlight the presence of correlations between '... + 'the maximum differential tilt recorded by tilt meters along the instrumental axes '... + 'and the maximum crack opening variation measured by crack meters installed on site.']); + title('Maximum values recorded by Klino and Crack Links'); + ChartTLvsKL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between '... + 'tilt and crack opening data'... + 'recorded during the reference time period respectively by '... + 'Klino Link and Crack Link sensors integrated in each single Array']); + end + sezGrafTLvsKL_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoTLvsKL.HAlign = 'justify'; + + yyaxis left + ylabel('Displacement [mm]'); + set(gca,'YColor','k') + yyaxis right + ylabel(['Tilt [' char(176) ']']); + set(gca,'YColor','k') + xlabel('Date [dd/mm/yyyy]'); + [~,colTL] = size(GI_Disp_TL); + [~,colIPL] = size(GI_Disp_IPL); + [~,colKL] = size(GI_Date_KL); + [~,colCrL] = size(GI_Date_CrL); + num = 1; + cmap = lines(2*colKL+colTL+colIPL+colCrL); + cont = 1; + % Tilt Link V + indexTL = []; + if sum(rTL) > 0 + yyaxis left + for t = 1:colTL + if GI_Date_TL(1,t) ~= 0 + ind_TL = find(GI_Date_TL(:,t)); + indexTL = [indexTL; t]; + plot(GI_Date_TL(1:ind_TL(end),t),GI_Disp_TL(1:ind_TL(end),t),'-','Color',cmap(cont,:)); + cont = cont+1; + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_TL(1,t)) ' m']); + num = num+1; + end + end + MIN(1) = min(min(GI_Disp_TL)); + MAX(1) = max(max(GI_Disp_TL)); + end + % In Place Link + indexIPL = []; + if sum(rIPL) > 0 + yyaxis left + for t = 1:colIPL + if GI_Date_IPL(1,t) ~= 0 + ind_IPL = find(GI_Date_IPL(:,t)); + indexIPL = [indexIPL; t]; + plot(GI_Date_IPL(1:ind_IPL(end),t),GI_Disp_IPL(1:ind_IPL(end),t),'-','Color',cmap(cont,:)); + cont = cont+1; + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_IPL(1,t)) ' m']); + num = num+1; + end + end + MIN(2) = min(min(GI_Disp_IPL)); + MAX(2) = max(max(GI_Disp_IPL)); + end + % Crack Link + indexCrL = []; + if sum(rCrL) > 0 + yyaxis left + for c = 1:colCrL + if GI_Date_CrL(1,c) ~= 0 + var = GI_Disp_CrL-GI_Disp_CrL(1,:); + ind_CrL = find(GI_Date_CrL(:,c)); + indexCrL = [indexCrL; c]; + if sum(rKL) > 0 + plot(GI_Date_CrL(1:ind_CrL(end),c),var(1:ind_CrL(end),c),'-','Color',cmap(cont,:)); + else + GI_KlinoLink = plot(GI_Date_CrL(1:ind_CrL(end),c),var(1:ind_CrL(end),c),'-','Color',cmap(cont,:)); + end + cont = cont+1; + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(c,4)) ' node ' num2str(GI_Num_CrL(1,c))]); + num = num+1; + end + end + MIN(3) = min(min(var)); + MAX(3) = max(max(var)); + ylim([floor(min(min(MIN))) ceil(max(max(MAX)))]); + end + + % Klino Link + indexKL = []; + if sum(rKL) > 0 + yyaxis right + kk = 1; + for k = 1:colKL + if GI_Date_KL(1,k) ~= 0 + ind_KL = find(GI_Date_KL(:,k)); + indexKL = [indexKL; k]; + plot(GI_Date_KL(1:ind_KL(end),k),GI_Angolo_KL(1:ind_KL(end),kk)... + -GI_Angolo_KL(1,kk),'-','Color',cmap(cont,:)); + GI_KlinoLink = plot(GI_Date_KL(1:ind_KL(end),k),GI_Angolo_KL(1:ind_KL(end)... + ,kk+1)-GI_Angolo_KL(1,kk+1),'-','Color',cmap(cont+1,:)); + cont = cont+2; + kk = kk+2; + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(k,4)) ' node ' num2str(GI_Num_KL(1,k)) ' - X axis']); + str(1,num+1) = cellstr([char(chainID(k,4)) ' node ' num2str(GI_Num_KL(1,k)) ' - Y axis']); + num = num+2; + end + end + yyaxis right + ylim([floor(min(min(GI_Angolo_KL))) ceil(max(max(GI_Angolo_KL)))]); + end + + numcolumns = 1; + [legend_h,object_h,plot_h,text_strings] = columnlegend(numcolumns,str,'Location','NorthWest'); + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-TLvsKL_ENG.png')); + + add(Site_ENG,sezGrafTLvsKL_ENG); + add(Site_ENG,testoTLvsKL); + saveas(GI_KlinoLink,TempName); + ChartTLvsKL_ENG = Image(TempName); + ChartTLvsKL_ENG.Style = {ScaleToFit}; + + FIG_ENG = FIG_ENG+1; + ChartTLvsKL_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = 'Monitoring data refer to the sensors listed below: '; + testoTL2 = Paragraph(text); + testoTL2.HAlign = 'justify'; + add(Site_ENG,testoTL2); + % Tilt Link + I = size(indexTL); + for a = 1:I(1) + text = ['- Array ',char(chainID(indexTL(a),4)),' - MEMS located ',num2str(abs(GI_Prof_TL(1,indexTL(a)))),' m b.g.l.']; + testoTL2 = Paragraph(text); + add(Site_ENG,testoTL2); + end + % In Place Link + I = size(indexIPL); + for a = 1:I(1) + text = ['- Array ',char(chainID(indexIPL(a),4)),' - MEMS located ',num2str(abs(GI_Prof_IPL(1,indexIPL(a)))),' m b.g.l.']; + testoTL2 = Paragraph(text); + add(Site_ENG,testoTL2); + end + % Klino Link + I = size(indexKL); + for a = 1:I(1) + text = ['- Array ',char(chainID(indexKL(a),4)),' - Tilt meter ',num2str(GI_Num_KL(1,indexKL(a)))]; + testoTL2 = Paragraph(text); + add(Site_ENG,testoTL2); + end + % Crack Link + I = size(indexCrL); + for a = 1:I(1) + text = ['- Array ',char(chainID(indexCrL(a),4)),' - Crack meter ',num2str(GI_Num_CrL(1,indexCrL(a)))]; + testoTL2 = Paragraph(text); + add(Site_ENG,testoTL2); + end + add(Site_ENG,ChartTLvsKL_ENG); + add(Site_ENG,ChartTLvsKL_ENG_cap); + add(Site_ENG,br); + close(figure(35)); + end + end + escludiTL = 1; + end + + % --- Spostamenti a confronto --- + % ---> Tilt Link + if sum(rTL) > 0 && exist('GI_Disp_TL','var') + if isempty(GI_Disp_TL) == 0 + if escludiTL == 0 + sezGrafTL = Heading2('Correlazioni tra sensori Tilt Link V'); + sezGrafTL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoTL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra '... + 'i maggiori spostamenti registrati per ogni Array dai sensori MEMS 3D '... + 'presenti in sito.']); + testoTL.HAlign = 'justify'; + figure(24) + ylabel('Spostamento [mm]'); + set(gca,'YColor','k') + title('Correlazione fra gli spostamenti massimi di ogni Array'); + xlabel('Data [gg/mm/aaaa]'); + [~,colTL] = size(GI_Disp_TL); + num = 1; + index = []; + for t = 1:colTL + if GI_Date_TL(1,t) ~= 0 + ind_TL = find(GI_Date_TL(:,t)); + index = [index; t]; + hold on + grid on + GI_TiltLink = plot(GI_Date_TL(1:ind_TL(end),t),GI_Disp_TL(1:ind_TL(end),t)); + h = gca; + h.XAxis.MinorTick = 'on'; + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_TL(1,t)) ' m']); + num = num+1; + end + end + Max = max(GI_Disp_TL(1:ind_TL(end),:)); + MAX = max(Max); + if MAX < 10 % mm + ylim([0 10]); + end + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + legend(str,'Location','northwest'); + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-TL.png')); + if num >= 3 + if titleCha == 0 + sezSITE = Heading1('Correlazioni fra i diversi sensori presenti in sito'); + sezSITE.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site.Title = sezSITE; + spazio = Paragraph(''); + add(Site,spazio); + if activeEN == 1 + sezSITE_ENG = Heading1('Correlations between different sensors installed on site'); + sezSITE_ENG.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site_ENG.Title = sezSITE_ENG; + spazio = Paragraph(''); + add(Site_ENG,spazio); + end + titleCha = 1; + end + add(Site,sezGrafTL); + add(Site,testoTL); + saveas(GI_TiltLink,TempName); + ChartTL = Image(TempName); + ChartTL.Style = {ScaleToFit}; + ChartTL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'tra i dati massimi di spostamento registrati da ogni singolo Array nel periodo temporale di riferimento']); + FIG = FIG+1; + ChartTL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = 'Gli spostamenti sono riferiti alle misure dei sensori riportati di seguito: '; + testoTL2 = Paragraph(text); + testoTL2.HAlign = 'justify'; + add(Site,testoTL2); + I = size(index); + for a = 1:I(1) + text = ['- Array ',char(chainID(index(a),4)),' - MEMS a ',num2str(abs(GI_Prof_TL(1,index(a)))),' m da P.C.']; + testoTL2 = Paragraph(text); + add(Site,testoTL2); + end + add(Site,ChartTL); + add(Site,ChartTL_cap); + add(Site,br); + end + close(figure(24)); + + % -- ENG -- + if activeEN == 1 + sezGrafTL_ENG = Heading2('Correlation between Tilt Link V sensors'); + sezGrafTL_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoTL = Paragraph(['The following graph aims to highlight the presence '... + 'of correlations between the most relevant displacements recorded by '... + '3D MEMS sensors for each single Array installed on site.']); + testoTL.HAlign = 'justify'; + figure(34) + ylabel('Displacement [mm]'); + set(gca,'YColor','k') + title('Correlation between maximum displacements recorded by each Array'); + xlabel('Date [dd/mm/yyyy]'); + [~,colTL] = size(GI_Disp_TL); + num = 1; + index = []; + for t = 1:colTL + if GI_Date_TL(1,t) ~= 0 + ind_TL = find(GI_Date_TL(:,t)); + index = [index; t]; + hold on + grid on + GI_TiltLink = plot(GI_Date_TL(1:ind_TL(end),t),GI_Disp_TL(1:ind_TL(end),t)); + h = gca; + h.XAxis.MinorTick = 'on'; + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_TL(1,t)) ' m']); + num = num+1; + end + end + Max = max(GI_Disp_TL(1:ind_TL(end),:)); + MAX = max(Max); + if MAX < 10 % mm + ylim([0 10]); + end + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + legend(str,'Location','northwest'); + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-TL_ENG.png')); + if num >= 3 + add(Site_ENG,sezGrafTL_ENG); + add(Site_ENG,testoTL); + saveas(GI_TiltLink,TempName); + ChartTL_ENG = Image(TempName); + ChartTL_ENG.Style = {ScaleToFit}; + ChartTL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between maximum '... + 'displacement data recorded by each Array during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartTL_ENG_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = 'Displacement data refers to the 3D MEMS sensors listed below: '; + testoTL2 = Paragraph(text); + testoTL2.HAlign = 'justify'; + add(Site_ENG,testoTL2); + I = size(index); + for a = 1:I(1) + text = ['- Array ',char(chainID(index(a),4)),' - MEMS located ',num2str(abs(GI_Prof_TL(1,index(a)))),' m b.g.l.']; + testoTL2 = Paragraph(text); + add(Site_ENG,testoTL2); + end + add(Site_ENG,ChartTL_ENG); + add(Site_ENG,ChartTL_ENG_cap); + add(Site_ENG,br); + end + close(figure(34)); + end + end + end + end + % ---> In Place Link + if sum(rIPL) > 0 && exist('GI_Disp_IPL','var') + if isempty(GI_Disp_IPL) == 0 + if escludiIPL == 0 + sezGrafIPL = Heading2('Correlazioni tra sensori In Place Link'); + sezGrafIPL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoIPL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra '... + 'i maggiori spostamenti registrati per ogni Array dai sensori MEMS 3D '... + 'presenti in sito.']); + testoIPL.HAlign = 'justify'; + figure(24) + ylabel('Spostamento [mm]'); + set(gca,'YColor','k') + title('Correlazione fra gli spostamenti massimi di ogni Array'); + xlabel('Data [gg/mm/aaaa]'); + [~,colIPL] = size(GI_Disp_IPL); + num = 1; + index = []; + for t = 1:colIPL + if GI_Date_IPL(1,t) ~= 0 + ind_IPL = find(GI_Date_IPL(:,t)); + index = [index; t]; + hold on + grid on + GI_InPlaceLink = plot(GI_Date_IPL(1:ind_IPL(end),t),GI_Disp_IPL(1:ind_IPL(end),t)); + h = gca; + h.XAxis.MinorTick = 'on'; + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_IPL(1,t)) ' m']); + num = num+1; + end + end + Max = max(GI_Disp_IPL(1:ind_IPL(end),:)); + MAX = max(Max); + if MAX < 10 % mm + ylim([0 10]); + end + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + legend(str,'Location','northwest'); + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-IPL.png')); + if num >= 3 + if titleCha == 0 + sezSITE = Heading1('Correlazioni fra i diversi sensori presenti in sito'); + sezSITE.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site.Title = sezSITE; + spazio = Paragraph(''); + add(Site,spazio); + if activeEN == 1 + sezSITE_ENG = Heading1('Correlations between different sensors installed on site'); + sezSITE_ENG.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site_ENG.Title = sezSITE_ENG; + spazio = Paragraph(''); + add(Site_ENG,spazio); + end + titleCha = 1; + end + add(Site,sezGrafIPL); + add(Site,testoIPL); + saveas(GI_InPlaceLink,TempName); + ChartIPL = Image(TempName); + ChartIPL.Style = {ScaleToFit}; + ChartIPL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'tra i dati massimi di spostamento registrati da ogni '... + 'singolo Array nel periodo temporale di riferimento']); + FIG = FIG+1; + ChartIPL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = 'Gli spostamenti sono riferiti alle misure dei sensori riportati di seguito: '; + testoIPL2 = Paragraph(text); + testoIPL2.HAlign = 'justify'; + add(Site,testoIPL2); + I = size(index); + for a = 1:I(1) + text = ['- Array ',char(chainID(index(a),4)),' - MEMS a ',num2str(abs(GI_Prof_IPL(1,index(a)))),' m da P.C.']; + testoIPL2 = Paragraph(text); + add(Site,testoIPL2); + end + add(Site,ChartIPL); + add(Site,ChartIPL_cap); + add(Site,br); + end + close(figure(24)); + + % --- ENG --- + if activeEN == 1 + sezGrafIPL_ENG = Heading2('Correlation between Tilt Link V sensors'); + sezGrafIPL_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoIPL = Paragraph(['The following graph aims to highlight the presence '... + 'of correlations between the most relevant displacements recorded by '... + '3D MEMS sensors for each single Array installed on site.']); + testoIPL.HAlign = 'justify'; + figure(34) + ylabel('Displacement [mm]'); + set(gca,'YColor','k') + title('Correlation between maximum displacements recorded by each Array'); + xlabel('Date [dd/mm/yyyy]'); + [~,colIPL] = size(GI_Disp_IPL); + num = 1; + index = []; + for t = 1:colIPL + if GI_Date_IPL(1,t) ~= 0 + ind_IPL = find(GI_Date_IPL(:,t)); + index = [index; t]; + hold on + grid on + GI_InPlaceLink = plot(GI_Date_IPL(1:ind_IPL(end),t),GI_Disp_IPL(1:ind_IPL(end),t)); + h = gca; + h.XAxis.MinorTick = 'on'; + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_IPL(1,t)) ' m']); + num = num+1; + end + end + Max = max(GI_Disp_IPL(1:ind_IPL(end),:)); + MAX = max(Max); + if MAX < 10 % mm + ylim([0 10]); + end + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + legend(str,'Location','northwest'); + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-IPL_ENG.png')); + if num >= 3 + add(Site_ENG,sezGrafIPL_ENG); + add(Site_ENG,testoIPL); + saveas(GI_InPlaceLink,TempName); + ChartIPL_ENG = Image(TempName); + ChartIPL_ENG.Style = {ScaleToFit}; + ChartIPL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between maximum '... + 'displacement data recorded by each Array during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartIPL_ENG_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = 'Displacement data refers to the 3D MEMS sensors listed below: '; + testoIPL2 = Paragraph(text); + testoIPL2.HAlign = 'justify'; + add(Site_ENG,testoIPL2); + I = size(index); + for a = 1:I(1) + text = ['- Array ',char(chainID(index(a),4)),' - MEMS located ',num2str(abs(GI_Prof_IPL(1,index(a)))),' m b.g.l.']; + testoIPL2 = Paragraph(text); + add(Site_ENG,testoIPL2); + end + add(Site_ENG,ChartIPL_ENG); + add(Site_ENG,ChartIPL_ENG_cap); + add(Site_ENG,br); + end + close(figure(34)); + end + end + end + end + %---> Quadranti Tunnel Link + if sum(rTuL) > 0 && exist('GI_Q1_TuL','var') + if isempty(GI_Q1_TuL) == 0 && isempty(GI_Q2_TuL) == 0 && isempty(GI_Q3_TuL) == 0 ... + && isempty(GI_Q4_TuL) == 0 + if titleCha == 0 + sezSITE = Heading1('Correlazioni fra i diversi sensori presenti in sito'); + sezSITE.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site.Title = sezSITE; + spazio = Paragraph(''); + add(Site,spazio); + if activeEN == 1 + sezSITE_ENG = Heading1('Correlations between different sensors installed on site'); + sezSITE_ENG.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site_ENG.Title = sezSITE_ENG; + spazio = Paragraph(''); + add(Site_ENG,spazio); + end + titleCha = 1; + end + sezGrafTuL = Heading2('Correlazioni tra sensori Tunnel Link'); + sezGrafTuL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoTuL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra '... + 'i maggiori spostamenti 2D registrati nel piano della sezione '... + 'dai sensori MEMS 3D installati in sito, per ogni quadrante '... + 'delle sezioni monitorate. Si ricorda che '... + 'i quadranti sono definiti suddividendo la sezione in quattro '... + 'zone, considerando le linee di mezzeria e mezza altezza. '... + 'L''ordine dei quadranti segue il principio della circonferenza '... + 'goniometrica, per cui il primo quadrante ' char(232) ' quello presente in alto '... + 'a destra e gli altri sono numerati in senso antiorario. '... + 'A titolo di esempio, la figura successiva identifica i 4 quadranti '... + 'per una sezione tipo.']); + testoTuL.HAlign = 'justify'; + img = Image(('Quadranti.png')); + img.Style = {Height('6cm'),HAlign('center')}; + imgcaption = Paragraph(['Fig. ' num2str(FIG) ' - Esempio di sezione tipo con relativi quadranti']); + FIG = FIG+1; + imgcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + % Quadrante 1 + figure(25) + set(gca,'YColor','k') + [~,colTuL] = size(GI_Q1_TuL); + num = 1; + for t = 1:colTuL + if GI_Date_TuL(1,t) ~= 0 + y1(num) = GI_Q1_TuL(1,t); + y2(num) = GI_Q2_TuL(1,t); + y3(num) = GI_Q3_TuL(1,t); + y4(num) = GI_Q4_TuL(1,t); + y5(num) = 0; + str(1,num) = chainID(t,4); + num = num+1; + end + end + y = [y1;y2;y3;y4;y5]; + x = [1;2;3;4;5]; + Quadranti = barh(x,y); + grid on + + title('Correlazione fra gli spostamenti dei singoli quadranti'); + xlabel('Spostamento [mm]'); + ylabel('Quadrante [-]'); + ylim([0 5]); % Con 5, metto la legenda in alto a sx (il valore 5 è pieno di 0) + % Stimo limiti asse X + ini1 = min(GI_Q1_TuL); + ini2 = min(GI_Q2_TuL); + ini3 = min(GI_Q3_TuL); + ini4 = min(GI_Q4_TuL); + Min = [ini1; ini2; ini3; ini4]; + C = min(Min); + end1 = max(GI_Q1_TuL); + end2 = max(GI_Q2_TuL); + end3 = max(GI_Q3_TuL); + end4 = max(GI_Q4_TuL); + Max = [end1; end2; end3; end4]; + B = max(Max); + A = [abs(C),abs(B)]; + LIM = max(A); + POS = find(A == LIM); + if -LIM > -2.5 % mm + ini = -2.5; + else + ini = -LIM; + end + if LIM < 2.5 + End = 2.5; + else + End = LIM; + end + xlim([ini End]); + if num-1 == 1 % 1 solo array + ylim([0 5]); + else + ylim([0 6]); + end + yticks(1:4); + if POS == 1 % Legenda a DX + legend(str,'Location','northeast'); + else % SX + legend(str,'Location','northwest'); + end + + add(Site,sezGrafTuL); + add(Site,testoTuL); + add(Site,img); + add(Site,imgcaption); + + TempName1 = char(strcat('Report',siteID,'-', char(toolrif),'-Quadranti.png')); + saveas(Quadranti(1),TempName1); + ChartTuL = Image(TempName1); + ChartTuL.Style = {ScaleToFit}; + close(figure(25)) + Quadranti_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'tra i dati massimi di spostamento 2D, registrati per ogni singolo '... + 'quadrante della sezione nel periodo temporale di riferimento, '... + 'dai sensori dei Cir Array presenti in sito']); + FIG = FIG+1; + Quadranti_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + text = 'Gli spostamenti sono riferiti alle misure dei sensori riportati di seguito: '; + testoTuL2 = Paragraph(text); + testoTuL2.HAlign = 'justify'; + add(Site,testoTuL2); + text = 'Quadrante 1'; + testoTuL1 = Paragraph(text); + testoTuL1.Style = {HAlign('justify'),FontSize(Font_caption),Bold(1),Color('midnightblue')}; + add(Site,testoTuL1); + for a = 1:colTuL + if GI_Date_TuL(1,a) ~= 0 + text1 = ['- Array ',char(chainID(a,4)),' - nodo numero ',num2str(abs(GI_Q1_Num_TuL(1,a))),'']; + testoTuL2 = Paragraph(text1); + add(Site,testoTuL2); + end + end + text = 'Quadrante 2'; + testoTuL3 = Paragraph(text); + testoTuL3.Style = {HAlign('justify'),FontSize(Font_caption),Bold(1),Color('midnightblue')}; + add(Site,testoTuL3); + for a = 1:colTuL + if GI_Date_TuL(1,a) ~= 0 + text2 = ['- Array ',char(chainID(a,4)),' - nodo numero ',num2str(abs(GI_Q2_Num_TuL(1,a))),'']; + testoTuL4 = Paragraph(text2); + add(Site,testoTuL4); + end + end + text = 'Quadrante 3'; + testoTuL5 = Paragraph(text); + testoTuL5.Style = {HAlign('justify'),FontSize(Font_caption),Bold(1),Color('midnightblue')}; + add(Site,testoTuL5); + for a = 1:colTuL + if GI_Date_TuL(1,a) ~= 0 + text3 = ['- Array ',char(chainID(a,4)),' - nodo numero ',num2str(abs(GI_Q3_Num_TuL(1,a))),'']; + testoTuL6 = Paragraph(text3); + add(Site,testoTuL6); + end + end + text = 'Quadrante 4'; + testoTuL7 = Paragraph(text); + testoTuL7.Style = {HAlign('justify'),FontSize(Font_caption),Bold(1),Color('midnightblue')}; + add(Site,testoTuL7); + for a = 1:colTuL + if GI_Date_TuL(1,a) ~= 0 + text4 = ['- Array ',char(chainID(a,4)),' - nodo numero ',num2str(abs(GI_Q4_Num_TuL(1,a))),'']; + testoTuL8 = Paragraph(text4); + add(Site,testoTuL8); + end + end + add(Site,ChartTuL); + add(Site,Quadranti_cap); + + % --- ENG --- + if activeEN == 1 + sezGrafTuL_ENG = Heading2('Correlation between Tunnel Link sensors'); + sezGrafTuL_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoTuL = Paragraph(['The following graph aims to highlight any correlation between '... + 'highest 2D displacement values recorded by 3D MEMS for each single Cir Array installed on-site. '... + 'Displacements are compared according to the corresponding sector, defined by dividing the monitored '... + 'section in four separated areas that are numbered as explained in the following figure. ']); + testoTuL.HAlign = 'justify'; + img = Image(('Quadranti.png')); + img.Style = {Height('6cm'),HAlign('center')}; + imgcaption = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Sectors numbering in a tunnel section']); + FIG_ENG = FIG_ENG+1; + imgcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + % Quadrante 1 + figure(35) + set(gca,'YColor','k') + [~,colTuL] = size(GI_Q1_TuL); + num = 1; + for t = 1:colTuL + if GI_Date_TuL(1,t) ~= 0 + y1(num) = GI_Q1_TuL(1,t); + y2(num) = GI_Q2_TuL(1,t); + y3(num) = GI_Q3_TuL(1,t); + y4(num) = GI_Q4_TuL(1,t); + y5(num) = 0; + str(1,num) = chainID(t,4); + num = num+1; + end + end + y = [y1;y2;y3;y4;y5]; + x = [1;2;3;4;5]; + Quadranti = barh(x,y); + grid on + + title('Correlation between displacements recorded in different sectors'); + xlabel('Displacement [mm]'); + ylabel('Sector [-]'); + ylim([0 5]); % Con 5, metto la legenda in alto a sx (il valore 5 è pieno di 0) + % Stimo limiti asse X + ini1 = min(GI_Q1_TuL); + ini2 = min(GI_Q2_TuL); + ini3 = min(GI_Q3_TuL); + ini4 = min(GI_Q4_TuL); + Min = [ini1; ini2; ini3; ini4]; + C = min(Min); + end1 = max(GI_Q1_TuL); + end2 = max(GI_Q2_TuL); + end3 = max(GI_Q3_TuL); + end4 = max(GI_Q4_TuL); + Max = [end1; end2; end3; end4]; + B = max(Max); + A = [abs(C),abs(B)]; + LIM = max(A); + POS = find(A == LIM); + if -LIM > -2.5 % mm + ini = -2.5; + else + ini = -LIM; + end + if LIM < 2.5 + End = 2.5; + else + End = LIM; + end + xlim([ini End]); + if num-1 == 1 % 1 solo array + ylim([0 5]); + else + ylim([0 6]); + end + yticks(1:4); + if POS == 1 % Legenda a DX + legend(str,'Location','northeast'); + else % SX + legend(str,'Location','northwest'); + end + + add(Site_ENG,sezGrafTuL_ENG); + add(Site_ENG,testoTuL); + add(Site_ENG,img); + add(Site_ENG,imgcaption); + + TempName1 = char(strcat('Report',siteID,'-', char(toolrif),'-Quadranti_ENG.png')); + saveas(Quadranti(1),TempName1); + ChartTuL_ENG = Image(TempName1); + ChartTuL_ENG.Style = {ScaleToFit}; + close(figure(35)) + Quadranti_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison '... + 'between highest 2D displacement values '... + 'recorded by each single Array in the corresponding '... + 'sector of the monitored tunnel section '... + 'during the reference time period']); + FIG_ENG = FIG_ENG+1; + Quadranti_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + text = 'Displacement data refer to the sensors listed below: '; + testoTuL2 = Paragraph(text); + testoTuL2.HAlign = 'justify'; + add(Site_ENG,testoTuL2); + text = 'Sector 1'; + testoTuL1 = Paragraph(text); + testoTuL1.Style = {HAlign('justify'),FontSize(Font_caption),Bold(1),Color('midnightblue')}; + add(Site_ENG,testoTuL1); + for a = 1:colTuL + if GI_Date_TuL(1,a) ~= 0 + text1 = ['- Array ',char(chainID(a,4)),' - node ',num2str(abs(GI_Q1_Num_TuL(1,a))),'']; + testoTuL2 = Paragraph(text1); + add(Site_ENG,testoTuL2); + end + end + text = 'Sector 2'; + testoTuL3 = Paragraph(text); + testoTuL3.Style = {HAlign('justify'),FontSize(Font_caption),Bold(1),Color('midnightblue')}; + add(Site_ENG,testoTuL3); + for a = 1:colTuL + if GI_Date_TuL(1,a) ~= 0 + text2 = ['- Array ',char(chainID(a,4)),' - node ',num2str(abs(GI_Q2_Num_TuL(1,a))),'']; + testoTuL4 = Paragraph(text2); + add(Site_ENG,testoTuL4); + end + end + text = 'Sector 3'; + testoTuL5 = Paragraph(text); + testoTuL5.Style = {HAlign('justify'),FontSize(Font_caption),Bold(1),Color('midnightblue')}; + add(Site_ENG,testoTuL5); + for a = 1:colTuL + if GI_Date_TuL(1,a) ~= 0 + text3 = ['- Array ',char(chainID(a,4)),' - node ',num2str(abs(GI_Q3_Num_TuL(1,a))),'']; + testoTuL6 = Paragraph(text3); + add(Site_ENG,testoTuL6); + end + end + text = 'Sector 4'; + testoTuL7 = Paragraph(text); + testoTuL7.Style = {HAlign('justify'),FontSize(Font_caption),Bold(1),Color('midnightblue')}; + add(Site_ENG,testoTuL7); + for a = 1:colTuL + if GI_Date_TuL(1,a) ~= 0 + text4 = ['- Array ',char(chainID(a,4)),' - node ',num2str(abs(GI_Q4_Num_TuL(1,a))),'']; + testoTuL8 = Paragraph(text4); + add(Site_ENG,testoTuL8); + end + end + add(Site_ENG,ChartTuL_ENG); + add(Site_ENG,Quadranti_ENG_cap); + end + end + end + % ---> Confronti variazioni segmenti Stella + if sum(rTuL) > 0 && exist('GI_Seg_TuL','var') + if isempty(GI_Seg_TuL) == 0 + testoStar = Paragraph(['Il grafico seguente confronta nella medesima '... + 'rappresentazione le variazioni di lunghezza dei segmenti di convergenza '... + 'delle sezioni monitorate da ciascun Cir Array. Nel rispettivo capitolo '... + 'di ogni catena ' char(232) ' riportata la stella di convergenza per ogni '... + 'sezione.']); + testoStar.HAlign = 'justify'; + figure(26) + set(gca,'YColor','k') + s = 1; + num = 1; + [~,colTuL] = size(GI_Date_TuL); + for t = 1:colTuL + if GI_Date_TuL(1,t) ~= 0 % Esistono dati per quell'array + % Segmento 1 + s1(num) = GI_Seg_TuL(1,s); + s = s+1; + % Segmento 2 + if GI_NumSeg_TuL(t,1) > 1 + s2(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s2(num) = 0; + end + % Segmento 3 + if GI_NumSeg_TuL(t,1) > 2 + s3(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s3(num) = 0; + end + % Segmento 4 + if GI_NumSeg_TuL(t,1) > 3 + s4(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s4(num) = 0; + end + % Segmento 5 + if GI_NumSeg_TuL(t,1) > 4 + s5(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s5(num) = 0; + end + % Segmento 6 + if GI_NumSeg_TuL(t,1) > 5 + s6(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s6(num) = 0; + end + % Segmento 7 + if GI_NumSeg_TuL(t,1) > 6 + s7(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s7(num) = 0; + end + str(1,num) = chainID(t,4); + num = num+1; + end + end + y = [s1;s2;s3;s4;s5;s6;s7]; + x = [1;2;3;4;5;6;7]; + yticklabels({'S1','S2','S3','S4','S5','S6','S7'}) + Stella = barh(x,y); + grid on + + title('Correlazione fra le variazioni di lunghezza dei segmenti di convergenza'); + xlabel('Spostamento [mm]'); + ylabel('Segmento [-]'); + % Stimo limiti asse X + ini = min(y); + ini = min(ini); + End = max(y); + End = max(End); + A = [abs(ini),End]; + RIF = max(A); + ind = find(A == RIF); + if ind == 1 + legend(str,'Location','northeast'); + else + legend(str,'Location','northwest'); + end + if -RIF > -2.5 % mm + ini = -2.5; + else + ini = -RIF; + end + if RIF < 2.5 + End = 2.5; + else + End = RIF; + end + xlim([ini End]); + yticks(1:7); + if num-1 == 1 % Numero Array + ylim([0 7]); + else + ylim([0 8]); + end + add(Site,testoStar); + + TempName1 = char(strcat('Report',siteID,'-', char(toolrif),'-Stella.png')); + saveas(Stella(1),TempName1); + ChartStella = Image(TempName1); + ChartStella.Style = {ScaleToFit}; + add(Site,ChartStella); + close(figure(26)) + Quadranti_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'tra le variazioni di lunghezza dei segmenti di convergenza, registrati '... + 'per le sezioni monitorate nel periodo temporale di riferimento, '... + 'dai sensori degli Array presenti in sito']); + FIG = FIG+1; + Quadranti_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Site,Quadranti_cap); + add(Site,br); + + % --- ENG --- + if activeEN == 1 + testoStar = Paragraph(['The following graph aims to compare the length variation of '... + 'each convergence segment referred to tunnel sections monitored with a Cir Array. '... + 'Please refer to the corresponding Array section of this Report for additional'... + 'information regarding each specific convergence star.']); + testoStar.HAlign = 'justify'; + figure(36) + set(gca,'YColor','k') + s = 1; + num = 1; + [~,colTuL] = size(GI_Date_TuL); + for t = 1:colTuL + if GI_Date_TuL(1,t) ~= 0 % Esistono dati per quell'array + % Segmento 1 + s1(num) = GI_Seg_TuL(1,s); + s = s+1; + % Segmento 2 + if GI_NumSeg_TuL(t,1) > 1 + s2(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s2(num) = 0; + end + % Segmento 3 + if GI_NumSeg_TuL(t,1) > 2 + s3(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s3(num) = 0; + end + % Segmento 4 + if GI_NumSeg_TuL(t,1) > 3 + s4(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s4(num) = 0; + end + % Segmento 5 + if GI_NumSeg_TuL(t,1) > 4 + s5(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s5(num) = 0; + end + % Segmento 6 + if GI_NumSeg_TuL(t,1) > 5 + s6(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s6(num) = 0; + end + % Segmento 7 + if GI_NumSeg_TuL(t,1) > 6 + s7(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s7(num) = 0; + end + str(1,num) = chainID(t,4); + num = num+1; + end + end + y = [s1;s2;s3;s4;s5;s6;s7]; + x = [1;2;3;4;5;6;7]; + yticklabels({'S1','S2','S3','S4','S5','S6','S7'}) + Stella = barh(x,y); + grid on + + title('Correlation between convergence segments length variation'); + xlabel('Displacement [mm]'); + ylabel('Segment number [-]'); + % Stimo limiti asse X + ini = min(y); + ini = min(ini); + End = max(y); + End = max(End); + A = [abs(ini),End]; + RIF = max(A); + ind = find(A == RIF); + if ind == 1 + legend(str,'Location','northeast'); + else + legend(str,'Location','northwest'); + end + if -RIF > -2.5 % mm + ini = -2.5; + else + ini = -RIF; + end + if RIF < 2.5 + End = 2.5; + else + End = RIF; + end + xlim([ini End]); + yticks(1:7); + if num-1 == 1 % Numero Array + ylim([0 7]); + else + ylim([0 8]); + end + add(Site_ENG,testoStar); + + TempName1 = char(strcat('Report',siteID,'-', char(toolrif),'-Stella_ENG.png')); + saveas(Stella(1),TempName1); + ChartStella_ENG = Image(TempName1); + ChartStella_ENG.Style = {ScaleToFit}; + add(Site_ENG,ChartStella_ENG); + close(figure(36)) + Quadranti_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison '... + 'between length variations of each convergence segment, '... + 'recorded in the corresponding tunnel section by each single Array '... + 'during the reference time period']); + FIG_ENG = FIG_ENG+1; + Quadranti_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Site_ENG,Quadranti_ENG_cap); + add(Site_ENG,br); + end + end + end + % ---> Grafici spostamento in calotta PreConv vs Cir + if sum(rTuL) > 0 && exist('GI_Z_TuL','var') && sum(rPCL) > 0 && exist('GI_Z_PCL','var') + if isempty(GI_Z_TuL) == 0 && isempty(GI_Z_PCL) == 0 + sezGrafTuLvsPCL = Heading2('Correlazioni tra PreConv Array e Cir Array'); + sezGrafTuLvsPCL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoTuLvsPCL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra gli spostamenti '... + 'locali registrati in calotta dal PreConv Array e dai corrispondenti '... + 'Cir Array, con riferimento ai sensori installati nei medesimi punti '... + '(o in quelli pi' char(249) ' prossimi tra di loro).']); + testoTuLvsPCL.HAlign = 'justify'; + + % Cerco eventuali correlazioni con Cir Array + NomeFile = strcat('Report',siteID,'-PCLvsTuL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + num = 1; + sen = 1; + SensoriTuL = zeros(1,1); + SensoriPCL = zeros(1,1); + CatenaTuL = cell(1,1); + CatenaPCL = cell(1,1); + colCIR = 0; + while AAA < rF % A un PreConv possono competere più Cir + PCL = 0; + Cir = 0; + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono PreConv Array o non ci sono Cir + break + else + check2 = Filetesto(AAA+1,1); + for nn = 1:rAR + chain = char(chainID(nn,4)); + if check1 == str2num(chain(end-2:end)) + PCL = nn; + NodoPCL = Filetesto(AAA+2,1); + SensoriPCL(sen,1) = NodoPCL; + CatenaPCL(sen,1) = chainID(nn,4); + end + if check2 == str2num(chain(end-2:end)) + Cir = nn; + NodoTuL = Filetesto(AAA+3,1); + SensoriTuL(sen,1) = NodoTuL; + CatenaTuL(sen,1) = chainID(nn,4); + colCIR = colCIR+1; + end + if PCL > 0 && Cir > 0 + figure(27) + ylabel('Spostamento [mm]'); + xlabel('Data [gg/mm/aaaa]'); + set(gca,'YColor','k') + title('Correlazione fra gli spostamenti corrispondenti'); + grid on + hold on + dim1 = find(GI_Z_PCL(:,PCL)); + dim2 = find(GI_Z_TuL(:,colCIR)); + if isempty(dim1) == 0 && isempty(dim2) == 0 + plot(GI_Date_PCL(1:dim1(end),PCL),GI_Z_PCL(1:dim1(end),PCL)); + GI_TuLvsPCL = plot(GI_Date_TuL(1:dim2(end),Cir),GI_Z_TuL(1:dim2(end),colCIR)); + MIN1 = min(GI_Z_PCL(:,PCL)); + MIN2 = min(GI_Z_TuL(:,colCIR)); + MIN = min(MIN1,MIN2); + MAX1 = max(GI_Z_PCL(:,PCL)); + MAX2 = max(GI_Z_TuL(:,colCIR)); + MAX = max(MAX1,MAX2); + if MAX < 5 && MIN > -5 % mm + ylim([-5 5]); + elseif MAX < 5 + ylim([MIN-1 5]); + elseif MIN > -5 + ylim([-5 MAX+1]); + end + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + h = gca; + h.XAxis.MinorTick = 'on'; + xtickangle(20); + str(1,1) = cellstr([char(CatenaPCL(sen,1)) ' Nodo ' num2str(NodoPCL) '']); + str(1,2) = cellstr([char(CatenaTuL(sen,1)) ' Nodo ' num2str(NodoTuL) '']); + legend(str,'Location','northwest'); + TempName = char(strcat('Report',siteID,'-PCLvsTuL',num2str(num),'.png')); + saveas(GI_TuLvsPCL,TempName); + num = num+1; + end + close(figure(27)); + sen = sen+1; + AAA = AAA+4; + break + end + end + end + end + num = num-1; + if num ~= 0 % Non ci sono legami + add(Site,sezGrafTuLvsPCL); + add(Site,testoTuLvsPCL); + if num == 1 + TempName = char(strcat('Report',siteID,'-PCLvsTuL',num2str(num),'.png')); + Chart1 = Image(TempName); + Chart1.Style = {ScaleToFit}; + add(Site,Chart1); + else + n = 1; + while n <= num + TempName = char(strcat('Report',siteID,'-PCLvsTuL',num2str(n),'.png')); + Chart1 = Image(TempName); + Chart1.Style = {Height('7cm')}; + if n+1 <= num + TempName = char(strcat('Report',siteID,'-PCLvsTuL',num2str(n+1),'.png')); + Chart2 = Image(TempName); + Chart2.Style = {Height('7cm')}; + lot = Table({Chart1, Chart2}); + lot.Style = {ResizeToFitContents(false), Width('100%')}; + n = n+2; + add(Site,lot); + else + n = n+1; + add(Site,Chart1); + end + end + end + ChartPCLvsTuL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'tra i dati di spostamento locale registrati dal nodo '... + 'del Cir Array installato in calotta ed il corrispondente '... + 'sensore PreConv Link pi' char(249) ' in prossimit' char(224) ', nel '... + 'periodo temporale di riferimento']); + FIG = FIG+1; + ChartPCLvsTuL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Site,ChartPCLvsTuL_cap); + + text = 'Gli spostamenti sono riferiti alle misure dei sensori riportati di seguito: '; + testoPCLvsTuL2 = Paragraph(text); + testoPCLvsTuL2.HAlign = 'justify'; + add(Site,testoPCLvsTuL2); + I = size(SensoriPCL); + for a = 1:I(1) + textPC = ['- PreConv Array ' char(CatenaPCL(a,1)) ' - Nodo numero ' num2str(SensoriPCL(a,1)) ';']; + textCA = ['- Cir Array ' char(CatenaTuL(a,1)),' - Nodo numero ' num2str(SensoriTuL(a,1)) '.']; + spazio = Paragraph(''); + testoPCLvsTuL2 = Paragraph(textPC); + testoPCLvsTuL3 = Paragraph(textCA); + add(Site,testoPCLvsTuL2); + add(Site,testoPCLvsTuL3); + add(Site,spazio); + end + add(Site,br); + end + + % --- ENG --- + if activeEN == 1 + sezGrafTuLvsPCL_ENG = Heading2('Correlation between PreConv Array and Cir Array'); + sezGrafTuLvsPCL_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoTuLvsPCL = Paragraph(['The following graph aims to highlight any correlation '... + 'between local displacements recorded by PreConv Array and Cir Array sensors. The comparison '... + 'takes into account two nodes, one for each Array, installed approximately '... + 'in the same place of the upper part of the monitored section.']); + testoTuLvsPCL.HAlign = 'justify'; + + % Cerco eventuali correlazioni con Cir Array + NomeFile = strcat('Report',siteID,'-PCLvsTuL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + num = 1; + sen = 1; + SensoriTuL = zeros(1,1); + SensoriPCL = zeros(1,1); + CatenaTuL = cell(1,1); + CatenaPCL = cell(1,1); + colCIR = 0; + while AAA < rF % A un PreConv possono competere più Cir + PCL = 0; + Cir = 0; + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono PreConv Array o non ci sono Cir + break + else + check2 = Filetesto(AAA+1,1); + for nn = 1:rAR + chain = char(chainID(nn,4)); + if check1 == str2num(chain(end-2:end)) + PCL = nn; + NodoPCL = Filetesto(AAA+2,1); + SensoriPCL(sen,1) = NodoPCL; + CatenaPCL(sen,1) = chainID(nn,4); + end + if check2 == str2num(chain(end-2:end)) + Cir = nn; + NodoTuL = Filetesto(AAA+3,1); + SensoriTuL(sen,1) = NodoTuL; + CatenaTuL(sen,1) = chainID(nn,4); + colCIR = colCIR+1; + end + if PCL > 0 && Cir > 0 + figure(37) + ylabel('Displacement [mm]'); + xlabel('Date [dd/mm/yyyy]'); + set(gca,'YColor','k') + title('Correlation between corresponding sensors'); + grid on + hold on + dim1 = find(GI_Z_PCL(:,PCL)); + dim2 = find(GI_Z_TuL(:,colCIR)); + if isempty(dim1) == 0 && isempty(dim2) == 0 + plot(GI_Date_PCL(1:dim1(end),PCL),GI_Z_PCL(1:dim1(end),PCL)); + GI_TuLvsPCL = plot(GI_Date_TuL(1:dim2(end),Cir),GI_Z_TuL(1:dim2(end),colCIR)); + MIN1 = min(GI_Z_PCL(:,PCL)); + MIN2 = min(GI_Z_TuL(:,colCIR)); + MIN = min(MIN1,MIN2); + MAX1 = max(GI_Z_PCL(:,PCL)); + MAX2 = max(GI_Z_TuL(:,colCIR)); + MAX = max(MAX1,MAX2); + if MAX < 5 && MIN > -5 % mm + ylim([-5 5]); + elseif MAX < 5 + ylim([MIN-1 5]); + elseif MIN > -5 + ylim([-5 MAX+1]); + end + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + h = gca; + h.XAxis.MinorTick = 'on'; + xtickangle(20); + str(1,1) = cellstr([char(CatenaPCL(sen,1)) ' Node ' num2str(NodoPCL) '']); + str(1,2) = cellstr([char(CatenaTuL(sen,1)) ' Node ' num2str(NodoTuL) '']); + legend(str,'Location','northwest'); + TempName = char(strcat('Report',siteID,'-PCLvsTuL',num2str(num),'_ENG.png')); + saveas(GI_TuLvsPCL,TempName); + num = num+1; + end + close(figure(37)); + sen = sen+1; + AAA = AAA+4; + break + end + end + end + end + num = num-1; + if num ~= 0 % Non ci sono legami + add(Site_ENG,sezGrafTuLvsPCL_ENG); + add(Site_ENG,testoTuLvsPCL); + if num == 1 + TempName = char(strcat('Report',siteID,'-PCLvsTuL',num2str(num),'_ENG.png')); + Chart1_ENG = Image(TempName); + Chart1_ENG.Style = {ScaleToFit}; + add(Site_ENG,Chart1_ENG); + else + n = 1; + while n <= num + TempName = char(strcat('Report',siteID,'-PCLvsTuL',num2str(n),'_ENG.png')); + Chart1_ENG = Image(TempName); + Chart1_ENG.Style = {Height('7cm')}; + if n+1 <= num + TempName = char(strcat('Report',siteID,'-PCLvsTuL',num2str(n+1),'_ENG.png')); + Chart2_ENG = Image(TempName); + Chart2_ENG.Style = {Height('7cm')}; + lot = Table({Chart1_ENG, Chart2_ENG}); + lot.Style = {ResizeToFitContents(false), Width('100%')}; + n = n+2; + add(Site_ENG,lot); + else + n = n+1; + add(Site_ENG,Chart1_ENG); + end + end + end + ChartPCLvsTuL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between '... + 'local displacements recorded during the reference time period by the '... + 'Cir Array sensor installed on the upper part of '... + 'the tunnel section, and the corresponding PreConv Array sensor']); + FIG_ENG = FIG_ENG+1; + ChartPCLvsTuL_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Site_ENG,ChartPCLvsTuL_ENG_cap); + + text = 'Dsiplacement data refer to the sensors listed below: '; + testoPCLvsTuL2 = Paragraph(text); + testoPCLvsTuL2.HAlign = 'justify'; + add(Site,testoPCLvsTuL2); + I = size(SensoriPCL); + for a = 1:I(1) + textPC = ['- PreConv Array ' char(CatenaPCL(a,1)) ' - Node ' num2str(SensoriPCL(a,1)) ';']; + textCA = ['- Cir Array ' char(CatenaTuL(a,1)),' - Node ' num2str(SensoriTuL(a,1)) '.']; + spazio = Paragraph(''); + testoPCLvsTuL2 = Paragraph(textPC); + testoPCLvsTuL3 = Paragraph(textCA); + add(Site_ENG,testoPCLvsTuL2); + add(Site_ENG,testoPCLvsTuL3); + add(Site_ENG,spazio); + end + add(Site_ENG,br); + end + end + end + end + + % ---> Grafici spostamento Cir vs Rad + if sum(rRaL) > 0 && exist('GI_dS_RL_TuL','var') && sum(rRaL) > 0 && exist('GI_dS_TuL_RL','var') + if isempty(GI_dS_RL_TuL) == 0 && isempty(GI_dS_TuL_RL) == 0 + sezGrafTuLvsRL = Heading2('Correlazioni tra Cir Array e Rad Array'); + sezGrafTuLvsRL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoTuLvsRL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra l''andamento nel tempo '... + 'della risultante degli spostamenti 2D differenziali locali registrati '... + 'dal sensore Radial Link prossimo alla sezione monitorata e dal '... + 'corrispondente sensore Tunnel Link.']); + testoTuLvsRL.HAlign = 'justify'; + + % Cerco eventuali correlazioni con Cir Array + NomeFile = strcat('Report',siteID,'-TuLvsRL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + num = 1; + sen = 1; + SensoriTuL = zeros(1,1); + SensoriRL = zeros(1,1); + CatenaTuL = cell(1,1); + CatenaRL = cell(1,1); + colCIR = 0; + while AAA < rF + Rad = 0; + Cir = 0; + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono Rad Array o non ci sono Cir + break + else + check2 = Filetesto(AAA+1,1); + for nn = 1:rAR + chain = char(chainID(nn,4)); + if check1 == str2num(chain(end-2:end)) % Il primo deve sempre essere il Cir + Cir = nn; + NodoTuL = Filetesto(AAA+2,1); + SensoriTuL(sen,1) = NodoTuL; + CatenaTuL(sen,1) = chainID(nn,4); + colCIR = colCIR+1; + end + if check2 == str2num(chain(end-2:end)) + Rad = nn; + NodoRL = Filetesto(AAA+3,1); + SensoriRL(sen,1) = NodoRL; + CatenaRL(sen,1) = chainID(nn,4); + end + if Rad > 0 && Cir > 0 + figure(28) + ylabel('Spostamento [mm]'); + xlabel('Data [gg/mm/aaaa]'); + set(gca,'YColor','k') + title('Correlazione fra gli spostamenti corrispondenti'); + grid on + hold on + dim1 = find(GI_dS_RL_TuL(:,Rad)); + dim2 = find(GI_dS_TuL_RL(:,colCIR)); + if isempty(dim1) == 0 && isempty(dim2) == 0 + plot(GI_Date_Rad(1:dim1(end),Rad),GI_dS_RL_TuL(1:dim1(end),Rad)); + GI_TuLvsRL = plot(GI_Date_TuL(1:dim2(end),Cir),GI_dS_TuL_RL(1:dim2(end),colCIR)); + MAX1 = max(GI_dS_RL_TuL(:,Rad)); + MAX2 = max(GI_dS_TuL_RL(:,colCIR)); + MAX = max(MAX1,MAX2); + if MAX < 5 % mm + ylim([0 5]); + end + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + h = gca; + h.XAxis.MinorTick = 'on'; + xtickangle(20); + str(1,1) = cellstr([char(CatenaTuL(sen,1)) ' Nodo ' num2str(NodoTuL) '']); + str(1,2) = cellstr([char(CatenaRL(sen,1)) ' Nodo ' num2str(NodoRL) '']); + legend(str,'Location','northwest'); + TempName = char(strcat('Report',siteID,'-TuLvsRL',num2str(num),'.png')); + saveas(GI_TuLvsRL,TempName); + num = num+1; + end + close(figure(28)); + sen = sen+1; + AAA = AAA+4; + break + end + end + end + end + num = num-1; + if num ~= 0 % Non ci sono legami + add(Site,sezGrafTuLvsRL); + add(Site,testoTuLvsRL); + if num == 1 + TempName = char(strcat('Report',siteID,'-TuLvsRL',num2str(num),'.png')); + Chart1 = Image(TempName); + Chart1.Style = {ScaleToFit}; + add(Site,Chart1); + else + n = 1; + while n <= num + TempName = char(strcat('Report',siteID,'-TuLvsRL',num2str(n),'.png')); + Chart1 = Image(TempName); + Chart1.Style = {Height('7cm')}; + if n+1 <= num + TempName = char(strcat('Report',siteID,'-TuLvsRL',num2str(n+1),'.png')); + Chart2 = Image(TempName); + Chart2.Style = {Height('7cm')}; + lot = Table({Chart1, Chart2}); + lot.Style = {ResizeToFitContents(false), Width('100%')}; + n = n+2; + add(Site,lot); + else + n = n+1; + add(Site,Chart1); + end + end + end + ChartTuLvsRL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'relativo al periodo temporale di riferimento, tra i dati di '... + 'spostamento locale 2D registrati dal nodo '... + 'del Cir Array installato nella sezione ed il corrispondente '... + 'sensore Radial Link pi' char(249) ' in prossimit' char(224) '']); + FIG = FIG+1; + ChartTuLvsRL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Site,ChartTuLvsRL_cap); + + text = 'Gli spostamenti sono riferiti alle misure dei sensori riportati di seguito: '; + testoTuL2vsRL = Paragraph(text); + testoTuL2vsRL.HAlign = 'justify'; + add(Site,testoTuL2vsRL); + I = size(SensoriRL); + for a = 1:I(1) + text = ['- Rad Array ' char(CatenaRL(a,1)) ' - Nodo numero ' num2str(SensoriRL(a,1)) ... + ', Cir Array ' char(CatenaTuL(a,1)),' - Nodo numero ' num2str(SensoriTuL(a,1)) '']; + testoTuL2vsRL = Paragraph(text); + add(Site,testoTuL2vsRL); + end + add(Site,br); + end + + % --- ENG --- + if activeEN == 1 + sezGrafTuLvsRL_ENG = Heading2('Correlation between Cir Array and Rad Array'); + sezGrafTuLvsRL_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoTuLvsRL = Paragraph(['The following graph aims to highlight the presence of '... + 'correlations between 2D local differential displacements recorded by the Radial Link '... + 'located closer to the monitored section, and the corresponding Tunnel Link sensor.']); + testoTuLvsRL.HAlign = 'justify'; + + % Cerco eventuali correlazioni con Cir Array + NomeFile = strcat('Report',siteID,'-TuLvsRL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + num = 1; + sen = 1; + SensoriTuL = zeros(1,1); + SensoriRL = zeros(1,1); + CatenaTuL = cell(1,1); + CatenaRL = cell(1,1); + colCIR = 0; + while AAA < rF + Rad = 0; + Cir = 0; + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono Rad Array o non ci sono Cir + break + else + check2 = Filetesto(AAA+1,1); + for nn = 1:rAR + chain = char(chainID(nn,4)); + if check1 == str2num(chain(end-2:end)) % Il primo deve sempre essere il Cir + Cir = nn; + NodoTuL = Filetesto(AAA+2,1); + SensoriTuL(sen,1) = NodoTuL; + CatenaTuL(sen,1) = chainID(nn,4); + colCIR = colCIR+1; + end + if check2 == str2num(chain(end-2:end)) + Rad = nn; + NodoRL = Filetesto(AAA+3,1); + SensoriRL(sen,1) = NodoRL; + CatenaRL(sen,1) = chainID(nn,4); + end + if Rad > 0 && Cir > 0 + figure(38) + ylabel('Displacement [mm]'); + xlabel('Date [dd/mm/yyyy]'); + set(gca,'YColor','k') + title('Correlation between corresponding sensors'); + grid on + hold on + dim1 = find(GI_dS_RL_TuL(:,Rad)); + dim2 = find(GI_dS_TuL_RL(:,colCIR)); + if isempty(dim1) == 0 && isempty(dim2) == 0 + plot(GI_Date_Rad(1:dim1(end),Rad),GI_dS_RL_TuL(1:dim1(end),Rad)); + GI_TuLvsRL = plot(GI_Date_TuL(1:dim2(end),Cir),GI_dS_TuL_RL(1:dim2(end),colCIR)); + MAX1 = max(GI_dS_RL_TuL(:,Rad)); + MAX2 = max(GI_dS_TuL_RL(:,colCIR)); + MAX = max(MAX1,MAX2); + if MAX < 5 % mm + ylim([0 5]); + end + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + h = gca; + h.XAxis.MinorTick = 'on'; + xtickangle(20); + str(1,1) = cellstr([char(CatenaTuL(sen,1)) ' Node ' num2str(NodoTuL) '']); + str(1,2) = cellstr([char(CatenaRL(sen,1)) ' Node ' num2str(NodoRL) '']); + legend(str,'Location','northwest'); + TempName = char(strcat('Report',siteID,'-TuLvsRL',num2str(num),'_ENG.png')); + saveas(GI_TuLvsRL,TempName); + num = num+1; + end + close(figure(38)); + sen = sen+1; + AAA = AAA+4; + break + end + end + end + end + num = num-1; + if num ~= 0 % Non ci sono legami + add(Site_ENG,sezGrafTuLvsRL_ENG); + add(Site_ENG,testoTuLvsRL); + if num == 1 + TempName = char(strcat('Report',siteID,'-TuLvsRL',num2str(num),'_ENG.png')); + Chart1_ENG = Image(TempName); + Chart1_ENG.Style = {ScaleToFit}; + add(Site_ENG,Chart1_ENG); + else + n = 1; + while n <= num + TempName = char(strcat('Report',siteID,'-TuLvsRL',num2str(n),'_ENG.png')); + Chart1_ENG = Image(TempName); + Chart1_ENG.Style = {Height('7cm')}; + if n+1 <= num + TempName = char(strcat('Report',siteID,'-TuLvsRL',num2str(n+1),'_ENG.png')); + Chart2_ENG = Image(TempName); + Chart2_ENG.Style = {Height('7cm')}; + lot = Table({Chart1_ENG, Chart2_ENG}); + lot.Style = {ResizeToFitContents(false), Width('100%')}; + n = n+2; + add(Site_ENG,lot); + else + n = n+1; + add(Site_ENG,Chart1_ENG); + end + end + end + ChartTuLvsRL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison '... + 'between 2D local displacement data recorded by the Radial Link sensor closer to '... + 'the monitored section, and the corresponding Tunnel Link sensor']); + FIG_ENG = FIG_ENG+1; + ChartTuLvsRL_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Site_ENG,ChartTuLvsRL_ENG_cap); + + text = 'Displacement data refer to the sensors listed below: '; + testoTuL2vsRL = Paragraph(text); + testoTuL2vsRL.HAlign = 'justify'; + add(Site_ENG,testoTuL2vsRL); + I = size(SensoriRL); + for a = 1:I(1) + text = ['- Rad Array ' char(CatenaRL(a,1)) ' - Node ' num2str(SensoriRL(a,1)) ... + ', Cir Array ' char(CatenaTuL(a,1)),' - Node ' num2str(SensoriTuL(a,1)) '']; + testoTuL2vsRL = Paragraph(text); + add(Site_ENG,testoTuL2vsRL); + end + add(Site_ENG,br); + end + end + end + end + + % ---> Grafici spostamento Rad vs MPB + if sum(rRaL) > 0 && exist('GI_dS_RL_MPB','var') && sum(rMPBEL) > 0 && exist('GI_dS_MPB_RL','var') + if isempty(GI_dS_RL_MPB) == 0 && isempty(GI_dS_MPB_RL) == 0 + sezGrafMPBvsRL = Heading2('Correlazioni tra Rad Array ed estensimetro multibase'); + sezGrafMPBvsRL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoMPBvsRL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra l''andamento nel tempo '... + 'della risultante degli spostamenti 3D differenziali locali registrati '... + 'dal sensore Radial Link e la relativa deformazione radiale misurata '... + 'dalla base pi' char(250) ' lunga dell''estensimetro multibase.']); + testoMPBvsRL.HAlign = 'justify'; + + % Cerco eventuali correlazioni con Estensimetro multibase + NomeFile = strcat('Report',siteID,'-RLvsMPBEL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + num = 1; + sen = 1; + SensoriRL = zeros(1,1); + SensoriMPB = zeros(1,1); + CatenaRL = cell(1,1); + CatenaMPB = cell(1,1); + colMPB = 0; + while AAA < rF + Rad = 0; + MPB = 0; + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono Rad Array o estensimetri multibase + break + else + check2 = Filetesto(AAA+1,1); + for nn = 1:rAR + chain = char(chainID(nn,4)); + if check1 == str2num(chain(end-2:end)) % Il primo deve sempre essere il Rad + Rad = nn; + NodoRL = Filetesto(AAA+2,1); + SensoriRL(sen,1) = NodoRL; + CatenaRL(sen,1) = chainID(nn,4); + end + if check2 == str2num(chain(end-2:end)) + MPB = nn; + NodoMPB = Filetesto(AAA+3,1); + SensoriMPB(sen,1) = NodoMPB; + CatenaMPB(sen,1) = chainID(nn,4); + colMPB = colMPB+1; + end + if Rad > 0 && MPB > 0 + figure(29) + ylabel('Spostamento [mm]'); + xlabel('Data [gg/mm/aaaa]'); + set(gca,'YColor','k') + title('Correlazione fra gli spostamenti corrispondenti'); + grid on + hold on + dim1 = find(GI_dS_RL_MPB(:,Rad)); + dim2 = find(GI_dS_MPB_RL(:,colMPB)); + if isempty(dim1) == 0 && isempty(dim2) == 0 + plot(GI_Date_Rad(1:dim1(end),Rad),GI_dS_RL_MPB(1:dim1(end),Rad)); + GI_MPBvsRL = plot(GI_Date_MPB(1:dim2(end),MPB),GI_dS_MPB_RL(1:dim2(end),colMPB)); + MAX1 = max(GI_dS_RL_MPB(:,Rad)); + MAX2 = max(GI_dS_MPB_RL(:,colMPB)); + MAX = max(MAX1,MAX2); + if MAX < 5 % mm + ylim([-5 5]); + end + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + h = gca; + h.XAxis.MinorTick = 'on'; + xtickangle(20); + str(1,1) = cellstr([char(CatenaRL(sen,1)) ' Nodo ' num2str(NodoRL) '']); + str(1,2) = cellstr([char(CatenaMPB(sen,1)) ' Estensimetro ' num2str(NodoMPB) '']); + legend(str,'Location','northwest'); + TempName = char(strcat('Report',siteID,'-RLvsMPB',num2str(num),'.png')); + saveas(GI_MPBvsRL,TempName); + num = num+1; + end + close(figure(29)) + sen = sen+1; + AAA = AAA+4; + break + end + end + end + end + num = num-1; + if num ~= 0 % Non ci sono legami + add(Site,sezGrafMPBvsRL); + add(Site,testoMPBvsRL); + if num == 1 + TempName = char(strcat('Report',siteID,'-RLvsMPB',num2str(num),'.png')); + Chart1 = Image(TempName); + Chart1.Style = {ScaleToFit}; + add(Site,Chart1); + else + n = 1; + while n <= num + TempName = char(strcat('Report',siteID,'-RLvsMPB',num2str(n),'.png')); + Chart1 = Image(TempName); + Chart1.Style = {Height('7cm')}; + if n+1 <= num + TempName = char(strcat('Report',siteID,'-RLvsMPB',num2str(n+1),'.png')); + Chart2 = Image(TempName); + Chart2.Style = {Height('7cm')}; + lot = Table({Chart1, Chart2}); + lot.Style = {ResizeToFitContents(false), Width('100%')}; + n = n+2; + add(Site,lot); + else + n = n+1; + add(Site,Chart1); + end + end + end + ChartMPBvsRL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'relativo al periodo temporale di riferimento, tra i dati di '... + 'spostamento locale 3D registrati dal nodo Radial Link pi' char(249) ... + ' in prossimit' char(224) ' della sezione e la base pi' char(249) ... + ' lunga dell''estensimetro multibase']); + FIG = FIG+1; + ChartMPBvsRL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Site,ChartMPBvsRL_cap); + + text = 'Gli spostamenti sono riferiti alle misure dei sensori riportati di seguito: '; + testoMPB2vsRL = Paragraph(text); + testoMPB2vsRL.HAlign = 'justify'; + add(Site,testoMPB2vsRL); + I = size(SensoriRL); + for a = 1:I(1) + text = ['- Rad Array ' char(CatenaRL(a,1)) ' - Nodo numero ' num2str(SensoriRL(a,1)) ... + ', Analog Array ' char(CatenaMPB(a,1)),' - Estensimetro Multibase numero ' num2str(SensoriMPB(a,1)) '']; + testoMPB2vsRL = Paragraph(text); + add(Site,testoMPB2vsRL); + end + + add(Site,br); + end + + %--- ENG --- + if activeEN == 1 + sezGrafMPBvsRL_ENG = Heading2('Correlation between Rad Array and Multipoint Borehole Extensometer (MPBE)'); + sezGrafMPBvsRL_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoMPBvsRL = Paragraph(['The following graph aims to highlight the presence of correlations '... + 'between 3D local differential displacements recorded by the Radial Link sensor, and the '... + 'corresponding radial deformation measured by the longest rod of the MPBE.']); + testoMPBvsRL.HAlign = 'justify'; + + % Cerco eventuali correlazioni con Estensimetro multibase + NomeFile = strcat('Report',siteID,'-RLvsMPBEL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + num = 1; + sen = 1; + SensoriRL = zeros(1,1); + SensoriMPB = zeros(1,1); + CatenaRL = cell(1,1); + CatenaMPB = cell(1,1); + colMPB = 0; + while AAA < rF + Rad = 0; + MPB = 0; + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono Rad Array o estensimetri multibase + break + else + check2 = Filetesto(AAA+1,1); + for nn = 1:rAR + chain = char(chainID(nn,4)); + if check1 == str2num(chain(end-2:end)) % Il primo deve sempre essere il Rad + Rad = nn; + NodoRL = Filetesto(AAA+2,1); + SensoriRL(sen,1) = NodoRL; + CatenaRL(sen,1) = chainID(nn,4); + end + if check2 == str2num(chain(end-2:end)) + MPB = nn; + NodoMPB = Filetesto(AAA+3,1); + SensoriMPB(sen,1) = NodoMPB; + CatenaMPB(sen,1) = chainID(nn,4); + colMPB = colMPB+1; + end + if Rad > 0 && MPB > 0 + figure(39) + ylabel('Displacement [mm]'); + xlabel('Date [d/mm/yyyy]'); + set(gca,'YColor','k') + title('Correlation between corresponding sensors'); + grid on + hold on + dim1 = find(GI_dS_RL_MPB(:,Rad)); + dim2 = find(GI_dS_MPB_RL(:,colMPB)); + if isempty(dim1) == 0 && isempty(dim2) == 0 + plot(GI_Date_Rad(1:dim1(end),Rad),GI_dS_RL_MPB(1:dim1(end),Rad)); + GI_MPBvsRL = plot(GI_Date_MPB(1:dim2(end),MPB),GI_dS_MPB_RL(1:dim2(end),colMPB)); + MAX1 = max(GI_dS_RL_MPB(:,Rad)); + MAX2 = max(GI_dS_MPB_RL(:,colMPB)); + MAX = max(MAX1,MAX2); + if MAX < 5 % mm + ylim([-5 5]); + end + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + h = gca; + h.XAxis.MinorTick = 'on'; + xtickangle(20); + str(1,1) = cellstr([char(CatenaRL(sen,1)) ' Node ' num2str(NodoRL) '']); + str(1,2) = cellstr([char(CatenaMPB(sen,1)) ' Extensometer ' num2str(NodoMPB) '']); + legend(str,'Location','northwest'); + TempName = char(strcat('Report',siteID,'-RLvsMPB',num2str(num),'_ENG.png')); + saveas(GI_MPBvsRL,TempName); + num = num+1; + end + close(figure(39)) + sen = sen+1; + AAA = AAA+4; + break + end + end + end + end + num = num-1; + if num ~= 0 % Non ci sono legami + add(Site_ENG,sezGrafMPBvsRL_ENG); + add(Site_ENG,testoMPBvsRL); + if num == 1 + TempName = char(strcat('Report',siteID,'-RLvsMPB',num2str(num),'_ENG.png')); + Chart1_ENG = Image(TempName); + Chart1_ENG.Style = {ScaleToFit}; + add(Site_ENG,Chart1_ENG); + else + n = 1; + while n <= num + TempName = char(strcat('Report',siteID,'-RLvsMPB',num2str(n),'_ENG.png')); + Chart1_ENG = Image(TempName); + Chart1_ENG.Style = {Height('7cm')}; + if n+1 <= num + TempName = char(strcat('Report',siteID,'-RLvsMPB',num2str(n+1),'_ENG.png')); + Chart2_ENG = Image(TempName); + Chart2_ENG.Style = {Height('7cm')}; + lot = Table({Chart1_ENG, Chart2_ENG}); + lot.Style = {ResizeToFitContents(false), Width('100%')}; + n = n+2; + add(Site_ENG,lot); + else + n = n+1; + add(Site_ENG,Chart1_ENG); + end + end + end + ChartMPBvsRL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison '... + 'between 3D local differential displacements recorded by the Radial Link sensor, and the '... + 'corresponding radial deformation measured by the longest rod of the MPBE.']); + FIG_ENG = FIG_ENG+1; + ChartMPBvsRL_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Site_ENG,ChartMPBvsRL_ENG_cap); + + text = 'Displacement data refer to the sensors listed below: '; + testoMPB2vsRL = Paragraph(text); + testoMPB2vsRL.HAlign = 'justify'; + add(Site_ENG,testoMPB2vsRL); + I = size(SensoriRL); + for a = 1:I(1) + text = ['- Rad Array ' char(CatenaRL(a,1)) ' - Node ' num2str(SensoriRL(a,1)) ... + ', Analog Array ' char(CatenaMPB(a,1)),' - MPBE ' num2str(SensoriMPB(a,1)) '']; + testoMPB2vsRL = Paragraph(text); + add(Site_ENG,testoMPB2vsRL); + end + + add(Site_ENG,br); + end + end + end + end +end + +text = 'report_CrossGraphs function executed correctly. report_CrossGraphs function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_CrossGraphs_ENG.m b/ATD/report_CrossGraphs_ENG.m new file mode 100755 index 0000000..f96f6a7 --- /dev/null +++ b/ATD/report_CrossGraphs_ENG.m @@ -0,0 +1,1499 @@ +function [Site,FIG] = report_CrossGraphs_ENG(rTL,rIPL,rTuL,rRaL,rPCL,rPL,rRL,rKL,rCrL,rMPBEL,... + GI_Disp_TL,GI_Date_TL,GI_Prof_TL,GI_Disp_IPL,GI_Date_IPL,GI_Prof_IPL,... + GI_Level_PL,GI_Prof_PL,GI_Date_PL,GI_Rain_RL,GI_Date_RL,GI_Angolo_KL,... + GI_Num_KL,GI_Date_KL,GI_Disp_CrL,GI_Num_CrL,GI_Date_CrL,GI_Q1_TuL,... + GI_Q2_TuL,GI_Q3_TuL,GI_Q4_TuL,GI_Q1_Num_TuL,GI_Q2_Num_TuL,GI_Q3_Num_TuL,... + GI_Q4_Num_TuL,GI_Z_TuL,GI_Seg_TuL,GI_NumSeg_TuL,GI_Date_TuL,GI_Z_PCL,GI_Date_PCL,... + GI_XYZ_Rad,GI_Num_Rad,GI_dS_RL_MPB,GI_dS_RL_TuL,GI_dS_TuL_RL,GI_Date_Rad,... + GI_Date_MPB,GI_dS_MPB,GI_MPB_Base,GI_dS_MPB_RL,siteID,toolrif,chainID,Font_Chapter,... + Font_caption,Font_tools,m,rAR,br,FIG,DT,FileName) + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +%% --- TILT LINK + PIEZO LINK --- +% Tilt Link V + Piezo Link : Spostamento massimo locale vs Falda +if rTL(m,1) > 0 && rPL(m,1) > 0 && exist( 'GI_Disp_TL','var') + if isempty(GI_Level_PL(:,m)) == 0 && GI_Date_PL(1,m) ~= 0 && isempty(GI_Disp_TL(:,m)) == 0 && GI_Date_TL(1,m) ~= 0 + ind_PL = find(GI_Date_PL(:,m)); + ind_TL = find(GI_Date_TL(:,m)); + sezGrafTLvsPL = Paragraph('Correlation between sensors - Tilt Link vs Piezo Link'); + sezGrafTLvsPL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + GI_VarFaldaPL = GI_Level_PL(:,m)-GI_Level_PL(1,m); + figure(21) + yyaxis left + GI_TiltLink = plot(GI_Date_TL(1:ind_TL(end),m),GI_Disp_TL(1:ind_TL(end),m),'Color','red'); + set(gca,'YColor','k') + if max(GI_Disp_TL(:,m)) < 10 + ylim([-inf 10]); + end + ylabel('Displacement [mm]'); + yyaxis right + GI_PiezoLink = plot(GI_Date_PL(1:ind_PL(end),m),GI_VarFaldaPL(1:ind_PL(end)),':','Color','blue'); + var = max(abs(GI_VarFaldaPL(1:ind_PL(end)))); + media = mean(GI_VarFaldaPL(1:ind_PL(end))); + if var < 1 + ylim([media-0.5 media+0.5]); + end + ylabel('Water level variation [m]'); + set(gca,'YColor','k') + title('Correlation between displacements and water level variation'); + xlabel('Date [dd/mm/yyyy]'); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + yyaxis left + lgdTL = (['Displacement (' num2str(GI_Prof_TL(1,m)) ' m)']); + lgdPL = ('Water level variation [m]'); + str(1,1) = {['Displacement (' num2str(GI_Prof_TL(1,m)) ' m)']}; + str(2,1) = {'Water level variation'}; + lgd = legend(lgdTL,lgdPL, 'Location','north'); + numcolumns = 2; + [legend_h,object_h,plot_h,text_strings] = columnlegend(numcolumns,str); + clear str + + testoTLvsPL = Paragraph(['The following graph aims to highlight any possible correlation '... + 'between the water level variation and displacements recorded by Tilt Link sensors. ' ... + 'In particular, with respect to the reference time period, sensors considered for this analysis '... + 'include the Tilt Link that recorded the highest local differential displacement '... + 'and the piezometer that measured the largest water level variation (if the Array '... + 'equips a single piezometer, water level data will refer to the only sensor available).']); + testoTLvsPL2 = Paragraph(['In this case, displacements included in the chart refers to the Tilt Link '... + 'located at ' num2str(-(GI_Prof_TL(1,m))) ' m of depth, '... + 'while the water level variation over time derives from the piezometer '... + 'installed at ' num2str((GI_Prof_PL(1,m))) ' metres below ground level.']); + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-TLvsPL_ENG.png')); + saveas(GI_PiezoLink,TempName); + ChartTLvsPL = Image(TempName); + ChartTLvsPL.Style = {ScaleToFit}; + ChartTLvsPL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Comparison between water level variation and '... + 'maximum local differential displacement during the reference time period']); + FIG = FIG+1; + ChartTLvsPL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testoTLvsPL.HAlign = 'justify'; + testoTLvsPL2.HAlign = 'justify'; + add(DT,sezGrafTLvsPL); + add(DT,testoTLvsPL); + add(DT,testoTLvsPL2); + add(DT,ChartTLvsPL); + add(DT,ChartTLvsPL_cap); + add(DT,br); + close(figure(21)); + % pulisco variabili da riutilizzare per catena successiva + clear GI_VarFaldaPL; + end +end + +%% --- IN PLACE LINK + PIEZO LINK --- +% In Place Link + Piezo Link : Spostamento massimo locale vs Falda +if rIPL(m,1) > 0 && rPL(m,1) > 0 && exist( 'GI_Disp_IPL','var') + if isempty(GI_Level_PL(:,m)) == 0 && GI_Date_PL(1,m) ~= 0 && ... + isempty(GI_Disp_IPL(:,m)) == 0 && GI_Date_IPL(1,m) ~= 0 + ind_PL = find(GI_Date_PL(:,m)); + ind_IPL = find(GI_Date_IPL(:,m)); + sezGrafIPLvsPL = Paragraph('Correlation between sensors - In Place Link vs Piezo Link'); + sezGrafIPLvsPL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + GI_VarFaldaPL = GI_Level_PL(:,m)-GI_Level_PL(1,m); + figure(21) + yyaxis left + GI_InPlaceLink = plot(GI_Date_IPL(1:ind_IPL(end),m),GI_Disp_IPL(1:ind_IPL(end),m),'Color','red'); + set(gca,'YColor','k') + if max(GI_Disp_IPL(:,m)) < 10 + ylim([-inf 10]); + end + ylabel('Displacement [mm]'); + yyaxis right + GI_PiezoLink = plot(GI_Date_PL(1:ind_PL(end),m),GI_VarFaldaPL(1:ind_PL(end)),':','Color','blue'); + var = max(abs(GI_VarFaldaPL(1:ind_PL(end)))); + media = mean(GI_VarFaldaPL(1:ind_PL(end))); + if var < 1 + ylim([media-0.5 media+0.5]); + end + ylabel('Water level variation [m]'); + set(gca,'YColor','k') + title('Correlation between displacements and water level variation'); + xlabel('Date [dd/mm/yyyy]'); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + lgdIPL = (['Displacements (' num2str(GI_Prof_IPL(1,m)) ' m)']); + lgdPL = ('Water level variation'); + str(1,1) = {['Displacements (' num2str(GI_Prof_IPL(1,m)) ' m)']}; + str(2,1) = {'Water level variation'}; + lgd = legend(lgdIPL,lgdPL, 'Location','north'); + numcolumns = 2; + [legend_h,object_h,plot_h,text_strings] = columnlegend(numcolumns,str); + clear str + + testoIPLvsPL = Paragraph(['The following graph aims to highlight any possible correlation '... + 'between the water level variation and displacements recorded by Tilt Link sensors. ' ... + 'In particular, with respect to the reference time period, sensors considered for this analysis '... + 'include the Tilt Link that recorded the highest local differential displacement along the '... + 'maximum slope direction, and the piezometer that measured the largest water level variation (if the Array '... + 'equips a single piezometer, water level data will refer to the only sensor available).']); + testoIPLvsPL2 = Paragraph(['In this case, displacements included in the chart refers to the Tilt Link '... + 'located at ' num2str(-(GI_Prof_TL(1,m))) ' m of depth, '... + 'while the water level variation over time derives from the piezometer '... + 'installed at ' num2str((GI_Prof_PL(1,m))) ' metres below ground level.']); + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-IPLvsPL_ENG.png')); + saveas(GI_PiezoLink,TempName); + ChartIPLvsPL = Image(TempName); + ChartIPLvsPL.Style = {ScaleToFit}; + ChartIPLvsPL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Comparison between water level variation and '... + 'maximum local differential displacement, along the maximum slope direction, during the reference time period']); + FIG = FIG+1; + ChartIPLvsPL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testoIPLvsPL.HAlign = 'justify'; + testoIPLvsPL2.HAlign = 'justify'; + add(DT,sezGrafIPLvsPL); + add(DT,testoIPLvsPL); + add(DT,testoIPLvsPL2); + add(DT,ChartIPLvsPL); + add(DT,ChartIPLvsPL_cap); + add(DT,br); + close(figure(21)); + % pulisco variabili da riutilizzare per catena successiva + clear GI_VarFaldaPL; + end +end + +Site = Chapter; +%% Grafici riassuntivi del SITO +if m == rAR && rAR > 1 + titleCha = 0; + % --- Piogge vs falda --- + if sum(rRL) > 0 && sum(rPL) > 0 && exist('GI_Rain_RL','var') && exist('GI_Level_PL','var') + if isempty(GI_Level_PL) == 0 && isempty(GI_Rain_RL) == 0 + if titleCha == 0 + sezSITE = Heading1('Correlations between different sensors'); + sezSITE.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site.Title = sezSITE; + spazio = Paragraph(''); + add(Site,spazio); + titleCha = 1; + end + sezGrafRLvsPL = Heading2('Correlation between sensors - Rain Link vs Piezo Link'); + sezGrafRLvsPL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + GI_VarFaldaPL = GI_Level_PL-GI_Level_PL(1,:); + testoRLvsPL = Paragraph(['The following graph aims to highlight any possible correlation '... + 'between the piezometer that measured the largest water level variation for each Array present on-site, '... + 'and local rainfall data recorded by the rain gauge.']); + add(Site,sezGrafRLvsPL); + add(Site,testoRLvsPL); + testoRLvsPL.HAlign = 'justify'; + figure(22) + GI_RainLink = bar(GI_Date_RL,GI_Rain_RL,75,'k'); + yyaxis left + ylabel('Rainfall [mm]'); + set(gca,'YColor','k') + yyaxis right + ylabel('Water level variation [m]'); + set(gca,'YColor','k') + title('Correlation between rainfall and water level variation'); + xlabel('Date [dd/mm/yyyy]'); + strRL(1,1) = cellstr('Rainfall'); + legend(strRL,'Location','northwest'); + [~,colPL] = size(GI_Level_PL); + num = 2; + index = []; + hold on + grid on + cmap = lines(colPL); + for p = 1:colPL + if GI_Date_PL(1,p) ~= 0 + ind_PL = find(GI_Date_PL(:,p)); + index = [index; p]; + GI_RainLink = plot(GI_Date_PL(1:ind_PL(end),p),GI_VarFaldaPL(1:ind_PL(end),p),'-','Color',cmap(p,:)); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(p,4)) ' -' num2str(GI_Prof_PL(1,p)) 'm']); + str(1,1) = cellstr('Rainfall'); + legend(str,'Location','northwest'); + num = num+1; + end + end + leg = legend(str,'Location','best'); + clear str + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-RLvsPL_ENG.png')); + saveas(GI_RainLink,TempName); + ChartRLvsPL = Image(TempName); + ChartRLvsPL.Style = {ScaleToFit}; + ChartRLvsPL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Comparison between rainfall data and water level '... + 'variations during the reference time period']); + FIG = FIG+1; + ChartRLvsPL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = ('In this case, the water level variation refers to data recorded by sensors reported below:'); + testoRLvsPL2 = Paragraph(text); + testoRLvsPL2.HAlign = 'justify'; + add(Site,testoRLvsPL2); + I = size(index); + for a = 1:I(1) + text = ['- Array ',char(chainID(index(a),4)),' - Piezometer at ',num2str(GI_Prof_PL(1,index(a))),' m b.g.l.']; + testoRLvsPL2 = Paragraph(text); + add(Site,testoRLvsPL2); + end + add(Site,ChartRLvsPL); + add(Site,ChartRLvsPL_cap); + add(Site,br); + close(figure(22)); + end + end + + escludiTL = 0; + escludiIPL = 0; + % --- Piogge vs Max Spostamento Tilt Link --- + if sum(rRL) > 0 && sum(rTL) > 0 && exist('GI_Rain_RL','var') && exist('GI_Disp_TL','var') + if isempty(GI_Disp_TL) == 0 && isempty(GI_Rain_RL) == 0 + if titleCha == 0 + sezSITE = Heading1('Correlation between different sensors'); + sezSITE.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site.Title = sezSITE; + spazio = Paragraph(''); + add(Site,spazio); + titleCha = 1; + end + sezGrafRLvsTL = Heading2('Correlation between sensors - Rain Link vs Tilt Link V'); + sezGrafRLvsTL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoRLvsTL = Paragraph(['The following graph aims to highlight any possible correlation '... + 'between 3D MEMS that recorded the maximum local differential displacement for each Array installed on-site, '... + 'and local rainfall data measured by the rain gauge']); + add(Site,sezGrafRLvsTL); + add(Site,testoRLvsTL); + testoRLvsTL.HAlign = 'justify'; + figure(23) + GI_RainLink = bar(GI_Date_RL,GI_Rain_RL,75,'k'); + yyaxis left + ylabel('Rainfall [mm]'); + set(gca,'YColor','k') + yyaxis right + ylabel('Displacement [mm]'); + set(gca,'YColor','k') + title('Correlation between rainfall and displacements'); + xlabel('Date [dd/mm/yyyy]'); + strRL(1,1) = cellstr('Rainfall'); + legend(strRL,'Location','northwest'); + [~,colTL] = size(GI_Disp_TL); + num = 2; + hold on + grid on + index = []; + cmap = lines(colTL); + for t = 1:colTL + if GI_Date_TL(1,t) ~= 0 + ind_TL = find(GI_Date_TL(:,t)); + index = [index; t]; + GI_RainLink = plot(GI_Date_TL(1:ind_TL(end),t),GI_Disp_TL(1:ind_TL(end),t),'-','Color',cmap(t,:)); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,1) = cellstr('Rainfall'); + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_TL(1,t)) 'm']); + legend(str,'Location','northwest'); + num = num+1; + end + end + clear str + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-RLvsTL_ENG.png')); + saveas(GI_RainLink,TempName); + ChartRLvsTL = Image(TempName); + ChartRLvsTL.Style = {ScaleToFit}; + ChartRLvsTL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Comparison '... + 'between rainfall and displacement data during the reference time period']); + FIG = FIG+1; + ChartRLvsTL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = 'Displacement data refer to data recorded by sensors listed below: '; + testoRLvsTL2 = Paragraph(text); + testoRLvsTL2.HAlign = 'justify'; + add(Site,testoRLvsTL2); + I = size(index); + for a = 1:I(1) + text = ['- Array ',char(chainID(index(a),4)),' - MEMS at ',num2str(abs(GI_Prof_TL(1,index(a)))),' m b.g.l.']; + testoRLvsTL2 = Paragraph(text); + add(Site,testoRLvsTL2); + end + add(Site,ChartRLvsTL); + add(Site,ChartRLvsTL_cap); + add(Site,br); + escludiTL = 1; + close(figure(23)); + end + end + % --- Piogge vs Max Spostamento In Place Link --- + if sum(rRL) > 0 && sum(rIPL) > 0 && exist('GI_Rain_RL','var') && exist('GI_Disp_IPL','var') + if isempty(GI_Disp_IPL) == 0 && isempty(GI_Rain_RL) == 0 + if titleCha == 0 + sezSITE = Heading1('Correlation between different sensors'); + sezSITE.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site.Title = sezSITE; + spazio = Paragraph(''); + add(Site,spazio); + titleCha = 1; + end + sezGrafRLvsIPL = Heading2('Correlation between sensors - Rain Link vs In Place Link'); + sezGrafRLvsIPL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoRLvsIPL = Paragraph(['The following graph aims to highlight any possible correlation '... + 'between 3D MEMS that recorded the maximum local differential displacement for each Array installed on-site '... + 'and local rainfall data measured by the rain gauge']); + add(Site,sezGrafRLvsIPL); + add(Site,testoRLvsIPL); + testoRLvsIPL.HAlign = 'justify'; + figure(23) + GI_RainLink = bar(GI_Date_RL,GI_Rain_RL,75,'k'); + yyaxis left + ylabel('Rainfall [mm]'); + set(gca,'YColor','k') + yyaxis right + ylabel('Displacement [mm]'); + set(gca,'YColor','k') + title('Correlation between rainfall and displacements'); + xlabel('Date [dd/mm/yyyy]'); + strRL(1,1) = cellstr('Rainfall'); + legend(strRL,'Location','northwest'); + [~,colIPL] = size(GI_Disp_IPL); + num = 2; + hold on + grid on + index = []; + cmap = lines(colIPL); + for t = 1:colIPL + if GI_Date_IPL(1,t) ~= 0 + ind_IPL = find(GI_Date_IPL(:,t)); + index = [index; t]; + GI_RainLink = plot(GI_Date_IPL(1:ind_IPL(end),t),GI_Disp_IPL(1:ind_IPL(end),t),'-','Color',cmap(t,:)); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_IPL(1,t)) 'm']); + num = num+1; + end + end + leg = legend(str,'Location','northwest'); + clear str + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-RLvsIPL_ENG.png')); + saveas(GI_RainLink,TempName); + ChartRLvsIPL = Image(TempName); + ChartRLvsIPL.Style = {ScaleToFit}; + ChartRLvsIPL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Comparison '... + 'between rainfall and displacement data during the reference time period']); + FIG = FIG+1; + ChartRLvsIPL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = 'Displacement data refer to data recorded by sensors listed below: '; + testoRLvsIPL2 = Paragraph(text); + testoRLvsIPL2.HAlign = 'justify'; + add(Site,testoRLvsIPL2); + I = size(index); + for a = 1:I(1) + text = ['- Array ',char(chainID(index(a),4)),' - MEMS at ',num2str(abs(GI_Prof_IPL(1,index(a)))),' m b.g.l.']; + testoRLvsIPL2 = Paragraph(text); + add(Site,testoRLvsIPL2); + end + add(Site,ChartRLvsIPL); + add(Site,ChartRLvsIPL_cap); + add(Site,br); + escludiIPL = 1; + close(figure(23)); + end + end + % --- Spostamenti Tilt Link o In Place Link - clinometri - fessurimetri --- + if sum(rTL) > 0 && exist('GI_Disp_TL','var') && sum(rKL) > 0 && exist('GI_Angolo_KL','var') || ... + sum(rIPL) > 0 && exist('GI_Disp_IPL','var') && sum(rKL) > 0 && exist('GI_Angolo_KL','var') || ... + sum(rTL) > 0 && exist('GI_Disp_TL','var') && sum(rCrL) > 0 && exist('GI_Disp_CrL','var') || ... + sum(rIPL) > 0 && exist('GI_Disp_IPL','var') && sum(rCrL) > 0 && exist('GI_Disp_CrL','var') || ... + sum(rCrL) > 0 && exist('GI_Disp_CrL','var') && sum(rKL) > 0 && exist('GI_Angolo_KL','var') + if isempty(GI_Disp_TL) == 0 && isempty(GI_Angolo_KL) == 0 || ... + isempty(GI_Disp_IPL) == 0 && isempty(GI_Angolo_KL) == 0 || ... + isempty(GI_Disp_TL) == 0 && isempty(GI_Disp_CrL) == 0 || ... + isempty(GI_Disp_IPL) == 0 && isempty(GI_Disp_CrL) == 0 || ... + isempty(GI_Disp_CrL) == 0 && isempty(GI_Angolo_KL) == 0 + figure(25) + hold on + grid on + if sum(rTL) > 0 && sum(rKL) > 0 && sum(rCrL) > 0 % Ci sono Tilt + Klino + Crack + sezGrafTLvsKL = Heading2('Correlation between sensors: Tilt Link V, Klino Link, Crack Link'); + testoTLvsKL = Paragraph(['The following graph aims to highlight any possible correlation '... + 'between 3D MEMS that recorded the maximum local differential displacement for each Array, the maximum tilt value '... + 'measured by Klino Links and the maximum crack opening recorded by crack meters installed on-site.']); + title('Maximum values recorded by Tilt, Klino and Crack Link sensors'); + ChartTLvsKL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Comparison '... + 'between maximum values of local differential displacement, tilt, and opening recorded during '... + 'the reference time period respectively by Tilt Links, Klino Links, and Crack Links']); + elseif sum(rIPL) > 0 && sum(rKL) > 0 && sum(rCrL) > 0 % Ci sono In Place + Klino + Crack + sezGrafTLvsKL = Heading2('Correlation between sensors: In Place Link, Klino Link, Crack Link'); + testoTLvsKL = Paragraph(['The following graph aims to highlight any possible correlation '... + 'between 3D MEMS that recorded the maximum local differential displacement for each Array, the maximum tilt value '... + 'measured by Klino Links and the maximum crack opening recorded by crack meters installed on-site.']); + title('Maximum values recorded by In Place, Klino and Crack Link sensors'); + ChartTLvsKL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Comparison '... + 'between maximum values of local differential displacements, tilt, and opening recorded during '... + 'the reference time period respectively by Tilt Links, Klino Links, and Crack Links']); + elseif sum(rTL) > 0 && sum(rKL) > 0 % Tilt + Klino + sezGrafTLvsKL = Heading2('Correlation between sensors: Tilt Link V and Klino Link'); + testoTLvsKL = Paragraph(['The following graph aims to highlight any possible correlation '... + 'between 3D MEMS that recorded the maximum local differential displacement for each Array, and the maximum tilt value '... + 'measured by Klino Links installed on-site.']); + title('Maximum values recorded by Tilt and Klino Link sensors'); + ChartTLvsKL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Comparison '... + 'between maximum values of local differential displacements and tilt recorded during '... + 'the reference time period respectively by Tilt Links and Klino Links']); + elseif sum(rIPL) > 0 && sum(rKL) > 0 % In Place + Klino + sezGrafTLvsKL = Heading2('Correlation between sensors: In Place Link and Klino Link'); + testoTLvsKL = Paragraph(['The following graph aims to highlight any possible correlation '... + 'between 3D MEMS that recorded the maximum local differential displacement for each Array, and the maximum tilt value '... + 'measured by Klino Links installed on-site.']); + title('Maximum values recorded by In Place and Klino Link sensors'); + ChartTLvsKL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Comparison '... + 'between maximum values of local differential displacements and tilt recorded during '... + 'the reference time period respectively by In Place Links and Klino Links']); + elseif sum(rTL) > 0 && sum(rCrL) > 0 % Tilt e Crack + sezGrafTLvsKL = Heading2('Correlation between sensors: Tilt Link V and Crack Link'); + testoTLvsKL = Paragraph(['The following graph aims to highlight any possible correlation '... + 'between 3D MEMS that recorded the maximum local differential displacement for each Array, '... + 'and the maximum crack opening recorded by crack meters installed on-site.']); + title('Maximum values recorded by Tilt and Crack Link sensors'); + ChartTLvsKL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Comparison '... + 'between maximum values of local differential displacements and opening recorded during '... + 'the reference time period respectively by Tilt Links and Crack Links']); + elseif sum(rIPL) > 0 && sum(rCrL) > 0 % In Place e Crack + sezGrafTLvsKL = Heading2('Correlation between sensors: In Place Link and Crack Link'); + testoTLvsKL = Paragraph(['The following graph aims to highlight any possible correlation '... + 'between 3D MEMS that recorded the maximum local differential displacement for each Array, '... + 'and the maximum crack opening recorded by crack meters installed on-site.']); + title('Maximum values recorded by In Place and Crack Link sensors'); + ChartTLvsKL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Comparison '... + 'between maximum values of local differential displacements and opening recorded during '... + 'the reference time period respectively by In Place Links and Crack Links']); + elseif sum(rKL) > 0 && sum(rCrL) > 0 + sezGrafTLvsKL = Heading2('Correlation between sensors: Klino Link and Crack Link'); + testoTLvsKL = Paragraph(['The following graph aims to highlight any possible correlation '... + 'between the maximum tilt value '... + 'measured by Klino Links, and the maximum crack opening recorded by crack meters installed on-site.']); + title('Maximum values recorded by Klino and Crack Link sensors'); + ChartTLvsKL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Comparison '... + 'between maximum values of tilt and opening recorded during '... + 'the reference time period respectively by Klino Links and Crack Links']); + end + sezGrafTLvsKL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoTLvsKL.HAlign = 'justify'; + + yyaxis left + ylabel('Displacement [mm]'); + set(gca,'YColor','k') + yyaxis right + ylabel(['Tilt [' char(176) ']']); + set(gca,'YColor','k') + xlabel('Date [dd/mm/yyyy]'); + [~,colTL] = size(GI_Disp_TL); + [~,colIPL] = size(GI_Disp_IPL); + [~,colKL] = size(GI_Date_KL); + [~,colCrL] = size(GI_Date_CrL); + num = 1; + cmap = lines(2*colKL+colTL+colIPL+colCrL); + cont = 1; + % Tilt Link V + indexTL = []; + if sum(rTL) > 0 + yyaxis left + for t = 1:colTL + if GI_Date_TL(1,t) ~= 0 + ind_TL = find(GI_Date_TL(:,t)); + indexTL = [indexTL; t]; + plot(GI_Date_TL(1:ind_TL(end),t),GI_Disp_TL(1:ind_TL(end),t),'-','Color',cmap(cont,:)); + cont = cont+1; + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_TL(1,t)) ' m']); + num = num+1; + end + end + MIN(1) = min(min(GI_Disp_TL)); + MAX(1) = max(max(GI_Disp_TL)); + end + % In Place Link + indexIPL = []; + if sum(rIPL) > 0 + yyaxis left + for t = 1:colIPL + if GI_Date_IPL(1,t) ~= 0 + ind_IPL = find(GI_Date_IPL(:,t)); + indexIPL = [indexIPL; t]; + plot(GI_Date_IPL(1:ind_IPL(end),t),GI_Disp_IPL(1:ind_IPL(end),t),'-','Color',cmap(cont,:)); + cont = cont+1; + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_IPL(1,t)) ' m']); + num = num+1; + end + end + MIN(2) = min(min(GI_Disp_IPL)); + MAX(2) = max(max(GI_Disp_IPL)); + end + % Crack Link + indexCrL = []; + if sum(rCrL) > 0 + yyaxis left + for c = 1:colCrL + if GI_Date_CrL(1,c) ~= 0 + var = GI_Disp_CrL-GI_Disp_CrL(1,:); + ind_CrL = find(GI_Date_CrL(:,c)); + indexCrL = [indexCrL; c]; + if sum(rKL) > 0 + plot(GI_Date_CrL(1:ind_CrL(end),c),var(1:ind_CrL(end),c),'-','Color',cmap(cont,:)); + else + GI_KlinoLink = plot(GI_Date_CrL(1:ind_CrL(end),c),var(1:ind_CrL(end),c),'-','Color',cmap(cont,:)); + end + cont = cont+1; + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(c,4)) ' node ' num2str(GI_Num_CrL(1,c))]); + num = num+1; + end + end + MIN(3) = min(min(var)); + MAX(3) = max(max(var)); + ylim([floor(min(min(MIN))) ceil(max(max(MAX)))]); + end + % Klino Link + indexKL = []; + if sum(rKL) > 0 + yyaxis right + kk = 1; + for k = 1:colKL + if GI_Date_KL(1,k) ~= 0 + ind_KL = find(GI_Date_KL(:,k)); + indexKL = [indexKL; k]; + plot(GI_Date_KL(1:ind_KL(end),k),GI_Angolo_KL(1:ind_KL(end),kk)... + -GI_Angolo_KL(1,kk),'-','Color',cmap(cont,:)); + GI_KlinoLink = plot(GI_Date_KL(1:ind_KL(end),k),GI_Angolo_KL(1:ind_KL(end)... + ,kk+1)-GI_Angolo_KL(1,kk+1),'-','Color',cmap(cont+1,:)); + cont = cont+2; + kk = kk+2; + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(k,4)) ' node' num2str(GI_Num_KL(1,k)) ', X axis']); + str(1,num+1) = cellstr([char(chainID(k,4)) ' node ' num2str(GI_Num_KL(1,k)) ', Y axis']); + num = num+2; + end + end + ylim([floor(min(min(GI_Angolo_KL))) ceil(max(max(GI_Angolo_KL)))]); + end + + numcolumns = 1; + [legend_h,object_h,plot_h,text_strings] = columnlegend(numcolumns,str,'Location','NorthWest'); + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-TLvsKL_ENG.png')); + if titleCha == 0 + sezSITE = Heading1('Correlation between different sensors'); + sezSITE.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site.Title = sezSITE; + titleCha = 1; + end + add(Site,sezGrafTLvsKL); + add(Site,testoTLvsKL); + saveas(GI_KlinoLink,TempName); + ChartTLvsKL = Image(TempName); + ChartTLvsKL.Style = {ScaleToFit}; + + FIG = FIG+1; + ChartTLvsKL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = 'Reported values refer to data recorded by sensors listed below: '; + testoTL2 = Paragraph(text); + testoTL2.HAlign = 'justify'; + add(Site,testoTL2); + % Tilt Link + I = size(indexTL); + for a = 1:I(1) + text = ['- Array ',char(chainID(indexTL(a),4)),' - MEMS at ',num2str(abs(GI_Prof_TL(1,indexTL(a)))),' m b.g.l.']; + testoTL2 = Paragraph(text); + add(Site,testoTL2); + end + % In Place Link + I = size(indexIPL); + for a = 1:I(1) + text = ['- Array ',char(chainID(indexIPL(a),4)),' - MEMS at ',num2str(abs(GI_Prof_IPL(1,indexIPL(a)))),' m b.g.l.']; + testoTL2 = Paragraph(text); + add(Site,testoTL2); + end + % Klino Link + I = size(indexKL); + for a = 1:I(1) + text = ['- Array ',char(chainID(indexKL(a),4)),' - Tilt meter ',num2str(GI_Num_KL(1,indexKL(a)))]; + testoTL2 = Paragraph(text); + add(Site,testoTL2); + end + % Crack Link + I = size(indexCrL); + for a = 1:I(1) + text = ['- Array ',char(chainID(indexCrL(a),4)),' - Crack meter, node ',num2str(GI_Num_CrL(1,indexCrL(a)))]; + testoTL2 = Paragraph(text); + add(Site,testoTL2); + end + add(Site,ChartTLvsKL); + add(Site,ChartTLvsKL_cap); + add(Site,br); + end + close(figure(25)); + escludiTL = 1; + end + % --- Spostamenti a confronto --- + % ---> Tilt Link + if sum(rTL) > 0 && exist('GI_Disp_TL','var') + if isempty(GI_Disp_TL) == 0 + if escludiTL == 0 + sezGrafTL = Heading2('Correlation between Tilt Link V sensors'); + sezGrafTL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoTL = Paragraph(['The following graph aims to highlight any possible correlation '... + 'between highest displacement values recorded by 3D MEMS '... + 'for each single Vertical Array installed on-site.']); + testoTL.HAlign = 'justify'; + figure(24) + ylabel('Displacement [mm]'); + set(gca,'YColor','k') + title('Correlation between maximum values measured by each single Array'); + xlabel('Date [dd/mm/yyyy]'); + [~,colTL] = size(GI_Disp_TL); + num = 1; + index = []; + for t = 1:colTL + if GI_Date_TL(1,t) ~= 0 + ind_TL = find(GI_Date_TL(:,t)); + index = [index; t]; + hold on + grid on + GI_TiltLink = plot(GI_Date_TL(1:ind_TL(end),t),GI_Disp_TL(1:ind_TL(end),t)); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_TL(1,t)) ' m']); + leg = legend(str,'Location','northwest'); + num = num+1; + end + end + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-TL_ENG.png')); + if num >= 3 + if titleCha == 0 + sezSITE = Heading1('Correlation between different sensors'); + sezSITE.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site.Title = sezSITE; + titleCha = 1; + end + add(Site,sezGrafTL); + add(Site,testoTL); + saveas(GI_TiltLink,TempName); + ChartTL = Image(TempName); + ChartTL.Style = {ScaleToFit}; + ChartTL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Comparison '... + 'between highest value of 2D differential local displacement '... + 'recorded by each single Array during the reference time period']); + FIG = FIG+1; + ChartTL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = 'Displacement data refer to the following sensors: '; + testoTL2 = Paragraph(text); + testoTL2.HAlign = 'justify'; + add(Site,testoTL2); + I = size(index); + for a = 1:I(1) + text = ['- Array ',char(chainID(index(a),4)),' - MEMS at ',num2str(abs(GI_Prof_TL(1,index(a)))),' m b.g.l.']; + testoTL2 = Paragraph(text); + add(Site,testoTL2); + end + add(Site,ChartTL); + add(Site,ChartTL_cap); + add(Site,br); + end + close(figure(24)); + end + end + end + % ---> In Place Link + if sum(rIPL) > 0 && exist('GI_Disp_IPL','var') + if isempty(GI_Disp_IPL) == 0 + if escludiIPL == 0 + sezGrafIPL = Heading2('Correlation between In Place sensors'); + sezGrafIPL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoIPL = Paragraph(['The following graph aims to highlight any possible correlation '... + 'between highest displacement values recorded by 3D MEMS '... + 'for each single In Place Array installed on-site.']); + testoIPL.HAlign = 'justify'; + figure(24) + ylabel('Displacement [mm]'); + set(gca,'YColor','k') + title('Correlation between maximum values measured by each single Array'); + xlabel('Date [dd/mm/yyyy]'); + [~,colIPL] = size(GI_Disp_IPL); + num = 1; + index = []; + for t = 1:colIPL + if GI_Date_IPL(1,t) ~= 0 + ind_IPL = find(GI_Date_IPL(:,t)); + index = [index; t]; + hold on + grid on + GI_InPlaceLink = plot(GI_Date_IPL(1:ind_IPL(end),t),GI_Disp_IPL(1:ind_IPL(end),t)); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_IPL(1,t)) ' m']); + leg = legend(str,'Location','northwest'); + num = num+1; + end + end + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-IPL_ENG.png')); + if num >= 3 + if titleCha == 0 + sezSITE = Heading1('Correlation between different sensors'); + sezSITE.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site.Title = sezSITE; + titleCha = 1; + end + add(Site,sezGrafIPL); + add(Site,testoIPL); + saveas(GI_InPlaceLink,TempName); + ChartIPL = Image(TempName); + ChartIPL.Style = {ScaleToFit}; + ChartIPL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Comparison '... + 'between highest value of 2D differential local displacement '... + 'recorded by each single Array during the reference time period']); + FIG = FIG+1; + ChartIPL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = 'Displacement data refer to the following sensors: '; + testoIPL2 = Paragraph(text); + testoIPL2.HAlign = 'justify'; + add(Site,testoIPL2); + I = size(index); + for a = 1:I(1) + text = ['- Array ',char(chainID(index(a),4)),' - MEMS at ',num2str(abs(GI_Prof_IPL(1,index(a)))),' m b.g.l.']; + testoIPL2 = Paragraph(text); + add(Site,testoIPL2); + end + add(Site,ChartIPL); + add(Site,ChartIPL_cap); + add(Site,br); + end + close(figure(24)); + end + end + end + %---> Quadranti Tunnel Link + if sum(rTuL) > 0 && exist('GI_Q1_TuL','var') + if isempty(GI_Q1_TuL) == 0 && isempty(GI_Q2_TuL) == 0 && isempty(GI_Q3_TuL) == 0 ... + && isempty(GI_Q4_TuL) == 0 + if titleCha == 0 + sezSITE = Heading1('Correlation between different sensors'); + sezSITE.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + spazio = Paragraph(''); + add(Site,spazio); + Site.Title = sezSITE; + titleCha = 1; + end + sezGrafTuL = Heading2('Correlation between Tunnel Links'); + sezGrafTuL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoTuL = Paragraph(['The following graph aims to highlight any correlation between '... + 'highest 2D displacement values recorded by 3D MEMS for each single Cir Array installed on-site. '... + 'Displacements are compared according to the corresponding sector, defined by dividing the monitored '... + 'section in four separated areas which are numbered as explained in the following figure. ']); + testoTuL.HAlign = 'justify'; + img = Image(('Quadranti.png')); + img.Style = {Height('6cm'),HAlign('center')}; + imgcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sectors numbering in a tunnel section']); + FIG = FIG+1; + imgcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + % Quadrante 1 + figure(25) + set(gca,'YColor','k') + [~,colTuL] = size(GI_Q1_TuL); + num = 1; + for t = 1:colTuL + if GI_Date_TuL(1,t) ~= 0 + y1(num) = GI_Q1_TuL(1,t); + y2(num) = GI_Q2_TuL(1,t); + y3(num) = GI_Q3_TuL(1,t); + y4(num) = GI_Q4_TuL(1,t); + y5(num) = 0; + str(1,num) = chainID(t,4); + num = num+1; + end + end + y = [y1;y2;y3;y4;y5]; + x = [1;2;3;4;5]; + Quadranti = barh(x,y); + grid on + + title('Correlation between displacements recorded in different sectors'); + xlabel('Displacement [mm]'); + ylabel('Sector [-]'); + ylim([0 5]); % Con 5, metto la legenda in alto a sx (il valore 5 ? pieno di 0) + % Stimo limiti asse X + ini1 = min(GI_Q1_TuL); + ini2 = min(GI_Q2_TuL); + ini3 = min(GI_Q3_TuL); + ini4 = min(GI_Q4_TuL); + Min = [ini1; ini2; ini3; ini4]; + C = min(Min); + end1 = max(GI_Q1_TuL); + end2 = max(GI_Q2_TuL); + end3 = max(GI_Q3_TuL); + end4 = max(GI_Q4_TuL); + Max = [end1; end2; end3; end4]; + B = max(Max); + A = [abs(C),abs(B)]; + LIM = max(A); + POS = find(A == LIM); + if -LIM > -2.5 % mm + ini = -2.5; + else + ini = -LIM; + end + if LIM < 2.5 + End = 2.5; + else + End = LIM; + end + xlim([ini End]); + if num-1 == 1 % 1 solo array + ylim([0 5]); + else + ylim([0 6]); + end + yticks(1:4); + if POS == 1 % Legenda a DX + legend(str,'Location','northeast'); + else % SX + legend(str,'Location','northwest'); + end + + add(Site,sezGrafTuL); + add(Site,testoTuL); + add(Site,img); + add(Site,imgcaption); + + TempName1 = char(strcat('Report',siteID,'-', char(toolrif),'-Quadranti_ENG.png')); + saveas(Quadranti(1),TempName1); + ChartTuL = Image(TempName1); + ChartTuL.Style = {Height('7.5cm'),HAlign('center')}; + close(figure(25)) + Quadranti_cap = Paragraph(['Fig. ' num2str(FIG) ' - Comparison '... + 'between highest 2D displacement values '... + 'recorded by each single Array in the corresponding sector of the monitored tunnel section '... + 'during the reference time period']); + FIG = FIG+1; + Quadranti_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + text = 'Displacement data refer to the following sensors: '; + testoTuL2 = Paragraph(text); + testoTuL2.HAlign = 'justify'; + add(Site,testoTuL2); + text = 'Sector 1'; + testoTuL1 = Paragraph(text); + testoTuL1.Style = {HAlign('justify'),FontSize(Font_caption),Bold(1),Color('midnightblue')}; + add(Site,testoTuL1); + for a = 1:colTuL + if GI_Date_TuL(1,a) ~= 0 + text1 = ['- Array ',char(chainID(a,4)),' - node ',num2str(abs(GI_Q1_Num_TuL(1,a))),'']; + testoTuL2 = Paragraph(text1); + add(Site,testoTuL2); + end + end + text = 'Sector 2'; + testoTuL3 = Paragraph(text); + testoTuL3.Style = {HAlign('justify'),FontSize(Font_caption),Bold(1),Color('midnightblue')}; + add(Site,testoTuL3); + for a = 1:colTuL + if GI_Date_TuL(1,a) ~= 0 + text2 = ['- Array ',char(chainID(a,4)),' - node ',num2str(abs(GI_Q2_Num_TuL(1,a))),'']; + testoTuL4 = Paragraph(text2); + add(Site,testoTuL4); + end + end + text = 'Sector 3'; + testoTuL5 = Paragraph(text); + testoTuL5.Style = {HAlign('justify'),FontSize(Font_caption),Bold(1),Color('midnightblue')}; + add(Site,testoTuL5); + for a = 1:colTuL + if GI_Date_TuL(1,a) ~= 0 + text3 = ['- Array ',char(chainID(a,4)),' - node ',num2str(abs(GI_Q3_Num_TuL(1,a))),'']; + testoTuL6 = Paragraph(text3); + add(Site,testoTuL6); + end + end + text = 'Sector 4'; + testoTuL7 = Paragraph(text); + testoTuL7.Style = {HAlign('justify'),FontSize(Font_caption),Bold(1),Color('midnightblue')}; + add(Site,testoTuL7); + for a = 1:colTuL + if GI_Date_TuL(1,a) ~= 0 + text4 = ['- Array ',char(chainID(a,4)),' - node ',num2str(abs(GI_Q4_Num_TuL(1,a))),'']; + testoTuL8 = Paragraph(text4); + add(Site,testoTuL8); + end + end + add(Site,ChartTuL); + add(Site,Quadranti_cap); + end + end + % ---> Confronti variazioni segmenti Stella + if sum(rTuL) > 0 && exist('GI_Seg_TuL','var') + if isempty(GI_Seg_TuL) == 0 + testoStar = Paragraph(['The following graph aims to compare the length variation of '... + 'each convergence segment referred to tunnel sections monitored with a Cir Array. Please refer to '... + 'the corresponding Array section of this Report for information regarding any specific convergence star.']); + testoStar.HAlign = 'justify'; + figure(26) + set(gca,'YColor','k') + s = 1; + num = 1; + [~,colTuL] = size(GI_Date_TuL); + for t = 1:colTuL + if GI_Date_TuL(1,t) ~= 0 % Esistono dati per quell'array + % Segmento 1 + s1(num) = GI_Seg_TuL(1,s); + s = s+1; + % Segmento 2 + if GI_NumSeg_TuL(t,1) > 1 + s2(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s2(num) = 0; + end + % Segmento 3 + if GI_NumSeg_TuL(t,1) > 2 + s3(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s3(num) = 0; + end + % Segmento 4 + if GI_NumSeg_TuL(t,1) > 3 + s4(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s4(num) = 0; + end + % Segmento 5 + if GI_NumSeg_TuL(t,1) > 4 + s5(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s5(num) = 0; + end + % Segmento 6 + if GI_NumSeg_TuL(t,1) > 5 + s6(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s6(num) = 0; + end + % Segmento 7 + if GI_NumSeg_TuL(t,1) > 6 + s7(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s7(num) = 0; + end + str(1,num) = chainID(t,4); + num = num+1; + end + end + y = [s1;s2;s3;s4;s5;s6;s7]; + x = [1;2;3;4;5;6;7]; + yticklabels({'S1','S2','S3','S4','S5','S6','S7'}) + Stella = barh(x,y); + grid on + + title('Correlation between convergence segments length variation'); + xlabel('Displacement [mm]'); + ylabel('Segment [-]'); + % Stimo limiti asse X + ini = min(y); + ini = min(ini); + End = max(y); + End = max(End); + A = [abs(ini),End]; + RIF = max(A); + ind = find(A == RIF); + if ind == 1 + legend(str,'Location','northeast'); + else + legend(str,'Location','northwest'); + end + if -RIF > -2.5 % mm + ini = -2.5; + else + ini = -RIF; + end + if RIF < 2.5 + End = 2.5; + else + End = RIF; + end + xlim([ini End]); + yticks(1:7); + if num-1 == 1 % Numero Array + ylim([0 7]); + else + ylim([0 8]); + end + add(Site,testoStar); + + TempName1 = char(strcat('Report',siteID,'-', char(toolrif),'-Stella_ENG.png')); + saveas(Stella(1),TempName1); + ChartStella = Image(TempName1); + ChartStella.Style = {Height('7.5cm'),HAlign('center')}; + add(Site,ChartStella); + close(figure(26)) + Quadranti_cap = Paragraph(['Fig. ' num2str(FIG) ' - Comparison '... + 'between length variations of each convergence segment '... + 'recorded in the corresponding tunnel section by each single Array '... + 'during the reference time period']); + FIG = FIG+1; + Quadranti_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Site,Quadranti_cap); + add(Site,br); + end + end + % ---> Grafici spostamento in calotta PreConv vs Cir + if sum(rTuL) > 0 && exist('GI_Z_TuL','var') && sum(rPCL) > 0 && exist('GI_Z_PCL','var') + if isempty(GI_Z_TuL) == 0 && isempty(GI_Z_PCL) == 0 + sezGrafTuLvsPCL = Heading2('Correlation between PreConv Array and Cir Array'); + sezGrafTuLvsPCL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoTuLvsPCL = Paragraph(['The following graph aims to highlight any correlation '... + 'between local displacements recorded by PreConv Array and Cir Array sensors. The comparison '... + 'takes into account two nodes, one for each Array, installed approximately in the same place of the '... + 'upper part of the monitored section.']); + testoTuLvsPCL.HAlign = 'justify'; + + % Cerco eventuali correlazioni con Cir Array + NomeFile = strcat('Report',siteID,'-PCLvsTuL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + num = 1; + sen = 1; + SensoriTuL = zeros(1,1); + SensoriPCL = zeros(1,1); + CatenaTuL = cell(1,1); + CatenaPCL = cell(1,1); + colCIR = 0; + while AAA < rF % A un PreConv possono competere pi? Cir + PCL = 0; + Cir = 0; + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono PreConv Array o non ci sono Cir + break + else + check2 = Filetesto(AAA+1,1); + for nn = 1:rAR + chain = char(chainID(nn,4)); + if check1 == str2num(chain(end-2:end)) + PCL = nn; + NodoPCL = Filetesto(AAA+2,1); + SensoriPCL(sen,1) = NodoPCL; + CatenaPCL(sen,1) = chainID(nn,4); + end + if check2 == str2num(chain(end-2:end)) + Cir = nn; + NodoTuL = Filetesto(AAA+3,1); + SensoriTuL(sen,1) = NodoTuL; + CatenaTuL(sen,1) = chainID(nn,4); + colCIR = colCIR+1; + end + if PCL > 0 && Cir > 0 + figure(27) + ylabel('Displacement [mm]'); + xlabel('Date [dd/mm/yyyy]'); + set(gca,'YColor','k') + title('Correlation between corresponding sensors'); + grid on + hold on + dim1 = find(GI_Z_PCL(:,PCL)); + dim2 = find(GI_Z_TuL(:,colCIR)); + if isempty(dim1) == 0 && isempty(dim2) == 0 + plot(GI_Date_PCL(1:dim1(end),PCL),GI_Z_PCL(1:dim1(end),PCL)); + GI_TuLvsPCL = plot(GI_Date_TuL(1:dim2(end),Cir),GI_Z_TuL(1:dim2(end),colCIR)); + MIN1 = min(GI_Z_PCL(:,PCL)); + MIN2 = min(GI_Z_TuL(:,colCIR)); + MIN = min(MIN1,MIN2); + MAX1 = max(GI_Z_PCL(:,PCL)); + MAX2 = max(GI_Z_TuL(:,colCIR)); + MAX = max(MAX1,MAX2); + if MAX < 5 && MIN > -5 % mm + ylim([-5 5]); + elseif MAX < 5 + ylim([MIN-1 5]); + elseif MIN > -5 + ylim([-5 MAX+1]); + end + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + h = gca; + h.XAxis.MinorTick = 'on'; + xtickangle(20); + str(1,1) = cellstr([char(CatenaPCL(sen,1)) ' Node ' num2str(NodoPCL) '']); + str(1,2) = cellstr([char(CatenaTuL(sen,1)) ' Node ' num2str(NodoTuL) '']); + legend(str,'Location','northwest'); + TempName = char(strcat('Report',siteID,'-PCLvsTuL',num2str(num),'_ENG.png')); + saveas(GI_TuLvsPCL,TempName); + num = num+1; + end + close(figure(27)); + sen = sen+1; + AAA = AAA+4; + break + end + end + end + end + num = num-1; + if num ~= 0 % Non ci sono legami + add(Site,sezGrafTuLvsPCL); + add(Site,testoTuLvsPCL); + if num == 1 + TempName = char(strcat('Report',siteID,'-PCLvsTuL',num2str(num),'_ENG.png')); + Chart1 = Image(TempName); + Chart1.Style = {ScaleToFit}; + add(Site,Chart1); + else + n = 1; + while n <= num + TempName = char(strcat('Report',siteID,'-PCLvsTuL',num2str(n),'_ENG.png')); + Chart1 = Image(TempName); + Chart1.Style = {Height('7cm')}; + if n+1 <= num + TempName = char(strcat('Report',siteID,'-PCLvsTuL',num2str(n+1),'_ENG.png')); + Chart2 = Image(TempName); + Chart2.Style = {Height('7cm')}; + lot = Table({Chart1, Chart2}); + lot.Style = {ResizeToFitContents(false), Width('100%')}; + n = n+2; + add(Site,lot); + else + n = n+1; + add(Site,Chart1); + end + end + end + ChartPCLvsTuL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Comparison between '... + 'local displacements recorded during the reference time period by the '... + 'Cir Array sensor installed on the upper part of '... + 'the tunnel section, and the corresponding PreConv Array sensor']); + FIG = FIG+1; + ChartPCLvsTuL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Site,ChartPCLvsTuL_cap); + + text = 'Displacement data refer to the following sensors: '; + testoPCLvsTuL2 = Paragraph(text); + testoPCLvsTuL2.HAlign = 'justify'; + add(Site,testoPCLvsTuL2); + I = size(SensoriPCL); + for a = 1:I(1) + textPC = ['- PreConv Array ' char(CatenaPCL(a,1)) ' - Node ' num2str(SensoriPCL(a,1)) ';']; + textCA = ['- Cir Array ' char(CatenaTuL(a,1)),' - Node ' num2str(SensoriTuL(a,1)) '.']; + spazio = Paragraph(''); + testoPCLvsTuL2 = Paragraph(textPC); + testoPCLvsTuL3 = Paragraph(textCA); + add(Site,testoPCLvsTuL2); + add(Site,testoPCLvsTuL3); + add(Site,spazio); + end + add(Site,br); + end + end + end + + % ---> Grafici spostamento Cir vs Rad + if sum(rRaL) > 0 && exist('GI_dS_RL_TuL','var') && sum(rRaL) > 0 && exist('GI_dS_TuL_RL','var') + if isempty(GI_dS_RL_TuL) == 0 && isempty(GI_dS_TuL_RL) == 0 + sezGrafTuLvsRL = Heading2('Correlazioni tra Cir Array e Rad Array'); + sezGrafTuLvsRL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoTuLvsRL = Paragraph(['The following graph aims to highlight any possible correlation '... + 'between 2D local differential displacement values recorded by the Radial Link located closer '... + 'to the monitored section, and the corresponding Tunnel Link sensor.']); + testoTuLvsRL.HAlign = 'justify'; + + % Cerco eventuali correlazioni con Cir Array + NomeFile = strcat('Report',siteID,'-TuLvsRL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + num = 1; + sen = 1; + SensoriTuL = zeros(1,1); + SensoriRL = zeros(1,1); + CatenaTuL = cell(1,1); + CatenaRL = cell(1,1); + colCIR = 0; + while AAA < rF + Rad = 0; + Cir = 0; + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono Rad Array o non ci sono Cir + break + else + check2 = Filetesto(AAA+1,1); + for nn = 1:rAR + chain = char(chainID(nn,4)); + if check1 == str2num(chain(end-2:end)) % Il primo deve sempre essere il Cir + Cir = nn; + NodoTuL = Filetesto(AAA+2,1); + SensoriTuL(sen,1) = NodoTuL; + CatenaTuL(sen,1) = chainID(nn,4); + colCIR = colCIR+1; + end + if check2 == str2num(chain(end-2:end)) + Rad = nn; + NodoRL = Filetesto(AAA+3,1); + SensoriRL(sen,1) = NodoRL; + CatenaRL(sen,1) = chainID(nn,4); + end + if Rad > 0 && Cir > 0 + figure(28) + ylabel('Displacement [mm]'); + xlabel('Date [dd/mm/yyyy]'); + set(gca,'YColor','k') + title('Correlation between corresponding sensors'); + grid on + hold on + dim1 = find(GI_dS_RL_TuL(:,Rad)); + dim2 = find(GI_dS_TuL_RL(:,colCIR)); + if isempty(dim1) == 0 && isempty(dim2) == 0 + plot(GI_Date_Rad(1:dim1(end),Rad),GI_dS_RL_TuL(1:dim1(end),Rad)); + GI_TuLvsRL = plot(GI_Date_TuL(1:dim2(end),Cir),GI_dS_TuL_RL(1:dim2(end),colCIR)); + MAX1 = max(GI_dS_RL_TuL(:,Rad)); + MAX2 = max(GI_dS_TuL_RL(:,colCIR)); + MAX = max(MAX1,MAX2); + if MAX < 5 % mm + ylim([0 5]); + end + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + h = gca; + h.XAxis.MinorTick = 'on'; + xtickangle(20); + str(1,1) = cellstr([char(CatenaTuL(sen,1)) ' Node ' num2str(NodoTuL) '']); + str(1,2) = cellstr([char(CatenaRL(sen,1)) ' Node ' num2str(NodoRL) '']); + legend(str,'Location','northwest'); + TempName = char(strcat('Report',siteID,'-TuLvsRL',num2str(num),'_ENG.png')); + saveas(GI_TuLvsRL,TempName); + num = num+1; + end + close(figure(28)); + sen = sen+1; + AAA = AAA+4; + break + end + end + end + end + num = num-1; + if num ~= 0 % Non ci sono legami + add(Site,sezGrafTuLvsRL); + add(Site,testoTuLvsRL); + if num == 1 + TempName = char(strcat('Report',siteID,'-TuLvsRL',num2str(num),'_ENG.png')); + Chart1 = Image(TempName); + Chart1.Style = {ScaleToFit}; + add(Site,Chart1); + else + n = 1; + while n <= num + TempName = char(strcat('Report',siteID,'-TuLvsRL',num2str(n),'_ENG.png')); + Chart1 = Image(TempName); + Chart1.Style = {Height('7cm')}; + if n+1 <= num + TempName = char(strcat('Report',siteID,'-TuLvsRL',num2str(n+1),'_ENG.png')); + Chart2 = Image(TempName); + Chart2.Style = {Height('7cm')}; + lot = Table({Chart1, Chart2}); + lot.Style = {ResizeToFitContents(false), Width('100%')}; + n = n+2; + add(Site,lot); + else + n = n+1; + add(Site,Chart1); + end + end + end + ChartTuLvsRL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Comparison '... + 'between 2D local displacement data recorded by the Radial Link sensor closer to '... + 'the monitored section, and the corresponding Tunnel Link sensor']); + FIG = FIG+1; + ChartTuLvsRL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Site,ChartTuLvsRL_cap); + + text = 'Displacement data refer to the following sensors: '; + testoTuL2vsRL = Paragraph(text); + testoTuL2vsRL.HAlign = 'justify'; + add(Site,testoTuL2vsRL); + I = size(SensoriRL); + for a = 1:I(1) + text = ['- Rad Array ' char(CatenaRL(a,1)) ' - Node ' num2str(SensoriRL(a,1)) ... + ', Cir Array ' char(CatenaTuL(a,1)),' - Node ' num2str(SensoriTuL(a,1)) '']; + testoTuL2vsRL = Paragraph(text); + add(Site,testoTuL2vsRL); + end + add(Site,br); + end + end + end + + % ---> Grafici spostamento Rad vs MPB + if sum(rRaL) > 0 && exist('GI_dS_RL_MPB','var') && sum(rMPBEL) > 0 && exist('GI_dS_MPB_RL','var') + if isempty(GI_dS_RL_MPB) == 0 && isempty(GI_dS_MPB_RL) == 0 + sezGrafMPBvsRL = Heading2('Correlation between Rad Array and Multipoint Borehole Extensometer (MPBX)'); + sezGrafMPBvsRL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoMPBvsRL = Paragraph(['The following graph aims to highlight any possible correlation '... + 'between 3D local differential displacement values recorded by the Radial Link sensor and the '... + 'corresponding radial deformation measured by the longest rod of the MPBX.']); + testoMPBvsRL.HAlign = 'justify'; + + % Cerco eventuali correlazioni con Estensimetro multibase + NomeFile = strcat('Report',siteID,'-RLvsMPBEL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + num = 1; + sen = 1; + SensoriRL = zeros(1,1); + SensoriMPB = zeros(1,1); + CatenaRL = cell(1,1); + CatenaMPB = cell(1,1); + colMPB = 0; + while AAA < rF + Rad = 0; + MPB = 0; + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono Rad Array o estensimetri multibase + break + else + check2 = Filetesto(AAA+1,1); + for nn = 1:rAR + chain = char(chainID(nn,4)); + if check1 == str2num(chain(end-2:end)) % Il primo deve sempre essere il Rad + Rad = nn; + NodoRL = Filetesto(AAA+2,1); + SensoriRL(sen,1) = NodoRL; + CatenaRL(sen,1) = chainID(nn,4); + end + if check2 == str2num(chain(end-2:end)) + MPB = nn; + NodoMPB = Filetesto(AAA+3,1); + SensoriMPB(sen,1) = NodoMPB; + CatenaMPB(sen,1) = chainID(nn,4); + colMPB = colMPB+1; + end + if Rad > 0 && MPB > 0 + figure(29) + ylabel('Displacement [mm]'); + xlabel('Date [dd/mm/yyyy]'); + set(gca,'YColor','k') + title('Correlation between corresponding displacements'); + grid on + hold on + dim1 = find(GI_dS_RL_MPB(:,Rad)); + dim2 = find(GI_dS_MPB_RL(:,colMPB)); + if isempty(dim1) == 0 && isempty(dim2) == 0 + plot(GI_Date_Rad(1:dim1(end),Rad),GI_dS_RL_MPB(1:dim1(end),Rad)); + GI_MPBvsRL = plot(GI_Date_MPB(1:dim2(end),MPB),GI_dS_MPB_RL(1:dim2(end),colMPB)); + MAX1 = max(GI_dS_RL_MPB(:,Rad)); + MAX2 = max(GI_dS_MPB_RL(:,colMPB)); + MAX = max(MAX1,MAX2); + if MAX < 5 % mm + ylim([-5 5]); + end + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + h = gca; + h.XAxis.MinorTick = 'on'; + xtickangle(20); + str(1,1) = cellstr([char(CatenaRL(sen,1)) ' Node ' num2str(NodoRL) '']); + str(1,2) = cellstr([char(CatenaMPB(sen,1)) ' MPBX ' num2str(NodoMPB) '']); + legend(str,'Location','northwest'); + TempName = char(strcat('Report',siteID,'-RLvsMPB',num2str(num),'_ENG.png')); + saveas(GI_MPBvsRL,TempName); + num = num+1; + end + close(figure(29)) + sen = sen+1; + AAA = AAA+4; + break + end + end + end + end + num = num-1; + if num ~= 0 % Non ci sono legami + add(Site,sezGrafMPBvsRL); + add(Site,testoMPBvsRL); + if num == 1 + TempName = char(strcat('Report',siteID,'-RLvsMPB',num2str(num),'_ENG.png')); + Chart1 = Image(TempName); + Chart1.Style = {ScaleToFit}; + add(Site,Chart1); + else + n = 1; + while n <= num + TempName = char(strcat('Report',siteID,'-RLvsMPB',num2str(n),'_ENG.png')); + Chart1 = Image(TempName); + Chart1.Style = {Height('7cm')}; + if n+1 <= num + TempName = char(strcat('Report',siteID,'-RLvsMPB',num2str(n+1),'_ENG.png')); + Chart2 = Image(TempName); + Chart2.Style = {Height('7cm')}; + lot = Table({Chart1, Chart2}); + lot.Style = {ResizeToFitContents(false), Width('100%')}; + n = n+2; + add(Site,lot); + else + n = n+1; + add(Site,Chart1); + end + end + end + ChartMPBvsRL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Comparison '... + 'between 3D local differential displacement values recorded by the Radial Link sensor and the '... + 'corresponding radial deformation measured by the longest rod of the MPBX.']); + FIG = FIG+1; + ChartMPBvsRL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Site,ChartMPBvsRL_cap); + + text = 'Displacement data refer to the following sensors: '; + testoMPB2vsRL = Paragraph(text); + testoMPB2vsRL.HAlign = 'justify'; + add(Site,testoMPB2vsRL); + I = size(SensoriRL); + for a = 1:I(1) + text = ['- Rad Array ' char(CatenaRL(a,1)) ' - Node ' num2str(SensoriRL(a,1)) ... + ', Analog Array ' char(CatenaMPB(a,1)),' - MPBX ' num2str(SensoriMPB(a,1)) '']; + testoMPB2vsRL = Paragraph(text); + add(Site,testoMPB2vsRL); + end + + add(Site,br); + end + end + end +end + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_CrossGraphs_ENG function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_EL.m b/ATD/report_EL.m new file mode 100755 index 0000000..eef99ba --- /dev/null +++ b/ATD/report_EL.m @@ -0,0 +1,420 @@ +function [FIG,FIG_ENG,battANALOG,ATTIVA] = report_EL(rEL,m,NodoExtensometerLink,toolrif,... + unitrif,contunit,datarif,Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,... + DT_ENG,FIG,FIG_ENG,activeEN,br,status,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_EL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() +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 + EE = Section(); + sezExtensometer = Heading3('Extensometer Link'); + sezExtensometer.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE.Title = sezExtensometer; + 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 + EE_ENG = Section(); + sezExtensometer_ENG = Heading3('Extensometer Link'); + sezExtensometer_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE_ENG.Title = sezExtensometer_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,sezExtensometer); + if activeEN == 1 + add(DT_ENG,sezExtensometer_ENG); + end + + for ex = 1:rEL(m,1) + NodeNum = num2str(NodoExtensometerLink(ex,m)); + comando = ['select EventDate, EventTime, XShift, T_node 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 + deform = cell2mat(Dati(:,3)); % deformazioni + TempEL = cell2mat(Dati(:,4)); % temperatura + + % grafico deformazioni NELL'ULTIMO MESE + figure(5); + if isnan(TempEL(1)) == 0 + yyaxis left + end + dE = deform-deform(1); + extens = plot(Date,dE); + Min = min(dE); + Max = max(dE); + if Min > -50 && Max < 50 + ylim([-50 50]) + end + hold on + ylabel('Deformazione [{\mu}{\epsilon}]'); + xlabel('Data [gg/mm/aaaa]'); + set(gca,'YColor','k'); + if isnan(TempEL(1)) == 0 + yyaxis right + plot(Date,TempEL,':','LineWidth',1.1); + ylabel(['Temperatura [' char(176) 'C]']); + set(gca,'YColor','k'); + str(1,1) = cellstr('Deformazione'); + str(2,1) = cellstr('Temperatura'); + MX(1) = max(TempEL(1:10)); + MX(2) = min(TempEL(1:10)); + MAX = max(abs(MX)); + IN = find(abs(MX)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + end + title(['Deformazioni misurate dal nodo numero ' NodeNum]); + xlim([Date(1)-1 Date(end)+1]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + hold off + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-Ext', NodeNum, '.png')); + saveas(extens,TempName); + ChartEL = Image(TempName); + ChartEL.Style = {Height('7.3cm'),HAlign('center')}; + % ChartEL.Style = {ScaleToFit}; + ChartEL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Deformazioni '... + 'differenziali misurate dall''estensimetro, nodo numero ' NodeNum... + ', nel periodo temporale di riferimento']); + FIG = FIG+1; + ChartEL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['Nei grafici seguenti sono rappresentati i dati relativi '... + 'alle deformazioni registrate dalle barrette estensimetriche appartenenti all''Analog Array.']); + testo2 = Paragraph(['Durante il periodo temporale di riferimento, il nodo numero ' NodeNum ... + ' ha registrato valori massimi e minimi di deformazione assoluta pari a '... + num2str(round(max(deform),2),'%0.2f') ' ' char(181) '' char(949) ' e ' num2str(round(min(deform),2),'%0.2f')... + ' ' char(181) '' char(949) ', con una variazione massima di '... + num2str(round(max(deform),2)-round(min(deform),2),'%0.2f') ' ' char(181) '' char(949) '.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if ex == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,ChartEL); + add(DT,ChartEL_cap); + if ex == rEL(m,1) + add(DT,br); + end + close(figure(5)); + + %--ENG-- + + if activeEN == 1 + % grafico deformazioni NELL'ULTIMO MESE + figure(15); + if isnan(TempEL(1)) == 0 + yyaxis left + end + dE = deform-deform(1); + extens = plot(Date,dE); + Min = min(dE); + Max = max(dE); + if Min > -50 && Max < 50 + ylim([-50 50]) + end + hold on + ylabel('Deformation [{\mu}{\epsilon}]'); + xlabel('Date [dd/mm/yyyy]'); + set(gca,'YColor','k'); + if isnan(TempEL(1)) == 0 + yyaxis right + plot(Date,TempEL,':','LineWidth',1.1); + ylabel(['Temperature [' char(176) 'C]']); + set(gca,'YColor','k'); + str(1,1) = cellstr('Deformation'); + str(2,1) = cellstr('Temperature'); + MX(1) = max(TempEL(1:10)); + MX(2) = min(TempEL(1:10)); + MAX = max(abs(MX)); + IN = find(abs(MX)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + end + title(['Deformation - Node ' NodeNum]); + xlim([Date(1)-1 Date(end)+1]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + hold off + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-Ext', NodeNum, '_ENG.png')); + saveas(extens,TempName); + ChartEL_ENG = Image(TempName); + ChartEL_ENG.Style = {Height('7.3cm'),HAlign('center')}; + % ChartEL.Style = {ScaleToFit}; + ChartEL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Differential '... + 'deformations measured by extensometer ' NodeNum... + ' during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartEL_ENG_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graphs display deformation data '... + 'recorded by extensometers integrated in the Analog Array.']); + testo2 = Paragraph(['During the reference time period, node ' NodeNum ... + ' measured maximum and minimum deformatio values of respectively '... + num2str(round(max(deform),2),'%0.2f') ' ' char(181) '' char(949) ' and ' num2str(round(min(deform),2),'%0.2f')... + ' ' char(181) '' char(949) ', with a maximum variation of '... + num2str(round(max(deform),2)-round(min(deform),2),'%0.2f') ' ' char(181) '' char(949) '.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if ex == 1 + add(DT_ENG,testo); + end + add(DT_ENG,testo2); + add(DT_ENG,ChartEL_ENG); + add(DT_ENG,ChartEL_ENG_cap); + if ex == rEL(m,1) + add(DT_ENG,br); + end + close(figure(15)) + end + + %pulisco variabili da riutilizzare per catena successiva + clear deform; + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + end + end + end + end +end + +text = 'report_EL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_EL_ENG.m b/ATD/report_EL_ENG.m new file mode 100755 index 0000000..20f57fa --- /dev/null +++ b/ATD/report_EL_ENG.m @@ -0,0 +1,239 @@ +function [FIG,battANALOG,ATTIVA] = report_EL_ENG(rEL,m,NodoExtensometerLink,toolrif,... + unitrif,contunit,datarif,Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,... + FIG,br,status,conn,FileName) + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() +if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('GMUX not installed or inactive .'); + add(DT,testo); + end +elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoring completed. Please log into the web-based platoform '... + 'to access the complete dataset.']); + add(DT,testo); + end +else + EE = Section(); + sezExtensometer = Heading3('Extensometer Link'); + sezExtensometer.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE.Title = sezExtensometer; + 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(['The following chart reports the battery level trend recorded during the reference time period. '... + 'The correct functioning of the GMUX module is guaranteed for a minimum level of 12 V. The last '... + 'available data is equal to ' num2str(Batteria(end,1)) ' V.']); + testoB2 = Paragraph(['The GMUX module equips also a thermometer that allows the monitoring of the working '... + 'temperature and the identification of eventual malfunctioning. The following chart reports temperature '... + 'data recorded by the GMUX module.']); + testoB1.HAlign = 'justify'; + testoB2.HAlign = 'justify'; + + % grafico batteria + figure(19) + plot(Date,Batteria); + hold on + title('Battery level and GMUX temperature'); + xlabel('Date [dd/mm/yyyy]'); + ylabel('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')}; + if Batteria(end,1) >= 13 + TempName = char(strcat('B_13.jpg')); + elseif Batteria(end,1) >= 12 + TempName = char(strcat('B_12.jpg')); + elseif Batteria(end,1) >= 11 + 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) ' - Battery level and GMUX temperature recorded '... + 'during the reference time period']); + FIG = FIG+1; + lot_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + Batt = Section(); + sezBATT = Heading3('GMUX - Battery level and temperature'); + 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)); + battANALOG = 1; + end + end + add(DT,sezExtensometer); + for ex = 1:rEL(m,1) + NodeNum = num2str(NodoExtensometerLink(ex,m)); + comando = ['select EventDate, EventTime, XShift, T_node 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 + deform = cell2mat(Dati(:,3)); % deformazioni + TempEL = cell2mat(Dati(:,4)); % temperatura + + % grafico deformazioni NELL'ULTIMO MESE + figure(5); + if isnan(TempEL(1)) == 0 + yyaxis left + end + dE = deform-deform(1); + extens = plot(Date,dE); + Min = min(dE); + Max = max(dE); + if Min > -50 && Max < 50 + ylim([-50 50]) + end + hold on + ylabel('Deformation [{\mu}{\epsilon}]'); + xlabel('Date [dd/mm/yyyy]'); + set(gca,'YColor','k'); + if isnan(TempEL(1)) == 0 + yyaxis right + plot(Date,TempEL,':','LineWidth',1.1); + ylabel(['Temperature [' char(176) 'C]']); + set(gca,'YColor','k'); + str(1,1) = cellstr('Deformation'); + str(2,1) = cellstr('Temperature'); + MX(1) = max(TempEL(1:10)); + MX(2) = min(TempEL(1:10)); + MAX = max(abs(MX)); + IN = find(abs(MX)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + end + title(['Deformation measured by node' NodeNum]); + xlim([Date(1)-1 Date(end)+1]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + hold off + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-Ext', NodeNum, '_ENG.png')); + saveas(extens,TempName); + ChartEL = Image(TempName); + ChartEL.Style = {Height('7.3cm'),HAlign('center')}; + % ChartEL.Style = {ScaleToFit}; + ChartEL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Differential '... + 'deformation values recorded by extensometer ' NodeNum... + ' during the reference time period']); + FIG = FIG+1; + ChartEL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graph reports deformation data recorded by '... + 'extensometer ' NodeNum ' during the reference time period.']); + testo2 = Paragraph(['Maximum and minimum values recorded by the tool '... + 'are respectively ' num2str(round(max(deform),2), '%0.2f') ' ' char(181) '' char(949) ' and '... + num2str(round(min(deform),2), '%0.2f')... + ' ' char(181) '' char(949) ', resulting in a maximum variation of '... + num2str(round(max(deform)-min(deform),2), '%0.2f') ' ' char(181) '' char(949) '.' ]); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if ex == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,ChartEL); + add(DT,ChartEL_cap); + if ex == rEL(m,1) + add(DT,br); + end + close(figure(5)); + %pulisco variabili da riutilizzare per catena successiva + clear deform; + else + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('No data available for the reference time period.'); + add(DT,testo); + br = PageBreak(); + add(DT,br); + end + end + end +end + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_EL_ENG function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_IPL.m b/ATD/report_IPL.m new file mode 100755 index 0000000..2222f86 --- /dev/null +++ b/ATD/report_IPL.m @@ -0,0 +1,561 @@ +function [GI_MaxDispMESE,GI_DateIPL,GI_MaxDispProf,ATTIVA,FIG,FIG_ENG] = report_IPL(... + rIPL,rIPLHR,m,NodoInPlaceLink,toolrif,unitrif,datarif,firstdata_num,Font_caption,... + Font_tools,siteID,toolrifID,DT,DT_ENG,FIG,FIG_ENG,br,colonna2,colonna2bis,status,... + ATTIVA,activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_IPL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +GI_MaxDispMESE = []; +GI_DateIPL = []; +GI_MaxDispProf = []; +check = 0; +NODATA(m,1) = 0; +while check == 0 + if status(m,1) == 1 + if ATTIVA == 1 + testo = Paragraph('Catena non ancora installata o inattiva.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array not installed or inactive.'); + add(DT_ENG,testo); + end + end + check = 1; + 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 + check = 1; + else + for n = 1:rIPL(m,1) + NodeNum = num2str(NodoInPlaceLink(n,m)); + comando = ['select EventDate, EventTime, HShift_local, HShift, NodeDepth, '... + 'XShift, YShift, X, Y, HShiftDir 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 + if n == 1 % Il primo lo scrivo e creo la variabile di controllo + else + [rS,~] = size(Spost_local); + if rD ~= rS + NODATA(m,1) = 2; + check = 0; + break + else + check = 1; + end + end + % dall'inizio + Spost_local(:,n) = cell2mat((Dati(:,3)))*1000; % Loc 2D + Spost(:,n) = (cell2mat(Dati(:,4)))*1000; % Cum 2D + Prof(:,n) = -(cell2mat(Dati(1,5))); % Profondità + % Locali ultimo mese + Spost_Local_MeseX(:,n) = cell2mat(Dati(:,6)); % Loc X ultimo mese + Spost_Local_MeseY(:,n) = cell2mat(Dati(:,7)); % Loc Y ultimo mese + diffMeseX_Local(1,n) = Spost_Local_MeseX(end,n)-Spost_Local_MeseX(1,n); + diffMeseY_Local(1,n) = Spost_Local_MeseY(end,n)-Spost_Local_MeseY(1,n); + DispMese_Local(1,n) = sqrt(diffMeseX_Local(1,n)^2 + diffMeseY_Local(1,n)^2)*1000; + % Cumulati ultimo mese + Spost_MeseX(:,n) = cell2mat(Dati(:,8)); % Cum X ultimo mese + Spost_MeseY(:,n) = cell2mat(Dati(:,9)); % Cum Y ultimo mese + diffMeseX(1,n) = Spost_MeseX(end,n)-Spost_MeseX(1,n); + diffMeseY(1,n) = Spost_MeseY(end,n)-Spost_MeseY(1,n); + DispMese(1,n) = sqrt(diffMeseX(1,n)^2 + diffMeseY(1,n)^2)*1000; + Azim(:,n) = cell2mat(Dati(:,10)); % Azimuth totale + else + NODATA(m,1) = 1; + check = 1; + end + end + if NODATA(m,1) == 0 + if strcmp(colonna2bis(m+1,1),colonna2(m+1,1)) == 0 % data zero = data riferimento + clear Spost; + clear Spost_local; + clear Azimuth; + datarifNEW = datestr(firstdata_num{m+1,1},'yyyy-mm-dd'); % data riferimento definita sul sito + for nw = 1:rIPL(m,1) + NodeNum = num2str(NodoInPlaceLink(nw,m)); + comando = ['select EventDate, EventTime, HShift_local, HShift, NodeDepth, XShift, YShift, X, Y, HShiftDir '... + 'from ElabDataView where EventDate = ''' datarifNEW ''' and ToolNameID = ''' char(toolrif) ... + ''' and UnitName = ''' char(unitrif) ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DatiNEW = curs.Data; % dati registrati alla data di riferimento + [~,rC] = size(DatiNEW); + if rC ~= 1 + % dalla data di riferimento + Spost_Local_X_RIF(:,nw) = cell2mat(DatiNEW(:,6)); %Loc X data rif + Spost_Local_Y_RIF(:,nw) = cell2mat(DatiNEW(:,7)); %Loc Y data rif + diffX_Local_RIF(1,nw) = Spost_Local_MeseX(end,nw)-Spost_Local_X_RIF(1,nw); + diffY_Local_RIF(1,nw) = Spost_Local_MeseY(end,nw)-Spost_Local_Y_RIF(1,nw); + Spost_local(1,nw) = sqrt(diffX_Local_RIF(1,nw)^2 + diffY_Local_RIF(1,nw)^2)*1000; + + Spost_X_RIF(:,nw) =cell2mat(DatiNEW(:,8)); % Cum X data rif + Spost_Y_RIF(:,nw) =cell2mat(DatiNEW(:,9)); % Cum Y data rif + diffX_RIF(1,nw) = Spost_MeseX(end,nw)-Spost_X_RIF(1,nw); + diffY_RIF(1,nw) = Spost_MeseY(end,nw)-Spost_Y_RIF(1,nw); + Spost(1,nw) = sqrt(diffX_RIF(1,nw)^2 + diffY_RIF(1,nw)^2)*1000; + + azim(1,nw) = (acos(abs(diffX_RIF(1,nw)*1000)/Spost(1,nw)))*180/pi(); % Angolo Teta in gradi 0° - 90° + segnoNS = sign(diffX_RIF(1,nw)); + segnoEO = sign(diffY_RIF(1,nw)); + % L'azimuth si calcola con NS = 0, positivo in senso orario + % (90° = Est) + if segnoNS == 1 && segnoEO == 1 % quadrante 1 + Azimuth(1,nw) = azim(1,nw); % Teta lo tengo come è (1 quadrante) + elseif segnoNS == -1 && segnoEO == 1 % quadrante 2 + Azimuth(1,nw) = 180 - azim(1,nw); % 180-teta + elseif segnoNS == -1 && segnoEO == -1 % quadrante 3 + Azimuth(1,nw) = 180 + azim(1,nw); % 180+teta + elseif segnoNS == 1 && segnoEO == -1 % quadrante 4 + Azimuth(1,nw) = 360 - azim(1,nw); % 360-teta + elseif segnoNS == 0 && segnoEO == -1 % 270° + Azimuth(1,nw) = 270; + elseif segnoNS == -1 && segnoEO == 0 % 180° + Azimuth(1,nw) = 180; + elseif segnoNS == 0 && segnoEO == 1 % 90° + Azimuth(1,nw) = 90; + elseif segnoNS == 1 && segnoEO == 0 % 0° + Azimuth(1,nw) = 0; + else % non c'è nessuno spostamento da nessuna parte + if nw == 1 + Azimuth(1,nw) = 0; + else + Azimuth(1,nw) = Azimuth(1,nw-1); + end + end + Azimuth(1,nw) = real(Azimuth(1,nw)); + else + NODATA(m,1) = 1; + end + end + % Approssimo gli spostamenti al decimo di millimetro + conv = Spost*10; + conv = round(conv); + Spost = conv/10; + end + + MaxDisp = max(Spost_local(end,:)); + Index = find(Spost_local(end,:) == MaxDisp); + MaxDispProf = Prof(1,Index(1)); + + MaxDispMESE = max(DispMese_Local(end,:)); + IndexMESE = find(DispMese_Local(end,:) == MaxDispMESE); + MaxDispProfMESE = Prof(1,IndexMESE(1)); + + % aggiungo ancora + comando = ['select nodetype_id, depth, num from nodes where tool_id = ''' num2str(cell2mat(toolrifID)) ... + ''' and nodetype_id = 9 order by num']; + Anc = fetch(conn,comando); + ProfAnc = -(cell2mat((Anc(:,2)))); + Prof = [ProfAnc Prof]; + [rt,~] = size(Spost_local); + ancoraTL = zeros(rt,1); + Spost_local = [ancoraTL Spost_local]; + Spost = [ancoraTL Spost]; + DispMese_Local = [0 DispMese_Local]; + DispMese = [0 DispMese]; + + % per grafici integrati + GI_MaxDispMESE_x = Spost_Local_MeseX(:,IndexMESE(1)); % x del nodo a maggior spostamento + GI_diff_x = GI_MaxDispMESE_x(:,:)- GI_MaxDispMESE_x(1,1); % differenza + GI_MaxDispMESE_y = Spost_Local_MeseY(:,IndexMESE(1));% y del nodo a maggior spostamento + GI_diff_y = GI_MaxDispMESE_y(:,:)- GI_MaxDispMESE_y(1,1); % differenza + GI_MaxDispMESE = sqrt((GI_diff_x).^2 + (GI_diff_y).^2)*1000; % risultante + GI_DateIPL = Date; + GI_MaxDispProf = MaxDispProfMESE; + + % --- grafico locali-profondità DALL'INIZIO --- + figure(1) + subplot(1,2,1); + plot(DispMese_Local,Prof); + hold on + plot(Spost_local(end,:),Prof); + title('Spostamenti Locali 2D'); + xlabel('Spostamento [mm]'); + ylabel(['Profondit' char(224) ' [m]']); + h = gca; + h.XAxis.MinorTick = 'on'; + if MaxDisp < 10 % mm + xlim([-inf 10]); + end + grid on + grid minor + legend('Periodo di riferimento','Intero periodo','Location','southeast'); + + % Grafico Cumulati + subplot(1,2,2); + plot(DispMese,Prof); + hold on + DispCum = plot(Spost(end,:),Prof); + title('Spostamenti Cumulati 2D'); + xlabel('Spostamento [mm]'); + ylabel(['Profondit' char(224) ' [m]']); + h = gca; + h.XAxis.MinorTick = 'on'; + if max(Spost(end,:)) < 10 + xlim([-inf 10]); + end + grid on + grid minor + legend('Periodo di riferimento','Intero periodo','Location','southeast'); + lgd.FontSize = 6; + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'DispIPL.png')); + saveas(DispCum,TempName); + Chart = Image(TempName); + if m > 1 + for C = 1:m-1 + if status(C,1) == 3 || status(C,1) == 1 + Chart.Style = {Height('10cm'),HAlign('center')}; + break + else + Chart.Style = {ScaleToFit}; + end + end + else + Chart.Style = {ScaleToFit}; + end + Chart.Style = {ScaleToFit}; + Chart_capM = Paragraph(['Fig. ' num2str(FIG) ' - Spostamenti differenziali locali e cumulati in '... + 'direzione di massima pendenza registrati dalla catena '... + 'durante il periodo temporale di riferimento e a partire '... + 'dalla data di riferimento riportata in Tabella 1']); + FIG = FIG+1; + Chart_capM.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + close(figure(1)) + + % ENG + if activeEN == 1 + figure(1) + subplot(1,2,1); + plot(DispMese_Local,Prof); + hold on + plot(Spost_local(end,:),Prof); + title('2D Local Displacements'); + xlabel('Displacement [mm]'); + ylabel('Depth [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + if MaxDisp < 10 % mm + xlim([-inf 10]); + end + grid on + grid minor + + subplot(1,2,2); + plot(DispMese,Prof); + hold on + DispCum = plot(Spost(end,:),Prof); + title('2D Cumulative Displacements'); + xlabel('Displacements [mm]'); + ylabel('Depth [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + if max(Spost(end,:)) < 10 + xlim([-inf 10]); + end + grid on + grid minor + lgd = legend('Last period','Entire period','Location','southeast'); + lgd.FontSize = 6; + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Disp_ENG.png')); + saveas(DispCum,TempName); + Chart = Image(TempName); + if m > 1 + for C = 1:m-1 + if status(C,1) == 3 || status(C,1) == 1 + Chart.Style = {Height('10cm'),HAlign('center')}; + break + else + Chart.Style = {ScaleToFit}; + end + end + else + Chart.Style = {ScaleToFit}; + end + Chart.Style = {ScaleToFit}; + Chart_capM = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Local and cumulative '... + 'differential displacements along maximum grade direction, '... + 'recorded during the monitoring reference period and starting from the '... + 'reported in Tab. 1']); + FIG_ENG = FIG_ENG+1; + Chart_capM.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + close(figure(1)) + end + + % grafico azimuth DALL'INIZIO + Azim_grafico = deg2rad(Azim(end,:)); + Azim_grafico = [0 Azim_grafico]; %aggiungo ancora + figure(2) + azimuth = polarscatter(Azim_grafico,flip(abs(Prof)),'filled'); + title('Azimut'); + h = gca; + h.ThetaDir = 'clockwise'; + h.ThetaZeroLocation = 'top'; + angles = 0:45:360; + h.ThetaTick = angles; + labels = {'N','NE','E','SE','S','SO','O','NO'}; + h.ThetaTickLabel = labels; + grid on + + Testa = Azim(end,end); + if Testa > 11.25 && Testa <= 33.75 + DirAzim = 'Nord-Nord-Est'; + elseif Testa > 33.75 && Testa <= 56.25 + DirAzim = 'Nord-Est'; + elseif Testa > 56.25 && Testa <= 78.75 + DirAzim = 'Est-Nord-Est'; + elseif Testa > 78.75 && Testa <= 101.25 + DirAzim = 'Est'; + elseif Testa > 101.25 && Testa <= 123.75 + DirAzim = 'Est-Sud-Est'; + elseif Testa > 123.75 && Testa <= 146.25 + DirAzim = 'Sud-Est'; + elseif Testa > 146.25 && Testa <= 168.75 + DirAzim = 'Sud-Sud-Est'; + elseif Testa > 168.75 && Testa <= 191.25 + DirAzim = 'Sud'; + elseif Testa > 191.25 && Testa <= 213.75 + DirAzim = 'Sud-Sud-Ovest'; + elseif Testa > 213.75 && Testa <= 236.25 + DirAzim = 'Sud-Ovest'; + elseif Testa > 236.25 && Testa <= 258.75 + DirAzim = 'Ovest-Sud-Ovest'; + elseif Testa > 258.75 && Testa <= 281.25 + DirAzim = 'Ovest'; + elseif Testa > 281.25 && Testa <= 303.75 + DirAzim = 'Ovest-Nord-Ovest'; + elseif Testa > 303.75 && Testa <= 326.25 + DirAzim = 'Nord-Ovest'; + elseif Testa > 326.25 && Testa <= 348.75 + DirAzim = 'Nord-Nord-Ovest'; + else + DirAzim = 'Nord'; + end + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Azimuth.png')); + saveas(azimuth,TempName); + ChartAZ = Image(TempName); + ChartAZ.Style = {ScaleToFit}; + ChartAZ_cap = Paragraph(['Fig. ' num2str(FIG) ' - Azimut degli spostamenti '... + 'differenziali cumulati secondo la profondit' char(224) ', registrato '... + 'a partire dalla lettura di riferimento']); + FIG = FIG+1; + ChartAZ_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + SE = Section(); + if rIPLHR(m,1) > 0 + sezTilt = Heading3('In Place Link HR 3D'); + else + sezTilt = Heading3('In Place Link'); + end + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SE.Title = sezTilt; + close(figure(2)) + + % ENG + if activeEN == 1 + Azim_grafico = deg2rad(Azim(end,:)); + Azim_grafico = [0 Azim_grafico]; %aggiungo ancora + figure(2) + azimuth = polarscatter(Azim_grafico,flip(abs(Prof)),'filled'); + title('Azimuth'); + h = gca; + h.ThetaDir = 'clockwise'; + h.ThetaZeroLocation = 'top'; + angles = 0:45:360; + h.ThetaTick = angles; + labels = {'N','NE','E','SE','S','SW','W','NW'}; + h.ThetaTickLabel = labels; + grid on + + Testa = Azim(end,end); + if Testa > 11.25 && Testa <= 33.75 + DirAzim = 'North-North-East'; + elseif Testa > 33.75 && Testa <= 56.25 + DirAzim = 'North-East'; + elseif Testa > 56.25 && Testa <= 78.75 + DirAzim = 'East-North-East'; + elseif Testa > 78.75 && Testa <= 101.25 + DirAzim = 'East'; + elseif Testa > 101.25 && Testa <= 123.75 + DirAzim = 'East-South-East'; + elseif Testa > 123.75 && Testa <= 146.25 + DirAzim = 'South-East'; + elseif Testa > 146.25 && Testa <= 168.75 + DirAzim = 'South-South-East'; + elseif Testa > 168.75 && Testa <= 191.25 + DirAzim = 'South'; + elseif Testa > 191.25 && Testa <= 213.75 + DirAzim = 'South-South-West'; + elseif Testa > 213.75 && Testa <= 236.25 + DirAzim = 'South-West'; + elseif Testa > 236.25 && Testa <= 258.75 + DirAzim = 'West-South-West'; + elseif Testa > 258.75 && Testa <= 281.25 + DirAzim = 'West'; + elseif Testa > 281.25 && Testa <= 303.75 + DirAzim = 'West-North-West'; + elseif Testa > 303.75 && Testa <= 326.25 + DirAzim = 'North-West'; + elseif Testa > 326.25 && Testa <= 348.75 + DirAzim = 'North-North-West'; + else + DirAzim = 'North'; + end + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Azimuth_ENG.png')); + saveas(azimuth,TempName); + ChartAZ = Image(TempName); + ChartAZ.Style = {ScaleToFit}; + ChartAZ_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Azimuth of cumulative differential '... + 'displacements vs depth, recorded starting from the monitoring reference date']); + FIG_ENG = FIG_ENG+1; + ChartAZ_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + SE_ENG = Section(); + SE_ENG.Title = sezTilt; + close(figure(2)) + end + + testo = Paragraph(['I grafici seguenti riportano i valori di spostamento differenziale locale e cumulato '... + 'misurati dal sensore MEMS 3D lungo la direzione di massima pendenza, '... + 'registrati durante il periodo temporale di riferimento e calcolati a partire dalla lettura di '... + 'riferimento riportata in Tabella 1. ']); + testo2 = Paragraph(['In particolare, il massimo spostamento differenziale locale registrato durante il periodo '... + 'temporale di riferimento ' char(232) ' pari a ' num2str((MaxDispMESE), '%0.1f') ' mm alla profondit' char(224) ... + ' di ' num2str(MaxDispProfMESE) ' metri. Lo spostamento cumulato in testa risulta pari a ' num2str(DispMese(end,end),'%0.1f') ' mm.']); + testo3 = Paragraph(['Gli stessi dati relativi all''intero periodo di monitoraggio rilevano un massimo spostamento '... + 'differenziale locale pari a ' num2str((MaxDisp), '%0.1f') ' mm, in corrispondenza di una profondit' char(224) ... + ' di ' num2str(MaxDispProf) ' metri. Lo spostamento cumulato in testa risulta pari a ' num2str(Spost(end,end)) ' mm.']); + testo4 = Paragraph(['Il grafico seguente mostra l''andamento dell''azimut ottenuto a partire dai dati cumulati '... + 'al variare della profondit' char(224) ', calcolati a partire dalla lettura di riferimento. Attualmente, il valore ' ... + 'rilevato in testa allo strumento indica uno spostamento in direzione ' DirAzim '.']); + testo5 = Paragraph(['Si ricorda che l''azimut ' char(232) ' una rappresentazione della direzione '... + 'di movimento del singolo sensore, calcolato a partire dai dati cumulati. '... + 'Il parametro viene calcolato indipendentemente dall''ordine di grandezza '... + 'dello spostamento misurato: ad esempio, uno spostamento sub-millimetrico '... + 'e uno centimetrico nella stessa direzione saranno caratterizzati dallo stesso '... + 'valore di azimut. Per questo motivo, ' char(232) ' opportuno considerare tale '... + 'grandezza come significativa solo nel caso di spostamenti di entit' char(224) ... + ' rilevante.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + testo3.HAlign = 'justify'; + testo4.HAlign = 'justify'; + testo5.HAlign = 'justify'; + add(DT,sezTilt); + add(DT,testo); + add(DT,testo2); + add(DT,testo3); + add(DT,Chart); + add(DT,Chart_capM); + add(DT,testo4); + add(DT,testo5); + add(DT,ChartAZ); + add(DT,ChartAZ_cap); + add(DT,br); + % ENG + if activeEN == 1 + testo = Paragraph(['The following graphs shows the local and differential cumulative displacements '... + 'recorded by 3D MEMS sensor along the maximum grade direction during the reference monitoring period '... + 'and starting from the reference date reported in Tab. 1. The maximum local differential displacement '... + 'recorded during the reference time period equals ' num2str((MaxDispMESE),'%0.1f') ' mm at a depth of '... + num2str(abs(MaxDispProfMESE)) ' m. The cumulative displacements at the ground level is '... + num2str(DispMese(end,end),'%0.1f') ' mm.']); + testo2 = Paragraph(['The same analysis related to the whole monitoring period highlights a maximum local '... + 'differential displacement of ' num2str((MaxDisp), '%0.1f') ' mm, at a depth of ' num2str(abs(MaxDispProf)) ... + ' m. The cumulative displacement equals ' num2str(Spost(end,end)) ' mm.']); + testo3 = Paragraph(['The following graph shows the azimuth obtained through cumulative displacements, '... + 'starting from the reference date. The direction identified is ' DirAzim '.']); + testo4 = Paragraph(['It is necessary to underline that the azimuth represents the movement direction '... + 'of every single sensor, calculated starting from differential cumulative displacements. '... + 'The parameter is always processed, regardless of the displacement measured: a sub-millimeters '... + 'or a centimeters movements in the same direction will show the same azimuth. '... + 'For this reason, it is appropriate to consider the result as significant only for relevant '... + 'displacements.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + testo3.HAlign = 'justify'; + testo4.HAlign = 'justify'; + add(DT_ENG,sezTilt); + add(DT_ENG,testo); + add(DT_ENG,testo2); + add(DT_ENG,Chart); + add(DT_ENG,Chart_capM); + add(DT_ENG,testo3); + add(DT_ENG,testo4); + add(DT_ENG,ChartAZ); + add(DT_ENG,ChartAZ_cap); + add(DT_ENG,br); + end + %pulisco variabili da riutilizzare per catena successiva + clear Spost; + clear Spost_local; + clear Spost_mese; + clear Spost_local_mese; + clear Prof; + clear Azim; + clear DirAzim; + clear Spost_Local_MeseX; + clear Spost_Local_MeseY; + clear diffMeseX_Local; + clear diffMeseY_Local; + clear DispMese_Local; + clear Spost_MeseX; + clear Spost_MeseY; + clear diffMeseX; + clear diffMeseY; + clear DispMese; + clear GI_MaxDispMESE_x; + clear GI_diff_x; + clear GI_MaxDispMESE_y; + clear GI_diff_y; + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + check = 1; + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + if m == 1 + add(DT_ENG,br); + end + end + end + end + end +end + +text = 'report_IPL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_IPLHR.m b/ATD/report_IPLHR.m new file mode 100755 index 0000000..b43d494 --- /dev/null +++ b/ATD/report_IPLHR.m @@ -0,0 +1,379 @@ +function [GI_MaxDispMESE,GI_DateIPLHR,GI_MaxDispProf,ATTIVA,FIG,FIG_ENG] = report_IPLHR(... + rIPLHR,m,NodoInPlaceLinkHR,toolrif,unitrif,datarif,firstdata_num,Font_caption,... + Font_tools,siteID,toolrifID,DT,DT_ENG,FIG,FIG_ENG,br,colonna2,colonna2bis,status,... + ATTIVA,activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_IPLHR function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +GI_MaxDispMESE = []; +GI_DateIPLHR = []; +GI_MaxDispProf = []; +check = 0; +NODATA(m,1) = 0; +while check == 0 + if status(m,1) == 1 + if ATTIVA == 1 + testo = Paragraph('Catena non ancora installata o inattiva.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array not installed or inactive.'); + add(DT_ENG,testo); + end + end + check = 1; + 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 + check = 1; + else + for n = 1:rIPLHR(m,1) + NodeNum = num2str(NodoInPlaceLinkHR(n,m)); + comando = ['select EventDate, EventTime, HShift_local, HShift, NodeDepth, '... + 'XShift, YShift, X, Y 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 + if n == 1 % Il primo lo scrivo e creo la variabile di controllo + else + [rS,~] = size(Spost_local); + if rD ~= rS + NODATA(m,1) = 2; + check = 0; + break + else + check = 1; + end + end + % dall'inizio + Spost_local(:,n) = cell2mat((Dati(:,3)))*1000; % Loc 2D + Spost(:,n) = (cell2mat(Dati(:,4)))*1000; % Cum 2D + Prof(:,n) = -(cell2mat(Dati(1,5))); % Profondità + % Locali ultimo mese + Spost_Local_MeseX(:,n) = cell2mat(Dati(:,6)); % Loc X ultimo mese + Spost_Local_MeseY(:,n) = cell2mat(Dati(:,7)); % Loc Y ultimo mese + diffMeseX_Local(1,n) = Spost_Local_MeseX(end,n)-Spost_Local_MeseX(1,n); + diffMeseY_Local(1,n) = Spost_Local_MeseY(end,n)-Spost_Local_MeseY(1,n); + DispMese_Local(1,n) = sqrt(diffMeseX_Local(1,n)^2 + diffMeseY_Local(1,n)^2)*1000; + % Cumulati ultimo mese + Spost_MeseX(:,n) = cell2mat(Dati(:,8)); % Cum X ultimo mese + Spost_MeseY(:,n) = cell2mat(Dati(:,9)); % Cum Y ultimo mese + diffMeseX(1,n) = Spost_MeseX(end,n)-Spost_MeseX(1,n); + diffMeseY(1,n) = Spost_MeseY(end,n)-Spost_MeseY(1,n); + DispMese(1,n) = sqrt(diffMeseX(1,n)^2 + diffMeseY(1,n)^2)*1000; + else + NODATA(m,1) = 1; + check = 1; + end + end + if NODATA(m,1) == 0 + if strcmp(colonna2bis(m+1,1),colonna2(m+1,1)) == 0 % data zero = data riferimento + clear Spost; + clear Spost_local; + clear Azimuth; + datarifNEW = datestr(firstdata_num{m+1,1},'yyyy-mm-dd'); % data riferimento definita sul sito + for nw = 1:rIPLHR(m,1) + NodeNum = num2str(NodoInPlaceLinkHR(nw,m)); + comando = ['select EventDate, EventTime, HShift_local, HShift, NodeDepth, XShift, YShift, X, Y '... + 'from ElabDataView where EventDate = ''' datarifNEW ''' and ToolNameID = ''' char(toolrif) ... + ''' and UnitName = ''' char(unitrif) ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DatiNEW = curs.Data; % dati registrati alla data di riferimento + [~,rC] = size(DatiNEW); + if rC ~= 1 + % dalla data di riferimento + Spost_Local_X_RIF(:,nw) = cell2mat(DatiNEW(:,6)); %Loc X data rif + Spost_Local_Y_RIF(:,nw) = cell2mat(DatiNEW(:,7)); %Loc Y data rif + diffX_Local_RIF(1,nw) = Spost_Local_MeseX(end,nw)-Spost_Local_X_RIF(1,nw); + diffY_Local_RIF(1,nw) = Spost_Local_MeseY(end,nw)-Spost_Local_Y_RIF(1,nw); + Spost_local(1,nw) = sqrt(diffX_Local_RIF(1,nw)^2 + diffY_Local_RIF(1,nw)^2)*1000; + + Spost_X_RIF(:,nw) =cell2mat(DatiNEW(:,8)); % Cum X data rif + Spost_Y_RIF(:,nw) =cell2mat(DatiNEW(:,9)); % Cum Y data rif + diffX_RIF(1,nw) = Spost_MeseX(end,nw)-Spost_X_RIF(1,nw); + diffY_RIF(1,nw) = Spost_MeseY(end,nw)-Spost_Y_RIF(1,nw); + Spost(1,nw) = sqrt(diffX_RIF(1,nw)^2 + diffY_RIF(1,nw)^2)*1000; + else + NODATA(m,1) = 1; + end + end + % Approssimo gli spostamenti al decimo di millimetro + conv = Spost*10; + conv = round(conv); + Spost = conv/10; + end + + MaxDisp = max(Spost_local(end,:)); + Index = find(Spost_local(end,:) == MaxDisp); + MaxDispProf = Prof(1,Index(1)); + + MaxDispMESE = max(DispMese_Local(end,:)); + IndexMESE = find(DispMese_Local(end,:) == MaxDispMESE); + MaxDispProfMESE = Prof(1,IndexMESE(1)); + + % aggiungo ancora + comando = ['select nodetype_id, depth, num from nodes where tool_id = ''' num2str(cell2mat(toolrifID)) ... + ''' and nodetype_id = 9 order by num']; + Anc = fetch(conn,comando); + ProfAnc = -(cell2mat((Anc(:,2)))); + Prof = [ProfAnc Prof]; + [rt,~] = size(Spost_local); + ancoraTL = zeros(rt,1); + Spost_local = [ancoraTL Spost_local]; + Spost = [ancoraTL Spost]; + DispMese_Local = [0 DispMese_Local]; + DispMese = [0 DispMese]; + + % per grafici integrati + GI_MaxDispMESE_x = Spost_Local_MeseX(:,IndexMESE(1)); % x del nodo a maggior spostamento + GI_diff_x = GI_MaxDispMESE_x(:,:)- GI_MaxDispMESE_x(1,1); % differenza + GI_MaxDispMESE_y = Spost_Local_MeseY(:,IndexMESE(1));% y del nodo a maggior spostamento + GI_diff_y = GI_MaxDispMESE_y(:,:)- GI_MaxDispMESE_y(1,1); % differenza + GI_MaxDispMESE = sqrt((GI_diff_x).^2 + (GI_diff_y).^2)*1000; % risultante + GI_DateIPLHR = Date; + GI_MaxDispProf = MaxDispProfMESE; + + % --- grafico locali-profondità DALL'INIZIO --- + figure(1) + subplot(1,2,1); + plot(DispMese_Local,Prof); + hold on + plot(Spost_local(end,:),Prof); + title('Spostamenti Locali 2D'); + xlabel('Spostamento [mm]'); + ylabel(['Profondit' char(224) ' [m]']); + h = gca; + h.XAxis.MinorTick = 'on'; + if MaxDisp < 10 % mm + xlim([-inf 10]); + end + grid on + grid minor + lgd = legend('Periodo di riferimento','Intero periodo','Location','southeast'); + lgd.FontSize = 6; + + % Grafico Cumulati + subplot(1,2,2); + plot(DispMese,Prof); + hold on + DispCum = plot(Spost(end,:),Prof); + title('Spostamenti Cumulati 2D'); + xlabel('Spostamento [mm]'); + ylabel(['Profondit' char(224) ' [m]']); + h = gca; + h.XAxis.MinorTick = 'on'; + if max(Spost(end,:)) < 10 + xlim([-inf 10]); + end + grid on + grid minor +% legend('Periodo di riferimento','Intero periodo','Location','southeast','FontSize',8); +% lgd.FontSize = 6; +% + TempName = char(strcat('Report',siteID,'-', char(toolrif),'DispIPL.png')); + saveas(DispCum,TempName); + Chart = Image(TempName); + if m > 1 + for C = 1:m-1 + if status(C,1) == 3 || status(C,1) == 1 + Chart.Style = {Height('10cm'),HAlign('center')}; + break + else + Chart.Style = {ScaleToFit}; + end + end + else + Chart.Style = {ScaleToFit}; + end + Chart.Style = {ScaleToFit}; + Chart_capM = Paragraph(['Fig. ' num2str(FIG) ' - Spostamenti differenziali locali e cumulati in '... + 'direzione di massima pendenza registrati dalla catena '... + 'durante il periodo temporale di riferimento e a partire '... + 'dalla data di riferimento riportata in Tabella 1']); + FIG = FIG+1; + Chart_capM.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + close(figure(1)) + + SE = Section(); + sezTilt = Heading3('In Place Link HR'); + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SE.Title = sezTilt; + + % ENG + if activeEN == 1 + figure(1) + subplot(1,2,1); + plot(DispMese_Local,Prof); + hold on + plot(Spost_local(end,:),Prof); + title('2D Local Displacements'); + xlabel('Displacement [mm]'); + ylabel('Depth [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + if MaxDisp < 10 % mm + xlim([-inf 10]); + end + grid on + grid minor + + subplot(1,2,2); + plot(DispMese,Prof); + hold on + DispCum = plot(Spost(end,:),Prof); + title('2D Cumulative Displacements'); + xlabel('Displacements [mm]'); + ylabel('Depth [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + if max(Spost(end,:)) < 10 + xlim([-inf 10]); + end + grid on + grid minor + lgd = legend('Last period','Entire period','Location','southeast'); + lgd.FontSize = 6; + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Disp_ENG.png')); + saveas(DispCum,TempName); + Chart = Image(TempName); + if m > 1 + for C = 1:m-1 + if status(C,1) == 3 || status(C,1) == 1 + Chart.Style = {Height('10cm'),HAlign('center')}; + break + else + Chart.Style = {ScaleToFit}; + end + end + else + Chart.Style = {ScaleToFit}; + end + Chart.Style = {ScaleToFit}; + Chart_capM = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Local and cumulative '... + 'differential displacements along maximum grade direction, '... + 'recorded during the monitoring reference period and starting from the '... + 'reported in Tab. 1']); + FIG_ENG = FIG_ENG+1; + Chart_capM.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + close(figure(1)) + + SE_ENG = Section(); + sezTilt_ENG = Heading3('In Place Link HR'); + sezTilt_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SE_ENG.Title = sezTilt; + end + + testo = Paragraph(['I grafici seguenti riportano i valori di spostamento differenziale locale e cumulato '... + 'misurati dal sensore elettrolitico 2D lungo la direzione di massima pendenza, '... + 'registrati durante il periodo temporale di riferimento e calcolati a partire dalla lettura di '... + 'riferimento riportata in Tabella 1. ']); + testo2 = Paragraph(['In particolare, il massimo spostamento differenziale locale registrato durante il periodo '... + 'temporale di riferimento ' char(232) ' pari a ' num2str((MaxDispMESE), '%0.1f') ' mm alla profondit' char(224) ... + ' di ' num2str(MaxDispProfMESE) ' metri. Lo spostamento cumulato in testa risulta pari a ' num2str(DispMese(end,end),'%0.1f') ' mm.']); + testo3 = Paragraph(['Gli stessi dati relativi all''intero periodo di monitoraggio rilevano un massimo spostamento '... + 'differenziale locale pari a ' num2str((MaxDisp), '%0.1f') ' mm, in corrispondenza di una profondit' char(224) ... + ' di ' num2str(MaxDispProf) ' metri. Lo spostamento cumulato in testa risulta pari a ' num2str(Spost(end,end)) ' mm.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + testo3.HAlign = 'justify'; + add(DT,sezTilt); + add(DT,testo); + add(DT,testo2); + add(DT,testo3); + add(DT,Chart); + add(DT,Chart_capM); + add(DT,br); + % ENG + if activeEN == 1 + testo = Paragraph(['The following graphs shows the local and differential cumulative displacements '... + 'recorded by 3D MEMS sensor along the maximum grade direction during the reference monitoring period '... + 'and starting from the reference date reported in Tab. 1. The maximum local differential displacement '... + 'recorded during the reference time period equals ' num2str((MaxDispMESE),'%0.1f') ' mm at a depth of '... + num2str(abs(MaxDispProfMESE)) ' m. The cumulative displacements at the ground level is '... + num2str(DispMese(end,end),'%0.1f') ' mm.']); + testo2 = Paragraph(['The same analysis related to the whole monitoring period highlights a maximum local '... + 'differential displacement of ' num2str((MaxDisp), '%0.1f') ' mm, at a depth of ' num2str(abs(MaxDispProf)) ... + ' m. The cumulative displacement equals ' num2str(Spost(end,end)) ' mm.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + add(DT_ENG,sezTilt); + add(DT_ENG,testo); + add(DT_ENG,testo2); + add(DT_ENG,Chart); + add(DT_ENG,Chart_capM); + add(DT_ENG,br); + end + %pulisco variabili da riutilizzare per catena successiva + clear Spost; + clear Spost_local; + clear Spost_mese; + clear Spost_local_mese; + clear Prof; + clear Azim; + clear DirAzim; + clear Spost_Local_MeseX; + clear Spost_Local_MeseY; + clear diffMeseX_Local; + clear diffMeseY_Local; + clear DispMese_Local; + clear Spost_MeseX; + clear Spost_MeseY; + clear diffMeseX; + clear diffMeseY; + clear DispMese; + clear GI_MaxDispMESE_x; + clear GI_diff_x; + clear GI_MaxDispMESE_y; + clear GI_diff_y; + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + check = 1; + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + if m == 1 + add(DT_ENG,br); + end + end + end + end + end +end + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_IPLHR function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_KL.m b/ATD/report_KL.m new file mode 100755 index 0000000..d5b3235 --- /dev/null +++ b/ATD/report_KL.m @@ -0,0 +1,530 @@ +function [GI_AngoloKL,GI_NumKL,GI_DateKL,ATTIVA,FIG,FIG_ENG] = report_KL(rKL,m,... + NodoKlinoLink,toolrif,unitrif,datarif,contunit,Font_caption,Font_tools,... + siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,activeEN,colonna4,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_KL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +GI_AngoloXKL = []; +GI_AngoloYKL = []; +GI_AngoloKL = []; +GI_NumKL = []; +GI_DateKL = []; +NODATA(m,1) = 0; +check = 0; +while check == 0 + if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('Catena non ancora installata o inattiva.'); + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array not installed or inactive.'); + add(DT_ENG,testo); + end + end + check = 1; + elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoraggio completato. Invitiamo a visitare la '... + 'piattaforma web per la visione dei dati storici.']); + 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 + check = 1; + else + KE = Section(); + if activeEN == 1 + KE_EN = Section(); + end + titolo = 1; + + if strcmp(char(colonna4(m+1,1)),'Klino Array D2W') == 1 % Clinometro Wi-Fi + 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 modulo Wi-Fi registrati '... + 'durante il periodo di monitoraggio sono riportati di seguito. Il corretto funzionamento '... + 'del sistema ' char(232) ' assicurato per una carica superiore a 7 V. L''ultimo dato '... + 'disponibile ' char(232) ' pari a ' num2str(Batteria(end,1)) ' V.']); + testoB2 = Paragraph(['Il modulo 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 D2W'); + 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,'-', num2str(m) ,'-D2W.png')); + saveas(GMUX,TempName); + ChartGMUX = Image(TempName); + ChartGMUX.Style = {Height('8cm'),HAlign('center')}; + if Batteria(end,1) > 6.5 + TempNameB = char(strcat('B_13.jpg')); + elseif Batteria(end,1) > 6 + TempNameB = char(strcat('B_12.jpg')); + elseif Batteria(end,1) > 5.8 + TempNameB = char(strcat('B_115.jpg')); + elseif Batteria(end,1) > 5.6 + TempNameB = char(strcat('B_11.jpg')); + else + TempNameB = char(strcat('B_10.jpg')); + end + 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) ' - Livello di carica della batteria e temperatura del '... + 'D2W registrati durante il periodo di riferimento']); + FIG = FIG+1; + lot_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + Batt = Section(); + sezBATT = Heading3('D2W - 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)); + + if activeEN == 1 + testoB1 = Paragraph(['The following chart reports the D2W battery level trend recorded '... + 'during the reference time period. '... + 'The correct functioning of the data acquisition system is guaranteed for a '... + 'minimum level of 7 V. The last available data is equal to ' num2str(Batteria(end,1)) ' V.']); + testoB2 = Paragraph(['The module 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.']); + testoB1.HAlign = 'justify'; + testoB2.HAlign = 'justify'; + + % grafico batteria + figure(19) + plot(Date,Batteria); + hold on + title('D2W 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,'-D2W_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 D2W 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('D2W - 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 + end + end + + for k = 1:rKL(m,1) + NodeNum = num2str(NodoKlinoLink(k,m)); + comando = ['select EventDate, EventTime, XShift, YShift, T_node 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 + TiltX(:,k) = cell2mat(Dati(:,3)); % asse x + TiltY(:,k) = cell2mat(Dati(:,4)); % asse y + TempKL(:,k) = cell2mat(Dati(:,5)); % temperatura + if k == 1 % Il primo lo scrivo e creo la variabile di controllo + check = 1; + else + [rS,~] = size(TiltX(:,k-1)); + if rD ~= rS + NODATA(m,1) = 2; + check = 0; + break + else + check = 1; + end + end + else + NODATA(m,1) = 1; + check = 1; + end + if NODATA(m,1) == 0 + % grafico inclinazione-tempo asse X,Y NELL'ULTIMO MESE + figure(1) + subplot(2,1,1); % (righe colonne posizione) + pbaspect([3 1 1]); + yyaxis left + plot(Date,TiltX(:,k)); + MAX = max(TiltX(:,k)); + MIN = min(TiltX(:,k)); + if MIN > -0.1 && MAX < 0.1 + ylim([-0.1 0.1]); + end + if isnan(TempKL(:,k)) == 0 + yyaxis right + hold on + plot(Date,TempKL,':','LineWidth',1.1); + yyaxis right + ylabel(['Temperatura [' char(176) 'C]']); + set(gca,'YColor','k'); + end + xlim([Date(1)-1 Date(end)+1]); + title(['Inclinazione clinometro ' NodeNum ' - asse X']); + xlabel('Data [gg/mm/aaaa]'); + yyaxis left + ylabel(['Inclinazione [' char(176) ']']); + set(gca,'YColor','k'); + +% str(1,1) = cellstr('Tilt X'); +% str(2,1) = cellstr('Temperature'); +% legend(str,'Location','southwest','FontSize',9); + + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + + hold off + subplot(2,1,2) + pbaspect([3 1 1]); + yyaxis left + InclY = plot(Date,TiltY(:,k)); + MAX = max(TiltY(:,k)); + MIN = min(TiltY(:,k)); + if MIN > -0.1 && MAX < 0.1 + ylim([-0.1 0.1]); + end + if isnan(TempKL) == 0 + yyaxis right + hold on + InclY = plot(Date,TempKL(:,k),':','LineWidth',1.1); + yyaxis right + ylabel(['Temperatura [' char(176) 'C]']); + set(gca,'YColor','k'); + end + xlim([Date(1)-1 Date(end)+1]); + title(['Inclinazione clinometro ' NodeNum ' - asse Y']); + xlabel('Data [gg/mm/aaaa]'); + yyaxis left + ylabel(['Inclinazione [' char(176) ']']); + set(gca,'YColor','k'); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + +% str(1,1) = cellstr('Tilt Y'); +% str(2,1) = cellstr('Temperature'); +% legend(str,'Location','southwest'); + + legendaKL = Image(('legendaKL.png')); + legendaKL.Style = {Height('0.4cm'),HAlign('center')}; + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-Klino', NodeNum, '.png')); + saveas(InclY,TempName); + ChartKL = Image(TempName); + ChartKL.Style = {ScaleToFit}; + ChartKL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Inclinazione in direzione '... + 'strumentale X e Y registrata dal sensore MEMS '... + 'del nodo ' NodeNum ' durante il periodo temporale di riferimento']); + FIG = FIG+1; + ChartKL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + if titolo == 1 + sezKlino = Heading3('Klino Link'); + sezKlino.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KE.Title = sezKlino; + add(DT,sezKlino); + if activeEN == 0 + titolo = 0; + end + end + if k == 1 + testo = Paragraph(['I grafici seguenti riportano i valori di inclinazione assoluta misurati '... + 'nel periodo temporale di riferimento lungo gli assi strumentali X e Y dai clinometri '... + 'presenti in sito.']); + testo.HAlign = 'justify'; + add(DT,testo); + end + testo2 = Paragraph(['Il nodo numero ' NodeNum ' ha rilevato un''inclinazione massima lungo l''asse X '... + 'pari a ' num2str(round(max(TiltX(:,k)),2),'%0.2f') '' char(176) ' ed un valore minimo pari a '... + num2str(round(min(TiltX(:,k)),2), '%0.2f') '' char(176) ', per una variazione massima uguale a '... + num2str(round(max(TiltX(:,k)),2)-round(min(TiltX(:,k)),2), '%0.2f')... + char(176) '. Per quanto riguarda l''asse Y, i valori massimi e minimi sono rispettivamente '... + ' pari a ' num2str(round(max(TiltY(:,k)),2), '%0.2f') '' char(176) ' e ' num2str(round(min(TiltY(:,k)),2), '%0.2f')... + char(176) ', con una variazione massima di ' num2str(round(max(TiltY(:,k)),2)-round(min(TiltY(:,k)),2), '%0.2f')... + char(176) ' di inclinazione.']); + testo2.HAlign = 'justify'; + add(DT,testo2); + add(DT,ChartKL); + add(DT,legendaKL); + add(DT,ChartKL_cap); + add(DT,br); + close(figure(1)); + + if activeEN == 1 + % grafico inclinazione-tempo asse X,Y NELL'ULTIMO MESE + figure(1) + subplot(2,1,1); % (righe colonne posizione) + pbaspect([3 1 1]); + yyaxis left + plot(Date,TiltX(:,k)); + if isnan(TempKL(:,k)) == 0 + yyaxis right + hold on + plot(Date,TempKL,':','LineWidth',1.1); + yyaxis right + ylabel(['Temperature [' char(176) 'C]']); + set(gca,'YColor','k'); + end +% str(1,1) = cellstr('Tilt X'); +% str(2,1) = cellstr('Temperature'); +% legend(str,'Location','southwest'); + + xlim([Date(1)-1 Date(end)+1]); + title(['Tilt ' NodeNum ' - X axis']); + xlabel('Date [dd/mm/yyyy]'); + yyaxis left + ylabel(['Tilt [' char(176) ']']); + set(gca,'YColor','k'); + + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + + hold off + subplot(2,1,2) + pbaspect([3 1 1]); + yyaxis left + InclY = plot(Date,TiltY(:,k)); + if isnan(TempKL) == 0 + yyaxis right + hold on + InclY = plot(Date,TempKL(:,k),':','LineWidth',1.1); + yyaxis right + ylabel(['Temperature [' char(176) 'C]']); + set(gca,'YColor','k'); + end + xlim([Date(1)-1 Date(end)+1]); + title(['Tilt ' NodeNum ' - Y axis']); + xlabel('Date [dd/mm/yyyy]'); + yyaxis left + ylabel(['Tilt [' char(176) ']']); +% str(1,1) = cellstr('Tilt Y'); +% str(2,1) = cellstr('Temperature'); +% legend(str,'Location','southwest'); + + set(gca,'YColor','k'); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-Klino', NodeNum, '_ENG.png')); + saveas(InclY,TempName); + ChartKL = Image(TempName); + ChartKL.Style = {ScaleToFit}; + ChartKL_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Tilt recorded by MEMS sensor '... + 'during the reference monitoring period along X and Y instrumental axes of node '... + NodeNum '']); + FIG_ENG = FIG_ENG+1; + ChartKL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + if titolo == 1 + if activeEN == 0 + KE_ENG.Title = sezKlino; + add(DT_ENG,sezKlino); + titolo = 0; + end + end + if k == 1 + testo = Paragraph(['The following graphs show the tilt angles recorded along X and Y '... + 'instrumental axes during the reference monitoring period.']); + testo.HAlign = 'justify'; + add(DT_ENG,testo); + end + testo2 = Paragraph(['Node number ' NodeNum ' highlighted a maximum and a minimum tilt of '... + num2str(round(max(TiltX(:,k)),2),'%0.2f') '' char(176) ' and '... + num2str(round(min(TiltX(:,k)),2),'%0.2f') '' char(176) ' respectively, along X axis. '... + 'The angle variation equals ' num2str(round(max(TiltX(:,k)),2)-round(min(TiltX(:,k)),2), '%0.2f')... + char(176) '. Y axis showed maximum and minimum values equal to '... + num2str(round(max(TiltY(:,k)),2), '%0.2f') '' char(176) ' and ' num2str(round(min(TiltY(:,k)),2), '%0.2f')... + char(176) '. The variation is ' num2str(round(max(TiltY(:,k)),2)-round(min(TiltY(:,k)),2), '%0.2f')... + char(176) '.']); + testo2.HAlign = 'justify'; + add(DT_ENG,testo2); + add(DT_ENG,ChartKL); + add(DT_ENG,legendaKL); + add(DT_ENG,ChartKL_cap); + add(DT_ENG,br); + close(figure(1)); + end + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + if m == 1 + add(DT_ENG,br); + end + end + check = 1; + end + end + end + if rC ~= 1 + var1 = max(abs(TiltX-TiltX(1,:))); + varX = max(var1); + indX = find(var1 == varX); + var2 = max(abs(TiltX-TiltX(1,:))); + varY = max(var2); + indY = find(var2 == varX); + MAX = max(varX,varY); + indM = find(max(varX,varY)==MAX); + if indM == 1 % X + GI_AngoloXKL = TiltX(:,indX)-TiltX(1,indX); + GI_AngoloYKL = TiltY(:,indX)-TiltY(1,indX); + GI_NumKL = NodoKlinoLink(indX,m); + GI_DateKL = Date; + else % Y + GI_AngoloXKL = TiltX(:,indY)-TiltX(1,indY); + GI_AngoloYKL = TiltY(:,indY)-TiltY(1,indY); + GI_NumKL = NodoKlinoLink(indY,m); + GI_DateKL = Date; + end + end + end +end +if isempty(GI_AngoloXKL) == 0 + GI_AngoloKL(:,1) = GI_AngoloXKL; + GI_AngoloKL(:,2) = GI_AngoloYKL; +end + +text = 'report_KL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_KLHR.m b/ATD/report_KLHR.m new file mode 100755 index 0000000..b82df67 --- /dev/null +++ b/ATD/report_KLHR.m @@ -0,0 +1,283 @@ +function [ATTIVA,FIG,FIG_ENG] = report_KLHR(rKLHR,m,NodoKlinoLinkHR,toolrif,unitrif,... + datarif,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,... + activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_KLHR function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('Catena non ancora installata o inattiva.'); + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array not installed or inactive.'); + add(DT_ENG,testo); + end + end +elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoraggio completato. Invitiamo a visitare la '... + 'piattaforma web per la visione dei dati storici.']); + 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 + KL = Section(); + if activeEN == 1 + KL_EN = Section(); + end + titolo = 1; + + for k = 1:rKLHR(m,1) + NodeNum = num2str(NodoKlinoLinkHR(k,m)); + comando = ['select EventDate, EventTime, XShift, YShift, T_node 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 + TiltX = cell2mat(Dati(:,3)); % asse x + TiltY = cell2mat(Dati(:,4)); % asse y + TempKLHR = cell2mat(Dati(:,5)); % temperatura + + % grafico inclinazione-tempo asse X,Y NELL'ULTIMO MESE + figure(1) + subplot(2,1,1); % (righe colonne posizione) + pbaspect([3 1 1]); + yyaxis left + InclX = plot(Date,TiltX); + if isnan(TempKLHR) == 0 + yyaxis right + TempKLHR_X = plot(Date,TempKLHR,':','LineWidth',1.1); + yyaxis right + ylabel(['Temperatura [' char(176) 'C]']); + set(gca,'YColor','k'); + end + title(['Inclinazione clinometro ' NodeNum ' - asse X']); + xlabel('Data [gg/mm/aaaa]'); + yyaxis left + ylabel(['Inclinazione [' char(176) ']']); + set(gca,'YColor','k'); + + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(12); + grid on + grid minor + + hold off + subplot(2,1,2) + pbaspect([3 1 1]); + yyaxis left + InclY = plot(Date,TiltY); + if isnan(TempKLHR) == 0 + yyaxis right + TempKLHR_Y = plot(Date,TempKLHR,':','LineWidth',1.1); + yyaxis right + ylabel(['Temperatura [' char(176) 'C]']); + set(gca,'YColor','k'); + end + title(['Inclinazione clinometro ' NodeNum ' - asse Y']); + xlabel('Data [gg/mm/aaaa]'); + yyaxis left + ylabel(['Inclinazione [' char(176) ']']); + set(gca,'YColor','k'); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(12); + grid on + grid minor + + legendaKL = Image(('legendaKL.png')); + legendaKL.Style = {Height('0.7cm'),HAlign('center')}; + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-KlinoHR', NodeNum, '.png')); + saveas(InclY,TempName); + ChartKLHR = Image(TempName); + ChartKLHR.Style = {ScaleToFit}; + ChartKLHR_cap = Paragraph(['Fig. ' num2str(FIG) ' - Inclinazione in direzione strumentale X e Y '... + 'registrata dal sensore elettrolitico durante il periodo temporale di riferimento']); + FIG = FIG+1; + ChartKLHR_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + if titolo == 1 + sezKlinoHR = Heading3('Klino Link HR'); + sezKlinoHR.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KL.Title = sezKlinoHR; + add(DT,sezKlinoHR); + if activeEN == 0 + titolo = 0; + end + end + + testo = Paragraph(['I grafici seguenti riportano i valori di inclinazione assoluta misurati dal Nodo ' NodeNum ... + ' lungo gli assi strumentali X e Y del sensore elettrolitico nell''ultimo mese di monitoraggio. ']); + testo2 = Paragraph(['In questo periodo di tempo, il sensore ha rilevato un''inclinazione massima lungo l''asse X '... + 'pari a ' num2str(round(max(TiltX),2), '%0.2f') '' char(176) ' ed un valore minimo pari a '... + num2str(round(min(TiltX),2), '%0.2f') '' char(176) ', per una variazione massima uguale a '... + num2str(round(max(TiltX)-min(TiltX),2), '%0.2f')... + char(176) '. Per quanto riguarda l''asse Y, i valori massimi e minimi sono rispettivamente '... + ' pari a ' num2str(round(max(TiltY),2), '%0.2f') '' char(176) ' e ' num2str(round(min(TiltY),2), '%0.2f')... + char(176) ', con una variazione massima di ' num2str(round(max(TiltY)-min(TiltY),2), '%0.2f')... + char(176) ' di inclinazione.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if titolo == 1 + sezKlinoHR = Heading3('Klino Link HR'); + sezKlinoHR.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + KL = Section(); + KL.Title = sezKlinoHR; + add(DT,sezKlinoHR); + titolo = 0; + end + add(DT,testo); + add(DT,testo2); + add(DT,ChartKLHR); + add(DT,legendaKL); + add(DT,ChartKLHR_cap); + add(DT,br); + close(figure(1)); + + if activeEN == 1 + % grafico inclinazione-tempo asse X,Y NELL'ULTIMO MESE + figure(1) + subplot(2,1,1); % (righe colonne posizione) + pbaspect([3 1 1]); + yyaxis left + InclX = plot(Date,TiltX); + if isnan(TempKLHR) == 0 + yyaxis right + TempKLHR_X = plot(Date,TempKLHR,':','LineWidth',1.1); + yyaxis right + ylabel(['Temperature [' char(176) 'C]']); + set(gca,'YColor','k'); + end + title(['Tilt ' NodeNum ' - X axis']); + xlabel('Date [dd/mm/yyyy]'); + yyaxis left + ylabel(['Tilt [' char(176) ']']); + set(gca,'YColor','k'); + + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(12); + grid on + grid minor + + hold off + subplot(2,1,2) + pbaspect([3 1 1]); + yyaxis left + InclY = plot(Date,TiltY); + if isnan(TempKLHR) == 0 + yyaxis right + TempKLHR_Y = plot(Date,TempKLHR,':','LineWidth',1.1); + yyaxis right + ylabel(['Temperature [' char(176) 'C]']); + set(gca,'YColor','k'); + end + title(['Tilt ' NodeNum ' - Y axis']); + xlabel('Date [dd/mm/yyyy]'); + yyaxis left + ylabel(['Tilt [' char(176) ']']); + set(gca,'YColor','k'); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(12); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-KlinoHR', NodeNum, '_ENG.png')); + saveas(InclY,TempName); + ChartKLHR = Image(TempName); + ChartKLHR.Style = {ScaleToFit}; + ChartKLHR_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Tilt recorded by electrolytic tilt sensor '... + 'during the reference monitoring period along X and Y instrumental axes of node '... + NodeNum '']); + FIG_ENG = FIG_ENG+1; + ChartKLHR_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + if titolo == 1 + if activeEN == 0 + KL_EN.Title = sezKlinoHR; + add(DT_ENG,sezKlinoHR); + titolo = 0; + end + end + + testo = Paragraph(['The following graphs show the absolute tilt angles recorded along X and Y '... + 'instrumental axes during the reference monitoring period.']); + testo2 = Paragraph(['Node number ' NodeNum ' highlighted a maximum and a minimum tilt of '... + num2str(round(max(TiltX),2), '%0.2f') '' char(176) ' and '... + num2str(round(min(TiltX),2), '%0.2f') '' char(176) ' along the X axis. The angle variation equals '... + num2str(round(max(TiltX)-min(TiltX),2), '%0.2f')... + char(176) '. Y axis showed maximum and minimum values equal to '... + num2str(round(max(TiltY),2), '%0.2f') '' char(176) ' and ' num2str(round(min(TiltY),2), '%0.2f')... + char(176) ', while the variation is ' num2str(round(max(TiltY)-min(TiltY),2), '%0.2f')... + char(176) '.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if titolo == 1 + sezKlinoHR = Heading3('Klino Link HR'); + sezKlinoHR.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + KL = Section(); + KL.Title = sezKlinoHR; + add(DT_ENG,sezKlinoHR); + titolo = 0; + end + add(DT_ENG,testo); + add(DT_ENG,testo2); + add(DT_ENG,ChartKLHR); + add(DT_ENG,legendaKL); + add(DT_ENG,ChartKLHR_cap); + add(DT_ENG,br); + close(figure(1)); + end + + %pulisco variabili da riutilizzare per catena successiva + clear TiltX; + clear TiltY; + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + if m == 1 + add(DT_ENG,br); + end + end + end + end + end +end + +text = 'report_KLHR function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_KLHR_ENG.m b/ATD/report_KLHR_ENG.m new file mode 100755 index 0000000..46e5f54 --- /dev/null +++ b/ATD/report_KLHR_ENG.m @@ -0,0 +1,149 @@ +function [ATTIVA,FIG] = report_KLHR_ENG(rKLHR,m,NodoKlinoLinkHR,toolrif,unitrif,... + datarif,Font_caption,Font_tools,siteID,DT,FIG,br,status,ATTIVA,conn,FileName) + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('Array not installed or inactive.'); + add(DT,testo); + end +elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoring completed. Please log into the web-based platoform '... + 'to access the complete dataset.']); + add(DT,testo); + end +else + for k = 1:rKLHR(m,1) + NodeNum = num2str(NodoKlinoLinkHR(k,m)); + comando = ['select EventDate, EventTime, XShift, YShift, T_node 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 + TiltX = cell2mat(Dati(:,3)); % asse x + TiltY = cell2mat(Dati(:,4)); % asse y + TempKLHR = cell2mat(Dati(:,5)); % temperatura + + % grafico inclinazione-tempo asse X,Y NELL'ULTIMO MESE + figure(1) + subplot(2,1,1); % (righe colonne posizione) + pbaspect([3 1 1]); + yyaxis left + InclX = plot(Date,TiltX); + if isnan(TempKLHR) == 0 + yyaxis right + TempKLHR_X = plot(Date,TempKLHR,':','LineWidth',1.1); + yyaxis right + ylabel(['Temperature [' char(186) 'C]']); + set(gca,'YColor','k'); + end + title(['Clinometer ' NodeNum ' - X axis tilt']); + xlabel('Date [dd/mm/yyyy]'); + yyaxis left + ylabel(['Tilt [' char(186) ']']); + set(gca,'YColor','k'); + + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(12); + grid on + grid minor + + hold off + subplot(2,1,2) + pbaspect([3 1 1]); + yyaxis left + InclY = plot(Date,TiltY); + if isnan(TempKLHR) == 0 + yyaxis right + TempKLHR_Y = plot(Date,TempKLHR,':','LineWidth',1.1); + yyaxis right + ylabel(['Temperature [' char(186) 'C]']); + set(gca,'YColor','k'); + end + title(['Clinometer ' NodeNum ' - Y axis tilt']); + xlabel('Date [dd/mm/yyyy]'); + yyaxis left + ylabel(['Tilt [' char(176) ']']); + set(gca,'YColor','k'); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(12); + grid on + grid minor + + legendaKL = Image(('legendaKL_ENG.png')); + legendaKL.Style = {Height('0.7cm'),HAlign('center')}; + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-KlinoHR', NodeNum, '_ENG.png')); + saveas(InclY,TempName); + ChartKLHR = Image(TempName); + ChartKLHR.Style = {ScaleToFit}; + ChartKLHR_cap = Paragraph(['Fig. ' num2str(FIG) ' - Tilt '... + 'recorded during thte reference time period by the electrolytic tilt sensor along X and Y instrumental axes']); + FIG = FIG+1; + ChartKLHR_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['Following graphs report the absolute tilt values measured during the reference time interval '... + 'by the electrolytic tilt sensor installed in the node ' NodeNum ' along the two instrumental axes X and Y.']); + testo2 = Paragraph(['In the time period considered for this report, the sensor recorded a maximum tilt value along '... + 'the X axis equal to ' num2str(round(max(TiltX),2), '%0.2f') '' char(186) ' and a minimum value of '... + num2str(round(min(TiltX),2), '%0.2f') '' char(186) ', with '... + num2str(round(max(TiltX),2)-round(min(TiltX),2), '%0.2f')... + char(186) ' of maximum variation. For what concern the Y axis, maximum and minimum values are respectively equal to'... + num2str(round(max(TiltY),2), '%0.2f') '' char(186) ' and ' num2str(round(min(TiltY),2), '%0.2f')... + char(186) ', displaying a maximum variation of ' num2str(round(max(TiltY),2)-round(min(TiltY),2), '%0.2f')... + char(186) '.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if titolo == 1 + sezKlino = Heading3('Klino Link HR'); + sezKlino.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + KL = Section(); + KL.Title = sezKlino; + add(DT,sezKlino); + titolo = 0; + end + add(DT,testo); + add(DT,testo2); + add(DT,ChartKLHR); + add(DT,legendaKL); + add(DT,ChartKLHR_cap); + add(DT,br); + close(figure(1)); + %pulisco variabili da riutilizzare per catena successiva + clear TiltX; + clear TiltY; + else + if ATTIVA == 1 + testo = Paragraph('No data available for the reference time period.'); + ATTIVA = 0; + add(DT,testo); + end + end + end +end + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_KLHR_ENG function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_KL_ENG.m b/ATD/report_KL_ENG.m new file mode 100755 index 0000000..7bd2848 --- /dev/null +++ b/ATD/report_KL_ENG.m @@ -0,0 +1,200 @@ +function [GI_AngoloKL,GI_NumKL,GI_DateKL,ATTIVA,FIG] = report_KL_ENG(rKL,m,... + NodoKlinoLink,toolrif,unitrif,datarif,Font_caption,Font_tools,... + siteID,DT,FIG,br,status,ATTIVA,conn,FileName) + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +GI_AngoloKL = []; +GI_NumKL = []; +GI_DateKL = []; +NODATA(m,1) = 0; +check = 0; +while check == 0 + if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('Array not installed or inactive.'); + add(DT,testo); + end + check = 1; + elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoring completed. Please log into the web-based platoform '... + 'to access the complete dataset.']); + add(DT,testo); + end + check = 1; + else + KE = Section(); + titolo = 1; + for k = 1:rKL(m,1) + NodeNum = num2str(NodoKlinoLink(k,m)); + comando = ['select EventDate, EventTime, XShift, YShift, T_node 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 + if k == 1 % Il primo lo scrivo e creo la variabile di controllo + check = 1; + else + [rS,~] = size(TiltX(:,k-1)); + if rD ~= rS + NODATA(m,1) = 2; + check = 0; + break + else + check = 1; + end + end + TiltX(:,k) = cell2mat(Dati(:,3)); % asse x + TiltY(:,k) = cell2mat(Dati(:,4)); % asse y + TempKL(:,k) = cell2mat(Dati(:,5)); % temperatura + else + NODATA(m,1) = 1; + check = 1; + end + if NODATA(m,1) == 0 + % grafico inclinazione-tempo asse X,Y NELL'ULTIMO MESE + figure(1) + subplot(2,1,1); % (righe colonne posizione) + pbaspect([3 1 1]); + yyaxis left + plot(Date,TiltX(:,k)); + if isnan(TempKL(:,k)) == 0 + yyaxis right + hold on + plot(Date,TempKL,':','LineWidth',1.1); + yyaxis right + ylabel(['Temperature [' char(176) 'C]']); + set(gca,'YColor','k'); + end + xlim([Date(1)-1 Date(end)+1]); + title(['Tilt meter ' NodeNum ' - X axis tilt']); + xlabel('Date [dd/mm/yyyy]'); + yyaxis left + ylabel(['Tilt [' char(186) ']']); + set(gca,'YColor','k'); + + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + + hold off + subplot(2,1,2) + pbaspect([3 1 1]); + yyaxis left + InclY = plot(Date,TiltY(:,k)); + if isnan(TempKL) == 0 + yyaxis right + hold on + TempKL_Y = plot(Date,TempKL(:,k),':','LineWidth',1.1); + yyaxis right + ylabel(['Temperature [' char(176) 'C]']); + set(gca,'YColor','k'); + end + xlim([Date(1)-1 Date(end)+1]); + title(['Tilt meter ' NodeNum ' - Y axis tilt']); + xlabel('Date [dd/mm/yyyy]'); + yyaxis left + ylabel(['Tilt [' char(186) ']']); + set(gca,'YColor','k'); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + + legendaKL = Image(which('legendaKL_ENG.png')); + legendaKL.Style = {Height('0.5cm'),HAlign('center')}; + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-Klino', NodeNum, '_ENG.png')); + saveas(InclY,TempName); + ChartKL = Image(TempName); + ChartKL.Style = {ScaleToFit}; + ChartKL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Tilt along X and Y instrumental axes '... + 'recorded during the reference time period by 3D MEMS sensor installed on the tilt meter ' NodeNum ]); + FIG = FIG+1; + ChartKL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + if titolo == 1 + sezKlino = Heading3('Klino Link'); + sezKlino.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KE.Title = sezKlino; + add(DT,sezKlino); + titolo = 0; + end + if k == 1 + testo = Paragraph(['Following graphs report the tilt values measured during the reference time interval '... + 'by the MEMS sensor installed on the node ' NodeNum ' along the two main instrumental axes X and Y.']); + testo.HAlign = 'justify'; + add(DT,testo); + end + testo2 = Paragraph(['In the time period considered for this report, the tilt meter ' NodeNum ' recorded a maximum tilt value along '... + 'the X axis equal to ' num2str(round(max(TiltX),2), '%0.2f') '' char(186) ' and a minimum value of '... + num2str(round(min(TiltX),2), '%0.2f') '' char(186) ', with '... + num2str(round(max(TiltX),2)-round(min(TiltX),2), '%0.2f')... + char(186) ' of maximum variation. For what concern the Y axis, maximum and minimum values are respectively equal to '... + num2str(round(max(TiltY),2), '%0.2f') '' char(186) ' and ' num2str(round(min(TiltY),2), '%0.2f')... + char(186) ', displaying a maximum variation of ' num2str(round(max(TiltY),2)-round(min(TiltY),2), '%0.2f')... + char(186) '.']); + testo2.HAlign = 'justify'; + add(DT,testo2); + add(DT,ChartKL); + add(DT,legendaKL); + add(DT,ChartKL_cap); + add(DT,br); + close(figure(1)); + else + if ATTIVA == 1 + testo = Paragraph('No data available for the reference time period.'); + ATTIVA = 0; + add(DT,testo); + check = 1; + end + end + end + var1 = max(abs(TiltX-TiltX(1,:))); + varX = max(var1); + indX = find(var1 == varX); + var2 = max(abs(TiltX-TiltX(1,:))); + varY = max(var2); + indY = find(var2 == varX); + MAX = max(varX,varY); + indM = find(max(varX,varY)==MAX); + if indM == 1 % X + GI_AngoloXKL = TiltX(:,indX)-TiltX(1,indX); + GI_AngoloYKL = TiltY(:,indX)-TiltY(1,indX); + GI_NumKL = NodoKlinoLink(indX,m); + GI_DateKL = Date; + else % Y + GI_AngoloXKL = TiltX(:,indY)-TiltX(1,indY); + GI_AngoloYKL = TiltY(:,indY)-TiltY(1,indY); + GI_NumKL = NodoKlinoLink(indY,m); + GI_DateKL = Date; + end + end +end +GI_AngoloKL(:,1) = GI_AngoloXKL; +GI_AngoloKL(:,2) = GI_AngoloYKL; + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_KL_ENG function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_LL.m b/ATD/report_LL.m new file mode 100755 index 0000000..92f87ec --- /dev/null +++ b/ATD/report_LL.m @@ -0,0 +1,404 @@ +function [FIG,FIG_ENG,battANALOG,ATTIVA] = report_LL(rLL,m,NodoLoadLink,toolrif,... + unitrif,datarif,contunit,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,... + br,colonna4,status,ATTIVA,battANALOG,activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_LL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +if status(m,1) == 1 + if strcmp(char(colonna4(m+1,1)),'Analog Array') == 1 % cella Analog Link + 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 + else + if ATTIVA == 1 + testo = Paragraph('Catena non ancora installata o inattiva.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array not installed or inactive.'); + add(DT_ENG,testo); + end + 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 + if strcmp(char(colonna4(m+1,1)),'Analog Array') == 1 % cella Analog Link + 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 registrati 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 registrati 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)); + + if activeEN == 1 + 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 + end + + sezLL = Heading3('Load Link'); + sezLL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + LL = Section(); + LL.Title = sezLL; + add(DT,sezLL); + if activeEN == 1 + add(DT_ENG,sezLL); + end + + for ld = 1:rLL(m,1) + NodeNum = num2str(NodoLoadLink(ld,m)); + comando = ['select EventDate, EventTime, load_value 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 + carico = cell2mat(Dati(:,3)); % carico cella + var_carico = carico-carico(1); % variazione carico + + % grafico carico + figure(5); + load = plot(Date,var_carico); + title(['Variazione di Carico - Nodo numero ' NodeNum '']); + xlabel('Data [gg/mm/aaaa]'); + ylabel('Variazione di carico [kN]'); + if strcmp(char(colonna4(m+1,1)),'Analog Array') == 1 % cella Analog Link + if max(var_carico) < 15 && min(var_carico) > -15 + ylim([-15 15]); + elseif max(var_carico) > 15 && min(var_carico) > -15 + ylim([-15 inf+1]); + elseif max(var_carico) < 15 && min(var_carico) < -15 + ylim([-inf-1 15]); + end + else % cella RSN + if max(var_carico) < 10 && min(var_carico) > -10 + ylim([-10 10]); + elseif max(var_carico) > 10 && min(var_carico) > -10 + ylim([-10 inf+1]); + elseif max(var_carico) < 20 && min(var_carico) < -10 + ylim([-inf-1 10]); + end + end + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + + hold off + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-CellaCarico', NodeNum, '.png')); + saveas(load,TempName); + ChartLL = Image(TempName); + ChartLL.Style = {Height('7.3cm'),HAlign('center')}; + ChartLL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Variazione di carico'... + ' registrato dalla cella di carico, sensore numero ' NodeNum... + ', nel periodo temporale di riferimento']); + FIG = FIG+1; + ChartLL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['Nel grafico seguente sono rappresentati i dati relativi '... + 'alla variazione di carico (in kN) registrata dai sensori appartenenti all''Analog Array.']); + testo2 = Paragraph(['Durante il periodo temporale di riferimento, il nodo numero ' NodeNum ... + ' ha rilevato una massima variazione di carico pari a '... + num2str(round(max(abs(var_carico)),2), '%0.2f') ' kN, mentre il valore di '... + 'massimo carico assoluto ' char(232) ' pari a ' num2str(round(max(carico),2), '%0.2f') ' kN.' ]); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if ld == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,ChartLL); + add(DT,ChartLL_cap); + if ld == rLL(m,1) + add(DT,br); + end + close(figure(5)); + + if activeEN == 1 + % grafico carico + figure(5); + load = plot(Date,var_carico); + title(['Load variation - Node number ' NodeNum '']); + xlabel('Date [dd/mm/yyyy]'); + ylabel('Load variation [kN]'); + if strcmp(char(colonna4(m+1,1)),'Analog Array') == 1 % cella Analog Link + if max(var_carico) < 15 && min(var_carico) > -15 + ylim([-15 15]); + elseif max(var_carico) > 15 && min(var_carico) > -15 + ylim([-15 inf+1]); + elseif max(var_carico) < 15 && min(var_carico) < -15 + ylim([-inf-1 15]); + end + else % cella RSN + if max(var_carico) < 10 && min(var_carico) > -10 + ylim([-10 10]); + elseif max(var_carico) > 10 && min(var_carico) > -10 + ylim([-10 inf+1]); + elseif max(var_carico) < 20 && min(var_carico) < -10 + ylim([-inf-1 10]); + end + end + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + hold off + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-CellaCarico', NodeNum, '_ENG.png')); + saveas(load,TempName); + ChartLL = Image(TempName); + ChartLL.Style = {Height('7.3cm'),HAlign('center')}; + ChartLL_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Load variation'... + ' recorded by the load cell, node number ' NodeNum... + ', during the reference monitoring period']); + FIG_ENG = FIG_ENG+1; + ChartLL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graph represents the load variations recorded by the sensors '... + 'that compose the Analog Array.']); + testo2 = Paragraph(['During the reference time period, node number ' NodeNum ... + ' highlighted a maximum load variations of '... + num2str(round(max(abs(var_carico)),2), '%0.2f') ' kN, while the maximum absolute load '... + 'recorded is ' num2str(round(max(carico),2), '%0.2f') ' kN.' ]); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if ld == 1 + add(DT_ENG,testo); + end + add(DT_ENG,testo2); + add(DT_ENG,ChartLL); + add(DT_ENG,ChartLL_cap); + if ld == rLL(m,1) + add(DT_ENG,br); + end + close(figure(5)); + end + + % pulisco variabili da riutilizzare per catena successiva + clear carico; + clear var_carico; + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + add(DT,br); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + if m == 1 + add(DT_ENG,br); + end + end + end + end + end +end + +text = 'report_LL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_LL_ENG.m b/ATD/report_LL_ENG.m new file mode 100755 index 0000000..dfa6af9 --- /dev/null +++ b/ATD/report_LL_ENG.m @@ -0,0 +1,239 @@ +function [FIG,battANALOG,ATTIVA] = report_LL_ENG(rLL,m,NodoLoadLink,toolrif,... + unitrif,datarif,contunit,Font_caption,Font_tools,siteID,DT,FIG,br,... + colonna4,status,ATTIVA,battANALOG,conn,FileName) + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +if status(m,1) == 1 + if strcmp(char(colonna4(m+1,1)),'Analog Array') == 1 % cella Analog Link + if ATTIVA == 1 + testo = Paragraph('GMUX not installed or inactive.'); + ATTIVA = 0; + end + else + if ATTIVA == 1 + testo = Paragraph('Array not installed or inactive.'); + ATTIVA = 0; + end + end + add(DT,testo); +elseif status(m,1) == 3 + if ATTIVA == 1 + testo = Paragraph(['Monitoring completed. Please log into the web-based platoform '... + 'to access the complete dataset.']); + ATTIVA = 0; + add(DT,testo); + end +else + if strcmp(char(colonna4(m+1,1)),'Analog Array') == 1 % cella Analog Link + 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(['The following chart reports the battery level trend recorded during the reference time period. '... + 'The correct functioning of the GMUX module is guaranteed for a minimum level of 12 V. The last '... + 'available data is equal to ' num2str(Batteria(end,1)) ' V.']); + testoB2 = Paragraph(['The GMUX module equips also a thermometer that allows the monitoring of the working '... + 'temperature and the identification of eventual malfunctioning. The following chart reports temperature '... + 'data recorded by the GMUX module.']); + testoB1.HAlign = 'justify'; + testoB2.HAlign = 'justify'; + + % grafico batteria + figure(19) + plot(Date,Batteria); + hold on + title('Battery level and GMUX temperature'); + xlabel('Date [dd/mm/yyyy]'); + ylabel('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')}; + if Batteria(end,1) >= 13 + TempName = char(strcat('B_13.jpg')); + elseif Batteria(end,1) >= 12 + TempName = char(strcat('B_12.jpg')); + elseif Batteria(end,1) >= 11 + 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) ' - Battery level and GMUX temperature recorded '... + 'during the reference time period']); + FIG = FIG+1; + lot_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + FIG = FIG+1; + Chart_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + Batt = Section(); + sezBATT = Paragraph('GMUX - Battery level and temperature'); + 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)); + battANALOG = 1; + end + end + end + + sezLL = Heading3('Load Link'); + sezLL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + LL = Section(); + LL.Title = sezLL; + add(DT,sezLL); + + for ld = 1:rLL(m,1) + NodeNum = num2str(NodoLoadLink(ld,m)); + comando = ['select EventDate, EventTime, load_value 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 + carico = cell2mat(Dati(:,3)); % carico cella + var_carico = carico-carico(1); % variazione carico + + % grafico carico + figure(5); + load = plot(Date,var_carico); + title(['Load variation - node ' NodeNum '']); + xlabel('Date [dd/mm/yyyy]'); + ylabel('Load variation [kN]'); + if strcmp(char(colonna4(m+1,1)),'Analog Array') == 1 % cella Analog Link + if max(var_carico) < 15 && min(var_carico) > -15 + ylim([-15 15]); + elseif max(var_carico) > 15 && min(var_carico) > -15 + ylim([-15 inf+1]); + elseif max(var_carico) < 15 && min(var_carico) < -15 + ylim([-inf-1 15]); + end + else % cella RSN + if max(var_carico) < 10 && min(var_carico) > -10 + ylim([-10 10]); + elseif max(var_carico) > 10 && min(var_carico) > -10 + ylim([-10 inf+1]); + elseif max(var_carico) < 20 && min(var_carico) < -10 + ylim([-inf-1 10]); + end + end + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + + hold off + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-CellaCarico', NodeNum, '_ENG.png')); + saveas(load,TempName); + ChartLL = Image(TempName); + ChartLL.Style = {Height('7.3cm'),HAlign('center')}; + ChartLL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Load variation '... + 'recorded by the load sensor ' NodeNum... + ', during the reference time period']); + FIG = FIG+1; + ChartLL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graph reports load variation data measured by load sensors'... + 'composing the Analog Array (values in kN).']); + testo2 = Paragraph(['During the reference time period, the node ' NodeNum ... + ' recorded a maximum load variation of '... + num2str(round(max(abs(var_carico)),2), '%0.2f') ' kN, while the maximum value referred '... + 'to the absolute load amounts to ' num2str(round(max(carico),2), '%0.2f') ' kN.' ]); + + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if ld == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,ChartLL); + add(DT,ChartLL_cap); + if ld == rLL(m,1) + add(DT,br); + end + close(figure(5)); + % pulisco variabili da riutilizzare per catena successiva + clear carico; + clear var_carico; + else + if ATTIVA == 1 + testo = Paragraph('No data available for the reference time period.'); + ATTIVA = 0; + add(DT,testo); + add(DT,br); + end + end + end +end + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_LL_ENG function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_MPBEL.m b/ATD/report_MPBEL.m new file mode 100755 index 0000000..993febd --- /dev/null +++ b/ATD/report_MPBEL.m @@ -0,0 +1,639 @@ +function [GI_MPB_RL,GI_MPB,GI_Base,GI_Date,FIG,FIG_ENG,battANALOG,ATTIVA] = report_MPBEL(DTcatena,... + rMPBEL,m,NodoMultiPointExtensometerLink,toolrif,unitrif,contunit,datarif,... + Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,DT_ENG,FIG,FIG_ENG,br,... + activeEN,status,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_MPBEL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +GI_Date = []; +GI_MPB = []; +GI_Base = []; +GI_MPB_RL = []; +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 + MPBE = Section(); + sezMPBELExtensometer = Heading3('MultiPoint Borehole Extensometer Link'); + sezMPBELExtensometer.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + MPBE.Title = sezMPBELExtensometer; + + 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 + MPBE_ENG = Section(); + sezMPBExt_ENG = Heading3('MultiPoint Borehole Extensometer Link'); + sezMPBExt_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + MPBE_ENG.Title = sezMPBExt_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,sezMPBELExtensometer); + if activeEN == 1 + add(DT_ENG,sezMPBExt_ENG); + end + + for mp = 1:rMPBEL(m,1) + NodeNum = num2str(NodoMultiPointExtensometerLink(mp,m)); + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z 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 + if isnan(cell2mat(Dati(:,3))) == 0 + d1(:,mp) = cell2mat(Dati(:,3)); % deformazioni base 1 + else + d1(:,mp) = 999999; + end + if isnan(cell2mat(Dati(:,4))) == 0 + d2(:,mp) = cell2mat(Dati(:,4)); % deformazioni base 2 + else + d2(:,mp) = 999999; + end + if isnan(cell2mat(Dati(:,5))) == 0 + d3(:,mp) = cell2mat(Dati(:,5)); % deformazioni base 3 + else + d3(:,mp) = 999999; + end + if isnan(cell2mat(Dati(:,6))) == 0 + d4(:,mp) = cell2mat(Dati(:,6)); % deformazioni base 4 + else + d4(:,mp) = 999999; + end + if isnan(cell2mat(Dati(:,7))) == 0 + d5(:,mp) = cell2mat(Dati(:,7)); % deformazioni base 5 + else + d5(:,mp) = 999999; + end + if isnan(cell2mat(Dati(:,8))) == 0 + d6(:,mp) = cell2mat(Dati(:,8)); % deformazioni base 6 + else + d6(:,mp) = 999999; + end + + % grafico deformazioni NELL'ULTIMO MESE + figure(5); + title(['Deformazioni misurate dal nodo numero ' NodeNum]); + d1g(:,mp) = d1(:,mp)-d1(1,mp); + MX(1) = max(d1g(:,mp)); + MN(1) = min(d1g(:,mp)); + MPB = plot(Date,d1g(:,mp)); + M = max(abs(d1g(:,mp))); + S = find(abs(d1g(:,mp))==M(1)); + D = d1g(S(1),mp); + basi = 1; + if d2(1,mp) < 999999 + hold on + d2g(:,mp) = d2(:,mp)-d2(1,mp); + MX(2) = max(d2g(:,mp)); + MN(2) = min(d2g(:,mp)); + MPB = plot(Date,d2g(:,mp)); + M(2) = max(abs(d2g(:,mp))); + S = find(abs(d2g(:,mp))==M(2)); + D(2) = d2g(S(1),mp); + basi = 2; + end + if d3(1,mp) < 999999 + hold on + d3g(:,mp) = d3(:,mp)-d3(1,mp); + MX(3) = max(d3g(:,mp)); + MN(3) = min(d3g(:,mp)); + MPB = plot(Date,d3g(:,mp)); + M(3) = max(abs(d3g(:,mp))); + S = find(abs(d3g(:,mp))==M(3)); + D(3) = d3g(S(1),mp); + basi = 3; + end + if d4(1,mp) < 999999 + hold on + d4g(:,mp) = d4(:,mp)-d4(1,mp); + MX(4) = max(d4g(:,mp)); + MN(4) = min(d4g(:,mp)); + MPB = plot(Date,d4g(:,mp)); + M(4) = max(abs(d4g(:,mp))); + S = find(abs(d4g(:,mp))==M(4)); + D(4) = d4g(S(1),mp); + basi = 4; + end + if d5(1,mp) < 999999 + hold on + d5g(:,mp) = d5(:,mp)-d5(1,mp); + MX(5) = max(d5g(:,mp)); + MN(5) = min(d5g(:,mp)); + MPB = plot(Date,d5g(:,mp)); + M(5) = max(abs(d5g(:,mp))); + S = find(abs(d5g(:,mp))==M(5)); + D(5) = d5g(S(1),mp); + basi = 5; + end + if d6(1,mp) < 999999 + hold on + d6g(:,mp) = d6(:,mp)-d6(1,mp); + MX(6) = max(d6g(:,mp)); + MN(6) = min(d6g(:,mp)); + plot(Date,d6g(:,mp)); + M(6) = max(abs(d6g(:,mp))); + S = find(abs(d6g(:,mp))==M(6)); + D(6) = d6g(S(1),mp); + basi = 6; + end + title(['Deformazioni registrate - Nodo numero ' NodeNum]); + ylabel('Deformazione [mm]'); + xlabel('Data [gg/mm/aaaa]'); + set(gca,'YColor','k'); + str(1,1) = cellstr('Base 1'); + if basi > 1 + str(2,1) = cellstr('Base 2'); + end + if basi > 2 + str(3,1) = cellstr('Base 3'); + end + if basi > 3 + str(4,1) = cellstr('Base 4'); + end + if basi > 4 + str(5,1) = cellstr('Base 5'); + end + if basi > 5 + str(6,1) = cellstr('Base 6'); + end + VAR(1) = max(MX); + VAR(2) = min(MN); + MAX = max(abs(VAR)); + IN = find(abs(VAR)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + + legend(str,'Location','northwest'); + xlim([Date(1)-1 Date(end)+1]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-MPBEL', NodeNum, '.png')); + saveas(MPB,TempName); + ChartMPBEL = Image(TempName); + ChartMPBEL.Style = {Height('7.3cm'),HAlign('center')}; + ChartMPBEL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Deformazioni '... + 'misurate dall''estensimetro multibase, nodo numero ' NodeNum... + ', nel periodo temporale di riferimento']); + FIG = FIG+1; + ChartMPBEL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + %--ENG-- + + if activeEN == 1 + % grafico deformazioni NELL'ULTIMO MESE + figure(15); + title(['Deformations meassured by node ' NodeNum]); + d1g(:,mp) = d1(:,mp)-d1(1,mp); + MX(1) = max(d1g(:,mp)); + MN(1) = min(d1g(:,mp)); + MPB = plot(Date,d1g(:,mp)); + M = max(abs(d1g(:,mp))); + S = find(abs(d1g(:,mp))==M(1)); + D = d1g(S(1),mp); + basi = 1; + if d2(1,mp) < 999999 + hold on + d2g(:,mp) = d2(:,mp)-d2(1,mp); + MX(2) = max(d2g(:,mp)); + MN(2) = min(d2g(:,mp)); + MPB = plot(Date,d2g(:,mp)); + M(2) = max(abs(d2g(:,mp))); + S = find(abs(d2g(:,mp))==M(2)); + D(2) = d2g(S(1),mp); + basi = 2; + end + if d3(1,mp) < 999999 + hold on + d3g(:,mp) = d3(:,mp)-d3(1,mp); + MX(3) = max(d3g(:,mp)); + MN(3) = min(d3g(:,mp)); + MPB = plot(Date,d3g(:,mp)); + M(3) = max(abs(d3g(:,mp))); + S = find(abs(d3g(:,mp))==M(3)); + D(3) = d3g(S(1),mp); + basi = 3; + end + if d4(1,mp) < 999999 + hold on + d4g(:,mp) = d4(:,mp)-d4(1,mp); + MX(4) = max(d4g(:,mp)); + MN(4) = min(d4g(:,mp)); + MPB = plot(Date,d4g(:,mp)); + M(4) = max(abs(d4g(:,mp))); + S = find(abs(d4g(:,mp))==M(4)); + D(4) = d4g(S(1),mp); + basi = 4; + end + if d5(1,mp) < 999999 + hold on + d5g(:,mp) = d5(:,mp)-d5(1,mp); + MX(5) = max(d5g(:,mp)); + MN(5) = min(d5g(:,mp)); + MPB = plot(Date,d5g(:,mp)); + M(5) = max(abs(d5g(:,mp))); + S = find(abs(d5g(:,mp))==M(5)); + D(5) = d5g(S(1),mp); + basi = 5; + end + if d6(1,mp) < 999999 + hold on + d6g(:,mp) = d6(:,mp)-d6(1,mp); + MX(6) = max(d6g(:,mp)); + MN(6) = min(d6g(:,mp)); + plot(Date,d6g(:,mp)); + M(6) = max(abs(d6g(:,mp))); + S = find(abs(d6g(:,mp))==M(6)); + D(6) = d6g(S(1),mp); + basi = 6; + end + title(['Deformations - Node ' NodeNum]); + ylabel('Deformations [mm]'); + xlabel('Date [dd/mm/yyyy]'); + set(gca,'YColor','k'); + str(1,1) = cellstr('Base 1'); + if basi > 1 + str(2,1) = cellstr('Rod 2'); + end + if basi > 2 + str(3,1) = cellstr('Rod 3'); + end + if basi > 3 + str(4,1) = cellstr('Rod 4'); + end + if basi > 4 + str(5,1) = cellstr('Rod 5'); + end + if basi > 5 + str(6,1) = cellstr('Rod 6'); + end + VAR(1) = max(MX); + VAR(2) = min(MN); + MAX = max(abs(VAR)); + IN = find(abs(VAR)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + + legend(str,'Location','northwest'); + xlim([Date(1)-1 Date(end)+1]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-MPBEL', NodeNum, '_ENG.png')); + saveas(MPB,TempName); + ChartMPBEL_ENG = Image(TempName); + ChartMPBEL_ENG.Style = {Height('7.3cm'),HAlign('center')}; + ChartMPBEL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Deformations '... + 'measured by the multipoint extensometer ' NodeNum... + ' during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartMPBEL_ENG_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + end + + MAX = max(M); + IN = find(MAX==M); % Base che ha misurato tale variazione + Massimo = D(IN); % Valore massimo (positivo o negativo) di deformazione misurata + + % Cerco eventuali correlazioni con Rad Array + NomeFile = strcat('Report',siteID,'-RLvsMPBEL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + Nodo = 999; + iNodo = 1; + while AAA <= rF % Cerco la coppia di sensori Rad - Multibase da correlare + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono multibase o non ci sono Rad + AAA = 2; + else + check2 = Filetesto(AAA+1,1); + if check1 == str2num(DTcatena(end-2:end)) % Il Multibase è da prendere in considerazione ed è riportato nella prima riga del file + Nodo(iNodo) = Filetesto(AAA+2,1); + iNodo = iNodo+1; + elseif check2 == str2num(DTcatena(end-2:end)) % Il Multibase è da prendere in considerazione ed è riportato nella seconda riga del file + Nodo(iNodo) = Filetesto(AAA+3,1); + iNodo = iNodo+1; + end + AAA = AAA+4; + end + end + [~,cd] = size(d1g); + if IN == 1 + if Nodo(mp) <= cd + GI_MPB_RL(:,mp) = d1g(:,Nodo(mp)); + end + GI_MPB(:,mp) = d1g(:,mp); + elseif IN == 2 + if Nodo(mp) <= cd + GI_MPB_RL(:,mp) = d2g(:,Nodo(mp)); + end + GI_MPB(:,mp) = d2g(:,mp); + elseif IN == 3 + if Nodo(mp) <= cd + GI_MPB_RL(:,mp) = d3g(:,Nodo(mp)); + end + GI_MPB(:,mp) = d3g(:,mp); + elseif IN == 4 + if Nodo(mp) <= cd + GI_MPB_RL(:,mp) = d4g(:,Nodo(mp)); + end + GI_MPB(:,mp) = d4g(:,mp); + elseif IN == 5 + if Nodo(mp) <= cd + GI_MPB_RL(:,mp) = d5g(:,Nodo(mp)); + end + GI_MPB(:,mp) = d5g(:,mp); + elseif IN == 2 + if Nodo(mp) <= cd + GI_MPB_RL(:,mp) = d6g(:,Nodo(mp)); + end + GI_MPB(:,mp) = d6g(:,mp); + else + + end + GI_Base(:,mp) = IN; + GI_Date(:,mp) = Date; + + testo = Paragraph(['Nei grafici seguenti sono rappresentati i dati relativi '... + 'alle deformazioni registrate dagli estensimetri multibase collegati all''Analog Array.']); + testo2 = Paragraph(['Durante il periodo temporale di riferimento, il nodo numero ' NodeNum... + ' ' char(232) ' stato caratterizzato da un valore massimo di deformazione differenziale pari a '... + num2str(round(Massimo,2), '%0.2f') ' mm, rilevato dalla base numero ' num2str(IN) '. ']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if mp == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,ChartMPBEL); + add(DT,ChartMPBEL_cap); + if mp == rMPBEL(m,1) + add(DT,br); + end + close(figure(5)); + + %--ENG-- + + if activeEN == 1 + testo = Paragraph(['The following graphs present deformations data '... + 'recorded by multipoint borehole extensometers integrated in the Analog Array.']); + testo2 = Paragraph(['During the reference time period, node' NodeNum... + ' measured a maximum differential deformation value of '... + num2str(round(Massimo,2), '%0.2f') ' mm, referred to Rod ' num2str(IN) '. ']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if mp == 1 + add(DT_ENG,testo); + end + add(DT_ENG,testo2); + add(DT_ENG,ChartMPBEL_ENG); + add(DT,ChartMPBEL_ENG_cap); + if mp == rMPBEL(m,1) + add(DT_ENG,br); + end + close(figure(15)); + end + %pulisco variabili da riutilizzare per catena successiva + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + end + end + end + end +end + +text = 'report_MPBEL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_MPBEL_ENG.m b/ATD/report_MPBEL_ENG.m new file mode 100755 index 0000000..302cfde --- /dev/null +++ b/ATD/report_MPBEL_ENG.m @@ -0,0 +1,393 @@ +function [GI_MPB_RL,GI_MPB,GI_Base,GI_Date,FIG,battANALOG,ATTIVA] = report_MPBEL_ENG(DTcatena,... + rMPBEL,m,NodoMultiPointExtensometerLink,toolrif,unitrif,contunit,datarif,... + Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,FIG,br,status,conn,FileName) + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +GI_Date = []; +GI_MPB = []; +GI_Base = []; +GI_MPB_RL = []; +if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('GMUX not installed or inactive.'); + add(DT,testo); + end +elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoring completed. Please log into the web-based platoform '... + 'to access the complete dataset.']); + add(DT,testo); + end +else + MPBE = Section(); + sezMPBELExtensometer = Heading3('MultiPoint Borehole Extensometer'); + sezMPBELExtensometer.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + MPBE.Title = sezMPBELExtensometer; + 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(['The following chart reports the battery level trend recorded during the reference time period. '... + 'The correct functioning of the GMUX module is guaranteed for a minimum level of 12 V. The last '... + 'available data is equal to ' num2str(Batteria(end,1)) ' V.']); + testoB2 = Paragraph(['The GMUX module equips also a thermometer that allows the monitoring of the working '... + 'temperature and the identification of eventual malfunctioning. The following chart reports temperature '... + 'data recorded by the GMUX module.']); + testoB1.HAlign = 'justify'; + testoB2.HAlign = 'justify'; + + % grafico batteria + figure(19) + plot(Date,Batteria); + hold on + title('Battery level and GMUX temperature'); + xlabel('Date [dd/mm/yyyy]'); + ylabel('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')}; + if Batteria(end,1) >= 13 + TempName = char(strcat('B_13.jpg')); + elseif Batteria(end,1) >= 12 + TempName = char(strcat('B_12.jpg')); + elseif Batteria(end,1) >= 11 + 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) ' - Battery level and GMUX temperature recorded '... + 'during the reference time period']); + FIG = FIG+1; + lot_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + FIG = FIG+1; + Chart_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + Batt = Section(); + sezBATT = Heading3('GMUX - Battery level and temperature'); + 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)); + battANALOG = 1; + end + end + add(DT,sezMPBELExtensometer); + for mp = 1:rMPBEL(m,1) + NodeNum = num2str(NodoMultiPointExtensometerLink(mp,m)); + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z 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 + if isnan(cell2mat(Dati(:,3))) == 0 + d1(:,mp) = cell2mat(Dati(:,3)); % deformazioni base 1 + else + d1(:,mp) = 999999; + end + if isnan(cell2mat(Dati(:,4))) == 0 + d2(:,mp) = cell2mat(Dati(:,4)); % deformazioni base 2 + else + d2(:,mp) = 999999; + end + if isnan(cell2mat(Dati(:,5))) == 0 + d3(:,mp) = cell2mat(Dati(:,5)); % deformazioni base 3 + else + d3(:,mp) = 999999; + end + if isnan(cell2mat(Dati(:,6))) == 0 + d4(:,mp) = cell2mat(Dati(:,6)); % deformazioni base 4 + else + d4(:,mp) = 999999; + end + if isnan(cell2mat(Dati(:,7))) == 0 + d5(:,mp) = cell2mat(Dati(:,7)); % deformazioni base 5 + else + d5(:,mp) = 999999; + end + if isnan(cell2mat(Dati(:,8))) == 0 + d6(:,mp) = cell2mat(Dati(:,8)); % deformazioni base 6 + else + d6(:,mp) = 999999; + end + + % grafico deformazioni NELL'ULTIMO MESE + figure(5); + title(['Deformation measured by node ' NodeNum]); + d1g(:,mp) = d1(:,mp)-d1(1,mp); + MX(1) = max(d1g(:,mp)); + MN(1) = min(d1g(:,mp)); + MPB = plot(Date,d1g(:,mp)); + M = max(abs(d1g(:,mp))); + S = find(abs(d1g(:,mp))==M(1)); + D = d1g(S(1),mp); + basi = 1; + if d2(1,mp) < 999999 + hold on + d2g(:,mp) = d2(:,mp)-d2(1,mp); + MX(2) = max(d2g(:,mp)); + MN(2) = min(d2g(:,mp)); + MPB = plot(Date,d2g(:,mp)); + M(2) = max(abs(d2g(:,mp))); + S = find(abs(d2g(:,mp))==M(2)); + D(2) = d2g(S(1),mp); + basi = 2; + end + if d3(1,mp) < 999999 + hold on + d3g(:,mp) = d3(:,mp)-d3(1,mp); + MX(3) = max(d3g(:,mp)); + MN(3) = min(d3g(:,mp)); + MPB = plot(Date,d3g(:,mp)); + M(3) = max(abs(d3g(:,mp))); + S = find(abs(d3g(:,mp))==M(3)); + D(3) = d3g(S(1),mp); + basi = 3; + end + if d4(1,mp) < 999999 + hold on + d4g(:,mp) = d4(:,mp)-d4(1,mp); + MX(4) = max(d4g(:,mp)); + MN(4) = min(d4g(:,mp)); + MPB = plot(Date,d4g(:,mp)); + M(4) = max(abs(d4g(:,mp))); + S = find(abs(d4g(:,mp))==M(4)); + D(4) = d4g(S(1),mp); + basi = 4; + end + if d5(1,mp) < 999999 + hold on + d5g(:,mp) = d5(:,mp)-d5(1,mp); + MX(5) = max(d5g(:,mp)); + MN(5) = min(d5g(:,mp)); + MPB = plot(Date,d5g(:,mp)); + M(5) = max(abs(d5g(:,mp))); + S = find(abs(d5g(:,mp))==M(5)); + D(5) = d5g(S(1),mp); + basi = 5; + end + if d6(1,mp) < 999999 + hold on + d6g(:,mp) = d6(:,mp)-d6(1,mp); + MX(6) = max(d6g(:,mp)); + MN(6) = min(d6g(:,mp)); + plot(Date,d6g(:,mp)); + M(6) = max(abs(d6g(:,mp))); + S = find(abs(d6g(:,mp))==M(6)); + D(6) = d6g(S(1),mp); + basi = 6; + end + title(['Deformations - node ' NodeNum]); + ylabel('Deformation [mm]'); + xlabel('Date [dd/mm/yyyy]'); + set(gca,'YColor','k'); + str(1,1) = cellstr('Rod 1'); + if basi > 1 + str(2,1) = cellstr('Rod 2'); + end + if basi > 2 + str(3,1) = cellstr('Rod 3'); + end + if basi > 3 + str(4,1) = cellstr('Rod 4'); + end + if basi > 4 + str(5,1) = cellstr('Rod 5'); + end + if basi > 5 + str(6,1) = cellstr('Rod 6'); + end + VAR(1) = max(MX); + VAR(2) = min(MN); + MAX = max(abs(VAR)); + IN = find(abs(VAR)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + + legend(str,'Location','northwest'); + xlim([Date(1)-1 Date(end)+1]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-MPBEL', NodeNum, '_ENG.png')); + saveas(MPB,TempName); + ChartMPBEL = Image(TempName); + ChartMPBEL.Style = {Height('7.3cm'),HAlign('center')}; + ChartMPBEL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Deformations '... + 'measured by the MultiPoint Borehole Extensometer ' NodeNum... + ', during the reference time period']); + FIG = FIG+1; + ChartMPBEL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + MAX = max(M); + IN = find(MAX==M); % Base che ha misurato tale variazione + Massimo = D(IN); % Valore massimo (positivo o negativo) di deformazione misurata + + % Cerco eventuali correlazioni con Rad Array + NomeFile = strcat('Report',siteID,'-RLvsMPBEL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + Nodo = 999; + iNodo = 1; + while AAA <= rF % Cerco la coppia di sensori Rad - Multibase da correlare + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono multibase o non ci sono Rad + AAA = 2; + else + check2 = Filetesto(AAA+1,1); + if check1 == str2num(DTcatena(end-2:end)) % Il Multibase è da prendere in considerazione ed è riportato nella prima riga del file + Nodo(iNodo) = Filetesto(AAA+2,1); + iNodo = iNodo+1; + elseif check2 == str2num(DTcatena(end-2:end)) % Il Multibase è da prendere in considerazione ed è riportato nella seconda riga del file + Nodo(iNodo) = Filetesto(AAA+3,1); + iNodo = iNodo+1; + end + AAA = AAA+4; + end + end + [~,cd] = size(d1g); + if IN == 1 + if Nodo(mp) <= cd + GI_MPB_RL(:,mp) = d1g(:,Nodo(mp)); + end + GI_MPB(:,mp) = d1g(:,mp); + elseif IN == 2 + if Nodo(mp) <= cd + GI_MPB_RL(:,mp) = d2g(:,Nodo(mp)); + end + GI_MPB(:,mp) = d2g(:,mp); + elseif IN == 3 + if Nodo(mp) <= cd + GI_MPB_RL(:,mp) = d3g(:,Nodo(mp)); + end + GI_MPB(:,mp) = d3g(:,mp); + elseif IN == 4 + if Nodo(mp) <= cd + GI_MPB_RL(:,mp) = d4g(:,Nodo(mp)); + end + GI_MPB(:,mp) = d4g(:,mp); + elseif IN == 5 + if Nodo(mp) <= cd + GI_MPB_RL(:,mp) = d5g(:,Nodo(mp)); + end + GI_MPB(:,mp) = d5g(:,mp); + elseif IN == 2 + if Nodo(mp) <= cd + GI_MPB_RL(:,mp) = d6g(:,Nodo(mp)); + end + GI_MPB(:,mp) = d6g(:,mp); + else + + end + GI_Base(:,mp) = IN; + GI_Date(:,mp) = Date; + + testo = Paragraph(['The following graph reports deformation data recorded by MultiPoint Borehole '... + 'Extensometers connected to the Analog Array. ']); + testo2 = Paragraph(['During the reference time period, node ' NodeNum... + ' measured a maximum differential deformation value of '... + num2str(round(Massimo,2), '%0.2f') ' mm, referred to Rod ' num2str(IN) '. ']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if mp == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,ChartMPBEL); + add(DT,ChartMPBEL_cap); + if mp == rMPBEL(m,1) + add(DT,br); + end + close(figure(5)); + %pulisco variabili da riutilizzare per catena successiva + else + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('No data available for the reference time period.'); + add(DT,testo); + add(DT,br); + end + end + end +end + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_MPBEL_ENG function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_PCL.m b/ATD/report_PCL.m new file mode 100755 index 0000000..a2825d7 --- /dev/null +++ b/ATD/report_PCL.m @@ -0,0 +1,1038 @@ +function [GI_PCL_Z,GI_PCL_Date,ATTIVA,FIG,FIG_ENG] = report_PCL(DTcatena,rPCL,m,NodoPreConvLink,... + toolrif,unitrif,datarif,firstdata_num,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,... + colonna2,colonna2bis,status,ATTIVA,activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_PCL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +check = 0; +while check == 0 + if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('Catena non ancora installata o inattiva.'); + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array not installed or inactive.'); + add(DT_ENG,testo); + end + end + check = 1; + elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoraggio completato. Invitiamo a visitare la '... + 'piattaforma web per la visione dei dati storici.']); + add(DT,testo); + if activeEN == 1 + testo = Paragraph(['Monitoring completed. Please log into the web-based platoform '... + 'to access the complete dataset.']); + add(DT_ENG,testo); + end + end + check = 1; + else + NODATAPCL(m,1) = 0; + date = datestr(datenum(colonna2{m+1,1},'dd-mm-yyyy'),'yyyy-mm-dd'); % data riferimento definita sul sito + % posizione di progetto dei nodi + comando = ['select EventDate, EventTime, Y, Z from ElabDataView where EventDate = ''' ... + date ''' and ToolNameID = ''' char(toolrif) ''' and UnitName = ''' char(unitrif) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + SezioneYZ = curs.Data; + Datasez = SezioneYZ(1,1); + Orasez = SezioneYZ(1,2); + [ry,~] = size(SezioneYZ); + scrivi = 1; + % ho scaricato tutti i dati del giorno di installazione, prendo + % i primi in ordine temporale per ciascun nodo + for cc = 1:ry + if strcmp(SezioneYZ(cc,1),Datasez)==1 && strcmp(SezioneYZ(cc,2),Orasez) ==1 + CoordY(scrivi,1) = SezioneYZ(cc,3); + CoordZ(scrivi,1) = SezioneYZ(cc,4); + scrivi = scrivi+1; + end + end + + comando = ['select id from units where name like ''' char(unitrif) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + unitID = curs.Data; + + % Data di fine PreConvergenza + comando = ['select prod_date_node from tools where unit_ID like ''' ... + num2str(cell2mat(unitID)) ''' and name like ''' DTcatena ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + dati = curs.Data; + stringa = cell2mat(dati(1,1)); + if strcmp(stringa,'null') || strcmp(stringa,'No Data') + data_PC = 0; + else + data_PC = stringa(1,1:10); + end + if data_PC ~= 0 + % Scarico dati di Fine PreConvergenza + Num = zeros(rPCL(m,1),1); + for p = 1:rPCL(m,1) + NodeNum = num2str(NodoPreConvLink(p,m)); + comando = ['select EventDate, EventTime, ZShift, Z, Y from ElabDataView where EventDate < ''' ... + data_PC ''' and ToolNameID = ''' char(toolrif) ''' and UnitName = ''' char(unitrif) ... + ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Dati_PC = curs.Data; + + Num(p,1) = NodoPreConvLink(p,m); + + [rD,rC] = size(Dati_PC); + if rC ~= 1 + T = [cell2mat(Dati_PC(:,1)) repmat(' ', [rD,1]) cell2mat(Dati_PC(:,2))]; + Date = datenum(T); % Data + + % Fine Pre-Convergenza + asseZ_PC(:,p) = 1000*cell2mat(Dati_PC(:,3)); + asseZ_Cum_PC(:,p) = 1000*cell2mat(Dati_PC(:,4)); + diffZ_PC(:,p) = asseZ_PC(:,p)-asseZ_PC(1,p); % mm + Z_Loc_PC(1,p) = asseZ_PC(end,p)-asseZ_PC(1,p); + Z_Cum_PC(1,p) = asseZ_Cum_PC(end,p)-asseZ_Cum_PC(1,p); + Y_PC(1,p) = cell2mat(Dati_PC(end,5)); + end + end + end + + % Scarico dati odierni + Num = zeros(rPCL(m,1),1); + for p = 1:rPCL(m,1) + NodeNum = num2str(NodoPreConvLink(p,m)); + comando = ['select EventDate, EventTime, ZShift, Z, Y 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; + Num(p,1) = NodoPreConvLink(p,m); + + [rD,rC] = size(Dati); + if rC ~= 1 + T = [cell2mat(Dati(:,1)) repmat(' ', [rD,1]) cell2mat(Dati(:,2))]; + Date = datenum(T); % Data + if p == 1 % Il primo lo scrivo e creo la variabile di controllo + else + [rS,~] = size(asseZ); + if rD ~= rS + NODATA(m,1) = 1; + check = 0; + break + else + check = 1; + end + end + + % Ultimo mese + asseZ(:,p) = 1000*cell2mat(Dati(:,3)); + asseZ_Cum(:,p) = 1000*cell2mat(Dati(:,4)); + diffZ(:,p) = asseZ(:,p)-asseZ(1,p); % mm + Z_Loc(1,p) = asseZ(end,p)-asseZ(1,p); + Z_Cum(1,p) = asseZ_Cum(end,p)-asseZ_Cum(1,p); + Z_Loc_Tot(1,p) = asseZ(end,p); + Z_Cum_Tot(1,p) = asseZ_Cum(end,p); + Y(1,p) = cell2mat(Dati(end,5)); + + else + NODATAPCL(m,1) = 1; + check = 1; + end + end + + if NODATAPCL(m,1) == 0 + if strcmp(colonna2bis(m+1,1),colonna2(m+1,1)) == 0 % data zero diversa data riferimento + datarifNEW = datestr(firstdata_num{m+1,1},'yyyy-mm-dd'); % data riferimento definita sul sito + for nw = 1:rPCL(m,1) + NodeNum = num2str(NodoPreConvLink(nw,m)); + comando = ['select EventDate, EventTime, ZShift, Z, Y from ElabDataView where EventDate >= ''' ... + datarifNEW ''' and ToolNameID = ''' char(toolrif) ''' and UnitName = ''' char(unitrif) ... + ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DatiNEW = curs.Data; + Num(nw,1) = NodoPreConvLink(nw,m); + + [~,rC] = size(DatiNEW); + if rC ~= 1 + % dalla data di riferimento + % divergenza/convergenza dei singoli nodi dall'inizio + Z_Loc_Tot(1,nw) = asseZ(end,nw)-1000*cell2mat(DatiNEW(1,3)); + Z_Cum_Tot(1,nw) = asseZ_Cum(end,nw)-1000*cell2mat(DatiNEW(1,4)); + if data_PC ~= 0 + % Solo periodo di PreConvergenza + Z_Loc_PC(1,nw) = asseZ_PC(end,nw)-1000*cell2mat(DatiNEW(1,3)); + Z_Cum_PC(1,nw) = asseZ_Cum_PC(end,nw)-1000*cell2mat(DatiNEW(1,4)); + end + else + NODATAPCL(m,1) = 1; + end + end + end + GI_PCL_Date = Date; + % Cerco eventuali correlazioni con Cir Array + NomeFile = strcat('Report',siteID,'-PCLvsTuL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + Var = 0; + while AAA < rF % A un PreConv possono competere più Cir + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono PreConv Array o non ci sono Cir + AAA = 2; + else + check2 = Filetesto(AAA+1,1); + if check1 == str2num(DTcatena(end-2:end)) % Il PreConv è da prendere in considerazione ed è riportato nella prima riga del file + Nodo = Filetesto(AAA+2,1); + Var = 1; + elseif check2 == str2num(DTcatena(end-2:end)) % Il PreConv è da prendere in considerazione ed è riportato nella seconda riga del file + Nodo = Filetesto(AAA+3,1); + Var = 1; + end + AAA = AAA+4; + end + end + if Var == 1 + GI_PCL_Z = diffZ(:,Nodo); + else + GI_PCL_Z = []; + end + + % --- grafico spostamenti locali - Periodi di PreConvergenza --- + figure(1) + Y = round(Y); + if data_PC ~= 0 + Disp_Loc_PC = bar(Y_PC,Z_Loc_PC'); + Z = Z_Loc_PC; + else + Disp_Loc_PC = bar(Y,Z_Loc'); + Z = Z_Loc; + end + title('Spostamenti locali - Periodo di Pre-Convergenza'); + ylabel('Spostamento [mm]'); + xlabel('Progressiva [m]'); + maxY = max(Y); + if maxY > 0 + xticks(0:1:maxY) + else + xticks(Y(end):1:0); + end + h = gca; + h.YAxis.MinorTick = 'on'; + grid on + if maxY < 0 % mm + xlim([Y_PC(end)-1 0]); + else + xlim([0 maxY+1]) + end + grid on + iniY = min(min(Z',Z_Loc')); + endY = max(max(Z',Z_Loc')); + MAX = max(abs(iniY),endY); + if MAX > 2.5 % Limiti Asse Y + ylim([-MAX-1 MAX+1]) + else + ylim([-2.5 +2.5]); + end + TempName1 = char(strcat('Report',siteID,'-', char(toolrif),'Z_Loc_PC_PCL.png')); + saveas(Disp_Loc_PC(1),TempName1); + close(figure(1)) + + % ENG + figure(1) + if data_PC ~= 0 + Disp_Loc_PC = bar(Y_PC,Z_Loc_PC'); + else + Disp_Loc_PC = bar(Y,Z_Loc'); + end + title('Local displacements - Pre-Convergence phase'); + ylabel('Displacement [mm]'); + xlabel('Position [m]'); + if maxY > 0 + xticks(0:1:maxY) + else + xticks(Y(end):1:0); + end + h = gca; + h.YAxis.MinorTick = 'on'; + grid on + if maxY < 0 % mm + xlim([Y_PC(end)-1 0]); + else + xlim([0 maxY+1]) + end + grid on + if MAX > 2.5 % Limiti Asse Y + ylim([-MAX-1 MAX+1]) + else + ylim([-2.5 +2.5]); + end + TempName1_ENG = char(strcat('Report',siteID,'-', char(toolrif),'Z_Loc_PC_PCL_ENG.png')); + saveas(Disp_Loc_PC(1),TempName1_ENG); + close(figure(1)) + + % --- grafico spostamenti locali - Periodi di riferimento --- + figure(2) + Y = round(Y); + Disp_Loc_PCL = bar(Y,Z_Loc'); + title('Spostamenti locali - Periodo di riferimento'); + ylabel('Spostamento [mm]'); + xlabel('Progressiva [m]'); + maxY = max(Y); + minY = min(Y); + MAXY = max(abs(minY),maxY); + IY = find(max(abs(minY),maxY) == MAXY); + maxY = Y(IY); + if maxY > 0 + xticks(0:1:maxY) + else + xticks(Y(end):1:0); + end + h = gca; + h.YAxis.MinorTick = 'on'; + grid on + if MAX > 2.5 % Limiti Asse Y + ylim([-MAX-1 MAX+1]) + else + ylim([-2.5 +2.5]); + end + grid on + if iniY < 2.5 && endY > 2.5 % Limiti Asse Y + elseif iniY < 2.5 + ylim([iniY-1 2.5]); + elseif endY < 2.5 + ylim([-2.5 endY+1]); + end + TempName2 = char(strcat('Report',siteID,'-', char(toolrif),'Z_Loc_PCL.png')); + saveas(Disp_Loc_PCL(1),TempName2); + close(figure(2)) + + ChartPCL = Image(TempName1); + ChartPCL2 = Image(TempName2); + lot1 = Table({ChartPCL, ChartPCL2}); + lot1.Style = {ResizeToFitContents(false), Width('100%')}; + ChartPCL.Style = {Height('6.6cm'),HAlign('center')}; + ChartPCL2.Style = {Height('6.6cm'),HAlign('center')}; + ChartPCL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Spostamenti '... + 'differenziali locali in direzione verticale registrati durante '... + 'il periodo di pre-convergenza e il periodo di riferimento']); + ChartPCL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + FIG = FIG+1; + + if activeEN == 1 + figure(2) + Y = round(Y); + Disp_Loc_PCL = bar(Y,Z_Loc'); + title('Local displacements - Reference time period'); + ylabel('Displacement [mm]'); + xlabel('Position [m]'); + maxY = Y(IY); + if maxY > 0 + xticks(0:1:maxY) + else + xticks(Y(end):1:0); + end + h = gca; + h.YAxis.MinorTick = 'on'; + grid on + if MAX > 2.5 % Limiti Asse Y + ylim([-MAX-1 MAX+1]) + else + ylim([-2.5 +2.5]); + end + grid on + if iniY < 2.5 && endY > 2.5 % Limiti Asse Y + elseif iniY < 2.5 + ylim([iniY-1 2.5]); + elseif endY < 2.5 + ylim([-2.5 endY+1]); + end + TempName2_ENG = char(strcat('Report',siteID,'-', char(toolrif),'Z_Loc_PCL_ENG.png')); + saveas(Disp_Loc_PCL(1),TempName2_ENG); + close(figure(2)) + + ChartPCL_ENG = Image(TempName1_ENG); + ChartPCL2_ENG = Image(TempName2_ENG); + lot1_ENG = Table({ChartPCL_ENG, ChartPCL2_ENG}); + lot1_ENG.Style = {ResizeToFitContents(false), Width('100%')}; + ChartPCL_ENG.Style = {Height('6.6cm'),HAlign('center')}; + ChartPCL2_ENG.Style = {Height('6.6cm'),HAlign('center')}; + ChartPCL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Local differential displacements '... + 'recorded in vertical direction during the pre-convergence phase and the '... + 'reference time period']); + ChartPCL_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + FIG_ENG = FIG_ENG+1; + end + + % ---Grafico Sezione Periodo PreConvergenza--- + figure(3) + contaS = 1; + contaG = 1; + contaF = 1; + for disp = 1:rPCL(m,1) + if diffZ_PC(end,disp)>0.5 + nodisuZ(contaS,1)=CoordZ(disp,1); + nodisuY(contaS,1)=CoordY(disp,1); + contaS = contaS + 1; + elseif diffZ_PC(end,disp)< -0.5 + nodigiuZ(contaG,1)=CoordZ(disp,1); + nodigiuY(contaG,1)=CoordY(disp,1); + contaG = contaG + 1; + else + nodistabZ(contaF,1)=CoordZ(disp,1); + nodistabY(contaF,1)=CoordY(disp,1); + contaF = contaF + 1; + end + end + %aggiungo coordinate ancora + if cell2mat(CoordY(1,1)) > cell2mat(CoordY(end,1)) + plot([cell2mat(CoordY(:,1)); 0],[cell2mat(CoordZ(:,1)); 0],'-','Color','black','MarkerSize' ,7); + else + plot([0; cell2mat(CoordY(:,1))],[0; cell2mat(CoordZ(:,1))],'-','Color','black','MarkerSize' ,7) + end + hold on + if contaS > 1 + sezS = plot(cell2mat(nodisuY(:,1)),cell2mat(nodisuZ(:,1)),'^','Color','red','MarkerSize' ,7); + set(sezS, 'markerfacecolor', get(sezS, 'color')); + end + if contaG > 1 + sezG = plot(cell2mat(nodigiuY(:,1)),cell2mat(nodigiuZ(:,1)),'v','Color',[0.4660 0.6740 0.1880],'MarkerSize' ,7); + set(sezG, 'markerfacecolor', get(sezG, 'color')); + end + if contaF > 1 + sezN = plot(cell2mat(nodistabY(:,1)),cell2mat(nodistabZ(:,1)),'o','Color','black'); + set(sezN, 'markerfacecolor', get(sezN, 'color')); + end + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + if contaS > 1 && contaG > 1 && contaF > 1 + legend('Geometria dello strumento','Innalzamento','Abbassamento','Nodi stabili','Ancora','Location','southoutside'); + elseif contaS > 1 && contaG > 1 && contaF == 1 + legend('Geometria dello strumento','Innalzamento','Abbassamento','Ancora','Location','southoutside'); + elseif contaS > 1 && contaG == 1 && contaF > 1 + legend('Geometria dello strumento','Innalzamento','Nodi stabili','Ancora','Location','southoutside'); + elseif contaS == 1 && contaG > 1 && contaF > 1 + legend('Geometria dello strumento','Abbassamento','Nodi stabili','Ancora','Location','southoutside'); + elseif contaS > 1 && contaG == 1 && contaF == 1 + legend('Geometria dello strumento','Innalzamento','Ancora','Location','southoutside'); + elseif contaS == 1 && contaG > 1 && contaF == 1 + legend('Geometria dello strumento','Abbassamento','Nodi stabili','Ancora','Location','southoutside'); + elseif contaS == 1 && contaG == 1 && contaF > 1 + legend('Geometria dello strumento','Nodi stabili','Ancora','Location','southoutside'); + end + title('Direzione degli spostamenti - periodo di pre-convergenza'); + xlabel('Progressiva [m]'); + ylabel('Direzione verticale'); + set(gca,'YTickLabel',[]); + set(gca,'YTick',[]); + ini = min([0; cell2mat(CoordY)]); + End = max([0; cell2mat(CoordY)]); + h = gca; + if ini >= -15 || End <= 15 + if ini == 0 + xticks(ini:1:End+1); + xlim([ini,End+1]); + elseif End == 0 + xticks(ini-1:1:End); + xlim([ini-1,End]); + end + else + h.XAxis.MinorTick = 'on'; + end + grid off + axes('pos',[0.1 0.8 .3 .1]) + imshow('direzionescavo.png') + hold off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezPCL.png')); + saveas(ancora,TempName); + ChartSEZPC1 = Image(TempName); + ChartSEZPC1.Style = {Height('6.6cm')}; + close(figure(3)) + + % ENG + if activeEN == 1 + % ---Grafico Sezione Periodo PreConvergenza--- + figure(3) + %aggiungo coordinate ancora + if cell2mat(CoordY(1,1)) > cell2mat(CoordY(end,1)) + plot([cell2mat(CoordY(:,1)); 0],[cell2mat(CoordZ(:,1)); 0],'-','Color','black','MarkerSize' ,7); + else + plot([0; cell2mat(CoordY(:,1))],[0; cell2mat(CoordZ(:,1))],'-','Color','black','MarkerSize' ,7) + end + hold on + if contaS > 1 + sezS = plot(cell2mat(nodisuY(:,1)),cell2mat(nodisuZ(:,1)),'^','Color','red','MarkerSize' ,7); + set(sezS, 'markerfacecolor', get(sezS, 'color')); + end + if contaG > 1 + sezG = plot(cell2mat(nodigiuY(:,1)),cell2mat(nodigiuZ(:,1)),'v','Color',[0.4660 0.6740 0.1880],'MarkerSize' ,7); + set(sezG, 'markerfacecolor', get(sezG, 'color')); + end + if contaF > 1 + sezN = plot(cell2mat(nodistabY(:,1)),cell2mat(nodistabZ(:,1)),'o','Color','black'); + set(sezN, 'markerfacecolor', get(sezN, 'color')); + end + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + if contaS > 1 && contaG > 1 && contaF > 1 + legend('Array geometry','Upwards','Downwards','Stable node','Anchor','Location','southoutside'); + elseif contaS > 1 && contaG > 1 && contaF == 1 + legend('Array geometry','Upwards','Downwards','Anchor','Location','southoutside'); + elseif contaS > 1 && contaG == 1 && contaF > 1 + legend('Array geometry','Upwards','Stable node','Anchor','Location','southoutside'); + elseif contaS == 1 && contaG > 1 && contaF > 1 + legend('Array geometry','Downwards','Stable node','Anchor','Location','southoutside'); + elseif contaS > 1 && contaG == 1 && contaF == 1 + legend('Array geometry','Upwards','Anchor','Location','southoutside'); + elseif contaS == 1 && contaG > 1 && contaF == 1 + legend('Array geometry','Downwards','Stable node','Anchor','Location','southoutside'); + elseif contaS == 1 && contaG == 1 && contaF > 1 + legend('Array geometry','Stable node','Anchor','Location','southoutside'); + end + title('Displacement direction - Pre-convergence phase'); + xlabel('Position [m]'); + ylabel('Vertical direction'); + set(gca,'YTickLabel',[]); + set(gca,'YTick',[]); + h = gca; + if ini >= -15 || End <= 15 + if ini == 0 + xticks(ini:1:End+1); + xlim([ini,End+1]); + elseif End == 0 + xticks(ini-1:1:End); + xlim([ini-1,End]); + end + else + h.XAxis.MinorTick = 'on'; + end + grid off + axes('pos',[0.1 0.8 .3 .1]) + imshow('direzionescavoENG.png') + hold off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezPCL_ENG.png')); + saveas(ancora,TempName); + ChartSEZPC1_ENG = Image(TempName); + ChartSEZPC1_ENG.Style = {Height('6.6cm')}; + close(figure(3)) + end + + % ---Grafico Sezione Ultimo Mese--- + figure(4) + clear nodisuZ + clear nodisuY + clear nodigiuZ + clear nodigiuY + clear nodistabZ + clear nodistabY + contaS_2 = 1; + contaG_2 = 1; + contaF_2 = 1; + for disp = 1:rPCL(m,1) + if diffZ(end,disp) > 0.5 % mm + nodisuZ(contaS_2,1) = CoordZ(disp,1); % il +1 salta l'ancora introdotta dopo l'esecuzione della funzione gemella + nodisuY(contaS_2,1) = CoordY(disp,1); + contaS_2 = contaS_2 + 1; + elseif diffZ(end,disp) < -0.5 + nodigiuZ(contaG_2,1) = CoordZ(disp,1); + nodigiuY(contaG_2,1) = CoordY(disp,1); + contaG_2 = contaG_2 + 1; + else + nodistabZ(contaF_2,1) = CoordZ(disp,1); + nodistabY(contaF_2,1) = CoordY(disp,1); + contaF_2 = contaF_2 + 1; + end + end + if cell2mat(CoordY(1,1)) > cell2mat(CoordY(end,1)) + plot([cell2mat(CoordY(:,1)); 0],[cell2mat(CoordZ(:,1)); 0],'-','Color','black','MarkerSize' ,7); + else + plot([0; cell2mat(CoordY(:,1))],[0; cell2mat(CoordZ(:,1))],'-','Color','black','MarkerSize' ,7) + end + hold on + if contaS_2 > 1 + sezS = plot(cell2mat(nodisuY(:,1)),cell2mat(nodisuZ(:,1)),'^','Color','red','MarkerSize' ,7); + set(sezS, 'markerfacecolor', get(sezS, 'color')); + end + if contaG_2 > 1 + sezG = plot(cell2mat(nodigiuY(:,1)),cell2mat(nodigiuZ(:,1)),'v','Color',[0.4660 0.6740 0.1880],'MarkerSize' ,7); + set(sezG, 'markerfacecolor', get(sezG, 'color')); + end + if contaF_2 > 1 + sezN = plot(cell2mat(nodistabY(:,1)),cell2mat(nodistabZ(:,1)),'o','Color','black'); + set(sezN, 'markerfacecolor', get(sezN, 'color')); + end + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + if contaS_2 > 1 && contaG_2 > 1 && contaF_2 > 1 + legend('Geometria dello strumento','Innalzamento','Abbassamento','Nodi stabili','Ancora','Location','southoutside'); + elseif contaS_2 > 1 && contaG_2 > 1 && contaF_2 == 1 + legend('Geometria dello strumento','Innalzamento','Abbassamento','Ancora','Location','southoutside'); + elseif contaS_2 > 1 && contaG_2 == 1 && contaF_2 > 1 + legend('Geometria dello strumento','Innalzamento','Nodi stabili','Ancora','Location','southoutside'); + elseif contaS_2 == 1 && contaG_2 > 1 && contaF_2 > 1 + legend('Geometria dello strumento','Abbassamento','Nodi stabili','Ancora','Location','southoutside'); + elseif contaS_2 > 1 && contaG_2 == 1 && contaF_2 == 1 + legend('Geometria dello strumento','Innalzamento','Ancora','Location','southoutside'); + elseif contaS_2 == 1 && contaG_2 > 1 && contaF_2 == 1 + legend('Geometria dello strumento','Abbassamentoi','Nodi stabili','Ancora','Location','southoutside'); + elseif contaS_2 == 1 && contaG_2 == 1 && contaF_2 > 1 + legend('Geometria dello strumento','Nodi stabili','Ancora','Location','southoutside'); + end + title('Direzione degli spostamenti - periodo di riferimento'); + xlabel('Progressiva [m]'); + ylabel('Direzione verticale'); + set(gca,'YTickLabel',[]); + set(gca,'YTick',[]); + ini = min([0; cell2mat(CoordY)]); + End = max([0; cell2mat(CoordY)]); + h = gca; + if ini >= -15 || End <= 15 + if ini == 0 + xticks(ini:1:End+1); + xlim([ini,End+1]); + elseif End == 0 + xticks(ini-1:1:End); + xlim([ini-1,End]); + end + else + h.XAxis.MinorTick = 'on'; + end + grid off + axes('pos',[0.1 0.8 .3 .1]) + imshow('direzionescavo.png') + hold off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezPCL2.png')); + saveas(ancora,TempName); + + ChartSEZPC2 = Image(TempName); + ChartSEZPC2.Style = {Height('6.6cm')}; + ChartSEZPC2_cap = Paragraph(['Fig. ' num2str(FIG) ' - Direzione degli spostamenti verticali '... + 'registrati durante il periodo di pre-convergenza e l''intervallo temporale di riferimento']); + FIG = FIG+1; + ChartSEZPC2_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + lot2 = Table({ChartSEZPC1, ChartSEZPC2}); + lot2.Style = {ResizeToFitContents(false), Width('100%')}; + close(figure(4)) + + if activeEN == 1 + % ---Grafico Sezione Ultimo Mese--- + figure(4) + if cell2mat(CoordY(1,1)) > cell2mat(CoordY(end,1)) + plot([cell2mat(CoordY(:,1)); 0],[cell2mat(CoordZ(:,1)); 0],'-','Color','black','MarkerSize' ,7); + else + plot([0; cell2mat(CoordY(:,1))],[0; cell2mat(CoordZ(:,1))],'-','Color','black','MarkerSize' ,7) + end + hold on + if contaS_2 > 1 + sezS = plot(cell2mat(nodisuY(:,1)),cell2mat(nodisuZ(:,1)),'^','Color','red','MarkerSize' ,7); + set(sezS, 'markerfacecolor', get(sezS, 'color')); + end + if contaG_2 > 1 + sezG = plot(cell2mat(nodigiuY(:,1)),cell2mat(nodigiuZ(:,1)),'v','Color',[0.4660 0.6740 0.1880],'MarkerSize' ,7); + set(sezG, 'markerfacecolor', get(sezG, 'color')); + end + if contaF_2 > 1 + sezN = plot(cell2mat(nodistabY(:,1)),cell2mat(nodistabZ(:,1)),'o','Color','black'); + set(sezN, 'markerfacecolor', get(sezN, 'color')); + end + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + if contaS_2 > 1 && contaG_2 > 1 && contaF_2 > 1 + legend('Array geometry','Upwards','Downwards','Stable node','Anchor','Location','southoutside'); + elseif contaS_2 > 1 && contaG_2 > 1 && contaF_2 == 1 + legend('Array geometry','Upwards','Downwards','Anchor','Location','southoutside'); + elseif contaS_2 > 1 && contaG_2 == 1 && contaF_2 > 1 + legend('Array geometry','Upwards','Stable node','Anchor','Location','southoutside'); + elseif contaS_2 == 1 && contaG_2 > 1 && contaF_2 > 1 + legend('Array geometry','Downwards','Stable node','Anchor','Location','southoutside'); + elseif contaS_2 > 1 && contaG_2 == 1 && contaF_2 == 1 + legend('Array geometry','Upwards','Anchor','Location','southoutside'); + elseif contaS_2 == 1 && contaG_2 > 1 && contaF_2 == 1 + legend('Array geometry','Downwards','Stable node','Anchor','Location','southoutside'); + elseif contaS_2 == 1 && contaG_2 == 1 && contaF_2 > 1 + legend('Array geometry','Stable node','Anchor','Location','southoutside'); + end + title('Displacement direction - Reference time period'); + xlabel('Position [m]'); + ylabel('Vertical direction'); + set(gca,'YTickLabel',[]); + set(gca,'YTick',[]); + h = gca; + if ini >= -15 || End <= 15 + if ini == 0 + xticks(ini:1:End+1); + xlim([ini,End+1]); + elseif End == 0 + xticks(ini-1:1:End); + xlim([ini-1,End]); + end + else + h.XAxis.MinorTick = 'on'; + end + grid off + axes('pos',[0.1 0.8 .3 .1]) + imshow('direzionescavoENG.png') + hold off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezPCL2_ENG.png')); + saveas(ancora,TempName); + + ChartSEZPC2_ENG = Image(TempName); + ChartSEZPC2_ENG.Style = {Height('6.6cm')}; + ChartSEZPC2_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Vertical displacements direction '... + 'observed during the pre-convergence phase and the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartSEZPC2_ENG_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + lot2_ENG = Table({ChartSEZPC1_ENG, ChartSEZPC2_ENG}); + lot2_ENG.Style = {ResizeToFitContents(false), Width('100%')}; + close(figure(4)) + end + + % --- grafico spostamenti cumulati - periodo di preconvergenza --- + figure(5) + if maxY < 0 + plot([0 Y],[0 Z_Cum_PC],'-','LineWidth',1,'Marker','.',... + 'MarkerSize',15,'MarkerEdgeColor',[0.6350 0.0780 0.1840],'MarkerFaceColor',[0.6350 0.0780 0.1840]); + else + plot([Y 0],[Z_Cum_PC 0],'-','LineWidth',1,'Marker','.',... + 'MarkerSize',15,'MarkerEdgeColor',[0.6350 0.0780 0.1840],'MarkerFaceColor',[0.6350 0.0780 0.1840]); + end + hold on + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + title('Spostamenti cumulati - Periodo di pre-convergenza'); + ylabel('Spostamento [mm]'); + xlabel('Progressiva [m]'); + h = gca; + h.YAxis.MinorTick = 'on'; + grid on + + if maxY > 0 % mm + xlim([0 maxY+1]); + else + xlim([Y(end)-1 0]) + end + grid on + + iniY = min(min(Z_Cum_PC',Z_Cum')); + endY = max(max(Z_Cum_PC',Z_Cum')); + MAX = max(abs(iniY),endY); + if MAX > 2.5 % Limiti Asse Y + ylim([-MAX-1 MAX+1]) + else + ylim([-2.5 +2.5]); + end + + if ini >= -15 || End <= 15 + xticks(ini:1:End); + else + h.XAxis.MinorTick = 'on'; + end + TempName3 = char(strcat('Report',siteID,'-', char(toolrif),'Z_Cum_PC.png')); + saveas(ancora(1),TempName3); + close(figure(5)) + + % ENG + % --- grafico spostamenti cumulati - periodo di preconvergenza --- + if activeEN == 1 + figure(5) + if maxY < 0 + plot([0 Y],[0 Z_Cum_PC],'-','LineWidth',1,'Marker','.',... + 'MarkerSize',15,'MarkerEdgeColor',[0.6350 0.0780 0.1840],'MarkerFaceColor',[0.6350 0.0780 0.1840]); + else + plot([Y 0],[Z_Cum_PC 0],'-','LineWidth',1,'Marker','.',... + 'MarkerSize',15,'MarkerEdgeColor',[0.6350 0.0780 0.1840],'MarkerFaceColor',[0.6350 0.0780 0.1840]); + end + hold on + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + title('Cumulative displacements - Pre-convergence phase'); + ylabel('Displacement [mm]'); + xlabel('Position [m]'); + h = gca; + h.YAxis.MinorTick = 'on'; + grid on + + if MAX > 2.5 % Limiti Asse Y + ylim([-MAX-1 MAX+1]) + else + ylim([-2.5 +2.5]); + end + + if ini >= -15 || End <= 15 + xticks(ini:1:End); + else + h.XAxis.MinorTick = 'on'; + end + TempName3_ENG = char(strcat('Report',siteID,'-', char(toolrif),'Z_Cum_PC_ENG.png')); + saveas(ancora(1),TempName3_ENG); + close(figure(5)) + end + + % --- grafico spostamenti cumulati - Periodo di riferimento --- + figure(6) + if maxY < 0 + plot([0 Y],[0 Z_Cum],'-','LineWidth',1,'Marker','.',... + 'MarkerSize',15,'MarkerEdgeColor','b','MarkerFaceColor',[0.5,0.5,0.5]); + else + plot([Y 0],[Z_Cum 0],'-','LineWidth',1,'Marker','.',... + 'MarkerSize',15,'MarkerEdgeColor','b','MarkerFaceColor',[0.5,0.5,0.5]); + end + hold on + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + title('Spostamenti cumulati - periodo di riferimento'); + ylabel('Spostamento [mm]'); + xlabel('Progressiva [m]'); + h = gca; + h.YAxis.MinorTick = 'on'; + grid on + + if MAX > 2.5 % Limiti Asse Y + ylim([-MAX-1 MAX+1]) + else + ylim([-2.5 +2.5]); + end + if ini >= -15 || End <= 15 + xticks(ini:1:End); + else + h.XAxis.MinorTick = 'on'; + end + TempName4 = char(strcat('Report',siteID,'-', char(toolrif),'Z_Cum_PCL.png')); + saveas(ancora(1),TempName4); + close(figure(6)) + + ChartPCL3 = Image(TempName3); + ChartPCL4 = Image(TempName4); + lot3 = Table({ChartPCL3, ChartPCL4}); + lot3.Style = {ResizeToFitContents(false), Width('100%')}; + ChartPCL3.Style = {Height('6.6cm'),HAlign('center')}; + ChartPCL4.Style = {Height('6.6cm'),HAlign('center')}; + ChartPCL3_cap = Paragraph(['Fig. ' num2str(FIG) ' - Spostamenti '... + 'differenziali cumulati in direzione verticale registrati durante '... + 'il periodo di pre-convergenza e il periodo di riferimento']); + ChartPCL3_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + FIG = FIG+1; + + % ENG + if activeEN == 1 + % --- grafico spostamenti cumulati - Periodo di riferimento --- + figure(6) + if maxY < 0 + plot([0 Y],[0 Z_Cum],'-','LineWidth',1,'Marker','.',... + 'MarkerSize',15,'MarkerEdgeColor','b','MarkerFaceColor',[0.5,0.5,0.5]); + else + plot([Y 0],[Z_Cum 0],'-','LineWidth',1,'Marker','.',... + 'MarkerSize',15,'MarkerEdgeColor','b','MarkerFaceColor',[0.5,0.5,0.5]); + end + hold on + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + title('Cumulative displacements - Reference time period'); + ylabel('Displacement [mm]'); + xlabel('Position [m]'); + h = gca; + h.YAxis.MinorTick = 'on'; + grid on + + if MAX > 2.5 % Limiti Asse Y + ylim([-MAX-1 MAX+1]) + else + ylim([-2.5 +2.5]); + end + if ini >= -15 || End <= 15 + xticks(ini:1:End); + else + h.XAxis.MinorTick = 'on'; + end + TempName4_ENG = char(strcat('Report',siteID,'-', char(toolrif),'Z_Cum_PCL_ENG.png')); + saveas(ancora(1),TempName4_ENG); + close(figure(6)) + + ChartPCL3_ENG = Image(TempName3_ENG); + ChartPCL4_ENG = Image(TempName4_ENG); + lot3_ENG = Table({ChartPCL3_ENG, ChartPCL4_ENG}); + lot3_ENG.Style = {ResizeToFitContents(false), Width('100%')}; + ChartPCL3_ENG.Style = {Height('6.6cm'),HAlign('center')}; + ChartPCL4_ENG.Style = {Height('6.6cm'),HAlign('center')}; + ChartPCL3_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Cumulative differential displacements '... + 'recorded in vertical direction during the pre-convergence phase and '... + 'the reference time period']); + ChartPCL3_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + FIG_ENG = FIG_ENG+1; + end + + % testi + sezPCL = Heading3('PreConv Link'); + sezPCL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + PCL = Section(); + PCL.Title = sezPCL; + testo1 = Paragraph(['I grafici riportati di seguito mostrano l''entit' char(224) ' e il verso degli spostamenti '... + 'locali e cumulati in direzione verticale, misurati dal sensore MEMS 3D nel periodo di pre-convergenza '... + '(ovvero considerando l''intervallo temporale fra la data di riferimento indicata in Tab. 1 '... + 'e il ' datestr(datenum(data_PC),'dd-mm-yyyy') ') e di riferimento. In particolare, valori negativi '... + 'indicano un abbassamento del nodo, mentre spostamenti '... + 'positivi caratterizzano un movimento verso l''alto del sensore in oggetto durante '... + 'l''intervallo di tempo considerato.']); + % Locale ultimo mese + progZ = max(abs(Z_Loc)); + prY = find(abs(Z_Loc)==progZ); + progY = Y(prY(1)); + % Locale da sempre + progZ_Tot = max(abs(Z_Loc_Tot)); + prY_Tot = find(abs(Z_Loc_Tot)==progZ_Tot); + progY_Tot = Y(prY_Tot(1)); + % locale periodo pre-convergenza + progZ_PC = max(abs(Z_Loc_PC)); + prY_PC = find(abs(Z_Loc_PC)==progZ_PC); + progY_PC = Y(prY_PC(1)); + testo2 = Paragraph(['Il massimo valore di spostamento differenziale locale registrato durante il periodo temporale '... + 'di riferimento ' char(232) ' pari a ' num2str(max(abs(round(Z_Loc,1)))) ' mm, rilevato dal nodo '... + 'alla progressiva di ' num2str(progY) ' m. La stessa analisi, condotta relativamente al periodo di pre-convergenza '... + 'e all''intera durata del monitoraggio, evidenzia movimenti differenziali locali pari a ' num2str(max(abs(round(Z_Loc_PC,1)))) ... + ' e ' num2str(max(abs(round(Z_Loc_Tot,1)))) ' mm, registrati rispettivamente dai nodi alla progressiva di ' num2str(progY_PC) ... + ' e ' num2str(progY_Tot) ' m.']); + parte1 = ['La figura associata riassume la direzione di movimento verticale dei singoli nodi '... + 'posizionati secondo la geometria dello strumento. Si noti che, in questa rappresentazione '... + 'vengono considerati stabili i sensori caratterizzati da uno spostamento '... + 'inferiore a 0.5 mm. Nel periodo di pre-convergenza, '... + 'l''analisi ha evidenziato ' num2str(contaS-1) ' ']; + if contaS-1 == 1 + parte2 = 'nodo caratterizzato '; + else + parte2 = 'nodi caratterizzati '; + end + parte3 = ['da movimenti verso l''alto, ' num2str(contaG-1) ' verso il basso e ' num2str(contaF-1) ]; + if contaF-1 == 1 + parte4 = ' nodo stabile. '; + else + parte4 = ' nodi stabili. '; + end + parte5 = ['Le corrispondenti informazioni relative all''intervallo di '... + 'riferimento forniscono ' num2str(contaS_2-1) ]; + if contaS_2-1 == 1 + parte6 = ' sensore che si sposta '; + else + parte6 = ' sensori che si spostano '; + end + parte7 = ['verso l''alto, ' num2str(contaG_2-1) ' verso il basso e ' num2str(contaF_2-1) ]; + if contaF_2-1 == 1 + parte8 = ' stabile.'; + else + parte8 = ' stabili.'; + end + testo3 = Paragraph([parte1 parte2 parte3 parte4 parte5 parte6 parte7 parte8]); + spazio = Paragraph(''); + testo1.HAlign = 'justify'; + testo2.HAlign = 'justify'; + testo3.HAlign = 'justify'; + add(DT,sezPCL); + add(DT,testo1); + add(DT,spazio); + add(DT,testo2); + add(DT,lot1); + add(DT,ChartPCL_cap); + add(DT,testo3); + add(DT,lot2); + add(DT,ChartSEZPC2_cap); + add(DT,lot3); + add(DT,ChartPCL3_cap); + add(DT,br); + + % ENG + if activeEN == 1 + % testi + sezPCL_ENG = Heading3('PreConv Link'); + sezPCL_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + PCL_ENG = Section(); + PCL_ENG.Title = sezPCL_ENG; + testo1 = Paragraph(['Following graphs display the magnitude and direction '... + 'of local and cumulative displacements '... + 'measured along the vertical direction by the 3D MEMS sensor during the pre-convergence phase '... + '(referring to the time interval between the reference date reported in Tab. 1 '... + 'and the following date: ' datestr(datenum(data_PC),'dd-mm-yyyy') ') and the reference time period. '... + 'In particular, negative values correspond to downwards movements of the node, '... + 'while positive ones represent an upward displacement.']); + testo2 = Paragraph(['The maximum local differential displacement value recorded during the reference time period is '... + num2str(max(abs(round(Z_Loc,1)))) ' mm, measured by the node '... + 'located at ' num2str(progY) ' m from the fixed point. The same analysis performed on the pre-convergence phase '... + 'and on the complete monitoring period highlights local differential displacement values of ' num2str(max(abs(round(Z_Loc_PC,1)))) ... + ' and ' num2str(max(abs(round(Z_Loc_Tot,1)))) ' mm, recorded by nodes located respectively at ' num2str(progY_PC) ... + ' m and ' num2str(progY_Tot) ' m from the fixed point.']); + parte1 = ['The corresponding figure summarizes the vertical displacement direction of each single node, according '... + 'to their position along the Array. In this specific representation, sensors featuring displacement values less than 0.5 mm '... + 'are assumed as stable. During the pre-convergence phase, the analysis evidenced ' num2str(contaS-1) ' ']; + if contaS-1 == 1 + parte2 = 'node featuring '; + else + parte2 = 'nodes featuring '; + end + parte3 = ['upward movement, ' num2str(contaG-1) ' in downward direction, and ' num2str(contaF-1) ]; + if contaF-1 == 1 + parte4 = ' stable sensor. '; + else + parte4 = ' stable sensors. '; + end + parte5 = ['By taking into account the reference time period, the '... + 'results show ' num2str(contaS_2-1) ]; + if contaS_2-1 == 1 + parte6 = ' sensor moving '; + else + parte6 = ' sensors moving '; + end + parte7 = ['upwards, ' num2str(contaG_2-1) ' in downward direction, and ' num2str(contaF_2-1) ]; + if contaF_2-1 == 1 + parte8 = ' stable node.'; + else + parte8 = ' stable nodes.'; + end + testo3 = Paragraph([parte1 parte2 parte3 parte4 parte5 parte6 parte7 parte8]); + spazio = Paragraph(''); + testo1.HAlign = 'justify'; + testo2.HAlign = 'justify'; + testo3.HAlign = 'justify'; + add(DT_ENG,sezPCL_ENG); + add(DT_ENG,testo1); + add(DT_ENG,spazio); + add(DT_ENG,testo2); + add(DT_ENG,lot1_ENG); + add(DT_ENG,ChartPCL_ENG_cap); + add(DT_ENG,testo3); + add(DT_ENG,lot2_ENG); + add(DT_ENG,ChartSEZPC2_ENG_cap); + add(DT_ENG,lot3_ENG); + add(DT_ENG,ChartPCL3_ENG_cap); + add(DT_ENG,br); + end + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + check = 1; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + end + end + end + end +end + +text = 'report_PCL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_PCL_ENG.m b/ATD/report_PCL_ENG.m new file mode 100755 index 0000000..fb93782 --- /dev/null +++ b/ATD/report_PCL_ENG.m @@ -0,0 +1,642 @@ +function [GI_PCL_Z,GI_PCL_Date,ATTIVA,FIG] = report_PCL_ENG(DTcatena,rPCL,m,NodoPreConvLink,... + toolrif,unitrif,datarif,firstdata_num,Font_caption,Font_tools,siteID,DT,FIG,br,... + colonna2,colonna2bis,status,ATTIVA,conn,FileName) + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +check = 0; +while check == 0 + if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('Array not installed or inactive.'); + add(DT,testo); + end + check = 1; + elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoring completed. Please log into the web-based platoform '... + 'to access the complete dataset.']); + add(DT,testo); + end + check = 1; + else + NODATAPCL(m,1) = 0; + date = datestr(datenum(colonna2{m+1,1},'dd-mm-yyyy'),'yyyy-mm-dd'); % data riferimento definita sul sito + % posizione di progetto dei nodi + comando = ['select EventDate, EventTime, Y, Z from ElabDataView where EventDate = ''' ... + date ''' and ToolNameID = ''' char(toolrif) ''' and UnitName = ''' char(unitrif) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + SezioneYZ = curs.Data; + Datasez = SezioneYZ(1,1); + Orasez = SezioneYZ(1,2); + [ry,~] = size(SezioneYZ); + scrivi = 1; + % ho scaricato tutti i dati del giorno di installazione, prendo + % i primi in ordine temporale per ciascun nodo + for cc = 1:ry + if strcmp(SezioneYZ(cc,1),Datasez)==1 && strcmp(SezioneYZ(cc,2),Orasez) ==1 + CoordY(scrivi,1) = SezioneYZ(cc,3); + CoordZ(scrivi,1) = SezioneYZ(cc,4); + scrivi = scrivi+1; + end + end + + comando = ['select id from units where name like ''' char(unitrif) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + unitID = curs.Data; + + % Data di fine PreConvergenza + comando = ['select prod_date_node from tools where unit_ID like ''' ... + num2str(cell2mat(unitID)) ''' and name like ''' DTcatena ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + dati = curs.Data; + stringa = cell2mat(dati(1,1)); + if strcmp(stringa,'null') || strcmp(stringa,'No Data') + data_PC = 0; +% time_PC = 0; + else + data_PC = stringa(1,1:10); +% time_PC = stringa(1,11:21); + end + if data_PC ~= 0 + % Scarico dati di Fine PreConvergenza + Num = zeros(rPCL(m,1),1); + for p = 1:rPCL(m,1) + NodeNum = num2str(NodoPreConvLink(p,m)); + comando = ['select EventDate, EventTime, ZShift, Z, Y from ElabDataView where EventDate < ''' ... + data_PC ''' and ToolNameID = ''' char(toolrif) ''' and UnitName = ''' char(unitrif) ... + ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Dati_PC = curs.Data; + Num(p,1) = NodoPreConvLink(p,m); + + [rD,rC] = size(Dati_PC); + if rC ~= 1 + T = [cell2mat(Dati_PC(:,1)) repmat(' ', [rD,1]) cell2mat(Dati_PC(:,2))]; + Date = datenum(T); % Data + + % Fine Pre-Convergenza + asseZ_PC(:,p) = 1000*cell2mat(Dati_PC(:,3)); + asseZ_Cum_PC(:,p) = 1000*cell2mat(Dati_PC(:,4)); + diffZ_PC(:,p) = asseZ_PC(:,p)-asseZ_PC(1,p); % mm + Z_Loc_PC(1,p) = asseZ_PC(end,p)-asseZ_PC(1,p); + Z_Cum_PC(1,p) = asseZ_Cum_PC(end,p)-asseZ_Cum_PC(1,p); + Y_PC(1,p) = cell2mat(Dati_PC(end,5)); + end + end + end + + % Scarico dati odierni + Num = zeros(rPCL(m,1),1); + for p = 1:rPCL(m,1) + NodeNum = num2str(NodoPreConvLink(p,m)); + comando = ['select EventDate, EventTime, ZShift, Z, Y 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; + Num(p,1) = NodoPreConvLink(p,m); + + [rD,rC] = size(Dati); + if rC ~= 1 + T = [cell2mat(Dati(:,1)) repmat(' ', [rD,1]) cell2mat(Dati(:,2))]; + Date = datenum(T); % Data + if p == 1 % Il primo lo scrivo e creo la variabile di controllo + else + [rS,~] = size(asseZ); + if rD ~= rS + NODATA(m,1) = 1; + check = 0; + break + else + check = 1; + end + end + + % Ultimo mese + asseZ(:,p) = 1000*cell2mat(Dati(:,3)); + asseZ_Cum(:,p) = 1000*cell2mat(Dati(:,4)); + diffZ(:,p) = asseZ(:,p)-asseZ(1,p); % mm + Z_Loc(1,p) = asseZ(end,p)-asseZ(1,p); + Z_Cum(1,p) = asseZ_Cum(end,p)-asseZ_Cum(1,p); + Z_Loc_Tot(1,p) = asseZ(end,p); + Z_Cum_Tot(1,p) = asseZ_Cum(end,p); + Y(1,p) = cell2mat(Dati(end,5)); + + else + NODATAPCL(m,1) = 1; + check = 1; + end + end + + if NODATAPCL(m,1) == 0 + if strcmp(colonna2bis(m+1,1),colonna2(m+1,1)) == 0 % data zero diversa data riferimento + datarifNEW = datestr(firstdata_num{m+1,1},'yyyy-mm-dd'); % data riferimento definita sul sito + for nw = 1:rPCL(m,1) + NodeNum = num2str(NodoPreConvLink(nw,m)); + comando = ['select EventDate, EventTime, ZShift, Z, Y from ElabDataView where EventDate >= ''' ... + datarifNEW ''' and ToolNameID = ''' char(toolrif) ''' and UnitName = ''' char(unitrif) ... + ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DatiNEW = curs.Data; + Num(nw,1) = NodoPreConvLink(nw,m); + + [~,rC] = size(DatiNEW); + if rC ~= 1 + % dalla data di riferimento + % divergenza/convergenza dei singoli nodi dall'inizio + Z_Loc_Tot(1,nw) = asseZ(end,nw)-1000*cell2mat(DatiNEW(1,3)); + Z_Cum_Tot(1,nw) = asseZ_Cum(end,nw)-1000*cell2mat(DatiNEW(1,4)); + if data_PC ~= 0 + % Solo periodo di PreConvergenza + Z_Loc_PC(1,nw) = asseZ_PC(end,nw)-1000*cell2mat(DatiNEW(1,3)); + Z_Cum_PC(1,nw) = asseZ_Cum_PC(end,nw)-1000*cell2mat(DatiNEW(1,4)); + end + else + NODATAPCL(m,1) = 1; + end + end + end + GI_PCL_Date = Date; + % Cerco eventuali correlazioni con Cir Array + NomeFile = strcat('Report',siteID,'-PCLvsTuL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + Var = 0; + while AAA < rF % A un PreConv possono competere più Cir + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono PreConv Array o non ci sono Cir + AAA = 2; + else + check2 = Filetesto(AAA+1,1); + if check1 == str2num(DTcatena(end-2:end)) % Il PreConv è da prendere in considerazione ed è riportato nella prima riga del file + Nodo = Filetesto(AAA+2,1); + Var = 1; + elseif check2 == str2num(DTcatena(end-2:end)) % Il PreConv è da prendere in considerazione ed è riportato nella seconda riga del file + Nodo = Filetesto(AAA+3,1); + Var = 1; + end + AAA = AAA+4; + end + end + if Var == 1 + GI_PCL_Z = diffZ(:,Nodo); + else + GI_PCL_Z = []; + end + + % --- grafico spostamenti locali - Periodi di PreConvergenza --- + figure(1) + Y = round(Y); + if data_PC ~= 0 + Disp_Loc_PC = bar(Y_PC,Z_Loc_PC'); + Z = Z_Loc_PC; + else + Disp_Loc_PC = bar(Y,Z_Loc'); + Z = Z_Loc; + end + title('Local displacements - Pre-Convergence phase'); + ylabel('Displacement [mm]'); + xlabel('Position [m]'); + maxY = max(Y); + if maxY > 0 + xticks(0:1:maxY) + else + xticks(Y(end):1:0); + end + h = gca; + h.YAxis.MinorTick = 'on'; + grid on + if maxY < 0 % mm + xlim([Y_PC(end)-1 0]); + else + xlim([0 maxY+1]) + end + grid on + iniY = min(min(Z',Z_Loc')); + endY = max(max(Z',Z_Loc')); + MAX = max(abs(iniY),endY); + if MAX > 2.5 % Limiti Asse Y + ylim([-MAX-1 MAX+1]) + else + ylim([-2.5 +2.5]); + end + TempName1 = char(strcat('Report',siteID,'-', char(toolrif),'Z_Loc_PC_PCL_ENG.png')); + saveas(Disp_Loc_PC(1),TempName1); + close(figure(1)) + + figure(2) + Y = round(Y); + Disp_Loc_PCL = bar(Y,Z_Loc'); + title('Local displacements - Reference time period'); + ylabel('Displacement [mm]'); + xlabel('Position [m]'); + maxY = max(Y); + minY = min(Y); + MAXY = max(abs(minY),maxY); + IY = find(max(abs(minY),maxY) == MAXY); + maxY = Y(IY); + if maxY > 0 + xticks(0:1:maxY) + else + xticks(Y(end):1:0); + end + h = gca; + h.YAxis.MinorTick = 'on'; + grid on + if MAX > 2.5 % Limiti Asse Y + ylim([-MAX-1 MAX+1]) + else + ylim([-2.5 +2.5]); + end + grid on + if iniY < 2.5 && endY > 2.5 % Limiti Asse Y + elseif iniY < 2.5 + ylim([iniY-1 2.5]); + elseif endY < 2.5 + ylim([-2.5 endY+1]); + end + TempName2 = char(strcat('Report',siteID,'-', char(toolrif),'Z_Loc_PCL_ENG.png')); + saveas(Disp_Loc_PCL(1),TempName2); + close(figure(2)) + + ChartPCL = Image(TempName1); + ChartPCL2 = Image(TempName2); + lot1 = Table({ChartPCL, ChartPCL2}); + lot1.Style = {ResizeToFitContents(false), Width('100%')}; + ChartPCL.Style = {Height('6.6cm'),HAlign('center')}; + ChartPCL2.Style = {Height('6.6cm'),HAlign('center')}; + ChartPCL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Local differential displacements '... + 'recorded in vertical direction during the pre-convergence phase and the '... + 'reference time period']); + ChartPCL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + FIG = FIG+1; + + % ---Grafico Sezione Periodo PreConvergenza--- + figure(3) + contaS = 1; + contaG = 1; + contaF = 1; + for disp = 1:rPCL(m,1) + if diffZ_PC(end,disp)>0.5 + nodisuZ(contaS,1)=CoordZ(disp,1); + nodisuY(contaS,1)=CoordY(disp,1); + contaS = contaS + 1; + elseif diffZ_PC(end,disp)< -0.5 + nodigiuZ(contaG,1)=CoordZ(disp,1); + nodigiuY(contaG,1)=CoordY(disp,1); + contaG = contaG + 1; + else + nodistabZ(contaF,1)=CoordZ(disp,1); + nodistabY(contaF,1)=CoordY(disp,1); + contaF = contaF + 1; + end + end + %aggiungo coordinate ancora + plot([0; cell2mat(CoordY(:,1))],[0; cell2mat(CoordZ(:,1))],'-','Color','black','MarkerSize' ,7); + hold on + if contaS > 1 + sezS = plot(cell2mat(nodisuY(:,1)),cell2mat(nodisuZ(:,1)),'^','Color','red','MarkerSize' ,7); + set(sezS, 'markerfacecolor', get(sezS, 'color')); + end + if contaG > 1 + sezG = plot(cell2mat(nodigiuY(:,1)),cell2mat(nodigiuZ(:,1)),'v','Color',[0.4660 0.6740 0.1880],'MarkerSize' ,7); + set(sezG, 'markerfacecolor', get(sezG, 'color')); + end + if contaF > 1 + sezN = plot(cell2mat(nodistabY(:,1)),cell2mat(nodistabZ(:,1)),'o','Color','black'); + set(sezN, 'markerfacecolor', get(sezN, 'color')); + end + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + if contaS > 1 && contaG > 1 && contaF > 1 + legend('Array geometry','Upwards','Downwards','Stable node','Anchor','Location','south'); + elseif contaS > 1 && contaG > 1 && contaF == 1 + legend('Array geometry','Upwards','Downwards','Anchor','Location','south'); + elseif contaS > 1 && contaG == 1 && contaF > 1 + legend('Array geometry','Upwards','Stable node','Anchor','Location','south'); + elseif contaS == 1 && contaG > 1 && contaF > 1 + legend('Array geometry','Downwards','Stable node','Anchor','Location','south'); + elseif contaS > 1 && contaG == 1 && contaF == 1 + legend('Array geometry','Upwards','Anchor','Location','south'); + elseif contaS == 1 && contaG > 1 && contaF == 1 + legend('Array geometry','Downwards','Stable node','Anchor','Location','south'); + elseif contaS == 1 && contaG == 1 && contaF > 1 + legend('Array geometry','Stable node','Anchor','Location','south'); + end + title('Displacement direction - Pre-convergence phase'); + xlabel('Position [m]'); + ylabel('Vertical direction'); + set(gca,'YTickLabel',[]); + set(gca,'YTick',[]); + ini = min([0; cell2mat(CoordY)]); + End = max([0; cell2mat(CoordY)]); + h = gca; + if ini >= -15 || End <= 15 + if ini == 0 + xticks(ini:1:End+1); + xlim([ini,End+1]); + elseif End == 0 + xticks(ini-1:1:End); + xlim([ini-1,End]); + end + else + h.XAxis.MinorTick = 'on'; + end + grid off + axes('pos',[0.1 0.8 .3 .1]) + imshow('direzionescavoENG.png') + hold off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezPCL_ENG.png')); + saveas(ancora,TempName); + ChartSEZPC1 = Image(TempName); + ChartSEZPC1.Style = {Height('6.6cm')}; + close(figure(3)) + + % ---Grafico Sezione Ultimo Mese--- + figure(4) + clear nodisuZ + clear nodisuY + clear nodigiuZ + clear nodigiuY + clear nodistabZ + clear nodistabY + contaS_2 = 1; + contaG_2 = 1; + contaF_2 = 1; + for disp = 1:rPCL(m,1) + if diffZ(end,disp) > 0.5 % mm + nodisuZ(contaS_2,1) = CoordZ(disp,1); % il +1 salta l'ancora introdotta dopo l'esecuzione della funzione gemella + nodisuY(contaS_2,1) = CoordY(disp,1); + contaS_2 = contaS_2 + 1; + elseif diffZ(end,disp) < -0.5 + nodigiuZ(contaG_2,1) = CoordZ(disp,1); + nodigiuY(contaG_2,1) = CoordY(disp,1); + contaG_2 = contaG_2 + 1; + else + nodistabZ(contaF_2,1) = CoordZ(disp,1); + nodistabY(contaF_2,1) = CoordY(disp,1); + contaF_2 = contaF_2 + 1; + end + end + plot([0; cell2mat(CoordY(:,1))],[0; cell2mat(CoordZ(:,1))],'-','Color','black','MarkerSize' ,7); + hold on + if contaS_2 > 1 + sezS = plot(cell2mat(nodisuY(:,1)),cell2mat(nodisuZ(:,1)),'^','Color','red','MarkerSize' ,7); + set(sezS, 'markerfacecolor', get(sezS, 'color')); + end + if contaG_2 > 1 + sezG = plot(cell2mat(nodigiuY(:,1)),cell2mat(nodigiuZ(:,1)),'v','Color',[0.4660 0.6740 0.1880],'MarkerSize' ,7); + set(sezG, 'markerfacecolor', get(sezG, 'color')); + end + if contaF_2 > 1 + sezN = plot(cell2mat(nodistabY(:,1)),cell2mat(nodistabZ(:,1)),'o','Color','black'); + set(sezN, 'markerfacecolor', get(sezN, 'color')); + end + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + if contaS_2 > 1 && contaG_2 > 1 && contaF_2 > 1 + legend('Array geometry','Upwards','Downwards','Stable node','Anchor','Location','south'); + elseif contaS_2 > 1 && contaG_2 > 1 && contaF_2 == 1 + legend('Array geometry','Upwards','Downwards','Anchor','Location','south'); + elseif contaS_2 > 1 && contaG_2 == 1 && contaF_2 > 1 + legend('Array geometry','Upwards','Stable node','Anchor','Location','south'); + elseif contaS_2 == 1 && contaG_2 > 1 && contaF_2 > 1 + legend('Array geometry','Downwards','Stable node','Anchor','Location','south'); + elseif contaS_2 > 1 && contaG_2 == 1 && contaF_2 == 1 + legend('Array geometry','Upwards','Anchor','Location','south'); + elseif contaS_2 == 1 && contaG_2 > 1 && contaF_2 == 1 + legend('Array geometry','Downwards','Stable node','Anchor','Location','south'); + elseif contaS_2 == 1 && contaG_2 == 1 && contaF_2 > 1 + legend('Array geometry','Stable node','Anchor','Location','south'); + end + title('Displacement direction - Reference time period'); + xlabel('Position [m]'); + ylabel('Vertical direction'); + set(gca,'YTickLabel',[]); + set(gca,'YTick',[]); + ini = min([0; cell2mat(CoordY)]); + End = max([0; cell2mat(CoordY)]); + h = gca; + if ini >= -15 || End <= 15 + if ini == 0 + xticks(ini:1:End+1); + xlim([ini,End+1]); + elseif End == 0 + xticks(ini-1:1:End); + xlim([ini-1,End]); + end + else + h.XAxis.MinorTick = 'on'; + end + grid off + axes('pos',[0.1 0.8 .3 .1]) + imshow('direzionescavoENG.png') + hold off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezPCL2_ENG.png')); + saveas(ancora,TempName); + + ChartSEZPC2 = Image(TempName); + ChartSEZPC2.Style = {Height('6.6cm')}; + ChartSEZPC2_cap = Paragraph(['Fig. ' num2str(FIG) ' - Vertical displacements direction '... + 'observed during the pre-convergence phase and the reference time period']); + FIG = FIG+1; + ChartSEZPC2_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + lot2 = Table({ChartSEZPC1, ChartSEZPC2}); + lot2.Style = {ResizeToFitContents(false), Width('100%')}; + close(figure(4)) + + % --- grafico spostamenti cumulati - periodo di preconvergenza --- + figure(5) + if maxY < 0 + plot([0 Y],[0 Z_Cum_PC],'-','LineWidth',1,'Marker','.',... + 'MarkerSize',15,'MarkerEdgeColor',[0.6350 0.0780 0.1840],'MarkerFaceColor',[0.6350 0.0780 0.1840]); + else + plot([Y 0],[Z_Cum_PC 0],'-','LineWidth',1,'Marker','.',... + 'MarkerSize',15,'MarkerEdgeColor',[0.6350 0.0780 0.1840],'MarkerFaceColor',[0.6350 0.0780 0.1840]); + end + hold on + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + title('Cumulative displacements - Pre-convergence phase'); + ylabel('Displacement [mm]'); + xlabel('Position [m]'); + h = gca; + h.YAxis.MinorTick = 'on'; + grid on + + if maxY > 0 % mm + xlim([0 maxY+1]); + else + xlim([Y(end)-1 0]) + end + grid on + + iniY = min(min(Z_Cum_PC',Z_Cum')); + endY = max(max(Z_Cum_PC',Z_Cum')); + MAX = max(abs(iniY),endY); + if MAX > 2.5 % Limiti Asse Y + ylim([-MAX-1 MAX+1]) + else + ylim([-2.5 +2.5]); + end + + if ini >= -15 || End <= 15 + xticks(ini:1:End); + else + h.XAxis.MinorTick = 'on'; + end + TempName3 = char(strcat('Report',siteID,'-', char(toolrif),'Z_Cum_PC_ENG.png')); + saveas(ancora(1),TempName3); + close(figure(5)) + + % --- grafico spostamenti cumulati - Periodo di riferimento --- + figure(6) + if maxY < 0 + plot([0 Y],[0 Z_Cum],'-','LineWidth',1,'Marker','.',... + 'MarkerSize',15,'MarkerEdgeColor','b','MarkerFaceColor',[0.5,0.5,0.5]); + else + plot([Y 0],[Z_Cum 0],'-','LineWidth',1,'Marker','.',... + 'MarkerSize',15,'MarkerEdgeColor','b','MarkerFaceColor',[0.5,0.5,0.5]); + end + hold on + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + title('Cumulative displacements - Reference time period'); + ylabel('Displacement [mm]'); + xlabel('Position [m]'); + h = gca; + h.YAxis.MinorTick = 'on'; + grid on + + if MAX > 2.5 % Limiti Asse Y + ylim([-MAX-1 MAX+1]) + else + ylim([-2.5 +2.5]); + end + if ini >= -15 || End <= 15 + xticks(ini:1:End); + else + h.XAxis.MinorTick = 'on'; + end + TempName4 = char(strcat('Report',siteID,'-', char(toolrif),'Z_Cum_PCL_ENG.png')); + saveas(ancora(1),TempName4); + close(figure(6)) + + ChartPCL3 = Image(TempName3); + ChartPCL4 = Image(TempName4); + lot3 = Table({ChartPCL3, ChartPCL4}); + lot3.Style = {ResizeToFitContents(false), Width('100%')}; + ChartPCL3.Style = {Height('6.6cm'),HAlign('center')}; + ChartPCL4.Style = {Height('6.6cm'),HAlign('center')}; + ChartPCL3_cap = Paragraph(['Fig. ' num2str(FIG) ' - Cumulative differential displacements '... + 'recorded in vertical direction during the pre-convergence phase and '... + 'the reference time period']); + ChartPCL3_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + FIG = FIG+1; + + % testi + sezPCL = Heading3('PreConv Link'); + sezPCL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + PCL = Section(); + PCL.Title = sezPCL; + testo1 = Paragraph(['Following graphs display the magnitude and direction '... + 'of local and cumulative displacements '... + 'measured along the vertical direction by the 3D MEMS sensor during the pre-convergence phase '... + '(referring to the time interval between the reference date reported in Tab. 1 '... + 'and the following date: ' datestr(datenum(data_PC),'dd-mm-yyyy') ') and the reference time period. '... + 'In particular, negative values correspond to downwards movements of the node, '... + 'while positive ones represent an upward displacement.']); + % Locale ultimo mese + progZ = max(abs(Z_Loc)); + prY = find(abs(Z_Loc)==progZ); + progY = Y(prY(1)); + % Locale da sempre + progZ_Tot = max(abs(Z_Loc_Tot)); + prY_Tot = find(abs(Z_Loc_Tot)==progZ_Tot); + progY_Tot = Y(prY_Tot(1)); + % locale periodo pre-convergenza + progZ_PC = max(abs(Z_Loc_PC)); + prY_PC = find(abs(Z_Loc_PC)==progZ_PC); + progY_PC = Y(prY_PC(1)); + testo2 = Paragraph(['The maximum local differential displacement value recorded during the reference time period is '... + num2str(max(abs(round(Z_Loc,1)))) ' mm, measured by the node '... + 'located at ' num2str(progY) ' m from the fixed point. The same analysis performed on the pre-convergence phase '... + 'and on the complete monitoring period highlights local differential displacement values of ' num2str(max(abs(round(Z_Loc_PC,1)))) ... + ' and ' num2str(max(abs(round(Z_Loc_Tot,1)))) ' mm, recorded by nodes located respectively at ' num2str(progY_PC) ... + ' m and ' num2str(progY_Tot) ' m from the fixed point.']); + parte1 = ['The corresponding figure summarizes the vertical displacement direction of each single node, according '... + 'to their position along the Array. In this specific representation, sensors featuring displacement values less than 0.5 mm '... + 'are assumed as stable. During the pre-convergence phase, the analysis evidenced ' num2str(contaS-1) ' ']; + if contaS-1 == 1 + parte2 = 'node featuring '; + else + parte2 = 'nodes featuring '; + end + parte3 = ['upward movement, ' num2str(contaG-1) ' in downward direction, and ' num2str(contaF-1) ]; + if contaF-1 == 1 + parte4 = ' stable sensor. '; + else + parte4 = ' stable sensors. '; + end + parte5 = ['By taking into account the reference time period, the '... + 'results show ' num2str(contaS_2-1) ]; + if contaS_2-1 == 1 + parte6 = ' sensor moving '; + else + parte6 = ' sensors moving '; + end + parte7 = ['upwards, ' num2str(contaG_2-1) ' in downward direction, and ' num2str(contaF_2-1) ]; + if contaF_2-1 == 1 + parte8 = ' stable node.'; + else + parte8 = ' stable nodes.'; + end + testo3 = Paragraph([parte1 parte2 parte3 parte4 parte5 parte6 parte7 parte8]); + spazio = Paragraph(''); + testo1.HAlign = 'justify'; + testo2.HAlign = 'justify'; + testo3.HAlign = 'justify'; + add(DT,sezPCL); + add(DT,testo1); + add(DT,spazio); + add(DT,testo2); + add(DT,lot1); + add(DT,ChartPCL_cap); + add(DT,testo3); + add(DT,lot2); + add(DT,ChartSEZPC2_cap); + add(DT,lot3); + add(DT,ChartPCL3_cap); + add(DT,br); + else + if ATTIVA == 1 + testo = Paragraph('No data available for the reference time period.'); + ATTIVA = 0; + check = 1; + add(DT,testo); + end + end + end +end + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_PCL_ENG function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_PE.m b/ATD/report_PE.m new file mode 100755 index 0000000..5b8acbe --- /dev/null +++ b/ATD/report_PE.m @@ -0,0 +1,440 @@ +function [battANALOG,ATTIVA,FIG,FIG_ENG] = report_PE(rPE,m,NodoPendulum,toolrif,unitrif,... + datarif,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,battANALOG,ATTIVA,... + activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_PE function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +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 + PEND = Section(); + sezPendulum = Heading3('Pendulum'); + sezPendulum.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PEND.Title = sezPendulum; + 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 + PEND_ENG = Section(); + sezPendulum_ENG = Heading3('Pendulum'); + sezPendulum_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PEND_ENG.Title = sezPendulum_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,sezPendulum); + if activeEN == 1 + add(DT_ENG,sezPendulum_ENG); + end + + for pe = 1:rPE(m,1) + NodeNum = num2str(NodoPendulum(pe,m)); + comando = ['select EventDate, EventTime, XShift, YShift 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 + PX = cell2mat(Dati(:,3)); % asseX + PY = cell2mat(Dati(:,4)); % asseY + + % grafico deformazioni NELL'ULTIMO MESE + figure(5); + plot(Date,PX); + hold on + def = plot(Date,PY); + title(['Deformazioni registrate dal pendolo numero ' NodeNum]); + xlabel('Data [gg/mm/aaaa]'); + ylabel('Deformazione [mm]'); +% controlX = abs(max(PX)-min(PX)); +% controlY = abs(max(PY)-min(PY)); +% controlXY = [controlX; controlY]; +% control = max(controlXY); +% if control < 0.5 % mm +% ylim([-0.5 0.5]); +% 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 + str(1,1) = cellstr('X'); + str(2,1) = cellstr('Y'); + MX(1) = max(PX(1:10)); + MX(2) = max(PY(1:10)); + MN(1) = min(PX(1:10)); + MN(2) = min(PY(1:10)); + VAR(1) = max(PX); + VAR(2) = min(PN); + MAX = max(abs(VAR)); + IN = find(abs(VAR)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-Pendulum', NodeNum, '.png')); + saveas(def,TempName); + ChartPend = Image(TempName); + ChartPend.Style = {Height('7.5cm'),HAlign('center')}; + ChartPend_cap = Paragraph(['Fig. ' num2str(FIG) ' - Andamento '... + 'delle deformazioni registrate '... + 'lungo i due assi strumentali del pendolo, nodo numero ' NodeNum ... + ', durante il periodo temporale di riferimento']); + FIG = FIG+1; + ChartPend_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['Nei grafici seguenti sono rappresentati i dati relativi '... + 'alla deformazione registrata lungo i due assi strumentali '... + 'dai pendoli che compongono l''Analog Array.']); + testo2 = Paragraph(['Durante il periodo temporale di riferimento, il nodo numero ' NodeNum ' ha '... + 'registrato i seguenti valori di deformazione: ']); + testoX = Paragraph(['- Asse X - Valore massimo: ' num2str(round(max(PX),2), '%0.2f') ... + ' mm, valore minimo: ' num2str(round(min(PX),2), '%0.2f') ' mm, variazione: ' ... + num2str(round(max(PX),2)-round(min(PX),2),'%0.2f') ' mm; ']); + testoY = Paragraph(['- Asse Y - Valore massimo: ' num2str(round(max(PY),2), '%0.2f') ... + ' mm, valore minimo: ' num2str(round(min(PY),2), '%0.2f') ' mm, variazione: ' ... + num2str(round(max(PY),2)-round(min(PY),2),'%0.2f') ' mm; ']); + spazio = Paragraph(''); + + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if pe == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,testoX); + add(DT,testoY); + add(DT,ChartPend); + add(DT,ChartPend_cap); + add(DT,spazio); + if pe == rPE(m,1) + add(DT,br); + end + close(figure(19)); + close(figure(5)); + + %---ENG--- + if activeEN == 1 + % grafico deformazioni NELL'ULTIMO MESE + figure(15); + plot(Date,sX); + hold on + plot(Date,sY); + defEN = plot(Date,sZ); + title(['Deformation - node ' NodeNum]); + xlabel('Date [dd/mm/yyyy]'); + ylabel('Deformation [mm]'); +% controlX = abs(max(sX)-min(sX)); +% controlY = abs(max(sY)-min(sY)); +% controlZ = abs(max(sZ)-min(sZ)); +% controlXY = [controlX; controlY; controlZ]; +% control = max(controlXY); +% if control < 0.5 % mm +% ylim([-0.5 0.5]); +% 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 + str(1,1) = cellstr('X'); + str(2,1) = cellstr('Y'); + MX(1) = max(PX(1:10)); + MX(2) = max(PY(1:10)); + MN(1) = min(PX(1:10)); + MN(2) = min(PY(1:10)); + VAR(1) = max(MX); + VAR(2) = min(MN); + MAX = max(abs(VAR)); + IN = find(abs(VAR)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-Pendulum', NodeNum, '_ENG.png')); + saveas(defEN,TempName); + ChartPend_ENG = Image(TempName); + ChartPend_ENG.Style = {Height('7.5cm'),HAlign('center')}; + ChartPend_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - deformations '... + ' measured along the two instrumental axes by node ' ... + NodeNum ' during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartPend_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graphs present deformation data '... + 'recorded along the two instrumental axes by the pendulum systems '... + 'integrated in the Analog Array.']); + testo2 = Paragraph(['During the reference time period, node ' NodeNum ... + ' recorded the following deformation values: ']); + testoX = Paragraph(['- X axis - maximum value: ' num2str(round(max(PX),2), '%0.2f') ... + ' mm, minimum value: ' num2str(round(min(PX),2), '%0.2f') ' mm, variation: ' ... + num2str(round(max(PX),2)-round(min(PX),2),'%0.2f') ' mm; ']); + testoY = Paragraph(['- Y axis - maximum value: ' num2str(round(max(PY),2), '%0.2f') ... + ' mm, minimum value: ' num2str(round(min(PY),2), '%0.2f') ' mm, variation: ' ... + num2str(round(max(PY),2)-round(min(PY),2),'%0.2f') ' mm; ']); + spazio = Paragraph(''); + + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if pe == 1 + add(DT_ENG,testo); + end + add(DT_ENG,testo2); + add(DT_ENG,testoX); + add(DT_ENG,testoY); + add(DT_ENG,ChartPend_ENG); + add(DT_ENG,ChartPend_ENG_cap); + add(DT_ENG,spazio); + if pe == rPE(m,1) + add(DT_ENG,br); + end + close(figure(15)); + end + else + if ATTIVA == 1 + ATTIVA = 0; + PEND = Section(); + sezPendulim = Heading3('Pendulum'); + sezPendulim.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PEND.Title = sezPendulim; + add(DT,sezPendulim); + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + add(DT,testo); + add(DT,br); + if activeEN == 1 + PEND_ENG = Section(); + sezPendulum_ENG = Heading3('Pendulum'); + sezPendulum_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PEND_ENG.Title = sezPendulum_ENG; + add(DT_ENG,sezPendulum_ENG); + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + add(DT_ENG,br); + end + end + end + end +end + +text = 'report_PE function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_PL.m b/ATD/report_PL.m new file mode 100755 index 0000000..e1dcd6e --- /dev/null +++ b/ATD/report_PL.m @@ -0,0 +1,370 @@ +function [GI_LivelloFaldaPL,GI_ProfPL,GI_DatePL,PL_A,PL_D,ATTIVA,FIG,FIG_ENG] = report_PL(... + rPL,rTL,rIPL,m,NodoPiezoLink,PL_A,PL_D,toolrif,unitrif,datarif,Font_caption,Font_tools,toolrifID,... + siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_PL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +GI_LivelloFaldaPL = []; +GI_ProfPL = []; +GI_DatePL = []; +titolo = 1; +check = 0; +NODATA(m,1) = 0; +while check == 0 + if status(m,1) == 1 + if ATTIVA == 1 + testo = Paragraph('Catena non ancora installata o inattiva.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array not installed or inactive.'); + add(DT_ENG,testo); + end + misuraPL = cell(1,3); + for p = 1:rPL(m,1) + NodeNum = num2str(NodoPiezoLink(p,m)); + comando = ['select num, depth, measurment from nodes where tool_id = ''' num2str(cell2mat(toolrifID))... + ''' and num = ''' NodeNum ''' and nodetype_id = 2 ']; + curs = exec(conn,comando); + curs = fetch(curs); + Leggo = curs.Data; + misuraPL(1,p) = Leggo(1,3); % unità di misura del piezometro + % pressione assoluta vs relativa + PL_A(p) = 0; + PL_D(p) = 0; + if strcmp(misuraPL(1,p),'VW kPa') == 1 || strcmp(misuraPL(1,p),'VW kg/cm2') == 1 + PL_A(p) = PL_A(p)+1; + else + PL_D(p) = PL_D(p)+1; + end + end + end + check = 1; + 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 + for p = 1:rPL(m,1) + NodeNum = num2str(NodoPiezoLink(p,m)); + comando = ['select num, depth, measurment from nodes where tool_id = ''' num2str(cell2mat(toolrifID))... + ''' and num = ''' NodeNum ''' and nodetype_id = 2 ']; + curs = exec(conn,comando); + curs = fetch(curs); + Leggo = curs.Data; + misuraPL(1,p) = Leggo(1,3); % unità di misura del piezometro + % pressione assoluta vs relativa + PL_A(p) = 0; + PL_D(p) = 0; + if strcmp(misuraPL(1,p),'VW kPa') == 1 || strcmp(misuraPL(1,p),'VW kg/cm2') == 1 + PL_A(p) = PL_A(p)+1; + else + PL_D(p) = PL_D(p)+1; + end + end + end + check = 1; + else + SE = Section(); + if activeEN == 1 + SE_ENG = Section(); + end + for p = 1:rPL(m,1) + NodeNum = num2str(NodoPiezoLink(p,m)); + comando = ['select EventDate, EventTime, water_level, pressure 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; + comando = ['select num, depth, measurment from nodes where tool_id = ''' num2str(cell2mat(toolrifID))... + ''' and num = ''' NodeNum ''' and nodetype_id = 2 ']; + curs = exec(conn,comando); + curs = fetch(curs); + Leggo = curs.Data; + % Modifico il formato di data e ora + [rD,rC] = size(Dati); + [~,PZc] = size(Leggo); + if rC ~= 1 && PZc > 1 + T = [cell2mat(Dati(:,1)) repmat(' ', [rD,1]) cell2mat(Dati(:,2))]; + Date = datenum(T); % Data + if p == 1 % Il primo lo scrivo e creo la variabile di controllo + check = 1; + else + [rS,~] = size(waterlevel); + if rD ~= rS + NODATA(m,1) = 2; + check = 0; + break + else + check = 1; + end + end + waterlevel(:,p) = cell2mat(Dati(:,3)); % altezza falda + pressure(:,p) = cell2mat(Dati(:,4)); % pressione + comando = ['select depth from nodes where tool_id = ''' num2str(cell2mat(toolrifID))... + ''' and num = ''' NodeNum ''' and nodetype_ID = 2 ']; + curs = exec(conn,comando); + curs = fetch(curs); + ProfPL(1,p) = curs.Data; % profondità piezometro + misuraPL(1,p) = Leggo(1,3); % unità di misura del piezometro + + % pressione assoluta vs relativa + tipopressione = 'assoluta '; + if activeEN == 1 + tipopressione = 'absolute '; + end + PL_A(p) = 0; + PL_D(p) = 0; + if strcmp(misuraPL(1,p),'VW kPa') == 1 || strcmp(misuraPL(1,p),'VW kg/cm2') == 1 + tipopressione = 'relativa '; + if activeEN == 1 + tipopressione = 'relative '; + end + PL_A(p) = PL_A(p)+1; + else + PL_D(p) = PL_D(p)+1; + end + + else + NODATA(m,1) = 1; + check = 1; + end + if NODATA(m,1) == 0 + % grafico livello falda e pressione interstiziale NELL'ULTIMO MESE + figure(3) + plot(Date,waterlevel(:,p),'LineWidth',1.5); + yyaxis left + ylabel(['Profondit' char(224) ' [m da p.c.]']); + var = max(abs(waterlevel(:,p)-waterlevel(1,p))); + media = mean(waterlevel(:,p)); + if var < 0.7 + ylim([media-0.5 media+0.5]); + end + title(['Livello idrico e pressione ' tipopressione ' - Sensore a ' num2str(cell2mat(ProfPL(1,p))) ' m da p.c.']); + xlabel('Data [gg/mm/aaaa]'); + hold on + yyaxis right + porepress = plot(Date,pressure(:,p),'--'); + ylabel(['Pressione ' tipopressione ' [Pa]']); + xlim([Date(1)-1 Date(end)+1]); + + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-Piezo',num2str(cell2mat(ProfPL(1,p))), '.png')); + saveas(porepress,TempName); + ChartPL = Image(TempName); + if rPL(p,1) == 1 + ChartPL.Style = {Height('8cm'),HAlign('center')}; + elseif rPL(p,1) == 2 + ChartPL.Style = {Height('7.5cm'),HAlign('center')}; + else + ChartPL.Style = {Height('8cm'),HAlign('center')}; + end + if rPL(p,1) == 2 + ChartPL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Livello idrico e pressione ' tipopressione... + ' registrati dal piezometro posto alla profondit' ... + char(224) ' di ' num2str(cell2mat(ProfPL(1,p))) ' metri']); + ChartPL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + else + ChartPL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Livello idrico e pressione ' tipopressione... + ' registrati durante il periodo temporale di riferimento dal piezometro posto alla profondit' ... + char(224) ' di ' num2str(cell2mat(ProfPL(1,p))) ' metri']); + ChartPL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + end + FIG = FIG+1; + if titolo == 1 + sezPiezo = Heading3('Piezo Link'); + sezPiezo.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SE.Title = sezPiezo; + add(DT,sezPiezo); + titolo = 0; + end + escludi2 = 0; + if rPL(p,1) == 2 + if p == 1 + testo = Paragraph(['I grafici seguenti riportano i valori di livello idrico e pressione ' tipopressione... + ' misurati nel corso del periodo di riferimento dai piezometri presenti nella catena. '... + 'Il sensore situato a una profondit' char(224) ' di ' ... + num2str(cell2mat(ProfPL(1,p))) ' m da p.c. ha rilevato un''altezza '... + 'di falda massima pari a ' num2str(round(max(waterlevel(:,p)),2), '%0.2f') ' m ed un valore minimo pari a '... + num2str(round(min(waterlevel(:,p)),2), '%0.2f') ' m, per una variazione massima di '... + num2str(round(max(waterlevel(:,p)),2)-round(min(waterlevel(:,p)),2),'%0.2f') ' m.']); + testo.HAlign = 'justify'; + escludi2 = 1; + add(DT,testo); + elseif p == 2 + testo = Paragraph(['Il sensore situato a una profondit' char(224) ' di ' ... + num2str(cell2mat(ProfPL(1,p))) ' m da p.c. ha rilevato un''altezza '... + 'di falda massima pari a ' num2str(round(max(waterlevel(:,p)),2), '%0.2f') ' m ed un valore minimo pari a '... + num2str(round(min(waterlevel(:,p)),2), '%0.2f') ' m, per una variazione massima di '... + num2str(round(max(waterlevel(:,p)),2)-round(min(waterlevel(:,p)),2),'%0.2f') ' m.']); + testo.HAlign = 'justify'; + escludi2 = 1; + add(DT,testo); + end + elseif p == 1 + testo = Paragraph(['I grafici seguenti riportano i valori di livello idrico e pressione ' tipopressione... + ' misurati nel corso del periodo di riferimento dai piezometri presenti nella catena.']); + testo.HAlign = 'justify'; + add(DT,testo); + end + if escludi2 == 0 + testo2 = Paragraph(['Il sensore situato a una profondit' char(224) ' di ' ... + num2str(cell2mat(ProfPL(1,p))) ' m da p.c. ha rilevato un''altezza '... + 'di falda massima pari a ' num2str(round(max(waterlevel(:,p)),2), '%0.2f') ' m ed un valore minimo pari a '... + num2str(round(min(waterlevel(:,p)),2), '%0.2f') ' m, per una variazione massima di '... + num2str(round(max(waterlevel(:,p)),2)-round(min(waterlevel(:,p)),2),'%0.2f') ' m.']); + testo2.HAlign = 'justify'; + add(DT,testo2); + end + add(DT,ChartPL); + add(DT,ChartPL_cap); + if p == rPL(m,1) || p == 1 && rPL(m,1) > 2 || rTL(m,1) == 0 && p == 1 && rIPL(m,1) == 0 && p == 1 + add(DT,br); + end + close(figure(3)); + + % Inglese + if activeEN == 1 + % grafico livello falda e pressione interstiziale NELL'ULTIMO MESE + figure(3) + plot(Date,waterlevel(:,p),'LineWidth',1.5); + yyaxis left + ylabel('Depth [m b.g.l.]'); + if var < 1 + ylim([media-0.5 media+0.5]); + end + title(['Water level and ' tipopressione ' pressure - Sensor at ' ... + num2str(cell2mat(ProfPL(1,p))) ' m of depth']); + xlabel('Date [dd/mm/yyyy]'); + hold on + yyaxis right + porepress = plot(Date,pressure(:,p),'--'); + ylabel([tipopressione ' pressure [Pa]']); + xlim([Date(1)-1 Date(end)+1]); + + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-Piezo',num2str(cell2mat(ProfPL(1,p))), '_ENG.png')); + saveas(porepress,TempName); + ChartPL = Image(TempName); + if rPL(p,1) == 1 + ChartPL.Style = {Height('8cm'),HAlign('center')}; + elseif rPL(p,1) == 2 + ChartPL.Style = {Height('7.5cm'),HAlign('center')}; + else + ChartPL.Style = {Height('8cm'),HAlign('center')}; + end + if rPL(p,1) == 2 + ChartPL_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Water level and ' tipopressione... + ' pressure recorded by the piezometer at a depth of ' num2str(cell2mat(ProfPL(1,p))) ' m']); + ChartPL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + else + ChartPL_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Water level and ' tipopressione... + ' pressure recorded during the reference time period by the sensor placed at a depth of ' ... + num2str(cell2mat(ProfPL(1,p))) ' m']); + ChartPL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + end + FIG_ENG = FIG_ENG+1; + if titolo == 1 + SE_ENG.Title = sezPiezo; + add(DT_ENG,sezPiezo); + titolo = 0; + end + escludi2 = 0; + if rPL(p,1) == 2 + if p == 1 + testo = Paragraph(['The following graphs shows the water level and ' tipopressione... + ' pressure values recorded during the reference time period by the piezometers placed on site. '... + 'Sensor at a depth of ' num2str(cell2mat(ProfPL(1,p))) ' m b.g.l. registered a maximum water level '... + 'that equals ' num2str(round(max(waterlevel(:,p)),2), '%0.2f') ' m. The minimum value is '... + num2str(round(min(waterlevel(:,p)),2), '%0.2f') ' m, while the maximum variation is '... + num2str(round(max(waterlevel(:,p)),2)-round(min(waterlevel(:,p)),2),'%0.2f') ' m.']); + testo.HAlign = 'justify'; + escludi2 = 1; + add(DT_ENG,testo); + elseif p == 2 + testo = Paragraph(['Sensor at a depth of ' num2str(cell2mat(ProfPL(1,p))) ' m b.g.l. registered a maximum water level '... + 'that equals ' num2str(round(max(waterlevel(:,p)),2), '%0.2f') ' m. The minimum value is '... + num2str(round(min(waterlevel(:,p)),2), '%0.2f') ' m, while the maximum variation is '... + num2str(round(max(waterlevel(:,p)),2)-round(min(waterlevel(:,p)),2),'%0.2f') ' m.']); + testo.HAlign = 'justify'; + escludi2 = 1; + add(DT_ENG,testo); + end + elseif p == 1 + testo = Paragraph(['The following graphs shows the water level and ' tipopressione... + ' pressure values recorded during the reference time period by the piezometers placed on the Array. ']); + testo.HAlign = 'justify'; + add(DT_ENG,testo); + end + if escludi2 == 0 + testo2 = Paragraph(['Sensor at a depth of ' num2str(cell2mat(ProfPL(1,p))) ' m b.g.l. registered a maximum water level '... + 'that equals ' num2str(round(max(waterlevel(:,p)),2), '%0.2f') ' m. The minimum value is '... + num2str(round(min(waterlevel(:,p)),2), '%0.2f') ' m, while the maximum variation is '... + num2str(round(max(waterlevel(:,p)),2)-round(min(waterlevel(:,p)),2),'%0.2f') ' m.']); + testo2.HAlign = 'justify'; + add(DT_ENG,testo2); + end + add(DT_ENG,ChartPL); + add(DT_ENG,ChartPL_cap); + if p == rPL(m,1) || p == 1 && rPL(m,1) > 2 || rTL(m,1) == 0 && p == 1 && rIPL(m,1) == 0 && p == 1 + add(DT_ENG,br); + end + close(figure(3)); + end + % per grafici integrati + diffP = waterlevel-waterlevel(1,:); + maxP = max(diffP); + MAX = max(maxP); + ind = find(maxP==MAX); + GI_LivelloFaldaPL = diffP(:,ind); + GI_ProfPL = cell2mat(ProfPL(1,ind)); + GI_DatePL = Date; + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + end + check = 1; + end + end + end + end +end + +text = 'report_PL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_PT100.m b/ATD/report_PT100.m new file mode 100755 index 0000000..519a012 --- /dev/null +++ b/ATD/report_PT100.m @@ -0,0 +1,364 @@ +function [FIG,FIG_ENG,battANALOG,ATTIVA] = report_PT100(rPT100,m,NodoPT100Link,... + toolrif,unitrif,datarif,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,... + battANALOG,ATTIVA,activeEN,contunit,br,status,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_PT100 function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('GMUX non ancora installato o canale inattivo.'); + add(DT,testo); + if activeEN == 1 + testo = Paragraph('GMUX not installed or inactive.'); + add(DT_ENG,testo); + end + end +elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoraggio completato. Invitiamo a visitare la '... + 'piattaforma web per la visione dei dati storici.']); + 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 + PTE = Section(); + titolo = 1; + + 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')}; + FIG = FIG+1; + Chart_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + sezBATT = Paragraph('GMUX - Batteria e Temperatura'); + sezBATT.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + add(DT,sezBATT); + add(DT,testoB1); + add(DT,testoB2); + add(DT,lot); + add(DT,lot_cap); + add(DT,br); + close(figure(19)); + + if activeEN == 1 + 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 + + for n = 1:rPT100(m,1) + NodeNum = num2str(NodoPT100Link(n,m)); + comando = ['select EventDate, EventTime, T_node 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 + TempPT100 = cell2mat(Dati(:,3)); % temperatura + MaxTempPT100 = max(TempPT100); + MinTempPT100 = min(TempPT100); + + % grafico temperatura + figure(1) + graficoPT100 = plot(Date,TempPT100); + xlim([Date(1)-1 Date(end)+1]); + title(['Andamento della temperatura registrata dal sensore numero ' NodeNum ]); + xlabel('Data [gg/mm/aaaa]'); + ylabel(['Temperatura [' char(176) 'C]']); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'PT100_',NodeNum,'.png')); + if titolo == 1 + sezPT100 = Heading3('PT100 Link'); + sezPT100.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PTE.Title = sezPT100; + add(DT,sezPT100); + if activeEN == 0 + titolo = 0; + end + end + + saveas(graficoPT100,TempName); + ChartPT100 = Image(TempName); + ChartPT100.Style = {Height('7.3cm'),HAlign('center')}; + ChartPT100_cap = Paragraph(['Fig. ' num2str(FIG) ' - Andamento della'... + ' temperatura misurata dalla sonda PT100 numero ' NodeNum... + ' durante il periodo temporale di riferimento']); + FIG = FIG+1; + ChartPT100_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['I grafici seguenti mostrano i valori di temperatura '... + 'misurati dalle sonde PT100 collegato all''Analog Array.']); + testo2 = Paragraph(['Durante il periodo temporale di riferimento, il nodo '... + 'numero ' NodeNum ' ha registrato valori massimi e minimi di temperatura rispettivamente pari '... + 'a ' num2str(MaxTempPT100,'%0.1f') '' char(176) 'C e ' num2str(MinTempPT100,'%0.1f') '' char(176) 'C.']); + testo.HAlign = 'justify'; + if n == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,ChartPT100); + add(DT,ChartPT100_cap); + if n == rPT100(m,1) + add(DT,br); + end + close(figure(1)); + + if activeEN == 1 + % grafico temperatura + figure(1) + graficoPT100 = plot(Date,TempPT100); + xlim([Date(1)-1 Date(end)+1]); + title(['Temperature recorded by sensor no. ' NodeNum ]); + xlabel('Date [dd/mm/yyyy]'); + ylabel(['Temperature [' char(176) 'C]']); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'PT100_',NodeNum,'_ENG.png')); + if titolo == 1 + sezPT100 = Heading3('PT100 Link'); + sezPT100.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PTE.Title = sezPT100; + add(DT,sezPT100); + titolo = 0; + end + + saveas(graficoPT100,TempName); + ChartPT100 = Image(TempName); + ChartPT100.Style = {Height('7.3cm'),HAlign('center')}; + ChartPT100_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Time evolution of '... + ' the temperature recorded by PT100 sensor number ' NodeNum... + ' during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartPT100_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graphs show the temperature values '... + 'recorded by PT100 sensors.']); + testo2 = Paragraph(['During the reference time period, node number '... + NodeNum ' highlighted maximum and minimum temperature values equal to '... + num2str(MaxTempPT100,'%0.1f') '' char(176) 'C and ' num2str(MinTempPT100,'%0.1f') '' char(176) 'C respectively.']); + testo.HAlign = 'justify'; + if n == 1 + add(DT_ENG,testo); + end + add(DT_ENG,testo2); + add(DT_ENG,ChartPT100); + add(DT_ENG,ChartPT100_cap); + if n == rPT100(m,1) + add(DT_ENG,br); + end + close(figure(1)); + end + %pulisco variabili da riutilizzare per catena successiva + clear TempPT100; + clear MaxTempPT100; + clear MinTempPT100; + else + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + if m == 1 + add(DT_ENG,br); + end + end + end + end + end +end + +text = 'report_PT100 function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_PrL.m b/ATD/report_PrL.m new file mode 100755 index 0000000..4ce4ec6 --- /dev/null +++ b/ATD/report_PrL.m @@ -0,0 +1,365 @@ +function [FIG,FIG_ENG,battANALOG,ATTIVA] = report_PrL(rPrL,m,NodoPressureLink,toolrif,... + unitrif,datarif,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,... + battANALOG,activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_PrL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('GMUX non ancora installato o canale inattivo.'); + add(DT,testo); + if activeEN == 1 + testo = Paragraph('GMUX not installed or inactive.'); + add(DT_ENG,testo); + end + end +elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoraggio completato. Invitiamo a visitare la '... + 'piattaforma web per la visione dei dati storici.']); + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array not installed or inactive.'); + add(DT_ENG,testo); + end + end +else + 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 registrati 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(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) ' - Livello di carica della batteria e temperatura del '... + 'GMUX registrati 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)); + if activeEN == 1 + 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 + + sezPrL = Heading3('Pressure Link'); + sezPrL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + PR = Section(); + PR.Title = sezPrL; + add(DT,sezPrL); + if activeEN == 1 + add(DT_ENG,sezPrL); + end + + for ld = 1:rPrL(m,1) + NodeNum = num2str(NodoPressureLink(ld,m)); + comando = ['select EventDate, EventTime, pressure 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 + pressione = cell2mat(Dati(:,3)); % carico cella + var_pressione = pressione-pressione(1); % variazione carico + + % grafico carico + figure(5); + load = plot(Date,var_pressione); + title(['Variazione di Pressione - Nodo numero ' NodeNum '']); + xlabel('Data [gg/mm/aaaa]'); + ylabel('Variazione di pressione [kPa]'); + if max(var_pressione) < 20 && min(var_pressione) > -20 + ylim([-20 20]); + elseif max(var_pressione) > 20 && min(var_pressione) > -20 + ylim([-20 inf]); + elseif max(var_pressione) < 20 && min(var_pressione) < -20 + ylim([-inf 20]); + end + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + hold off + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-CellaPressione', NodeNum, '.png')); + saveas(load,TempName); + ChartPrL = Image(TempName); + ChartPrL.Style = {Height('7.3cm'),HAlign('center')}; + ChartPrL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Variazione di pressione'... + ' registrata dalla cella, nodo numero ' NodeNum... + ', nel periodo temporale di riferimento']); + FIG = FIG+1; + ChartPrL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['I grafici seguenti rappresentato i dati relativi '... + 'alla variazione di pressione (in kPa) rilevata dai sensori collegati all''Analog Array.']); + testo2 = Paragraph(['Durante il periodo temporale di riferimento, il nodo numero ' NodeNum... + ' ha registrato una massima variazione di pressione pari a '... + num2str(round(max(abs(var_pressione)),2), '%0.2f') ' kPa, mentre il massimo '... + 'valore di pressione assoluta ' char(232) ' pari a ' num2str(round(max(pressione),2), '%0.2f') ' kPa.' ]); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if ld == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,ChartPrL); + add(DT,ChartPrL_cap); + if ld == rPrL(m,1) + add(DT,br); + end + close(figure(5)); + if activeEN == 1 + % grafico carico + figure(5); + load = plot(Date,var_pressione); + title(['Pressure variation - Node number ' NodeNum '']); + xlabel('Date [dd/mm/yyyy]'); + ylabel('Pressure variation [kPa]'); + if max(var_pressione) < 20 && min(var_pressione) > -20 + ylim([-20 20]); + elseif max(var_pressione) > 20 && min(var_pressione) > -20 + ylim([-20 inf]); + elseif max(var_pressione) < 20 && min(var_pressione) < -20 + ylim([-inf 20]); + end + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + hold off + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-CellaPressione', NodeNum, '_ENG.png')); + saveas(load,TempName); + ChartPrL = Image(TempName); + ChartPrL.Style = {Height('7.3cm'),HAlign('center')}; + ChartPrL_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Pressure variation '... + 'recorded by the pressure cell, node number ' NodeNum... + ', during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartPrL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following representations show the pressure variation recorded by '... + 'the sensors that equip the Analog Array.']); + testo2 = Paragraph(['During the reference monitoring period, node number ' NodeNum... + ' recorded a maximum pressure variation of '... + num2str(round(max(abs(var_pressione)),2), '%0.2f') ' kPa, while the maximum absolute '... + 'pressure value is ' num2str(round(max(pressione),2), '%0.2f') ' kPa.' ]); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if ld == 1 + add(DT_ENG,testo); + end + add(DT_ENG,testo2); + add(DT_ENG,ChartPrL); + add(DT_ENG,ChartPrL_cap); + if ld == rPrL(m,1) + add(DT_ENG,br); + end + close(figure(5)); + end + % pulisco variabili da riutilizzare per catena successiva + clear carico; + clear var_carico; + else + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + add(DT,testo); + add(DT,br); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + if m == 1 + add(DT_ENG,br); + end + end + end + end + end +end + +text = 'report_PrL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_PrL_ENG.m b/ATD/report_PrL_ENG.m new file mode 100755 index 0000000..b17a85d --- /dev/null +++ b/ATD/report_PrL_ENG.m @@ -0,0 +1,217 @@ +function [FIG,battANALOG,ATTIVA] = report_PrL_ENG(rPrL,m,NodoPressureLink,toolrif,... + unitrif,datarif,Font_caption,Font_tools,siteID,DT,FIG,br,status,ATTIVA,... + battANALOG,conn,FileName) + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('GMUX not installed or inactive.'); + add(DT,testo); + end +elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoring completed. Please log into the web-based platoform '... + 'to access the complete dataset.']); + add(DT,testo); + end +else + 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(['The following chart reports the battery level trend recorded during the reference time period. '... + 'The correct functioning of the GMUX module is guaranteed for a minimum level of 12 V. The last '... + 'available data is equal to ' num2str(Batteria(end,1)) ' V.']); + testoB2 = Paragraph(['The GMUX module equips also a thermometer that allows the monitoring of the working '... + 'temperature and the identification of eventual malfunctioning. The following chart reports temperature '... + 'data recorded by the GMUX module.']); + testoB1.HAlign = 'justify'; + testoB2.HAlign = 'justify'; + + % grafico batteria + figure(19) + plot(Date,Batteria); + hold on + title('Battery level and GMUX temperature'); + xlabel('Date [dd/mm/yyyy]'); + ylabel('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')}; + if Batteria(end,1) >= 13 + TempName = char(strcat('B_13.jpg')); + elseif Batteria(end,1) >= 12 + TempName = char(strcat('B_12.jpg')); + elseif Batteria(end,1) >= 11 + 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) ' - Battery level and GMUX temperature recorded '... + 'during the reference time period']); + FIG = FIG+1; + lot_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + FIG = FIG+1; + Batt = Section(); + sezBATT = Heading3('GMUX - Battery level and temperature'); + 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)); + battANALOG = 1; + end + end + + sezPrL = Heading3('Pressure Link'); + sezPrL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + PR = Section(); + PR.Title = sezPrL; + add(DT,sezPrL); + for ld = 1:rPrL(m,1) + NodeNum = num2str(NodoPressureLink(ld,m)); + comando = ['select EventDate, EventTime, pressure 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 + pressione = cell2mat(Dati(:,3)); % carico cella + var_pressione = pressione-pressione(1); % variazione carico + + % grafico carico + figure(5); + load = plot(Date,var_pressione); + title(['Pressure variation - node ' NodeNum '']); + xlabel('Date [dd/mm/yyyy]'); + ylabel('Pressure variation [kPA]'); + if max(var_pressione) < 20 && min(var_pressione) > -20 + ylim([-20 20]); + elseif max(var_pressione) > 20 && min(var_pressione) > -20 + ylim([-20 inf]); + elseif max(var_pressione) < 20 && min(var_pressione) < -20 + ylim([-inf 20]); + end + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + hold off + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-CellaPressione', NodeNum, '_ENG.png')); + saveas(load,TempName); + ChartPrL = Image(TempName); + ChartPrL.Style = {Height('7.3cm'),HAlign('center')}; + ChartPrL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Pressure variation'... + ' recorded by the pressure cell ' NodeNum... + ', during the reference time period']); + FIG = FIG+1; + ChartPrL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graph reports pressure variation data measured by pressure sensors'... + 'composing the Analog Array (values in kPa).']); + testo2 = Paragraph(['During the reference time period, the node ' NodeNum ... + ' recorded a maximum pressure variation of '... + num2str(round(max(abs(var_pressione)),2), '%0.2f') ' kPa, while the maximum value referred '... + 'to the absolute pressure amounts to ' num2str(round(max(pressione),2), '%0.2f') ' kPa.' ]); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if ld == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,ChartPrL); + add(DT,ChartPrL_cap); + if ld == rPrL(m,1) + add(DT,br); + end + close(figure(5)); + % pulisco variabili da riutilizzare per catena successiva + clear carico; + clear var_carico; + else + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('No data available for the reference time period.'); + add(DT,testo); + add(DT,br); + end + end + end +end + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_PrL_ENG function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_RL.m b/ATD/report_RL.m new file mode 100755 index 0000000..3b1db4a --- /dev/null +++ b/ATD/report_RL.m @@ -0,0 +1,213 @@ +function [GI_rainloc,GI_DateRL,ATTIVA,FIG,FIG_ENG] = report_RL(rRL,m,NodoRainLink,toolrif,... + unitrif,datarif,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,... + activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_RL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +titolo = 1; +GI_rainloc = []; +GI_DateRL = []; + +if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('Catena non ancora installata o inattiva.'); + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array not installed or inactive.'); + add(DT_ENG,testo); + end + end +elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoraggio completato. Invitiamo a visitare la '... + 'piattaforma web per la visione dei dati storici.']); + 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 + for r = 1:rRL(m,1) + NodeNum = num2str(NodoRainLink(r,m)); + comando = ['select EventDate, EventTime, Z, ZShift 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 + pioggiatot = cell2mat(Dati(:,3)); % altezza di pioggia cumulata + pioggialoc = cell2mat(Dati(:,4)); % altezza di pioggia locale + pioggiatot_diff = pioggiatot - pioggiatot(1); + + % per grafici integrati + GI_rainloc = pioggialoc; + GI_DateRL = Date; + + % grafico piogge locali e totali + figure(6) + rain = bar(Date,pioggialoc,65); + title('Precipitazioni'); + yyaxis left + ylabel('Altezza di pioggia [mm]'); + xlabel('Data [gg/mm/aaaa]'); + xlim([Date(1)-1 Date(end)+1]); + ylim([0 max(pioggialoc(:,1))+1]); + + hold on + yyaxis right + raintot = plot(Date,pioggiatot_diff); + ylabel('Altezza di pioggia cumulata [mm]'); + set(gca,'YColor','k'); + if min(pioggiatot_diff(:,1))-2 > 0 + ylim([min(pioggiatot_diff(:,1))-2 max(pioggiatot_diff(:,1))+1]); + else + ylim([0 max(pioggiatot_diff(:,1))+1]); + end + + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(25); + str(1,1) = cellstr('Precipitazioni'); + str(2,1) = cellstr('Precipitazioni cumulate'); + legend(str,'Location','best'); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-RainLink', NodeNum, '.png')); + saveas(raintot,TempName); + ChartRL = Image(TempName); + ChartRL.Style = {ScaleToFit}; + ChartRL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Andamento nel tempo delle precipitazioni misurate dal pluviometro']); + FIG = FIG+1; + ChartRL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['Il grafico seguente riporta i dati di precipitazione '... + 'locale e cumulata registrati nel periodo temporale di riferimento. '... + 'In particolare, l''altezza di pioggia totale registrata '... + 'dal pluviometro in riferimento al solo periodo di riferimento ' char(232) ' pari a ' num2str(sum(pioggiatot_diff(end)))... + ' mm, mentre il valore di pioggia cumulata '... + 'a partire dall''inizio dell''attivit' char(224) ' di monitoraggio ' char(232) ' di ' num2str(pioggiatot(end))... + ' mm (dato aggiornato al ' datestr(Date(end), 'dd/mm/yyyy HH:MM') ').']); + testo.HAlign = 'justify'; + + if titolo == 1 + sezRain = Paragraph('Rain Link'); + sezRain.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + RR = Section(); + RR.Title = sezRain; + add(DT,sezRain); + if activeEN == 1 + sezRain_ENG = Paragraph('Rain Link'); + sezRain_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + RR_ENG = Section(); + RR_ENG.Title = sezRain; + add(DT_ENG,sezRain_ENG); + end + titolo = 0; + end + + add(DT,testo); + add(DT,ChartRL); + add(DT,ChartRL_cap); + add(DT,br); + close(figure(6)); + + %--ENG-- + if activeEN == 1 + % grafico piogge locali e totali + figure(16) + rain = bar(Date,pioggialoc,25); + title('Rainfall'); + yyaxis left + ylabel('Rainfall [mm]'); + xlabel('Date [dd/mm/yyyy]'); + xlim([Date(1)-1 Date(end)+1]); + ylim([0 max(pioggialoc(:,1))+1]); + + hold on + yyaxis right + raintot = plot(Date,pioggiatot_diff); + ylabel('Cumulative rainfall [mm]'); + set(gca,'YColor','k'); + if min(pioggiatot_diff(:,1))-2 > 0 + ylim([min(pioggiatot_diff(:,1))-2 max(pioggiatot_diff(:,1))+1]); + else + ylim([0 max(pioggiatot_diff(:,1))+1]); + end + + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(25); + str(1,1) = cellstr('Rainfall'); + str(2,1) = cellstr('Cumulative rainfall'); + legend(str,'Location','best'); + grid on + grid minor + + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-RainLink', NodeNum, '_ENG.png')); + saveas(raintot,TempName); + ChartRL_ENG = Image(TempName); + ChartRL_ENG.Style = {ScaleToFit}; + ChartRL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Rainfall trend recorded by the rain gauge during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartRL_ENG_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graph shows precipitation data recorded by the rain gauge during the '... + 'reference time period. In particular, the sensor recorded a total rainfall of '... + ' ' num2str(sum(pioggiatot_diff(end)))... + ' mm during the reference time period, while the cumulative rainfall measured since the '... + 'beginning of the monitoring activity amounts to ' num2str(pioggiatot(end))... + ' mm (updated to: ' datestr(Date(end), 'dd/mm/yyyy HH:MM') ').']); + testo.HAlign = 'justify'; + + add(DT_ENG,testo); + add(DT_ENG,ChartRL_ENG); + add(DT_ENG,ChartRL_ENG_cap); + add(DT_ENG,br); + close(figure(16)); + end + + % pulisco variabili da riutilizzare per catena successiva + clear pioggiatot; + clear pioggialoc; + + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + end + end + end + end +end + +text = 'report_RL function executed correctly. report_RL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_RSN.m b/ATD/report_RSN.m new file mode 100755 index 0000000..99e088c --- /dev/null +++ b/ATD/report_RSN.m @@ -0,0 +1,262 @@ +function [ATTIVA,FIG,FIG_ENG] = report_RSN(rRSN,m,NodoRSNLink,toolrif,unitrif,datarif,... + Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_RSN function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + + +% Make sure DOM is compilable +makeDOMCompilable() + +if status(m,1) == 1 + if ATTIVA == 1 + testo = Paragraph('Catena non ancora installata o inattiva.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array 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 + titolo = 1; + for b = 1:rRSN(m,1) + NodeNum = num2str(NodoRSNLink(b,m)); + comando = ['select EventDate, EventTime, AlfaX, AlfaY, T_node 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 + AngX = cell2mat(Dati(:,3)); % asse x assoluti + AngY = cell2mat(Dati(:,4)); % asse y assoluti + TempRSN = cell2mat(Dati(:,5)); % temp + [d,~] = size(AngX); + for ind = 2:d + VarAngX(ind,1) = AngX(ind,1)-AngX(ind-1,1); % variazioni asse x + VarAngY(ind,1) = AngY(ind,1)-AngY(ind-1,1); % variazione asse y + end + + % grafico inclinazione-tempo asse X,Y NELL'ULTIMO MESE + figure(1) + yyaxis left + RSN_X = plot(Date,VarAngX,'-','LineWidth',2); + hold on + RSN_Y = plot(Date,VarAngY,'-','Color','red','LineWidth',2); + hold off + yyaxis right + RSN_Temp = plot(Date,TempRSN,':','LineWidth',1.2); + title('Rockfall Safety Network - RSN Link'); + xlabel('Data [gg/mm/aaaa]'); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(12); + lgd = legend('Asse X','Asse Y','Temperatura','Location','south'); + lgd.NumColumns = 3; + yyaxis left + if max(VarAngX) > 1 || max(VarAngY) > 1 + if min(VarAngX) < -1 || max(VarAngY) < -1 + ylim([-inf inf]); + else + ylim([-1 inf]); + end + elseif min(VarAngX) < -1 || max(VarAngY) < -1 + if max(VarAngX) > 1 || max(VarAngY) > 1 + ylim([-inf inf]); + else + ylim([-inf 1]); + end + else + ylim([-1 1]); + end + ylabel(['Variazione di inclinazione [' char(176) ']','Color','k']); + set(gca,'YColor','k'); + yyaxis right + if max(VarAngX) > 1 || max(VarAngY) > 1 + if min(VarAngX) < -1 || max(VarAngY) < -1 + ylim([-inf inf]); + else + ylim([min(TempRSN)-7 inf]); + end + elseif min(VarAngX) < -1 || max(VarAngY) < -1 + if max(VarAngX) > 1 || max(VarAngY) > 1 + ylim([-inf inf]); + else + ylim([-inf max(TempRSN)+7]); + end + else + end + ylabel(['Temperatura [' char(176) 'C]','Color','k']); + set(gca,'YColor','k'); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-RSN.png')); + saveas(RSN_Y,TempName); + ChartRSN = Image(TempName); + ChartRSN.Style = {ScaleToFit}; + ChartRSN_cap = Paragraph(['Fig. ' num2str(FIG) ' - Variazione dell''inclinazione'... + ' in direzione X (perpendicolarmente rispetto alla barriera) e Y (trasversalmente alla barriera)'... + ' registrata dal sensore MEMS, integrato nel '... + 'modulo BPM, durante il periodo temporale di riferimento']); + FIG = FIG+1; + ChartRSN_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['I grafici seguenti riportano le variazioni di inclinazione misurate '... + 'nel periodo temporale di riferimento dal sensore MEMS incluso nel Rockfall Safety Network - RSN Link'... + ', relativamente agli assi strumentali X (perpendicolare alla barriera) e Y (trasversale alla barriera). ']); + testo2 = Paragraph(['In questo periodo di tempo, il sensore ha rilevato una variazione di inclinazione massima lungo l''asse X '... + 'pari a ' num2str(round(max(abs(VarAngX)),2), '%0.2f')... + char(176) '. Per quanto riguarda l''asse Y, la massima variazione risulta '... + ' pari a ' num2str(round(max(abs(VarAngY)),2), '%0.2f') '' char(176) ' di inclinazione.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if titolo == 1 + sezRSN = Paragraph('RSN Link'); + sezRSN.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + add(DT,sezRSN); + end + add(DT,testo); + add(DT,testo2); + add(DT,ChartRSN); + add(DT,ChartRSN_cap); + add(DT,br); + close(figure(1)); + + if activeEN == 1 + % grafico inclinazione-tempo asse X,Y NELL'ULTIMO MESE + figure(11) + yyaxis left + RSN_X = plot(Date,VarAngX,'-','LineWidth',2); + hold on + RSN_Y = plot(Date,VarAngY,'-','Color','red','LineWidth',2); + hold off + yyaxis right + RSN_Temp = plot(Date,TempRSN,':','LineWidth',1.2); + title('Rockfall Safety Network - RSN Link'); + xlabel('Date [dd/mm/yyyy]'); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(12); + lgd = legend('X axis','Y axis','Temperature','Location','south'); + lgd.NumColumns = 3; + yyaxis left + if max(VarAngX) > 1 || max(VarAngY) > 1 + if min(VarAngX) < -1 || max(VarAngY) < -1 + ylim([-inf inf]); + else + ylim([-1 inf]); + end + elseif min(VarAngX) < -1 || max(VarAngY) < -1 + if max(VarAngX) > 1 || max(VarAngY) > 1 + ylim([-inf inf]); + else + ylim([-inf 1]); + end + else + ylim([-1 1]); + end + ylabel(['Tilt variation [' char(176) ']','Color','k']); + set(gca,'YColor','k'); + yyaxis right + if max(VarAngX) > 1 || max(VarAngY) > 1 + if min(VarAngX) < -1 || max(VarAngY) < -1 + ylim([-inf inf]); + else + ylim([min(TempRSN)-7 inf]); + end + elseif min(VarAngX) < -1 || max(VarAngY) < -1 + if max(VarAngX) > 1 || max(VarAngY) > 1 + ylim([-inf inf]); + else + ylim([-inf max(TempRSN)+7]); + end + else + end + ylabel(['Temperature [' char(176) 'C]','Color','k']); + set(gca,'YColor','k'); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-RSN_ENG.png')); + saveas(RSN_Y,TempName); + ChartRSN_ENG = Image(TempName); + ChartRSN_ENG.Style = {ScaleToFit}; + ChartRSN_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Tilt variation along '... + 'X and Y directions (perpendicular and parallel to the barrier, respectively) '... + 'recorded during the reference time period by the MEMS sensor '... + 'integrated in the BPM module']); + FIG_ENG = FIG_ENG+1; + ChartRSN_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graphs display the tilt variation recorded during the '... + 'reference time period by the MEMS sensor integrated in the Rockfall Safety Network - RSN Link'... + ', referring to instrumental axes X (perpendicular to the barrier) and Y (parallel to the barrier). ']); + testo2 = Paragraph(['During the reference time period, the sensors measured a maximum tilt variation along the X axis '... + 'equal to ' num2str(round(max(abs(VarAngX)),2), '%0.2f')... + char(176) '. For what concerns the Y axis, the maximum tilt variation amounts to '... + num2str(round(max(abs(VarAngY)),2), '%0.2f') '' char(176) '.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if titolo == 1 + sezRSN_ENG = Paragraph('RSN Link'); + sezRSN_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + add(DT_ENG,sezRSN_ENG); + end + add(DT_ENG,testo); + add(DT_ENG,testo2); + add(DT_ENG,ChartRSN_ENG); + add(DT_ENG,ChartRSN_ENG_cap); + add(DT_ENG,br); + close(figure(11)); + end + titolo = 0; + % pulisco variabili da riutilizzare per catena successiva + clear AngX; + clear AngY; + clear VarAngX; + clear VarAngY; + clear TempRSN; + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + end + end + end + end +end + +text = 'report_RSN function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_RSNHR.m b/ATD/report_RSNHR.m new file mode 100755 index 0000000..b1dc666 --- /dev/null +++ b/ATD/report_RSNHR.m @@ -0,0 +1,258 @@ +function [ATTIVA,FIG,FIG_ENG] = report_RSNHR(rRSNHR,m,NodoRSNHRLink,toolrif,unitrif,... + datarif,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_RSNHR function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + + +% Make sure DOM is compilable +makeDOMCompilable() + +if status(m,1) == 1 + if ATTIVA == 1 + testo = Paragraph('Catena non ancora installata o inattiva.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array 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 + titolo = 1; + for h = 1:rRSNHR(m,1) + NodeNum = num2str(NodoRSNHRLink(h,m)); + comando = ['select EventDate, EventTime, AlfaX, AlfaY, T_node 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 + AngX_HR = cell2mat(Dati(:,3)); % asse x assoluti + AngY_HR = cell2mat(Dati(:,4)); % asse y assoluti + TempRSNHR = cell2mat(Dati(:,5)); % temp + [d,~] = size(AngX_HR); + for ind = 2:d + VarAngX_HR(ind,1) = AngX_HR(ind,1)-AngX_HR(ind-1,1); % variazioni asse x + VarAngY_HR(ind,1) = AngY_HR(ind,1)-AngY_HR(ind-1,1); % variazione asse y + end + + % grafico inclinazione-tempo asse X,Y NELL'ULTIMO MESE + figure(1) + yyaxis left + RSNHR_X = plot(Date,VarAngX_HR,'-','LineWidth',2); + hold on + RSNHR_Y = plot(Date,VarAngY_HR,'-','Color','red','LineWidth',2); + hold off + yyaxis right + RSNHR_Temp = plot(Date,TempRSNHR,':','LineWidth',1.2); + title('Rockfall Safety Network - RSN Link HR'); + xlabel('Data [gg/mm/aaaa]'); + lgd = legend('Asse X','Asse Y','Temperatura','Location','south'); + lgd.NumColumns = 3; + gra = gca; + gra.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(12); + yyaxis left + if max(VarAngX_HR) > 1 || max(VarAngY_HR) > 1 + if min(VarAngX_HR) < -1 || max(VarAngY_HR) < -1 + ylim([-inf inf]); + else + ylim([-1 inf]); + end + elseif min(VarAngX_HR) < -1 || max(VarAngY_HR) < -1 + if max(VarAngX_HR) > 1 || max(VarAngY_HR) > 1 + ylim([-inf inf]); + else + ylim([-inf 1]); + end + else + ylim([-1 1]); + end + set(gca,'YColor','k'); + ylabel(['Variazione di inclinazione [' char(176) ']','Color','k']); + yyaxis right + if max(VarAngX_HR) > 1 || max(VarAngY_HR) > 1 + if min(VarAngX_HR) < -1 || max(VarAngY_HR) < -1 + else + ylim([min(TempRSNHR)-7 inf]); + end + elseif min(VarAngX_HR) < -1 || max(VarAngY_HR) < -1 + if max(VarAngX_HR) > 1 || max(VarAngY_HR) > 1 + else + ylim([-inf max(TempRSNHR)+7]); + end + end + ylabel(['Temperatura [' char(176) 'C]','Color','k']); + set(gca,'YColor','k'); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-RSNHR.png')); + saveas(RSNHR_Temp,TempName); + ChartRSNHR = Image(TempName); + ChartRSNHR.Style = {ScaleToFit}; + ChartRSNHR_cap = Paragraph(['Fig. ' num2str(FIG) ' - Variazione dell''inclinazione'... + ' in direzione X (perpendicolarmente rispetto alla barriera) e Y (trasversalmente alla barriera)'... + ' registrata dal sensore elettrolitico, integrato nel '... + 'modulo BPM, durante il periodo temporale di riferimento']); + FIG = FIG+1; + ChartRSNHR_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['I grafici seguenti riportano le variazioni di inclinazione misurate '... + 'nel periodo temporale di riferimento dal sensore elettrolitico incluso'... + ' nel Rockfall Safety Network - RSN Link HR, relativamente agli assi strumentali'... + ' X (perpendicolare alla barriera) e Y (trasversale alla barriera). ']); + testo2 = Paragraph(['In questo periodo di tempo, l''ampolla elettrolitica ha'... + ' rilevato una variazione di inclinazione massima lungo l''asse X '... + 'pari a ' num2str(round(max(abs(VarAngX_HR)),2), '%0.2f')... + char(176) '. Per quanto riguarda l''asse Y, la massima variazione risulta '... + ' pari a ' num2str(round(max(abs(VarAngY_HR)),2), '%0.2f') '' char(176) ' di inclinazione.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if titolo == 1 + sezRSNHR = Paragraph('RSN Link HR'); + sezRSNHR.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + add(DT,sezRSNHR); + end + add(DT,testo); + add(DT,testo2); + add(DT,ChartRSNHR); + add(DT,ChartRSNHR_cap); + add(DT,br); + close(figure(1)); + + if activeEN == 1 + % grafico inclinazione-tempo asse X,Y NELL'ULTIMO MESE + figure(1) + yyaxis left + RSNHR_X = plot(Date,VarAngX_HR,'-','LineWidth',2); + hold on + RSNHR_Y = plot(Date,VarAngY_HR,'-','Color','red','LineWidth',2); + hold off + yyaxis right + RSNHR_Temp = plot(Date,TempRSNHR,':','LineWidth',1.2); + title('Rockfall Safety Network - RSN Link HR'); + xlabel('Data [gg/mm/aaaa]'); + lgd = legend('X axis','Y axis','Temperature','Location','south'); + lgd.NumColumns = 3; + gra = gca; + gra.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(12); + yyaxis left + if max(VarAngX_HR) > 1 || max(VarAngY_HR) > 1 + if min(VarAngX_HR) < -1 || max(VarAngY_HR) < -1 + ylim([-inf inf]); + else + ylim([-1 inf]); + end + elseif min(VarAngX_HR) < -1 || max(VarAngY_HR) < -1 + if max(VarAngX_HR) > 1 || max(VarAngY_HR) > 1 + ylim([-inf inf]); + else + ylim([-inf 1]); + end + else + ylim([-1 1]); + end + set(gca,'YColor','k'); + ylabel(['Tilt variation [' char(176) ']','Color','k']); + yyaxis right + if max(VarAngX_HR) > 1 || max(VarAngY_HR) > 1 + if min(VarAngX_HR) < -1 || max(VarAngY_HR) < -1 + else + ylim([min(TempRSNHR)-7 inf]); + end + elseif min(VarAngX_HR) < -1 || max(VarAngY_HR) < -1 + if max(VarAngX_HR) > 1 || max(VarAngY_HR) > 1 + else + ylim([-inf max(TempRSNHR)+7]); + end + end + ylabel(['Temperature [' char(176) 'C]','Color','k']); + set(gca,'YColor','k'); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-RSNHR_ENG.png')); + saveas(RSNHR_Temp,TempName); + ChartRSNHR_ENG = Image(TempName); + ChartRSNHR_ENG.Style = {ScaleToFit}; + ChartRSNHR_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Tilt variation along '... + 'X and Y directions (perpendicular and parallel to the barrier, respectively) '... + 'recorded during the reference time period by the electrolytic sensor '... + 'integrated in the BPM module']); + FIG_ENG = FIG_ENG+1; + ChartRSNHR_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graphs display the tilt variation recorded during the '... + 'reference time period by the electrolytic sensor integrated in the Rockfall Safety Network - RSNHR Link'... + ', referring to instrumental axes X (perpendicular to the barrier) and Y (parallel to the barrier). ']); + testo2 = Paragraph(['During the reference time period, the sensors measured a maximum tilt variation along the X axis '... + 'equal to ' num2str(round(max(abs(VarAngX_HR)),2), '%0.2f')... + char(176) '. For what concerns the Y axis, the maximum tilt variation amounts to '... + num2str(round(max(abs(VarAngY_HR)),2), '%0.2f') '' char(176) '.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if titolo == 1 + sezRSNHR_ENG = Paragraph('RSN Link HR'); + sezRSNHR_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + add(DT_ENG,sezRSNHR_ENG); + end + add(DT_ENG,testo); + add(DT_ENG,testo2); + add(DT_ENG,ChartRSNHR); + add(DT_ENG,ChartRSNHR_cap); + add(DT_ENG,br); + close(figure(1)); + end + titolo = 0; + %pulisco variabili da riutilizzare per catena successiva + clear AngX_HR; + clear AngY_HR; + clear VarAngX_HR; + clear VarAngY_HR; + clear TempRSNHR; + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + end + end + end + end +end + +text = 'report_RSNHR function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_RaL.m b/ATD/report_RaL.m new file mode 100755 index 0000000..d8613e3 --- /dev/null +++ b/ATD/report_RaL.m @@ -0,0 +1,1036 @@ +function [GI_Rad_XYZ,GI_Rad_Num,GI_Rad_MPBEL,GI_Rad_Cir,GI_Rad_Date,ATTIVA,FIG,FIG_ENG] = report_RaL(... + DTcatena,rRaL,m,NodoRadialLink,toolrif,unitrif,datarif,firstdata_num,Font_caption,... + Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,colonna2,colonna2bis,status,ATTIVA,activeEN,... + conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_RaL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +GI_Rad_XYZ = []; +GI_Rad_Num = []; +GI_Rad_MPBEL = []; +GI_Rad_Cir = []; +GI_Rad_Date = []; + +check = 0; +while check == 0 + if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('Catena non ancora installata o inattiva.'); + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array not installed or inactive.'); + add(DT_ENG,testo); + end + end + check = 1; + elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoraggio completato. Invitiamo a visitare la '... + 'piattaforma web per la visione dei dati storici.']); + 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 + check = 1; + else + NODATA(m,1) = 0; + date = datestr(datenum(colonna2{m+1,1},'dd-mm-yyyy'),'yyyy-mm-dd'); % data riferimento definita sul sito + % posizione di progetto dei nodi + comando = ['select EventDate, EventTime, X, Y, Z from ElabDataView where EventDate = ''' ... + date ''' and ToolNameID = ''' char(toolrif) ''' and UnitName = ''' char(unitrif) ... + ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + SezioneXYZ = curs.Data; + Datasez = SezioneXYZ(1,1); + Orasez = SezioneXYZ(1,2); + [rz,~] = size(SezioneXYZ); + scrivi = 1; + for rr = 1:rz + if strcmp(SezioneXYZ(rr,1),Datasez)==1 && strcmp(SezioneXYZ(rr,2),Orasez) ==1 + CoordX(scrivi,1) = cell2mat(SezioneXYZ(rr,3)); + CoordY(scrivi,1) = cell2mat(SezioneXYZ(rr,4)); + CoordZ(scrivi,1) = cell2mat(SezioneXYZ(rr,5)); + scrivi = scrivi+1; + end + end + + diffX = zeros(1,rRaL(m,1)); + diffY = zeros(1,rRaL(m,1)); + diffZ = zeros(1,rRaL(m,1)); + RIS_XYZ_Mese = zeros(1,rRaL(m,1)); + RIS_XYZ_Tot = zeros(1,rRaL(m,1)); + Num = zeros(rRaL(m,1),1); + for n = 1:rRaL(m,1) + NodeNum = num2str(NodoRadialLink(n,m)); + % dati del mese + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z '... + '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; + Num(n,1) = NodoRadialLink(n,m); + + [rD,rC] = size(Dati); + if rC ~= 1 + T = [cell2mat(Dati(:,1)) repmat(' ', [rD,1]) cell2mat(Dati(:,2))]; + Date = datenum(T); % Data + if n == 1 % Il primo lo scrivo e creo la variabile di controllo + else + [rS,~] = size(asseX); + if rD ~= rS + NODATA(m,1) = 1; + check = 0; + break + else + check = 1; + end + end + + % spostamenti dei nodi dall'inizio + asseX(:,n) = cell2mat(Dati(:,3)); + asseY(:,n) = cell2mat(Dati(:,4)); + asseZ(:,n) = cell2mat(Dati(:,5)); + X_RL_Tot(:,n) = cell2mat(Dati(:,6)); + Y_RL_Tot(:,n) = cell2mat(Dati(:,7)); + Z_RL_Tot(:,n) = cell2mat(Dati(:,8)); + X_RL_Mese(:,n) = X_RL_Tot(:,n)-X_RL_Tot(1,n)+CoordX(n,1)'; + Y_RL_Mese(:,n) = Y_RL_Tot(:,n)-Y_RL_Tot(1,n)+CoordY(n,1)'; + Z_RL_Mese(:,n) = Z_RL_Tot(:,n)-Z_RL_Tot(1,n)+CoordZ(n,1)'; + diffX(1,n) = asseX(end,n)-asseX(1,n); + diffY(1,n) = asseY(end,n)-asseY(1,n); + diffZ(1,n) = asseZ(end,n)-asseZ(1,n); + dX(:,n) = asseX(:,n)-asseX(:,1); + dY(:,n) = asseY(:,n)-asseY(:,1); + dZ(:,n) = asseZ(:,n)-asseZ(:,1); + + RIS_XYZ_Mese(1,n) = (sqrt(diffX(1,n)^2 + diffY(1,n)^2+diffZ(1,n)^2))*1000; + cX_Mese(1,n) = 100*abs(1000*diffX(1,n))/RIS_XYZ_Mese(1,n); + cY_Mese(1,n) = 100*abs(1000*diffY(1,n))/RIS_XYZ_Mese(1,n); + cZ_Mese(1,n) = 100*abs(1000*diffZ(1,n))/RIS_XYZ_Mese(1,n); + RIS_XYZ_Tot(1,n) = (sqrt(asseX(end,n)^2 + asseY(end,n)^2+asseZ(end,n)^2))*1000; + cX_Tot(1,n) = 100*abs(1000*asseX(1,n))/RIS_XYZ_Tot(1,n); + sigX_Tot(1,n) = sign(asseX(1,n)); + cY_Tot(1,n) = 100*abs(1000*asseY(1,n))/RIS_XYZ_Tot(1,n); + sigY_Tot(1,n) = sign(asseY(1,n)); + cZ_Tot(1,n) = 100*abs(1000*asseZ(1,n))/RIS_XYZ_Tot(1,n); + sigZ_Tot(1,n) = sign(asseZ(1,n)); + else + NODATA(m,1) = 1; + check = 1; + end + end + + if NODATA(m,1) == 0 + if strcmp(colonna2bis(m+1,1),colonna2(m+1,1)) == 0 % data zero diversa data riferimento + clear RIS_XYZ_Tot + datarifNEW = datestr(firstdata_num{m+1,1},'yyyy-mm-dd'); % data riferimento definita sul sito + for nw = 1:rRaL(m,1) + NodeNum = num2str(NodoRadialLink(nw,m)); + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, '... + 'from ElabDataView where EventDate = ''' datarifNEW ''' and ToolNameID = ''' char(toolrif) ... + ''' and UnitName = ''' char(unitrif) ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DatiNEW = curs.Data; % dati registrati alla data di riferimento + Num(nw,1) = NodoRadialLink(nw,m); + [~,rC] = size(DatiNEW); + if rC ~= 1 + % dalla data di riferimento + asseX(:,nw) = asseX(:,nw)-cell2mat(DatiNEW(1,3)); + asseY(:,nw) = asseY(:,nw)-cell2mat(DatiNEW(1,4)); + asseZ(:,nw) = asseZ(:,nw)-cell2mat(DatiNEW(1,5)); + X_RL_Tot(:,nw) = X_RL_Tot-cell2mat(DatiNEW(:,6))+CoordX(nw,1)'; + Y_RL_Tot(:,nw) = Y_RL_Tot-cell2mat(DatiNEW(:,7))+CoordY(nw,1)'; + Z_RL_Tot(:,nw) = Z_RL_Tot-cell2mat(DatiNEW(:,8))+CoordZ(nw,1)'; + RIS_XYZ_Tot(1,n) = (sqrt(asseX(end,n)^2 + asseY(end,n)^2+asseZ(end,n)^2))*1000; + cX_Tot(1,n) = 100*abs(1000*diffX(1,n))/RIS_XYZ_Tot(1,n); + cY_Tot(1,n) = 100*abs(1000*diffY(1,n))/RIS_XYZ_Tot(1,n); + cZ_Tot(1,n) = 100*abs(1000*diffZ(1,n))/RIS_XYZ_Tot(1,n); + else + NODATA(m,1) = 1; + end + end + end + + GI_Rad_XYZ = max(RIS_XYZ_Mese); + ind = find(GI_Rad_XYZ==max(RIS_XYZ_Mese(1,:))); + GI_Rad_Num = Num(ind(1)); + GI_Rad_Date = Date; + + % Cerco eventuali correlazioni con Multibase + NomeFile = strcat('Report',siteID,'-RLvsMPBEL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + Var = 0; + while AAA < rF + check1 = Filetesto(AAA,1); + if check1 == 99999 + AAA = 2; + else + check2 = Filetesto(AAA+1,1); + if check1 == str2num(DTcatena(end-2:end)) + Nodo = Filetesto(AAA+2,1); + Var = 1; + elseif check2 == str2num(DTcatena(end-2:end)) + Nodo = Filetesto(AAA+3,1); + Var = 1; + end + AAA = AAA+4; + end + end + if Var == 1 + % Riabilitare le variabili sotto se vogliamo usare i + % cumulati anzichè i locali +% sX = dX'; +% sTX = cumsum(sX); +% sX = sTX'; +% sY = dY'; +% sTY = cumsum(sY); +% sY = sTY'; +% sZ = dZ'; +% sTZ = cumsum(sZ); +% sZ = sTZ'; + GI_Rad_MPBEL = (sqrt(dX(:,Nodo).^2 + dY(:,Nodo).^2 + dZ(:,Nodo).^2))*1000; % ad ogni rad è associato al massimo un solo multibase + end + + % Cerco eventuali correlazioni con Cir + NomeFile = strcat('Report',siteID,'-TuLvsRL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + Var = 0; + while AAA < rF % Cerco coppie Cir - Rad + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono Rad o non ci sono Cir + AAA = 2; + else + check2 = Filetesto(AAA+1,1); + if check1 == str2num(DTcatena(end-2:end)) % Il Cir è da prendere in considerazione ed è riportato nella prima riga del file + Nodo = Filetesto(AAA+2,1); + Var = 1; + elseif check2 == str2num(DTcatena(end-2:end)) % Il Cir è da prendere in considerazione ed è riportato nella seconda riga del file + Nodo = Filetesto(AAA+3,1); + Var = 1; + end + AAA = AAA+4; + end + end + if Var == 1 + GI_Rad_Cir = (sqrt(dX(:,Nodo).^2 + dZ(:,Nodo).^2))*1000; %Più rad possono associarsi allo stesso cir + end + + % Istogramma spostamenti 3D + figure(1) + [~,nn] = size(RIS_XYZ_Mese(end,:)); + for w = 1:nn + nodi_grafico(1,w) = w; + end + RIS_XYZ = [RIS_XYZ_Mese(end,:)' RIS_XYZ_Tot(end,:)']; + Rad_3D = barh(nodi_grafico,RIS_XYZ); + title('Risultante 3D degli spostamenti locali'); + xlabel('Spostamento [mm]'); + ylabel('Nodo [-]'); + h = gca; + h.XAxis.MinorTick = 'on'; + h.YAxis.MinorTick = 'off'; + Max(1) = max(RIS_XYZ_Mese); + Max(2) = max(RIS_XYZ_Tot); + MAX = max(Max); + in = find(Max == MAX); + if in == 1 + POS = find(RIS_XYZ_Mese == Max(1)); + else + POS = find(RIS_XYZ_Tot == Max(2)); + end + if MAX < 10 % mm + xlim([0 10]); + end + yticks(0:1:nn); + grid on + if POS > rRaL(m)/2 % Legenda in basso a dx + legend('Periodo di riferimento','Intero periodo','Location','southeast'); + else % legenda in alto a dx + legend('Periodo di riferimento','Intero periodo','Location','northeast'); + end + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Rad3D.png')); + saveas(Rad_3D(1),TempName); + ChartRad = Image(TempName); + ChartRad.Style = {HAlign('justify'),ScaleToFit}; + ChartRad_cap = Paragraph(['Fig. ' num2str(FIG) ' - Risultante 3D degli '... + 'spostamenti differenziali locali nello spazio, registrati durante '... + 'il periodo temporale di riferimento e l''intero monitoraggio']); + FIG = FIG+1; + ChartRad_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + %--ENG-- + if activeEN == 1 + figure(11) + [~,nn] = size(RIS_XYZ_Mese(end,:)); + for w = 1:nn + nodi_grafico(1,w) = w; + end + RIS_XYZ = [RIS_XYZ_Mese(end,:)' RIS_XYZ_Tot(end,:)']; + Rad_3D = barh(nodi_grafico,RIS_XYZ); + title('3D Local displacements'); + xlabel('Displacement [mm]'); + ylabel('Node [-]'); + h = gca; + h.XAxis.MinorTick = 'on'; + h.YAxis.MinorTick = 'off'; + Max(1) = max(RIS_XYZ_Mese); + Max(2) = max(RIS_XYZ_Tot); + MAX = max(Max); + in = find(Max == MAX); + if in == 1 + POS = find(RIS_XYZ_Mese == Max(1)); + else + POS = find(RIS_XYZ_Tot == Max(2)); + end + if MAX < 10 % mm + xlim([0 10]); + end + yticks(0:1:nn); + grid on + if POS > rRaL(m)/2 % Legenda in basso a dx + legend('Reference time period','Complete period','Location','southeast'); + else % legenda in alto a dx + legend('Reference time period','Complete period','Location','northeast'); + end + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Rad3D_ENG.png')); + saveas(Rad_3D(1),TempName); + ChartRad_ENG = Image(TempName); + ChartRad_ENG.Style = {HAlign('justify'),ScaleToFit}; + ChartRad_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - 3D local differential '... + 'displacements, measured during the reference and '... + 'the complete monitoring period']); + FIG_ENG = FIG_ENG+1; + ChartRad_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + end + + % --- Sezione - MESE --- + contaS_Mese = 1; + conta0_Mese = 1; + for ris = 1:nn + if RIS_XYZ_Mese(end,ris)> 0.5 + nodiSX(contaS_Mese,1) = CoordX(ris,1); + nodiSZ(contaS_Mese,1) = CoordZ(ris,1); + contaS_Mese = contaS_Mese+1; + else + nodi0X(conta0_Mese,1) = CoordX(ris,1); + nodi0Z(conta0_Mese,1) = CoordZ(ris,1); + conta0_Mese = conta0_Mese+1; + end + end + + % Aggiungo ancora + % --- Geometria Strumento - Mese --- + figure(2) + plot([0; CoordX(:,1)],[0;CoordZ(:,1)],'-','Color','black'); + hold on + if contaS_Mese > 1 + sezC = plot(nodiSX(:,1),nodiSZ(:,1),'o','Color','red'); + set(sezC, 'markerfacecolor', get(sezC, 'color')); + end + hold on + if conta0_Mese > 1 + sez0 = plot(nodi0X(:,1),nodi0Z(:,1),'o','Color','black'); + set(sez0, 'markerfacecolor', get(sez0, 'color')); + end + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + if sign(CoordX(ris,1)) == -1 + Location = 'southeast'; + else + Location = 'southwest'; + end + if contaS_Mese > 1 && conta0_Mese > 1 + legend('Geometria della strumentazione','Nodi con spostamenti','Nodi stabili','Location',Location); + elseif contaS_Mese > 1 && conta0_Mese == 1 + legend('Geometria della strumentazione','Nodi con spostamenti','Location',Location); + elseif contaS_Mese == 1 && conta0_Mese > 1 + legend('Geometria della strumentazione','Nodi stabili','Location',Location); + end + title('Spostamenti locali - periodo di riferimento'); + xlabel('X [m]'); + ylabel('Z [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + h.YAxis.MinorTick = 'on'; + grid off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezRAD-Mese.png')); + saveas(ancora,TempName); + ChartSEZ_Mese = Image(TempName); + ChartSEZ_Mese.Style = {HAlign('center'),Height('6.5cm')}; + + %--ENG-- + if activeEN == 1 + figure(22) + plot([0; CoordX(:,1)],[0;CoordZ(:,1)],'-','Color','black'); + hold on + if contaS_Mese > 1 + sezC = plot(nodiSX(:,1),nodiSZ(:,1),'o','Color','red'); + set(sezC, 'markerfacecolor', get(sezC, 'color')); + end + hold on + if conta0_Mese > 1 + sez0 = plot(nodi0X(:,1),nodi0Z(:,1),'o','Color','black'); + set(sez0, 'markerfacecolor', get(sez0, 'color')); + end + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + if sign(CoordX(ris,1)) == -1 + Location = 'southeast'; + else + Location = 'southwest'; + end + if contaS_Mese > 1 && conta0_Mese > 1 + legend('Array geometry','Nodes showing displacement','Stable nodes','Location',Location); + elseif contaS_Mese > 1 && conta0_Mese == 1 + legend('Array geometry','Nodes showing displacement','Location',Location); + elseif contaS_Mese == 1 && conta0_Mese > 1 + legend('Array geometry','Stable nodes','Location',Location); + end + title('Local Displacements - reference time period'); + xlabel('X [m]'); + ylabel('Z [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + h.YAxis.MinorTick = 'on'; + grid off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezRAD-Mese_ENG.png')); + saveas(ancora,TempName); + ChartSEZ_Mese_ENG = Image(TempName); + ChartSEZ_Mese_ENG.Style = {HAlign('center'),Height('6.5cm')}; + end + + % --- Geometria Strumento - Intero periodo --- + % --- Sezione - TOT --- + contaS_Tot = 1; + conta0_Tot = 1; + contaSX = 1; + contaD = 1; + contaT = 1; + contaA = 1; + contaB = 1; + contaXZ = 1; + contaG = 1; + clear nodi0X + clear nodi0Z + clear nodiSX + clear nodiSZ + for ris = 1:nn % Ho aggiunto l'ancora + if RIS_XYZ_Tot(end,ris)> 0.5 + if cX_Tot(1,ris) > 70 % + if sigX_Tot(1,ris) == 1 % Destra + nodiD_X(contaD,1) = CoordX(ris,1); + nodiD_Z(contaD,1) = CoordZ(ris,1); + contaD = contaD+1; + else % sinistra + nodiS_X(contaSX,1) = CoordX(ris,1); + nodiS_Z(contaSX,1) = CoordZ(ris,1); + contaSX = contaSX+1; + end + elseif cY_Tot(1,ris) > 70 % Trasversale + nodiT_X(contaT,1) = CoordX(ris,1); + nodiT_Z(contaT,1) = CoordZ(ris,1); + contaT = contaT+1; + elseif cZ_Tot(1,ris) > 70 + if sigZ_Tot(1,ris) == 1 % Verso l'alto + nodiA_X(contaA,1) = CoordX(ris,1); + nodiA_Z(contaA,1) = CoordZ(ris,1); + contaA = contaA+1; + else % Verso il basso + nodiB_X(contaB,1) = CoordX(ris,1); + nodiB_Z(contaB,1) = CoordZ(ris,1); + contaB = contaB+1; + end + elseif cX_Tot(1,ris)+cZ_Tot(1,ris) > 70 % 45 gradi circa + nodiXZ_X(contaXZ,1) = CoordX(ris,1); + nodiXZ_Z(contaXZ,1) = CoordZ(ris,1); + contaXZ = contaXZ+1; + else % Moto Generico + nodi_X(contaG,1) = CoordX(ris,1); + nodi_Z(contaG,1) = CoordZ(ris,1); + contaG = contaG+1; + end + nodiSX(contaS_Tot,1) = CoordX(ris,1); + nodiSZ(contaS_Tot,1) = CoordZ(ris,1); + contaS_Tot = contaS_Tot+1; + else % Stabili + nodi0X(conta0_Tot,1) = CoordX(ris,1); + nodi0Z(conta0_Tot,1) = CoordZ(ris,1); + conta0_Tot = conta0_Tot+1; + end + end + + figure(3) + plot([0;CoordX(:,1)],[0;CoordZ(:,1)],'-','Color','black'); + hold on + % Spostamenti generici + if contaG > 1 + sezG = plot(nodi_X(:,1),nodi_Z(:,1),'o','Color','red'); + set(sezG, 'markerfacecolor', get(sezG, 'color')); + end + % Spostamenti Alto + if contaA > 1 + sezA = plot(nodiA_X(:,1),nodiA_Z(:,1),'^','Color',[0.4660 0.6740 0.1880],'MarkerSize' ,7); + set(sezA, 'markerfacecolor', get(sezA, 'color')); + end + % Spostamenti Basso + if contaB > 1 + sezB = plot(nodiB_X(:,1),nodiB_Z(:,1),'v','Color',[0.4660 0.6740 0.1880],'MarkerSize' ,7); + set(sezB, 'markerfacecolor', get(sezB, 'color')); + end + % Spostamenti Destra + if contaD > 1 + sezD = plot(nodiD_X(:,1),nodiD_Z(:,1),'>','Color','blue','MarkerSize' ,7); + set(sezD, 'markerfacecolor', get(sezD, 'color')); + end + % Spostamenti Sinistra + if contaSX > 1 + sezSX = plot(nodiS_X(:,1),nodiS_Z(:,1),'<','Color',[0.3010 0.7450 0.9330],'MarkerSize' ,7); + set(sezSX, 'markerfacecolor', get(sezSX, 'color')); + end + % Spostamenti 45° + if contaXZ > 1 + sezXZ = plot(nodiXZ_X(:,1),nodiXZ_Z(:,1),'x','Color',[0.8500 0.3250 0.0980],'MarkerSize' ,13); + set(sezXZ, 'markerfacecolor', get(sezXZ, 'color')); + end + % Sensori Fermi + if conta0_Tot > 1 + sez0 = plot(nodi0X(:,1),nodi0Z(:,1),'o','Color','black'); + set(sez0, 'markerfacecolor', get(sez0, 'color')); + end + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + if sign(CoordX(ris,1)) == -1 + Location = 'southeast'; + else + Location = 'southwest'; + end + if contaG > 1 && contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaG > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti verso destra',... + 'Spostamenti verso sinistra','Nodi stabili','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaD > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto','Spostamenti in basso',... + 'Spostamenti verso destra','Nodi stabili','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto','Spostamenti in basso',... + 'Spostamenti verso sinistra','Nodi stabili','Location',Location); + elseif contaG > 1 && contaA > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Nodi stabili','Location',Location); + elseif contaG > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Nodi stabili','Location',Location); + elseif contaG > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Spostamenti a 2D',... + 'Nodi stabili','Location',Location); + elseif contaG > 1 && contaA > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Spostamenti a 2D',... + 'Nodi stabili','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto','Spostamenti in basso',... + 'Spostamenti verso sinistra','Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Nodi stabili','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Spostamenti a 2D','Location',Location); + elseif contaG > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Spostamenti a 2D','Nodi stabili',... + 'Location',Location); + elseif contaG > 1 && contaB > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in basso',... + 'Spostamenti verso sinistra','Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaG > 1 && contaB > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaG > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Nodi stabili','Location',Location); + elseif contaG > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Spostamenti a 2D','Location',Location); + elseif contaG > 1 && contaA > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto',... + 'Spostamenti verso sinistra','Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaG > 1 && contaA > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto',... + 'Spostamenti verso destra','Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaG > 1 && contaA > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Nodi stabili','Location',Location); + elseif contaG > 1 && contaA > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Spostamenti a 2D','Location',Location); + elseif contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti in alto','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Spostamenti a 2D',... + 'Nodi stabili','Location',Location); + elseif contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Spostamenti a 2D',... + 'Nodi stabili','Location',Location); + elseif contaA > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti in alto',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Spostamenti a 2D',... + 'Nodi stabili','Location',Location); + elseif contaA > 1 && contaB > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti in alto','Spostamenti in basso',... + 'Spostamenti verso sinistra','Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaA > 1 && contaB > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti in alto','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti in alto','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Nodi stabili','Location',Location); + elseif contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Geometria della strumentazione','Spostamenti in alto','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Spostamenti a 2D','Location',Location); + elseif contaB > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti in basso','Spostamenti verso sinistra',... + 'Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaB > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaB > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Nodi stabili','Location',Location); + elseif contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Geometria della strumentazione','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Spostamenti a 2D','Location',Location); + elseif contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti verso destra','Spostamenti verso sinistra',... + 'Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaG > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti verso sinistra',... + 'Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaG > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti verso destra',... + 'Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaG > 1 && contaB > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in basso','Nodi stabili','Location',Location); + elseif contaG > 1 && contaD > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti verso destra','Nodi stabili','Location',Location); + elseif contaG > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti verso sinistra','Nodi stabili','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto','Spostamenti in basso',... + 'Nodi stabili','Location',Location); + elseif contaG > 1 && contaA > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto','Nodi stabili','Location',Location); + elseif contaG > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti a 2D',... + 'Nodi stabili','Location',Location); + elseif contaG > 1 && contaXZ > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti a 2D','Location',Location); + elseif contaG > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Nodi stabili','Location',Location); + elseif contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti verso destra',... + 'Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti verso destra','Spostamenti verso sinistra',... + 'Nodi stabili','Location',Location); + elseif contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Geometria della strumentazione','Spostamenti verso destra','Spostamenti verso sinistra',... + 'Spostamenti a 2D','Location',Location); + elseif contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti verso sinistra',... + 'Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaSX > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti verso sinistra',... + 'Nodi stabili','Location',Location); + elseif contaSX > 1 && contaXZ > 1 + legend('Geometria della strumentazione','Spostamenti verso sinistra',... + 'Spostamenti a 2D','Location',Location); + elseif contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti a 2D','Nodi stabili','Location',Location); + elseif conta0_Tot > 1 + legend('Geometria della strumentazione','Nodi stabili','Location',Location); + elseif contaG > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Location',Location); + elseif contaA > 1 + legend('Geometria della strumentazione','Spostamenti in alto','Location',Location); + elseif contaB > 1 + legend('Spostamenti in basso','Location',Location); + elseif contaD > 1 + legend('Geometria della strumentazione','Spostamenti verso destra','Location',Location); + elseif contaSX > 1 + legend('Geometria della strumentazione','Spostamenti verso sinistra','Location',Location); + elseif contaXZ > 1 + legend('Geometria della strumentazione','Spostamenti a 2D','Location',Location); + end + + title('Spostamenti locali - intero periodo'); + xlabel('X [m]'); + ylabel('Z [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + h.YAxis.MinorTick = 'on'; + grid off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezRAD-Tot.png')); + saveas(ancora,TempName); + ChartSEZ = Image(TempName); + ChartSEZ.Style = {HAlign('center'),Height('6.5cm')}; + ChartSEZ_cap = Paragraph(['Fig. ' num2str(FIG) ' - Riassunto grafico della '... + 'situazione rilevata dai singoli nodi, con riferimento alla risultante '... + 'del vettore di spostamento 3D differenziale locale, '... + 'registrato durante il periodo temporale di riferimento e l''intero periodo di monitoraggio']); + FIG = FIG+1; + ChartSEZ_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + lot = Table({ChartSEZ_Mese, ChartSEZ}); + lot.Style = {ResizeToFitContents(false), Width('100%')}; + + %--ENG-- + if activeEN == 1 + figure(33) + plot([0;CoordX(:,1)],[0;CoordZ(:,1)],'-','Color','black'); + hold on + % Spostamenti generici + if contaG > 1 + sezG = plot(nodi_X(:,1),nodi_Z(:,1),'o','Color','red'); + set(sezG, 'markerfacecolor', get(sezG, 'color')); + end + % Spostamenti Alto + if contaA > 1 + sezA = plot(nodiA_X(:,1),nodiA_Z(:,1),'^','Color',[0.4660 0.6740 0.1880],'MarkerSize' ,7); + set(sezA, 'markerfacecolor', get(sezA, 'color')); + end + % Spostamenti Basso + if contaB > 1 + sezB = plot(nodiB_X(:,1),nodiB_Z(:,1),'v','Color',[0.4660 0.6740 0.1880],'MarkerSize' ,7); + set(sezB, 'markerfacecolor', get(sezB, 'color')); + end + % Spostamenti Destra + if contaD > 1 + sezD = plot(nodiD_X(:,1),nodiD_Z(:,1),'>','Color','blue','MarkerSize' ,7); + set(sezD, 'markerfacecolor', get(sezD, 'color')); + end + % Spostamenti Sinistra + if contaSX > 1 + sezSX = plot(nodiS_X(:,1),nodiS_Z(:,1),'<','Color',[0.3010 0.7450 0.9330],'MarkerSize' ,7); + set(sezSX, 'markerfacecolor', get(sezSX, 'color')); + end + % Spostamenti 45° + if contaXZ > 1 + sezXZ = plot(nodiXZ_X(:,1),nodiXZ_Z(:,1),'x','Color',[0.8500 0.3250 0.0980],'MarkerSize' ,13); + set(sezXZ, 'markerfacecolor', get(sezXZ, 'color')); + end + % Sensori Fermi + if conta0_Tot > 1 + sez0 = plot(nodi0X(:,1),nodi0Z(:,1),'o','Color','black'); + set(sez0, 'markerfacecolor', get(sez0, 'color')); + end + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + if sign(CoordX(ris,1)) == -1 + Location = 'southeast'; + else + Location = 'southwest'; + end + if contaG > 1 && contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upwards displacements','Downwards displacements',... + 'Rightward displacements','Leftward displacements','2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Rightward displacements',... + 'Leftward displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaD > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upwards displacements','Downwards displacements',... + 'Rightward displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upwards displacements','Downwards displacements',... + 'Leftward displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upwards displacements',... + 'Rightward displacements','Leftward displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Downwards displacements',... + 'Rightward displacements','Leftward displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Downwards displacements',... + 'Rightward displacements','Leftward displacements','2D displacements',... + 'Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upwards displacements',... + 'Rightward displacements','Leftward displacements','2D displacements',... + 'Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upwards displacements','Downwards displacements',... + 'Leftward displacements','2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upwards displacements','Downwards displacements',... + 'Rightward displacements','2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upwards displacements','Downwards displacements',... + 'Rightward displacements','Leftward displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Array geometry','3D displacements','Upwards displacements','Downwards displacements',... + 'Rightward displacements','Leftward displacements','2D displacements','Location',Location); + elseif contaG > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements',... + 'Rightward displacements','Leftward displacements','2D displacements','Stable nodes',... + 'Location',Location); + elseif contaG > 1 && contaB > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Downwards displacements',... + 'Leftward displacements','2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaB > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Downwards displacements',... + 'Rightward displacements','2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Downwards displacements',... + 'Rightward displacements','Leftward displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Array geometry','3D displacements','Downwards displacements',... + 'Rightward displacements','Leftward displacements','2D displacements','Location',Location); + elseif contaG > 1 && contaA > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upwards displacements',... + 'Leftward displacements','2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upwards displacements',... + 'Rightward displacements','2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upwards displacements',... + 'Rightward displacements','Leftward displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Array geometry','3D displacements','Upwards displacements',... + 'Rightward displacements','Leftward displacements','2D displacements','Location',Location); + elseif contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Upwards displacements','Downwards displacements',... + 'Rightward displacements','Leftward displacements','2D displacements',... + 'Stable nodes','Location',Location); + elseif contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Downwards displacements',... + 'Rightward displacements','Leftward displacements','2D displacements',... + 'Stable nodes','Location',Location); + elseif contaA > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Upwards displacements',... + 'Rightward displacements','Leftward displacements','2D displacements',... + 'Stable nodes','Location',Location); + elseif contaA > 1 && contaB > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Upwards displacements','Downwards displacements',... + 'Leftward displacements','2D displacements','Stable nodes','Location',Location); + elseif contaA > 1 && contaB > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Upwards displacements','Downwards displacements',... + 'Rightward displacements','2D displacements','Stable nodes','Location',Location); + elseif contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','Upwards displacements','Downwards displacements',... + 'Rightward displacements','Leftward displacements','Stable nodes','Location',Location); + elseif contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Array geometry','Upwards displacements','Downwards displacements',... + 'Rightward displacements','Leftward displacements','2D displacements','Location',Location); + elseif contaB > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Downwards displacements','Leftward displacements',... + '2D displacements','Stable nodes','Location',Location); + elseif contaB > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Downwards displacements',... + 'Rightward displacements','2D displacements','Stable nodes','Location',Location); + elseif contaB > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','Downwards displacements',... + 'Rightward displacements','Leftward displacements','Stable nodes','Location',Location); + elseif contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Array geometry','Downwards displacements',... + 'Rightward displacements','Leftward displacements','2D displacements','Location',Location); + elseif contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Rightward displacements','Leftward displacements',... + '2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Leftward displacements',... + '2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Rightward displacements',... + '2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaB > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Downwards displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaD > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Rightward displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Leftward displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upwards displacements','Downwards displacements',... + 'Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upwards displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','2D displacements',... + 'Stable nodes','Location',Location); + elseif contaG > 1 && contaXZ > 1 + legend('Array geometry','3D displacements','2D displacements','Location',Location); + elseif contaG > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Stable nodes','Location',Location); + elseif contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Rightward displacements',... + '2D displacements','Stable nodes','Location',Location); + elseif contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','Rightward displacements','Leftward displacements',... + 'Stable nodes','Location',Location); + elseif contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Array geometry','Rightward displacements','Leftward displacements',... + '2D displacements','Location',Location); + elseif contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Leftward displacements',... + '2D displacements','Stable nodes','Location',Location); + elseif contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','Leftward displacements',... + 'Stable nodes','Location',Location); + elseif contaSX > 1 && contaXZ > 1 + legend('Array geometry','Leftward displacements',... + '2D displacements','Location',Location); + elseif contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','2D displacements','Stable nodes','Location',Location); + elseif conta0_Tot > 1 + legend('Array geometry','Stable nodes','Location',Location); + elseif contaG > 1 + legend('Array geometry','3D displacements','Location',Location); + elseif contaA > 1 + legend('Array geometry','Upwards displacements','Location',Location); + elseif contaB > 1 + legend('Downwards displacements','Location',Location); + elseif contaD > 1 + legend('Array geometry','Rightward displacements','Location',Location); + elseif contaSX > 1 + legend('Array geometry','Leftward displacements','Location',Location); + elseif contaXZ > 1 + legend('Array geometry','2D displacements','Location',Location); + end + + title('Local displacements - complete monitoring period'); + xlabel('X [m]'); + ylabel('Z [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + h.YAxis.MinorTick = 'on'; + grid off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezRAD-Tot_ENG.png')); + saveas(ancora,TempName); + ChartSEZ_ENG = Image(TempName); + ChartSEZ_ENG.Style = {HAlign('center'),Height('6.5cm')}; + ChartSEZ_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Graphical summary of '... + 'single nodes behaviour, with reference to 3D local '... + 'differential displacements recorded during the '... + 'reference and the complete monitoring period']); + FIG_ENG = FIG_ENG+1; + ChartSEZ_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + lotEN = Table({ChartSEZ_Mese_ENG, ChartSEZ_ENG}); + lotEN.Style = {ResizeToFitContents(false), Width('100%')}; + end + + sezRAD = Heading3('Radial Link'); + sezRAD.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + RA = Section(); + RA.Title = sezRAD; + % Testi relativi all'ultimo mese + testo1 = Paragraph(['Il grafico riportato di seguito mostra l''entit' char(224) ' '... + 'dei vettori di spostamento differenziale locale 3D, misurati dai sensori Radial Link '... + 'nel periodo temporale di riferimento e nell''intero periodo di monitoraggio. '... + 'Il vettore ' char(232) ' ottenuto come risultante delle componenti nel piano X-Y-Z, '... + 'ovvero larghezza, profondit' char(224) ' ed altezza della sezione. ']); + testo2 = Paragraph(['La figura seguente riassume la situazione registrata dall''Array, con i '... + 'singoli sensori rappresentati sulla geometria di progetto della strumentazione. Nel periodo '... + 'temporale di riferimento, l''analisi degli spostamenti ha evidenziato ' ... + num2str(contaS_Mese-1) ' nodi con spostamenti e ' num2str(conta0_Mese-1) ' nodi stabili. '... + 'Si noti che in questa rappresentazione vengono considerati stabili i nodi caratterizzati '... + 'da uno spostamento con modulo inferiore a 0.5 mm.']); + spazio = Paragraph(''); + testo1.HAlign = 'justify'; + testo2.HAlign = 'justify'; + + add(DT,sezRAD); + add(DT,testo1); + add(DT,ChartRad); + add(DT,ChartRad_cap); + add(DT,testo2); + add(DT,spazio); + add(DT,lot); + add(DT,ChartSEZ_cap); + add(DT,br); + + close(figure(1)); + close(figure(2)); + close(figure(3)); + + if attivaEN == 1 + sezRAD_ENG = Heading3('Radial Link'); + sezRAD_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + RA_ENG = Section(); + RA_ENG.Title = sezRAD; + % Testi relativi all'ultimo mese + testo1 = Paragraph(['The following graph reports the 3D local '... + 'differential displacements measrued by Radial Link sensors '... + 'during the reference and complete monitoring period. '... + 'The 3D displacement vector derives from X-Y-Z displacement components, '... + 'respectively representing length, depth, and height of the section. ']); + testo2 = Paragraph(['The following figure summarized the situation recorded by the Array, '... + 'representing each sensor on the instrumentation non-deformed geometry. During the '... + 'reference time period, the Rad Array presented ' ... + num2str(contaS_Mese-1) ' nodes showing displacements and ' num2str(conta0_Mese-1) ' stable nodes. '... + 'In this specific representation, nodes featuring displacement values less than 0.5 mm '... + 'are assumed to be stable.']); + spazio = Paragraph(''); + testo1.HAlign = 'justify'; + testo2.HAlign = 'justify'; + + add(DT_ENG,sezRAD_ENG); + add(DT_ENG,testo1); + add(DT_ENG,ChartRad_ENG); + add(DT_ENG,ChartRad_ENG_cap); + add(DT_ENG,testo2); + add(DT_ENG,spazio); + add(DT_ENG,lotEN); + add(DT_ENG,ChartSEZ_ENG_cap); + add(DT_ENG,br); + + close(figure(11)); + close(figure(22)); + close(figure(33)); + end + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + check = 1; + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT,testo); + end + end + end + end +end + +text = 'report_RaL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_RaL_ENG.m b/ATD/report_RaL_ENG.m new file mode 100755 index 0000000..55d1c24 --- /dev/null +++ b/ATD/report_RaL_ENG.m @@ -0,0 +1,662 @@ +function [GI_Rad_XYZ,GI_Rad_Num,GI_Rad_MPBEL,GI_Rad_Cir,GI_Rad_Date,ATTIVA,FIG] = report_RaL_ENG(... + DTcatena,rRaL,m,NodoRadialLink,toolrif,unitrif,datarif,firstdata_num,Font_caption,... + Font_tools,siteID,DT,FIG,br,colonna2,colonna2bis,status,ATTIVA,conn,FileName) + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +GI_Rad_XYZ = []; +GI_Rad_Num = []; +GI_Rad_MPBEL = []; +GI_Rad_Cir = []; +GI_Rad_Date = []; + +check = 0; +while check == 0 + if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('Array not installed or inactive.'); + add(DT,testo); + end + check = 1; + elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoring completed. Please log into the web-based platoform '... + 'to access the complete dataset.']); + add(DT,testo); + end + check = 1; + else + NODATA(m,1) = 0; + date = datestr(datenum(colonna2{m+1,1},'dd-mm-yyyy'),'yyyy-mm-dd'); % data riferimento definita sul sito + % posizione di progetto dei nodi + comando = ['select EventDate, EventTime, X, Y, Z from ElabDataView where EventDate = ''' ... + date ''' and ToolNameID = ''' char(toolrif) ''' and UnitName = ''' char(unitrif) ... + ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + SezioneXYZ = curs.Data; + Datasez = SezioneXYZ(1,1); + Orasez = SezioneXYZ(1,2); + [rz,~] = size(SezioneXYZ); + scrivi = 1; + for rr = 1:rz + if strcmp(SezioneXYZ(rr,1),Datasez)==1 && strcmp(SezioneXYZ(rr,2),Orasez) ==1 + CoordX(scrivi,1) = cell2mat(SezioneXYZ(rr,3)); + CoordY(scrivi,1) = cell2mat(SezioneXYZ(rr,4)); + CoordZ(scrivi,1) = cell2mat(SezioneXYZ(rr,5)); + scrivi = scrivi+1; + end + end + + diffX = zeros(1,rRaL(m,1)); + diffY = zeros(1,rRaL(m,1)); + diffZ = zeros(1,rRaL(m,1)); + RIS_XYZ_Mese = zeros(1,rRaL(m,1)); + RIS_XYZ_Tot = zeros(1,rRaL(m,1)); + Num = zeros(rRaL(m,1),1); + for n = 1:rRaL(m,1) + NodeNum = num2str(NodoRadialLink(n,m)); + % dati del mese + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z '... + '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; + Num(n,1) = NodoRadialLink(n,m); + + [rD,rC] = size(Dati); + if rC ~= 1 + T = [cell2mat(Dati(:,1)) repmat(' ', [rD,1]) cell2mat(Dati(:,2))]; + Date = datenum(T); % Data + if n == 1 % Il primo lo scrivo e creo la variabile di controllo + else + [rS,~] = size(asseX); + if rD ~= rS + NODATA(m,1) = 1; + check = 0; + break + else + check = 1; + end + end + + % spostamenti dei nodi dall'inizio + asseX(:,n) = cell2mat(Dati(:,3)); + asseY(:,n) = cell2mat(Dati(:,4)); + asseZ(:,n) = cell2mat(Dati(:,5)); + X_RL_Tot(:,n) = cell2mat(Dati(:,6)); + Y_RL_Tot(:,n) = cell2mat(Dati(:,7)); + Z_RL_Tot(:,n) = cell2mat(Dati(:,8)); + X_RL_Mese(:,n) = X_RL_Tot(:,n)-X_RL_Tot(1,n)+CoordX(n,1)'; + Y_RL_Mese(:,n) = Y_RL_Tot(:,n)-Y_RL_Tot(1,n)+CoordY(n,1)'; + Z_RL_Mese(:,n) = Z_RL_Tot(:,n)-Z_RL_Tot(1,n)+CoordZ(n,1)'; + diffX(1,n) = asseX(end,n)-asseX(1,n); + diffY(1,n) = asseY(end,n)-asseY(1,n); + diffZ(1,n) = asseZ(end,n)-asseZ(1,n); + dX(:,n) = asseX(:,n)-asseX(:,1); + dY(:,n) = asseY(:,n)-asseY(:,1); + dZ(:,n) = asseZ(:,n)-asseZ(:,1); + + RIS_XYZ_Mese(1,n) = (sqrt(diffX(1,n)^2 + diffY(1,n)^2+diffZ(1,n)^2))*1000; + cX_Mese(1,n) = 100*abs(1000*diffX(1,n))/RIS_XYZ_Mese(1,n); + cY_Mese(1,n) = 100*abs(1000*diffY(1,n))/RIS_XYZ_Mese(1,n); + cZ_Mese(1,n) = 100*abs(1000*diffZ(1,n))/RIS_XYZ_Mese(1,n); + RIS_XYZ_Tot(1,n) = (sqrt(asseX(end,n)^2 + asseY(end,n)^2+asseZ(end,n)^2))*1000; + cX_Tot(1,n) = 100*abs(1000*asseX(1,n))/RIS_XYZ_Tot(1,n); + sigX_Tot(1,n) = sign(asseX(1,n)); + cY_Tot(1,n) = 100*abs(1000*asseY(1,n))/RIS_XYZ_Tot(1,n); + sigY_Tot(1,n) = sign(asseY(1,n)); + cZ_Tot(1,n) = 100*abs(1000*asseZ(1,n))/RIS_XYZ_Tot(1,n); + sigZ_Tot(1,n) = sign(asseZ(1,n)); + else + NODATA(m,1) = 1; + check = 1; + end + end + + if NODATA(m,1) == 0 + if strcmp(colonna2bis(m+1,1),colonna2(m+1,1)) == 0 % data zero diversa data riferimento + clear RIS_XYZ_Tot + datarifNEW = datestr(firstdata_num{m+1,1},'yyyy-mm-dd'); % data riferimento definita sul sito + for nw = 1:rRaL(m,1) + NodeNum = num2str(NodoRadialLink(nw,m)); + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, '... + 'from ElabDataView where EventDate = ''' datarifNEW ''' and ToolNameID = ''' char(toolrif) ... + ''' and UnitName = ''' char(unitrif) ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DatiNEW = curs.Data; % dati registrati alla data di riferimento + Num(nw,1) = NodoRadialLink(nw,m); + [~,rC] = size(DatiNEW); + if rC ~= 1 + % dalla data di riferimento + asseX(:,nw) = asseX(:,nw)-cell2mat(DatiNEW(1,3)); + asseY(:,nw) = asseY(:,nw)-cell2mat(DatiNEW(1,4)); + asseZ(:,nw) = asseZ(:,nw)-cell2mat(DatiNEW(1,5)); + X_RL_Tot(:,nw) = X_RL_Tot-cell2mat(DatiNEW(:,6))+CoordX(nw,1)'; + Y_RL_Tot(:,nw) = Y_RL_Tot-cell2mat(DatiNEW(:,7))+CoordY(nw,1)'; + Z_RL_Tot(:,nw) = Z_RL_Tot-cell2mat(DatiNEW(:,8))+CoordZ(nw,1)'; + RIS_XYZ_Tot(1,n) = (sqrt(asseX(end,n)^2 + asseY(end,n)^2+asseZ(end,n)^2))*1000; + cX_Tot(1,n) = 100*abs(1000*diffX(1,n))/RIS_XYZ_Tot(1,n); + cY_Tot(1,n) = 100*abs(1000*diffY(1,n))/RIS_XYZ_Tot(1,n); + cZ_Tot(1,n) = 100*abs(1000*diffZ(1,n))/RIS_XYZ_Tot(1,n); + else + NODATA(m,1) = 1; + end + end + end + + GI_Rad_XYZ = max(RIS_XYZ_Mese); + ind = find(GI_Rad_XYZ==max(RIS_XYZ_Mese(1,:))); + GI_Rad_Num = Num(ind(1)); + GI_Rad_Date = Date; + + % Cerco eventuali correlazioni con Multibase + NomeFile = strcat('Report',siteID,'-RLvsMPBEL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + Var = 0; + while AAA < rF + check1 = Filetesto(AAA,1); + if check1 == 99999 + AAA = 2; + else + check2 = Filetesto(AAA+1,1); + if check1 == str2num(DTcatena(end-2:end)) + Nodo = Filetesto(AAA+2,1); + Var = 1; + elseif check2 == str2num(DTcatena(end-2:end)) + Nodo = Filetesto(AAA+3,1); + Var = 1; + end + AAA = AAA+4; + end + end + if Var == 1 + % Riabilitare le variabili sotto se vogliamo usare i + % cumulati anzichè i locali +% sX = dX'; +% sTX = cumsum(sX); +% sX = sTX'; +% sY = dY'; +% sTY = cumsum(sY); +% sY = sTY'; +% sZ = dZ'; +% sTZ = cumsum(sZ); +% sZ = sTZ'; + GI_Rad_MPBEL = (sqrt(dX(:,Nodo).^2 + dY(:,Nodo).^2 + dZ(:,Nodo).^2))*1000; % ad ogni rad è associato al massimo un solo multibase + end + + % Cerco eventuali correlazioni con Cir + NomeFile = strcat('Report',siteID,'-TuLvsRL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + Var = 0; + while AAA < rF % Cerco coppie Cir - Rad + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono Rad o non ci sono Cir + AAA = 2; + else + check2 = Filetesto(AAA+1,1); + if check1 == str2num(DTcatena(end-2:end)) % Il Cir è da prendere in considerazione ed è riportato nella prima riga del file + Nodo = Filetesto(AAA+2,1); + Var = 1; + elseif check2 == str2num(DTcatena(end-2:end)) % Il Cir è da prendere in considerazione ed è riportato nella seconda riga del file + Nodo = Filetesto(AAA+3,1); + Var = 1; + end + AAA = AAA+4; + end + end + if Var == 1 + GI_Rad_Cir = (sqrt(dX(:,Nodo).^2 + dZ(:,Nodo).^2))*1000; %Più rad possono associarsi allo stesso cir + end + + % Istogramma 3D displacements + figure(1) + [~,nn] = size(RIS_XYZ_Mese(end,:)); + for w = 1:nn + nodi_grafico(1,w) = w; + end + RIS_XYZ = [RIS_XYZ_Mese(end,:)' RIS_XYZ_Tot(end,:)']; + Rad_3D = barh(nodi_grafico,RIS_XYZ); + title('3D Local displacements'); + xlabel('Displacement [mm]'); + ylabel('Node [-]'); + h = gca; + h.XAxis.MinorTick = 'on'; + h.YAxis.MinorTick = 'off'; + Max(1) = max(RIS_XYZ_Mese); + Max(2) = max(RIS_XYZ_Tot); + MAX = max(Max); + in = find(Max == MAX); + if in == 1 + POS = find(RIS_XYZ_Mese == Max(1)); + else + POS = find(RIS_XYZ_Tot == Max(2)); + end + if MAX < 10 % mm + xlim([0 10]); + end + yticks(0:1:nn); + grid on + if POS > rRaL(m)/2 % Legenda in basso a dx + legend('Reference time period','Complete monitoring period','Location','southeast'); + else % legenda in alto a dx + legend('Reference time period','Complete monitoring period','Location','northeast'); + end + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Rad3D_ENG.png')); + saveas(Rad_3D(1),TempName); + ChartRad = Image(TempName); + ChartRad.Style = {HAlign('justify'),ScaleToFit}; + ChartRad_cap = Paragraph(['Fig. ' num2str(FIG) ' - 3D local differential '... + 'displacements recorded by the 3D MEMS sensor during the reference time period '... + 'and the complete monitoring period']); + FIG = FIG+1; + ChartRad_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + % --- Sezione - MESE --- + contaS_Mese = 1; + conta0_Mese = 1; + for ris = 1:nn + if RIS_XYZ_Mese(end,ris)> 0.5 + nodiSX(contaS_Mese,1) = CoordX(ris,1); + nodiSZ(contaS_Mese,1) = CoordZ(ris,1); + contaS_Mese = contaS_Mese+1; + else + nodi0X(conta0_Mese,1) = CoordX(ris,1); + nodi0Z(conta0_Mese,1) = CoordZ(ris,1); + conta0_Mese = conta0_Mese+1; + end + end + + % Aggiungo ancora + % --- Geometria Strumento - Mese --- + figure(2) + plot([0; CoordX(:,1)],[0;CoordZ(:,1)],'-','Color','black'); + hold on + if contaS_Mese > 1 + sezC = plot(nodiSX(:,1),nodiSZ(:,1),'o','Color','red'); + set(sezC, 'markerfacecolor', get(sezC, 'color')); + end + hold on + if conta0_Mese > 1 + sez0 = plot(nodi0X(:,1),nodi0Z(:,1),'o','Color','black'); + set(sez0, 'markerfacecolor', get(sez0, 'color')); + end + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + if sign(CoordX(ris,1)) == -1 + Location = 'southeast'; + else + Location = 'southwest'; + end + if contaS_Mese > 1 && conta0_Mese > 1 + legend('Array geometry','Moving nodes','Stable nodes','Location',Location); + elseif contaS_Mese > 1 && conta0_Mese == 1 + legend('Array geometry','Moving nodes','Location',Location); + elseif contaS_Mese == 1 && conta0_Mese > 1 + legend('Array geometry','Stable nodes','Location',Location); + end + title('Local displacements - reference time priod'); + xlabel('X [m]'); + ylabel('Z [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + h.YAxis.MinorTick = 'on'; + grid off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezRAD-Mese_ENG.png')); + saveas(ancora,TempName); + ChartSEZ_Mese = Image(TempName); + ChartSEZ_Mese.Style = {HAlign('center'),Height('6.5cm')}; + + % --- Geometria Strumento - Intero periodo --- + % --- Sezione - TOT --- + contaS_Tot = 1; + conta0_Tot = 1; + contaSX = 1; + contaD = 1; + contaT = 1; + contaA = 1; + contaB = 1; + contaXZ = 1; + contaG = 1; + clear nodi0X + clear nodi0Z + clear nodiSX + clear nodiSZ + for ris = 1:nn % Ho aggiunto l'ancora + if RIS_XYZ_Tot(end,ris)> 0.5 + if cX_Tot(1,ris) > 70 % + if sigX_Tot(1,ris) == 1 % Destra + nodiD_X(contaD,1) = CoordX(ris,1); + nodiD_Z(contaD,1) = CoordZ(ris,1); + contaD = contaD+1; + else % sinistra + nodiS_X(contaSX,1) = CoordX(ris,1); + nodiS_Z(contaSX,1) = CoordZ(ris,1); + contaSX = contaSX+1; + end + elseif cY_Tot(1,ris) > 70 % Trasversale + nodiT_X(contaT,1) = CoordX(ris,1); + nodiT_Z(contaT,1) = CoordZ(ris,1); + contaT = contaT+1; + elseif cZ_Tot(1,ris) > 70 + if sigZ_Tot(1,ris) == 1 % Verso l'alto + nodiA_X(contaA,1) = CoordX(ris,1); + nodiA_Z(contaA,1) = CoordZ(ris,1); + contaA = contaA+1; + else % Verso il basso + nodiB_X(contaB,1) = CoordX(ris,1); + nodiB_Z(contaB,1) = CoordZ(ris,1); + contaB = contaB+1; + end + elseif cX_Tot(1,ris)+cZ_Tot(1,ris) > 70 % 45 gradi circa + nodiXZ_X(contaXZ,1) = CoordX(ris,1); + nodiXZ_Z(contaXZ,1) = CoordZ(ris,1); + contaXZ = contaXZ+1; + else % Moto Generico + nodi_X(contaG,1) = CoordX(ris,1); + nodi_Z(contaG,1) = CoordZ(ris,1); + contaG = contaG+1; + end + nodiSX(contaS_Tot,1) = CoordX(ris,1); + nodiSZ(contaS_Tot,1) = CoordZ(ris,1); + contaS_Tot = contaS_Tot+1; + else % Stabili + nodi0X(conta0_Tot,1) = CoordX(ris,1); + nodi0Z(conta0_Tot,1) = CoordZ(ris,1); + conta0_Tot = conta0_Tot+1; + end + end + figure(3) + plot([0;CoordX(:,1)],[0;CoordZ(:,1)],'-','Color','black'); + hold on + % Spostamenti generici + if contaG > 1 + sezG = plot(nodi_X(:,1),nodi_Z(:,1),'o','Color','red'); + set(sezG, 'markerfacecolor', get(sezG, 'color')); + end + % Spostamenti Alto + if contaA > 1 + sezA = plot(nodiA_X(:,1),nodiA_Z(:,1),'^','Color',[0.4660 0.6740 0.1880],'MarkerSize' ,7); + set(sezA, 'markerfacecolor', get(sezA, 'color')); + end + % Spostamenti Basso + if contaB > 1 + sezB = plot(nodiB_X(:,1),nodiB_Z(:,1),'v','Color',[0.4660 0.6740 0.1880],'MarkerSize' ,7); + set(sezB, 'markerfacecolor', get(sezB, 'color')); + end + % Spostamenti Destra + if contaD > 1 + sezD = plot(nodiD_X(:,1),nodiD_Z(:,1),'>','Color','blue','MarkerSize' ,7); + set(sezD, 'markerfacecolor', get(sezD, 'color')); + end + % Spostamenti Sinistra + if contaSX > 1 + sezSX = plot(nodiS_X(:,1),nodiS_Z(:,1),'<','Color',[0.3010 0.7450 0.9330],'MarkerSize' ,7); + set(sezSX, 'markerfacecolor', get(sezSX, 'color')); + end + % Spostamenti 45° + if contaXZ > 1 + sezXZ = plot(nodiXZ_X(:,1),nodiXZ_Z(:,1),'x','Color',[0.8500 0.3250 0.0980],'MarkerSize' ,13); + set(sezXZ, 'markerfacecolor', get(sezXZ, 'color')); + end + % Sensori Fermi + if conta0_Tot > 1 + sez0 = plot(nodi0X(:,1),nodi0Z(:,1),'o','Color','black'); + set(sez0, 'markerfacecolor', get(sez0, 'color')); + end + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + if sign(CoordX(ris,1)) == -1 + Location = 'southeast'; + else + Location = 'southwest'; + end + if contaG > 1 && contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upward displacements','Downward displacements',... + 'Right direction shift','Left direction shift','2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Right direction shift',... + 'Left direction shift','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaD > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upward displacements','Downward displacements',... + 'Right direction shift','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upward displacements','Downward displacements',... + 'Left direction shift','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upward displacements',... + 'Right direction shift','Left direction shift','Stable nodes','Location',Location); + elseif contaG > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Downward displacements',... + 'Right direction shift','Left direction shift','Stable nodes','Location',Location); + elseif contaG > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Downward displacements',... + 'Right direction shift','Left direction shift','2D displacements',... + 'Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upward displacements',... + 'Right direction shift','Left direction shift','2D displacements',... + 'Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upward displacements','Downward displacements',... + 'Left direction shift','2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upward displacements','Downward displacements',... + 'Right direction shift','2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upward displacements','Downward displacements',... + 'Right direction shift','Left direction shift','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Array geometry','3D displacements','Upward displacements','Downward displacements',... + 'Right direction shift','Left direction shift','2D displacements','Location',Location); + elseif contaG > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements',... + 'Right direction shift','Left direction shift','2D displacements','Stable nodes',... + 'Location',Location); + elseif contaG > 1 && contaB > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Downward displacements',... + 'Left direction shift','2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaB > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Downward displacements',... + 'Right direction shift','2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Downward displacements',... + 'Right direction shift','Left direction shift','Stable nodes','Location',Location); + elseif contaG > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Array geometry','3D displacements','Downward displacements',... + 'Right direction shift','Left direction shift','2D displacements','Location',Location); + elseif contaG > 1 && contaA > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upward displacements',... + 'Left direction shift','2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upward displacements',... + 'Right direction shift','2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upward displacements',... + 'Right direction shift','Left direction shift','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Array geometry','3D displacements','Upward displacements',... + 'Right direction shift','Left direction shift','2D displacements','Location',Location); + elseif contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Upward displacements','Downward displacements',... + 'Right direction shift','Left direction shift','2D displacements',... + 'Stable nodes','Location',Location); + elseif contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Downward displacements',... + 'Right direction shift','Left direction shift','2D displacements',... + 'Stable nodes','Location',Location); + elseif contaA > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Upward displacements',... + 'Right direction shift','Left direction shift','2D displacements',... + 'Stable nodes','Location',Location); + elseif contaA > 1 && contaB > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Upward displacements','Downward displacements',... + 'Left direction shift','2D displacements','Stable nodes','Location',Location); + elseif contaA > 1 && contaB > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Upward displacements','Downward displacements',... + 'Right direction shift','2D displacements','Stable nodes','Location',Location); + elseif contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','Upward displacements','Downward displacements',... + 'Right direction shift','Left direction shift','Stable nodes','Location',Location); + elseif contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Array geometry','Upward displacements','Downward displacements',... + 'Right direction shift','Left direction shift','2D displacements','Location',Location); + elseif contaB > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Downward displacements','Left direction shift',... + '2D displacements','Stable nodes','Location',Location); + elseif contaB > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Downward displacements',... + 'Right direction shift','2D displacements','Stable nodes','Location',Location); + elseif contaB > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','Downward displacements',... + 'Right direction shift','Left direction shift','Stable nodes','Location',Location); + elseif contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Array geometry','Downward displacements',... + 'Right direction shift','Left direction shift','2D displacements','Location',Location); + elseif contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Right direction shift','Left direction shift',... + '2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Left direction shift',... + '2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Right direction shift',... + '2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaB > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Downward displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaD > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Right direction shift','Stable nodes','Location',Location); + elseif contaG > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Left direction shift','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upward displacements','Downward displacements',... + 'Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upward displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','2D displacements',... + 'Stable nodes','Location',Location); + elseif contaG > 1 && contaXZ > 1 + legend('Array geometry','3D displacements','2D displacements','Location',Location); + elseif contaG > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Stable nodes','Location',Location); + elseif contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Right direction shift',... + '2D displacements','Stable nodes','Location',Location); + elseif contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','Right direction shift','Left direction shift',... + 'Stable nodes','Location',Location); + elseif contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Array geometry','Right direction shift','Left direction shift',... + '2D displacements','Location',Location); + elseif contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Left direction shift',... + '2D displacements','Stable nodes','Location',Location); + elseif contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','Left direction shift',... + 'Stable nodes','Location',Location); + elseif contaSX > 1 && contaXZ > 1 + legend('Array geometry','Left direction shift',... + '2D displacements','Location',Location); + elseif contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','2D displacements','Stable nodes','Location',Location); + elseif conta0_Tot > 1 + legend('Array geometry','Stable nodes','Location',Location); + elseif contaG > 1 + legend('Array geometry','3D displacements','Location',Location); + elseif contaA > 1 + legend('Array geometry','Upward displacements','Location',Location); + elseif contaB > 1 + legend('Downward displacements','Location',Location); + elseif contaD > 1 + legend('Array geometry','Right direction shift','Location',Location); + elseif contaSX > 1 + legend('Array geometry','Left direction shift','Location',Location); + elseif contaXZ > 1 + legend('Array geometry','2D displacements','Location',Location); + end + + title('Local displacemets - complete monitoring period'); + xlabel('X [m]'); + ylabel('Z [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + h.YAxis.MinorTick = 'on'; + grid off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezRAD-Tot_ENG.png')); + saveas(ancora,TempName); + ChartSEZ = Image(TempName); + ChartSEZ.Style = {HAlign('center'),Height('6.5cm')}; + ChartSEZ_cap = Paragraph(['Fig. ' num2str(FIG) ' - Graphical illsutration '... + 'of each single node behaviour, based on the 3D local differential displacement vector, recorded '... + 'during the reference time period and the complete monitoring period']); + + FIG = FIG+1; + ChartSEZ_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + lot = Table({ChartSEZ_Mese, ChartSEZ}); + lot.Style = {ResizeToFitContents(false), Width('100%')}; + + sezRAD = Heading3('Radial Link'); + sezRAD.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + RA = Section(); + RA.Title = sezRAD; + % Testi relativi all'ultimo mese + testo1 = Paragraph(['The following graph presents the 3D local differential displacement vectors '... + 'recorded by Radial Links during the reference time period and the complete monitoring period. '... + 'The 3D vector is computed as a resultant of X-Y-Z component vectors, corresponding to width, depth and height '... + 'of the monitored section, respectively.']); + testo2 = Paragraph(['The corresponding figure summarizes the behaviour of the Array, '... + 'by representing each single node on the original configuration of the tool. During the '... + 'reference time period, the analysis highlighted ' ... + num2str(contaS_Mese-1) ' nodes featuring displacements and ' num2str(conta0_Mese-1) ' stable nodes. '... + 'In this specific representation, nodes characterized by displacement values less than 0.5 mm '... + 'are assumed as stable']); + + spazio = Paragraph(''); + testo1.HAlign = 'justify'; + testo2.HAlign = 'justify'; + + add(DT,sezRAD); + add(DT,testo1); + add(DT,ChartRad); + add(DT,ChartRad_cap); + add(DT,testo2); + add(DT,spazio); + add(DT,lot); + add(DT,ChartSEZ_cap); + add(DT,br); + + close(figure(1)); + close(figure(2)); + close(figure(3)); + else + if ATTIVA == 1 + testo = Paragraph('No data available for the reference time period.'); + ATTIVA = 0; + add(DT,testo); + check = 1; + end + end + end +end + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_RaL_ENG function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_TL.m b/ATD/report_TL.m new file mode 100755 index 0000000..369fdc5 --- /dev/null +++ b/ATD/report_TL.m @@ -0,0 +1,555 @@ +function [GI_MaxDispMESE,GI_DateTL,GI_MaxDispProf,ATTIVA,FIG,FIG_ENG] = report_TL(... + rTL,rTLHR,m,NodoTiltLink,toolrif,unitrif,datarif,firstdata_num,... + Font_caption,Font_tools,siteID,toolrifID,DT,DT_ENG,FIG,FIG_ENG,br,... + colonna2,colonna2bis,status,ATTIVA,activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_TL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +NODATA(m,1) = 0; +GI_MaxDispMESE = []; +GI_DateTL = []; +GI_MaxDispProf = []; +check = 0; +while check == 0 + if status(m,1) == 1 + if ATTIVA == 1 + testo = Paragraph('Catena non ancora installata o inattiva.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array not installed or inactive.'); + add(DT_ENG,testo); + end + end + check = 1; + 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 + check = 1; + else + for n = 1:rTL(m,1) + NodeNum = num2str(NodoTiltLink(n,m)); + comando = ['select EventDate, EventTime, HShift_local, HShift, NodeDepth, XShift, YShift, X, Y, HShiftDir 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 + if n == 1 % Il primo lo scrivo e creo la variabile di controllo + else + [rS,~] = size(Spost_local); + if rD ~= rS + NODATA(m,1) = 2; + check = 0; + break + else + check = 1; + end + end + % dall'inizio + Spost_local(:,n) = cell2mat((Dati(:,3)))*1000; % Loc 2D + Spost(:,n) = (cell2mat(Dati(:,4)))*1000; % Cum 2D + Prof(:,n) = -(cell2mat(Dati(1,5))); % Profondità + % Locali ultimo mese + Spost_Local_MeseX(:,n) = cell2mat(Dati(:,6)); % Loc X ultimo mese + Spost_Local_MeseY(:,n) = cell2mat(Dati(:,7)); % Loc Y ultimo mese + diffMeseX_Local(1,n) = Spost_Local_MeseX(end,n)-Spost_Local_MeseX(1,n); + diffMeseY_Local(1,n) = Spost_Local_MeseY(end,n)-Spost_Local_MeseY(1,n); + DispMese_Local(1,n) = sqrt(diffMeseX_Local(1,n)^2 + diffMeseY_Local(1,n)^2)*1000; + % Cumulati ultimo mese + Spost_MeseX(:,n) = cell2mat(Dati(:,8)); % Cum X ultimo mese + Spost_MeseY(:,n) = cell2mat(Dati(:,9)); % Cum Y ultimo mese + diffMeseX(1,n) = Spost_MeseX(end,n)-Spost_MeseX(1,n); + diffMeseY(1,n) = Spost_MeseY(end,n)-Spost_MeseY(1,n); + DispMese(1,n) = sqrt(diffMeseX(1,n)^2 + diffMeseY(1,n)^2)*1000; + Azim(:,n) = cell2mat(Dati(:,10)); % Azimuth totale + else + NODATA(m,1) = 1; + check = 1; + end + end + if NODATA(m,1) == 0 + if strcmp(colonna2bis(m+1,1),colonna2(m+1,1)) == 0 % data zero diversa data riferimento + clear Spost; + clear Spost_local; + clear Azimuth; + datarifNEW = datestr(firstdata_num{m+1,1},'yyyy-mm-dd'); % data riferimento definita sul sito + for nw = 1:rTL(m,1) + NodeNum = num2str(NodoTiltLink(nw,m)); + comando = ['select EventDate, EventTime, HShift_local, HShift, NodeDepth, XShift, YShift, X, Y, HShiftDir '... + 'from ElabDataView where EventDate = ''' datarifNEW ''' and ToolNameID = ''' char(toolrif) ... + ''' and UnitName = ''' char(unitrif) ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DatiNEW = curs.Data; % dati registrati alla data di riferimento + [~,rC] = size(DatiNEW); + if rC ~= 1 + % dalla data di riferimento + Spost_Local_X_RIF(:,nw) = cell2mat(DatiNEW(:,6)); %Loc X data rif + Spost_Local_Y_RIF(:,nw) = cell2mat(DatiNEW(:,7)); %Loc Y data rif + diffX_Local_RIF(1,nw) = Spost_Local_MeseX(end,nw)-Spost_Local_X_RIF(1,nw); + diffY_Local_RIF(1,nw) = Spost_Local_MeseY(end,nw)-Spost_Local_Y_RIF(1,nw); + Spost_local(1,nw) = sqrt(diffX_Local_RIF(1,nw)^2 + diffY_Local_RIF(1,nw)^2)*1000; + + Spost_X_RIF(:,nw) =cell2mat(DatiNEW(:,8)); % Cum X data rif + Spost_Y_RIF(:,nw) =cell2mat(DatiNEW(:,9)); % Cum Y data rif + diffX_RIF(1,nw) = Spost_MeseX(end,nw)-Spost_X_RIF(1,nw); + diffY_RIF(1,nw) = Spost_MeseY(end,nw)-Spost_Y_RIF(1,nw); + Spost(1,nw) = sqrt(diffX_RIF(1,nw)^2 + diffY_RIF(1,nw)^2)*1000; + + azim(1,nw) = (acos(abs(diffX_RIF(1,nw)*1000)/Spost(1,nw)))*180/pi(); % Angolo Teta in gradi 0° - 90° + segnoNS = sign(diffX_RIF(1,nw)); + segnoEO = sign(diffY_RIF(1,nw)); + % L'azimuth si calcola con NS = 0, positivo in senso orario + % (90° = Est) + if segnoNS == 1 && segnoEO == 1 % quadrante 1 + Azimuth(1,nw) = azim(1,nw); % Teta lo tengo come è (1 quadrante) + elseif segnoNS == -1 && segnoEO == 1 % quadrante 2 + Azimuth(1,nw) = 180 - azim(1,nw); % 180-teta + elseif segnoNS == -1 && segnoEO == -1 % quadrante 3 + Azimuth(1,nw) = 180 + azim(1,nw); % 180+teta + elseif segnoNS == 1 && segnoEO == -1 % quadrante 4 + Azimuth(1,nw) = 360 - azim(1,nw); % 360-teta + elseif segnoNS == 0 && segnoEO == -1 % 270° + Azimuth(1,nw) = 270; + elseif segnoNS == -1 && segnoEO == 0 % 180° + Azimuth(1,nw) = 180; + elseif segnoNS == 0 && segnoEO == 1 % 90° + Azimuth(1,nw) = 90; + elseif segnoNS == 1 && segnoEO == 0 % 0° + Azimuth(1,nw) = 0; + else % non c'è nessuno spostamento da nessuna parte + if nw == 1 + Azimuth(1,nw) = 0; + else + Azimuth(1,nw) = Azimuth(1,nw-1); + end + end + Azimuth(1,nw) = real(Azimuth(1,nw)); + else + NODATA(m,1) = 1; + end + end + % Approssimo gli spostamenti al decimo di millimetro + conv = Spost*10; + conv = round(conv); + Spost = conv/10; + end + + MaxDisp = max(Spost_local(end,:)); + Index = find(Spost_local(end,:) == MaxDisp); + MaxDispProf = Prof(1,Index(1)); + + MaxDispMESE = max(DispMese_Local(end,:)); + IndexMESE = find(DispMese_Local(end,:) == MaxDispMESE); + MaxDispProfMESE = Prof(1,IndexMESE(1)); + + % aggiungo ancora + comando = ['select nodetype_id, depth, num from nodes where tool_id = ''' num2str(cell2mat(toolrifID)) ... + ''' and nodetype_id = 9 order by num']; + Anc = fetch(conn,comando); + ProfAnc = -(cell2mat((Anc(:,2)))); + Prof = [ProfAnc Prof]; + [rt,~] = size(Spost_local); + ancoraTL = zeros(rt,1); + Spost_local = [ancoraTL Spost_local]; + Spost = [ancoraTL Spost]; + DispMese_Local = [0 DispMese_Local]; + DispMese = [0 DispMese]; + + % per grafici integrati + GI_MaxDispMESE_x = Spost_Local_MeseX(:,IndexMESE(1)); % x del nodo a maggior spostamento + GI_diff_x = GI_MaxDispMESE_x(:,:)- GI_MaxDispMESE_x(1,1); % differenza + GI_MaxDispMESE_y = Spost_Local_MeseY(:,IndexMESE(1));% y del nodo a maggior spostamento + GI_diff_y = GI_MaxDispMESE_y(:,:)- GI_MaxDispMESE_y(1,1); % differenza + GI_MaxDispMESE = sqrt((GI_diff_x).^2 + (GI_diff_y).^2)*1000; % risultante + GI_DateTL = Date; + GI_MaxDispProf = MaxDispProfMESE; + + % Grafico Locali + figure(1) + subplot(1,2,1); + plot(DispMese_Local,Prof); + hold on + plot(Spost_local(end,:),Prof); + title('Spostamenti Locali 2D'); + xlabel('Spostamento [mm]'); + ylabel(['Profondit' char(224) ' [m]']); + h = gca; + h.XAxis.MinorTick = 'on'; + if MaxDisp < 10 % mm + xlim([-inf 10]); + end + grid on + grid minor + + % Grafico Cumulati + subplot(1,2,2); + plot(DispMese,Prof); + hold on + DispCum = plot(Spost(end,:),Prof); + title('Spostamenti Cumulati 2D'); + xlabel('Spostamento [mm]'); + ylabel(['Profondit' char(224) ' [m]']); + h = gca; + h.XAxis.MinorTick = 'on'; + if max(Spost(end,:)) < 10 + xlim([-inf 10]); + end + grid on + grid minor + lgd = legend('Ultimo periodo','Intero periodo','Location','southeast'); + lgd.FontSize = 6; + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Disp.png')); + saveas(DispCum,TempName); + Chart = Image(TempName); + if m > 1 + for C = 1:m-1 + if status(C,1) == 3 || status(C,1) == 1 + Chart.Style = {Height('10cm'),HAlign('center')}; + break + else + Chart.Style = {ScaleToFit}; + end + end + else + Chart.Style = {ScaleToFit}; + end + Chart_capM = Paragraph(['Fig. ' num2str(FIG) ' - Spostamenti differenziali locali e cumulati in '... + 'direzione di massima pendenza registrati dalla catena '... + 'durante il periodo temporale di riferimento e a partire '... + 'dalla data di riferimento riportata in Tabella 1']); + FIG = FIG+1; + Chart_capM.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + close(figure(1)) + + if activeEN == 1 + figure(1) + subplot(1,2,1); + plot(DispMese_Local,Prof); + hold on + plot(Spost_local(end,:),Prof); + title('2D Local Displacements'); + xlabel('Displacement [mm]'); + ylabel('Depth [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + if MaxDisp < 10 % mm + xlim([-inf 10]); + end + grid on + grid minor + + subplot(1,2,2); + plot(DispMese,Prof); + hold on + DispCum = plot(Spost(end,:),Prof); + title('2D Cumulative Displacements'); + xlabel('Displacements [mm]'); + ylabel('Depth [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + if max(Spost(end,:)) < 10 + xlim([-inf 10]); + end + grid on + grid minor + lgd = legend('Last period','Entire period','Location','southeast'); + lgd.FontSize = 6; + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Disp_ENG.png')); + saveas(DispCum,TempName); + Chart = Image(TempName); + if m > 1 + for C = 1:m-1 + if status(C,1) == 3 || status(C,1) == 1 + Chart.Style = {Height('10cm'),HAlign('center')}; + break + else + Chart.Style = {ScaleToFit}; + end + end + else + Chart.Style = {ScaleToFit}; + end + Chart.Style = {ScaleToFit}; + Chart_capM = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Local and cumulative '... + 'differential displacements along maximum grade direction, '... + 'recorded during the monitoring reference period and starting from the '... + 'reported in Tab. 1']); + FIG_ENG = FIG_ENG+1; + Chart_capM.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + close(figure(1)) + end + + % grafico azimuth DALL'INIZIO + Azim_grafico = deg2rad(Azim(end,:)); + Azim_grafico = [0 Azim_grafico]; %aggiungo ancora + figure(2) + azimuth = polarscatter(Azim_grafico,flip(abs(Prof)),'filled'); + title('Azimut'); + h = gca; + h.ThetaDir = 'clockwise'; + h.ThetaZeroLocation = 'top'; + angles = 0:45:360; + h.ThetaTick = angles; + labels = {'N','NE','E','SE','S','SO','O','NO'}; + h.ThetaTickLabel = labels; + grid on + + Testa = Azim(end,end); + if Testa > 11.25 && Testa <= 33.75 + DirAzim = 'Nord-Nord-Est'; + elseif Testa > 33.75 && Testa <= 56.25 + DirAzim = 'Nord-Est'; + elseif Testa > 56.25 && Testa <= 78.75 + DirAzim = 'Est-Nord-Est'; + elseif Testa > 78.75 && Testa <= 101.25 + DirAzim = 'Est'; + elseif Testa > 101.25 && Testa <= 123.75 + DirAzim = 'Est-Sud-Est'; + elseif Testa > 123.75 && Testa <= 146.25 + DirAzim = 'Sud-Est'; + elseif Testa > 146.25 && Testa <= 168.75 + DirAzim = 'Sud-Sud-Est'; + elseif Testa > 168.75 && Testa <= 191.25 + DirAzim = 'Sud'; + elseif Testa > 191.25 && Testa <= 213.75 + DirAzim = 'Sud-Sud-Ovest'; + elseif Testa > 213.75 && Testa <= 236.25 + DirAzim = 'Sud-Ovest'; + elseif Testa > 236.25 && Testa <= 258.75 + DirAzim = 'Ovest-Sud-Ovest'; + elseif Testa > 258.75 && Testa <= 281.25 + DirAzim = 'Ovest'; + elseif Testa > 281.25 && Testa <= 303.75 + DirAzim = 'Ovest-Nord-Ovest'; + elseif Testa > 303.75 && Testa <= 326.25 + DirAzim = 'Nord-Ovest'; + elseif Testa > 326.25 && Testa <= 348.75 + DirAzim = 'Nord-Nord-Ovest'; + else + DirAzim = 'Nord'; + end + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Azimuth.png')); + saveas(azimuth,TempName); + ChartAZ = Image(TempName); + ChartAZ.Style = {ScaleToFit}; + ChartAZ_cap = Paragraph(['Fig. ' num2str(FIG) ' - Azimut degli spostamenti '... + 'differenziali cumulati secondo la profondit' char(224) ', registrato a partire dalla lettura di riferimento']); + FIG = FIG+1; + ChartAZ_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + SE = Section(); + if rTLHR(m,1) > 0 + sezTilt = Heading3('Tilt Link HR 3D V'); + else + sezTilt = Heading3('Tilt Link V'); + end + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SE.Title = sezTilt; + close(figure(2)) + + if activeEN == 1 + Azim_grafico = deg2rad(Azim(end,:)); + Azim_grafico = [0 Azim_grafico]; %aggiungo ancora + figure(2) + azimuth = polarscatter(Azim_grafico,flip(abs(Prof)),'filled'); + title('Azimuth'); + h = gca; + h.ThetaDir = 'clockwise'; + h.ThetaZeroLocation = 'top'; + angles = 0:45:360; + h.ThetaTick = angles; + labels = {'N','NE','E','SE','S','SW','W','NW'}; + h.ThetaTickLabel = labels; + grid on + + Testa = Azim(end,end); + if Testa > 11.25 && Testa <= 33.75 + DirAzim = 'North-North-East'; + elseif Testa > 33.75 && Testa <= 56.25 + DirAzim = 'North-East'; + elseif Testa > 56.25 && Testa <= 78.75 + DirAzim = 'East-North-East'; + elseif Testa > 78.75 && Testa <= 101.25 + DirAzim = 'East'; + elseif Testa > 101.25 && Testa <= 123.75 + DirAzim = 'East-South-East'; + elseif Testa > 123.75 && Testa <= 146.25 + DirAzim = 'South-East'; + elseif Testa > 146.25 && Testa <= 168.75 + DirAzim = 'South-South-East'; + elseif Testa > 168.75 && Testa <= 191.25 + DirAzim = 'South'; + elseif Testa > 191.25 && Testa <= 213.75 + DirAzim = 'South-South-West'; + elseif Testa > 213.75 && Testa <= 236.25 + DirAzim = 'South-West'; + elseif Testa > 236.25 && Testa <= 258.75 + DirAzim = 'West-South-West'; + elseif Testa > 258.75 && Testa <= 281.25 + DirAzim = 'West'; + elseif Testa > 281.25 && Testa <= 303.75 + DirAzim = 'West-North-West'; + elseif Testa > 303.75 && Testa <= 326.25 + DirAzim = 'North-West'; + elseif Testa > 326.25 && Testa <= 348.75 + DirAzim = 'North-North-West'; + else + DirAzim = 'North'; + end + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Azimuth_ENG.png')); + saveas(azimuth,TempName); + ChartAZ = Image(TempName); + ChartAZ.Style = {ScaleToFit}; + ChartAZ_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Azimuth of cumulative differential '... + 'displacements vs depth, recorded starting from the monitoring reference date']); + FIG_ENG = FIG_ENG+1; + ChartAZ_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + SE_ENG = Section(); + SE_ENG.Title = sezTilt; + close(figure(2)) + end + + testo = Paragraph(['I grafici seguenti riportano i valori di spostamento differenziale locale e cumulato '... + 'misurati dal sensore MEMS 3D lungo la direzione di massima pendenza, '... + 'registrati durante il periodo temporale di riferimento e calcolati a partire dalla lettura di '... + 'riferimento riportata in Tabella 1. In particolare, il massimo spostamento differenziale locale '... + 'registrato durante il periodo temporale di riferimento ' char(232) ' pari a ' num2str((MaxDispMESE), ... + '%0.1f') ' mm alla profondit' char(224) ' di ' num2str(abs(MaxDispProfMESE)) ' m. '... + 'Lo spostamento cumulato in testa risulta pari a ' num2str(DispMese(end,end),'%0.1f') ' mm.']); + testo2 = Paragraph(['Gli stessi dati relativi all''intero periodo di monitoraggio rilevano un massimo spostamento '... + 'differenziale locale pari a ' num2str((MaxDisp), '%0.1f') ' mm, in corrispondenza di una profondit' char(224) ... + ' di ' num2str(abs(MaxDispProf)) ' metri. Lo spostamento cumulato in testa risulta pari a ' num2str(Spost(end,end)) ' mm.']); + testo3 = Paragraph(['Il grafico seguente mostra l''andamento dell''azimut ottenuto a partire dai dati cumulati '... + 'al variare della profondit' char(224) ', calcolati a partire dalla lettura di riferimento. Attualmente, il valore ' ... + 'rilevato in testa allo strumento indica uno spostamento in direzione ' DirAzim '.']); + testo4 = Paragraph(['Si ricorda che l''azimut ' char(232) ' una rappresentazione della direzione '... + 'di movimento del singolo sensore, calcolato a partire dai dati cumulati. '... + 'Il parametro viene calcolato indipendentemente dall''ordine di grandezza '... + 'dello spostamento misurato: ad esempio, uno spostamento sub-millimetrico '... + 'e uno centimetrico nella stessa direzione saranno caratterizzati dallo stesso '... + 'valore di azimut. Per questo motivo, ' char(232) ' opportuno considerare tale '... + 'grandezza come significativa solo nel caso di spostamenti di entit' char(224) ... + ' rilevante.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + testo3.HAlign = 'justify'; + testo4.HAlign = 'justify'; + add(DT,sezTilt); + add(DT,testo); + add(DT,testo2); + add(DT,Chart); + add(DT,Chart_capM); + add(DT,testo3); + add(DT,testo4); + add(DT,ChartAZ); + add(DT,ChartAZ_cap); + add(DT,br); + if activeEN == 1 + testo = Paragraph(['The following graphs shows the local and differential cumulative displacements '... + 'recorded by 3D MEMS sensor along the maximum grade direction during the reference monitoring period '... + 'and starting from the reference date reported in Tab. 1. The maximum local differential displacement '... + 'recorded during the reference time period equals ' num2str((MaxDispMESE),'%0.1f') ' mm at a depth of '... + num2str(abs(MaxDispProfMESE)) ' m. The cumulative displacements at the ground level is '... + num2str(DispMese(end,end),'%0.1f') ' mm.']); + testo2 = Paragraph(['The same analysis related to the whole monitoring period highlights a maximum local '... + 'differential displacement of ' num2str((MaxDisp), '%0.1f') ' mm, at a depth of ' num2str(abs(MaxDispProf)) ... + ' m. The cumulative displacement equals ' num2str(Spost(end,end)) ' mm.']); + testo3 = Paragraph(['The following graph shows the azimuth obtained through cumulative displacements, '... + 'starting from the reference date. The direction identified is ' DirAzim '.']); + testo4 = Paragraph(['It is necessary to underline that the azimuth represents the movement direction '... + 'of every single sensor, calculated starting from differential cumulative displacements. '... + 'The parameter is always processed, regardless of the displacement measured: a sub-millimeters '... + 'or a centimeters movements in the same direction will show the same azimuth. '... + 'For this reason, it is appropriate to consider the result as significant only for relevant '... + 'displacements.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + testo3.HAlign = 'justify'; + testo4.HAlign = 'justify'; + add(DT_ENG,sezTilt); + add(DT_ENG,testo); + add(DT_ENG,testo2); + add(DT_ENG,Chart); + add(DT_ENG,Chart_capM); + add(DT_ENG,testo3); + add(DT_ENG,testo4); + add(DT_ENG,ChartAZ); + add(DT_ENG,ChartAZ_cap); + add(DT_ENG,br); + end + %pulisco variabili da riutilizzare per catena successiva + clear Spost; + clear Spost_local; + clear Spost_mese; + clear Spost_local_mese; + clear Prof; + clear Azim; + clear DirAzim; + clear Spost_Local_MeseX; + clear Spost_Local_MeseY; + clear diffMeseX_Local; + clear diffMeseY_Local; + clear DispMese_Local; + clear Spost_MeseX; + clear Spost_MeseY; + clear diffMeseX; + clear diffMeseY; + clear DispMese; + clear GI_MaxDispMESE_x; + clear GI_diff_x; + clear GI_MaxDispMESE_y; + clear GI_diff_y; + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + check = 1; + if m == 1 + add(DT,br); + end + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + if m == 1 + add(DT_ENG,br); + end + end + end + end + end +end + +text = 'report_TL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_ThL.m b/ATD/report_ThL.m new file mode 100755 index 0000000..fda4e7d --- /dev/null +++ b/ATD/report_ThL.m @@ -0,0 +1,345 @@ +function [ATTIVA,FIG,FIG_ENG] = report_ThL(rThL,m,NodoThermLink,toolrif,... + unitrif,datarif,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,... + activeEN,br,status,ATTIVA,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_ThL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +NODATAThL(m,1) = 0; +check = 0; +while check == 0 + if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('Catena non ancora installata o inattiva.'); + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array not installed or inactive.'); + add(DT_ENG,testo); + end + end + check = 1; + elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoraggio completato. Invitiamo a visitare la '... + 'piattaforma web per la visione dei dati storici.']); + 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 + check = 1; + else + titolo = 1; + ThE = Section(); + if activeEN == 1 + ThE_EN = Section(); + end + for n = 1:rThL(m,1) + NodeNum = num2str(NodoThermLink(n,m)); + comando = ['select T_node, NodeDepth, EventDate, EventTime 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(:,3)) repmat(' ', [rD,1]) cell2mat(Dati(:,4))]; + Date = datenum(T); % Data + if n == 1 % Il primo lo scrivo e creo la variabile di controllo + else + [rS,~] = size(TempHR); + if rD ~= rS + NODATAThL(m,1) = 2; + check = 0; + break + else + check = 1; + end + end + TempHR(:,n) = cell2mat(Dati(:,1)); % temperatura + MaxTempHR(1,n) = max(TempHR(:,n)); + MinTempHR(1,n) = min(TempHR(:,n)); + Prof(:,n) = -(cell2mat(Dati(1,2))); % Profondità + else + NODATAThL = 1; + check = 1; + end + end + if NODATAThL == 0 + testo = Paragraph(['I grafici seguenti mostrano i valori di temperatura lungo la verticale '... + 'ed il loro andamento nel tempo, misurati dal termometro ad alta risoluzione '... + 'durante il periodo temporale di riferimento. ']); + testo.HAlign = 'justify'; + + if activeEN == 1 + testo_ENG = Paragraph(['The following graphs show the temperature values recorded at different depths '... + 'and their evolution over time, recorded by the high-resolution thermometer '... + 'during the reference time period. ']); + testo_ENG.HAlign = 'justify'; + end + + % grafico temperatura - profondità + figure(1) + plot(TempHR(end,:),Prof,'-o'); + hold on + plot(MaxTempHR(1,:),Prof,'-o'); + Tmin_nodi = plot(MinTempHR(1,:),Prof,'-o'); + legend('Ultima temperatura','Temperatura massima','Temperatura minima','Location','southeast'); + + title('Temperatura'); + xlabel(['Temperatura [' char(176) 'C]']); + ylabel(['Profondit' char(224) ' [m]']); + h = gca; + h.XAxis.MinorTick = 'on'; + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Therm.png')); + saveas(Tmin_nodi,TempName); + ChartTh = Image(TempName); + ChartTh.Style = {Height('9.5cm'),HAlign('center')}; + ChartTh_cap = Paragraph(['Fig. ' num2str(FIG) ' - Ultimo dato, '... + 'temperatura massima e minima misurate '... + 'durante il periodo temporale di riferimento']); + FIG = FIG+1; + ChartTh_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + if titolo == 1 + sezTherm = Heading3('Therm Link'); + sezTherm.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + ThE.Title = sezTherm; + add(DT,sezTherm); + if activeEN == 1 + else + titolo = 0; + end + end + add(DT,testo); + add(DT,ChartTh); + add(DT,ChartTh_cap); + + % Grafico Temperatura vs Tempo + cont = 1; + num = 2; + tab = 1; + while cont <= rThL(m,1) + figure(num) + if rThL(m,1)-cont > 5 + str = cell(5,1); + else + str = cell(rThL(m,1)-cont+1,1); + end + hold on + grid on + grid minor + xlabel('Data [gg/mm/aaaa]'); + ylabel(['Temperatura [' char(176) 'C]']); + Mx = []; + Mn = []; + for a = 1:5 + if cont > rThL(m,1) + break + end + Tt = plot(Date,TempHR(:,cont)); + Mx = [Mx; ceil(max(TempHR(:,cont)))]; + Mn = [Mn; ceil(min(TempHR(:,cont)))]; + xlim([Date(1)-1 Date(end)+1]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(a,1) = cellstr(['' num2str(Prof(cont)) ' m da P.C.']); + cont = cont+1; + end + ylim([min(Mn)-1 max(Mx)+1]); + lgd = legend(str,'Location','north'); + num = num+1; + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Therm ',num2str(num),'.png')); + saveas(Tt,TempName); + if tab == 2 + TempName1 = char(strcat('Report',siteID,'-', char(toolrif),'Therm ',num2str(num-1),'.png')); + Chart1 = Image(TempName1); + Chart1.Style = {Height('6.8cm'),HAlign('center')}; + Chart2 = Image(TempName); + Chart2.Style = {Height('6.8cm'),HAlign('center')}; + lot = Table({Chart1, Chart2}); + lot.Style = {ResizeToFitContents(false), Width('100%')}; + add(DT,lot); + tab = 1; + elseif rThL <= 5 % Una sola immagine + Chart1 = Image(TempName); + Chart1.Style = {Height('7.5cm'),HAlign('center')}; + add(DT,Chart1); + elseif cont > rThL + Chart2 = Image(TempName); + Chart2.Style = {Height('6.8cm'),HAlign('center')}; + add(DT,Chart2); + else + tab = tab+1; + end + close(figure(num)); + end + + ChartTh2_cap = Paragraph(['Fig. ' num2str(FIG) ' - Andamento nel tempo della temperatura registrata '... + 'dai singoli sensori']); + add(DT,ChartTh2_cap); + FIG = FIG+1; + ChartTh2_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + add(DT,br); + close(figure(1)); + close(figure(2)); + + if activeEN == 1 + % grafico temperatura - profondità + figure(1) + plot(TempHR(end,:),Prof,'-o'); + hold on + plot(MaxTempHR(1,:),Prof,'-o'); + Tmin_nodi = plot(MinTempHR(1,:),Prof,'-o'); + legend('Last value','T max','T min','Location','southeast'); + + title('Temperature'); + xlabel(['Temperature [' char(176) 'C]']); + ylabel('Depth [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Therm_ENG.png')); + saveas(Tmin_nodi,TempName); + ChartTh = Image(TempName); + ChartTh.Style = {Height('9.5cm'),HAlign('center')}; + ChartTh_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Last value, '... + 'maximum and minimum temperature recorded '... + 'during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartTh_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + if titolo == 1 + sezTherm = Heading3('Therm Link'); + sezTherm.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + ThE.Title = sezTherm; + add(DT_ENG,sezTherm); + titolo = 0; + end + add(DT_ENG,testo_ENG); + add(DT_ENG,ChartTh); + add(DT_ENG,ChartTh_cap); + + % Grafico Temperatura vs Tempo + cont = 1; + num = 2; + tab = 1; + while cont <= rThL(m,1) + figure(num) + if rThL(m,1)-cont > 5 + str = cell(5,1); + else + str = cell(rThL(m,1)-cont+1,1); + end + hold on + grid on + grid minor + xlabel('Date [dd/mm/yyyy]'); + ylabel(['Temperature [' char(176) 'C]']); + Mx = []; + Mn = []; + for a = 1:5 + if cont > rThL(m,1) + break + end + Tt = plot(Date,TempHR(:,cont)); + Mx = [Mx; ceil(max(TempHR(:,cont)))]; + Mn = [Mn; ceil(min(TempHR(:,cont)))]; + xlim([Date(1)-1 Date(end)+1]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(a,1) = cellstr(['' num2str(Prof(cont)) ' m b.g.l.']); + cont = cont+1; + end + ylim([min(Mn)-1 max(Mx)+1]); + lgd = legend(str,'Location','north'); + num = num+1; + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Therm ',num2str(num),'.png')); + saveas(Tt,TempName); + if tab == 2 + TempName1 = char(strcat('Report',siteID,'-', char(toolrif),'Therm ',num2str(num-1),'.png')); + Chart1 = Image(TempName1); + Chart1.Style = {Height('6.8cm'),HAlign('center')}; + Chart2 = Image(TempName); + Chart2.Style = {Height('6.8cm'),HAlign('center')}; + lot = Table({Chart1, Chart2}); + lot.Style = {ResizeToFitContents(false), Width('100%')}; + add(DT,lot); + tab = 1; + elseif rThL <= 5 % Una sola immagine + Chart1 = Image(TempName); + Chart1.Style = {Height('7.5cm'),HAlign('center')}; + add(DT,Chart1); + elseif cont > rThL + Chart2 = Image(TempName); + Chart2.Style = {Height('6.8cm'),HAlign('center')}; + add(DT,Chart2); + else + tab = tab+1; + end + close(figure(num)); + end + + ChartTh2_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Temporal evolution of the temperature recorded '... + 'by the sensors']); + add(DT_ENG,ChartTh2_cap); + FIG_ENG = FIG_ENG+1; + ChartTh2_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + add(DT_ENG,br); + close(figure(1)); + close(figure(2)); + end + + clear TempHR; + clear MaxTempHR; + clear MinTempHR; + clear Prof; + + elseif NODATA(m,1) == 1 + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + if m == 1 + add(DT_ENG,br); + end + end + check = 1; + end + end + end +end + +close all + +text = 'report_ThL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_TrL.m b/ATD/report_TrL.m new file mode 100755 index 0000000..6508ae7 --- /dev/null +++ b/ATD/report_TrL.m @@ -0,0 +1,144 @@ +function ATTIVA = report_TrL(NodoTriggerLink,rTrL,m,Font_tools,br,datarif,toolrif,... + unitrif,DT,DT_ENG,activeEN,status,ATTIVA,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_TrL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('Trigger non ancora installato o inattivo.'); + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Trigger not installed or inactive.'); + add(DT_ENG,testo); + end + end +elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoraggio completato. Invitiamo a visitare la '... + 'piattaforma web per la visione dei dati storici.']); + 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 + for t = 1:rTrL(m,1) + NodeNum = num2str(NodoTriggerLink(t,m)); + comando = ['select EventDate, EventTime, X, 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 + Att_Tot = cell2mat(Dati(:,3)); % attivazioni totali da inizio monitoraggio + Att = cell2mat(Dati(:,4)); % attivazioni nel periodo di riferimento + Att_Rif = cumsum(Att); + + sezTrig = Paragraph('Trigger Link'); + sezTrig.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + TR = Section(); + TR.Title = sezTrig; + add(DT,sezTrig); + if activeEN == 1 + sezTrig_ENG = Paragraph('Trigger Link'); + sezTrig_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + TR_ENG = Section(); + TR_ENG.Title = sezTrig_ENG; + add(DT_ENG,sezTrig_ENG); + end + + testo = Paragraph(['Durante il periodo temporale di riferimento, '... + 'sono state registrate ' num2str(Att_Rif(end)) ' attivazioni del sensore Trigger. '... + 'Il numero di attivazioni totali dalla data di inizio monitoraggio ' char(232) ' pari '... + 'a ' num2str(Att_Tot(end)) '.' ]); + testo.HAlign = 'justify'; + add(DT,testo); + + if Att_Rif > 0 % ci sono attivazioni nel periodo di riferimento + testo2 = Paragraph(['Di seguito sono riportate le date, relative al periodo temporale di riferimento, '... + 'nelle quali ' char(232) ' stata identificata un''attivazione del Trigger Link: ']); + testo2.HAlign = 'justify'; + + add(DT,testo2); + nd = size(Date); + for dt = 1:nd + if Att(dt) == 1 + text = ['- ' datestr(Date(dt),'dd/mm/yyyy HH:MM:SS')]; + testodata = Paragraph(text); + add(DT,testodata); + end + end + end + add(DT,br); + + + % -- ENG -- + if activeEN == 1 + testo = Paragraph(['During the reference time period, '... + 'the Trigger sensor activated ' num2str(Att_Rif(end)) ' times. '... + 'The total amount of activations since the beginning of the monitoring activity is '... + 'equal to ' num2str(Att_Tot(end)) '.' ]); + testo.HAlign = 'justify'; + add(DT_ENG,testo); + + if Att_rif > 0 % ci sono attivazioni nel periodo di riferimento + testo2 = Paragraph(['The activation dates for what concern the reference time period '... + 'are reported below: ']); + testo2.HAlign = 'justify'; + add(DT_ENG,testo2); + nd = size(Date); + for dt = 1:nd + if Att(dt) == 1 + textENG = ['- ' datestr(Date(dt),'dd/mm/yyyy HH:MM:SS')]; + testodataENG = Paragraph(textENG); + add(DT_ENG,testodataENG); + end + end + end + add(DT_ENG,br); + end + + % pulisco variabili da riutilizzare per catena successiva + clear Att_Tot + clear Att + clear Att_Rif + + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + end + end + end + end +end + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_TrL function executed correctly. report_TrL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_TuL.m b/ATD/report_TuL.m new file mode 100755 index 0000000..867f2fc --- /dev/null +++ b/ATD/report_TuL.m @@ -0,0 +1,1014 @@ +function [GI_Cir_Q1,GI_Cir_Q2,GI_Cir_Q3,GI_Cir_Q4,GI_Cir_Q1_Num,GI_Cir_Q2_Num,... + GI_Cir_Q3_Num,GI_Cir_Q4_Num,GI_Cir_Seg,GI_Cir_Z,GI_Cir_Date,GI_TuL_RL,... + ATTIVA,FIG,FIG_ENG] = report_TuL(IDcentralina,DTcatena,rTuL,m,NodoTunnelLink,toolrif,... + unitrif,datarif,firstdata_num,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,... + colonna2,colonna2bis,status,ATTIVA,activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_TuL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +GI_Cir_Q1 = []; +GI_Cir_Q2 = []; +GI_Cir_Q3 = []; +GI_Cir_Q4 = []; +GI_Cir_Q1_Num = []; +GI_Cir_Q2_Num = []; +GI_Cir_Q3_Num = []; +GI_Cir_Q4_Num = []; +GI_Cir_Seg = []; +GI_Cir_Z = []; +GI_Cir_Date = []; +GI_TuL_RL = []; + +check = 0; +while check == 0 + if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('Catena non ancora installata o inattiva.'); + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array not installed or inactive.'); + add(DT_ENG,testo); + end + end + check = 1; + elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoraggio completato. Invitiamo a visitare la '... + 'piattaforma web per la visione dei dati storici.']); + 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 + check = 1; + else + [~,Segmenti,~,~,~,Antiorario] = star(IDcentralina,DTcatena,FileName); + [dim,~] = size(Segmenti); % numero di punti per il calcolo della stella + + NODATA(m,1) = 0; + Num = zeros(rTuL(m,1),1); + for n = 1:rTuL(m,1) + NodeNum = num2str(NodoTunnelLink(n,m)); + % dati del mese + comando = ['select EventDate, EventTime, XShift, ZShift, HShift, '... + 'HShift_local, X, Z 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; + Num(n,1) = NodoTunnelLink(n,m); + + datarifNEW = datestr(firstdata_num{m+1,1},'yyyy-mm-dd'); % data riferimento definita sul sito + temporifNEW = datestr(firstdata_num{m+1,1},'HH:MM:SS'); + % primo dato per la stella + comando = ['select HShift from ElabDataView where EventDate = ''' ... + datarifNEW ''' and EventTime >= ''' temporifNEW ''' and '... + 'ToolNameID = ''' char(toolrif) ''' and UnitName = ''' ... + char(unitrif) ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Stella1 = cell2mat(curs.Data); + + % Scarico ay che mi serve per orientare gli spostamenti in + % convergenze/divergenza a seconda del quadrante - Inizio mese + comando = ['select Val1, Val6 from RawDataView where Date >= ''' datarif ... + ''' and UnitName = ''' char(unitrif) ''' and ToolNameID = ''' char(toolrif) ... + ''' and NodeNum = ' NodeNum ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DatiaccY_Mese = curs.Data; + + % Scarico i parametri di calibrazione di ay + comando = ['select Cal0, Cal1, Cal2, Cal3, Cal4, Cal5, Cal6, Cal7, Cal8, '... + 'CalA, CalB from CalibrationView where UnitName = ''' char(unitrif) ... + ''' and ToolNameID = ''' char(toolrif) ''' and NodeNum = ''' NodeNum '''']; + curs = exec(conn,comando); + curs = fetch(curs); + DCalTuL = curs.Data; + [r,c] = size(DCalTuL); + MATconv = zeros(r,c); + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalTuL{ii,jj}; + end + end + DCalTuL = MATconv; + caY_Tu = DCalTuL(:,4); + pIntY_Tu = DCalTuL(:,5); + iIntY_Tu = DCalTuL(:,6); + + [rD,rC] = size(Dati); + if rC ~= 1 + T = [cell2mat(Dati(:,1)) repmat(' ', [rD,1]) cell2mat(Dati(:,2))]; + Date = datenum(T); % Data + if n == 1 % Il primo lo scrivo e creo la variabile di controllo + else + [rS,~] = size(asseX); + if rD ~= rS + NODATA(m,1) = 1; + check = 0; + break + else + check = 1; + end + end + + % divergenza/convergenza dei singoli nodi dall'inizio + asseX(:,n) = cell2mat((Dati(:,3))); + asseZ(:,n) = cell2mat(Dati(:,4)); + X_TuL_Mese(:,n) = cell2mat(Dati(:,7)); + Z_TuL_Mese(:,n) = cell2mat(Dati(:,8)); + accY_raw(:,n) = str2double(DatiaccY_Mese(:,1)); + t_TuL(:,n) = str2double(DatiaccY_Mese(:,2)); + accY_Mese(:,n) = accY_raw(:,n)*caY_Tu+(t_TuL(:,n)*pIntY_Tu+iIntY_Tu); + diffX(:,n) = asseX(:,n)-asseX(1,n); + diffZ(:,n) = asseZ(:,n)-asseZ(1,n); + RIS_XZ(:,n) = 1000*cell2mat((Dati(:,6))); + if n <= dim + stella_Rif(:,n) = 1000*(cell2mat(Dati(:,5))-Stella1(1,1)); + stella_Mese(:,n) = 1000*(cell2mat(Dati(:,5))-cell2mat(Dati(1,5))); + end + + % dati relativi al mese + RIS_XZ_Mese(1,n) = sqrt(diffX(end,n)^2 + diffZ(end,n)^2)*1000; + [rAY,~] = size(accY_Mese); + if isnan(accY_Mese(end,n)) == 1 + for d = 1:rAY + if isnan(accY_Mese(end-d+1,n)) == 0 + diffaccY(1,n) = accY_Mese(end-d+1,n)-accY_Mese(1,n); + break + end + end + else + diffaccY(1,n) = accY_Mese(end,n)-accY_Mese(1,n); + end + % correggo segno risultante + if diffaccY(1,n) < 0 + if Antiorario(n,1) == 1 || Antiorario(n,1) == 4 + RIS_XZ_Mese(1,n) = -1*RIS_XZ_Mese(1,n); + end + elseif diffaccY(1,n) > 0 + if Antiorario(n,1) == 2 || Antiorario(n,1) == 3 + RIS_XZ_Mese(1,n) = -1*RIS_XZ_Mese(1,n); + end + end + else + NODATA(m,1) = 1; + check = 1; + end + end + + if NODATA(m,1) == 0 + date = datestr(datenum(colonna2{m+1,1},'dd-mm-yyyy'),'yyyy-mm-dd'); % data riferimento definita sul sito + % posizione di progetto dei nodi + comando = ['select EventDate, EventTime, X, Z from ElabDataView where EventDate >= ''' ... + date ''' and ToolNameID = ''' char(toolrif) ''' and UnitName = ''' char(unitrif) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + SezioneXZ = curs.Data; + Datasez = SezioneXZ(1,1); + Orasez = SezioneXZ(1,2); + [rz,~] = size(SezioneXZ); + scrivi = 1; + for rr = 1:rz + if strcmp(SezioneXZ(rr,1),Datasez)==1 && strcmp(SezioneXZ(rr,2),Orasez) ==1 + CoordX(scrivi,1) = SezioneXZ(rr,3); + CoordZ(scrivi,1) = SezioneXZ(rr,4); + scrivi = scrivi+1; + end + end + if strcmp(colonna2bis(m+1,1),colonna2(m+1,1)) == 0 % data zero diversa data riferimento + datarifNEW = datestr(firstdata_num{m+1,1},'yyyy-mm-dd'); % data riferimento definita sul sito + for nw = 1:rTuL(m,1) + NodeNum = num2str(NodoTunnelLink(nw,m)); + comando = ['select EventDate, EventTime, XShift, ZShift, X, Z, '... + 'from ElabDataView where EventDate = ''' datarifNEW ''' and ToolNameID = ''' char(toolrif) ... + ''' and UnitName = ''' char(unitrif) ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DatiNEW = curs.Data; % dati registrati alla data di riferimento + Num(nw,1) = NodoTunnelLink(nw,m); + [~,rC] = size(DatiNEW); + if rC ~= 1 + % dalla data di riferimento + % divergenza/convergenza dei singoli nodi dall'inizio + asseX(:,nw) = asseX(:,nw)-cell2mat(DatiNEW(1,3)); + asseZ(:,nw) = asseZ(:,nw)-cell2mat(DatiNEW(1,4)); + X_TuL_Rif(:,nw) = cell2mat(DatiNEW(1,5)); + Z_TuL_Rif(:,nw) = cell2mat(DatiNEW(1,6)); + + % Scarico ay che mi serve per orientare gli spostamenti in + % convergenze/divergenza a seconda del quadrante - dati + % dalla data di riferimento + comando = ['select Val1, Val6 from RawDataView where Date >= ''' datarifNEW ... + ''' and UnitName = ''' char(unitrif) ''' and ToolNameID = ''' char(toolrif) ... + ''' and NodeNum = ' NodeNum ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DatiaccY_Rif = curs.Data; + + accY_raw(:,n) = str2double(DatiaccY(:,1)); + t_TuL(:,n) = str2double(DatiaccY(:,2)); + accY_Rif(:,n) = accY_raw(:,n)*caY_Tu+(t_TuL(:,n)*pIntY_Tu+iIntY_Tu); + + diffX(:,n) = asseX(:,n)-asseX(1,n); + diffZ(:,n) = asseZ(:,n)-asseZ(1,n); + + % Risultati dalla data di riferimento + RIS_XZ(:,n) = 1000*((asseX(:,n).^2+asseZ(:,n).^2).^0.5); + diffaccY_Rif(1,n) = accY_Mese(end,n)-accY_Rif(1,n); + % correggo segno risultante + if diffaccY_Rif(1,n) < 0 + if Antiorario(n,1) == 1 || Antiorario(n,1) == 4 + RIS_XZ(1,n) = -1*RIS_XZ(1,n); + end + elseif diffaccY_Rif(1,n) > 0 + if Antiorario(n,1) == 2 || Antiorario(n,1) == 3 + RIS_XZ(1,n) = -1*RIS_XZ(1,n); + end + end + + % dati relativi al mese + RIS_XZ_Mese(:,n) = sqrt(diffX(end,n).^2 + diffZ(end,n)^2)*1000; + diffaccY_Mese(:,n) = accY_Mese(:,n)-accY_Mese(1,n); + % correggo segno risultante + [rA,~] = size(accY_Mese); + for aa = 1:rA + if diffaccY_Mese(1,n) < 0 + if Antiorario(n,1) == 1 || Antiorario(n,1) == 4 + RIS_XZ_Mese(aa,n) = -1*RIS_XZ_Mese(aa,n); + end + elseif diffaccY_Mese(1,n) > 0 + if Antiorario(n,1) == 2 || Antiorario(n,1) == 3 + RIS_XZ_Mese(aa,n) = -1*RIS_XZ_Mese(aa,n); + end + end + end + else + NODATA(m,1) = 1; + end + end + end + + q1 = find(Antiorario==1); + q2 = find(Antiorario==2); + q3 = find(Antiorario==3); + q4 = find(Antiorario==4); + m1 = max(abs(RIS_XZ_Mese(end,q1))); + g1 = find(m1==abs(RIS_XZ_Mese)); + GI_Cir_Q1 = RIS_XZ_Mese(end,g1(1)); + m2 = max(abs(RIS_XZ_Mese(end,q2))); + g2 = find(m2==abs(RIS_XZ_Mese)); + GI_Cir_Q2 = RIS_XZ_Mese(end,g2(1)); + m3 = max(abs(RIS_XZ_Mese(end,q3))); + g3 = find(m3==abs(RIS_XZ_Mese)); + GI_Cir_Q3 = RIS_XZ_Mese(end,g3(1)); + m4 = max(abs(RIS_XZ_Mese(end,q4))); + g4 = find(m4==abs(RIS_XZ_Mese)); + GI_Cir_Q4 = RIS_XZ_Mese(end,g4(1)); + GI_Cir_Q1_Num = Num(g1(1)); + GI_Cir_Q2_Num = Num(g2(1)); + GI_Cir_Q3_Num = Num(g3(1)); + GI_Cir_Q4_Num = Num(g4(1)); + GI_Cir_Seg = stella_Mese(end,:); + GI_Cir_Date = Date; + + % Cerco eventuali correlazioni con PreConv Array + NomeFile = strcat('Report',siteID,'-PCLvsTuL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + Var = 0; + ind = 1; + while AAA < rF % A un Cir compete (se c'è) uno ed un solo PreConv. Lo vado a cercare + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono PreConv Array o non ci sono Cir + AAA = 2; + else + check2 = Filetesto(AAA+1,1); + if check1 == str2num(DTcatena(end-2:end)) % Il Cir è da prendere in considerazione ed è riportato nella prima riga del file + Nodo = Filetesto(AAA+2,1); + Var = 1; + elseif check2 == str2num(DTcatena(end-2:end)) % Il Cir è da prendere in considerazione ed è riportato nella seconda riga del file + Nodo = Filetesto(AAA+3,1); + Var = 1; + end + AAA = AAA+4; + end + end + if Var == 1 + GI_Cir_Z(:,ind) = (asseZ(:,Nodo)-asseZ(1,Nodo))*1000; + ind = ind+1; + Var = 0; + end + + % Cerco eventuali correlazioni con Rad Array + NomeFile = strcat('Report',siteID,'-TuLvsRL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + Var = 0; + ind = 1; + while AAA < rF % A un Cir compete un Rad Array. Lo vado a cercare + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono Rad Array o non ci sono Cir + AAA = 2; + else + check2 = Filetesto(AAA+1,1); + if check1 == str2num(DTcatena(end-2:end)) % Il Cir è da prendere in considerazione ed è riportato nella prima riga del file + Nodo = Filetesto(AAA+2,1); + Var = 1; + elseif check2 == str2num(DTcatena(end-2:end)) % Il Cir è da prendere in considerazione ed è riportato nella seconda riga del file + Nodo = Filetesto(AAA+3,1); + Var = 1; + end + AAA = AAA+4; + end + if Var == 1 + GI_TuL_RL(:,ind) = sqrt(diffX(:,Nodo).^2 + diffZ(:,Nodo).^2)*1000; % ad un Cir possono competere più Rad. Il cir è unico + ind = ind+1; + Var = 0; + end + end + + % Istogramma convergenza/divergenza dei singoli nodi + figure(1) + [~,nn] = size(RIS_XZ_Mese(end,:)); + for w = 1:nn + nodi_grafico(1,w) = w; + end + RIS = [RIS_XZ_Mese(end,:)' RIS_XZ(end,:)']; + div_conv = barh(nodi_grafico,RIS); + title('Risultante 2D degli spostamenti locali'); + xlabel('Spostamento [mm]'); + ylabel('Nodo [-]'); + h = gca; + h.XAxis.MinorTick = 'on'; + h.YAxis.MinorTick = 'off'; + Max(1) = max(RIS_XZ_Mese(end,:)); + Max(2) = max(RIS_XZ(end,:)); + MAX = max(Max); + Min(1) = min(RIS_XZ_Mese(end,:)); + Min(2) = min(RIS_XZ(end,:)); + MIN = min(Min); + in1 = find(Max == MAX); + in2 = find(Min == MIN); + MM = [abs(MIN) MAX]; + MAXX = max(MM); + in3 = find(MM == MAXX); + if in3 == 1 % DX + if in2 == 1 + POS = find(RIS_XZ_Mese == Min(1)); + else + POS = find(RIS_XZ == Min(2)); + end + else % SX + if in1 == 1 + POS = find(RIS_XZ_Mese == Max(1)); + else + POS = find(RIS_XZ == Max(2)); + end + end + if MAXX < 10 % mm + xlim([-10 10]); + else + xlim([-MAXX MAXX]) + end + ylim([0 nn+2]); + yticks(0:1:nn); + grid on + if in3 == 1 % DX + legend('Periodo di riferimento','Intero periodo','Location','northeast'); + else % SX + legend('Periodo di riferimento','Intero periodo','Location','northwest'); + end + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Convergenza.png')); + saveas(div_conv(1),TempName); + ChartCIR = Image(TempName); + ChartCIR.Style = {HAlign('justify'),ScaleToFit}; + ChartCIR_cap = Paragraph(['Fig. ' num2str(FIG) ' - Risultante 2D degli '... + 'spostamenti differenziali locali nel piano della sezione registrati durante '... + 'il periodo temporale di riferimento e l''intero periodo di monitoraggio']); + FIG = FIG+1; + ChartCIR_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + close(figure(1)) + + % ENG + if activeEN == 1 + % Istogramma convergenza/divergenza dei singoli nodi + figure(2) + div_conv = barh(nodi_grafico,RIS); + title('2D local displacements'); + xlabel('Displacement [mm]'); + ylabel('Node [-]'); + h = gca; + h.XAxis.MinorTick = 'on'; + h.YAxis.MinorTick = 'off'; + if MAXX < 10 % mm + xlim([-10 10]); + else + xlim([-MAXX MAXX]) + end + ylim([0 nn+2]); + yticks(0:1:nn); + grid on + if in3 == 1 % DX + legend('Reference time period','Complete monitoring period','Location','northeast'); + else % SX + legend('Reference time period','Complete monitoring period','Location','northwest'); + end + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Convergenza_ENG.png')); + saveas(div_conv(1),TempName); + ChartCIR_ENG = Image(TempName); + ChartCIR_ENG.Style = {HAlign('justify'),ScaleToFit}; + ChartCIR_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - 2D Local differential displacements '... + 'recorded in the section plane by the 3D MEMS sensors during the reference and the '... + 'complete monitoring period']); + FIG_ENG = FIG_ENG+1; + ChartCIR_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + end + close(figure(2)) + + % --- Sezione - MESE --- + contaC_Mese = 1; + contaD_Mese = 1; + conta0_Mese = 1; + for ris = 1:nn + if RIS_XZ_Mese(end,ris)< -0.5 + nodiCX_Mese(contaC_Mese,1) = CoordX(ris,1); + nodiCZ_Mese(contaC_Mese,1) = CoordZ(ris,1); + contaC_Mese = contaC_Mese + 1; + elseif RIS_XZ_Mese(end,ris)> 0.5 + nodiDX_Mese(contaD_Mese,1) = CoordX(ris,1); + nodiDZ_Mese(contaD_Mese,1) = CoordZ(ris,1); + contaD_Mese = contaD_Mese + 1; + else + nodiFX_Mese(conta0_Mese,1) = CoordX(ris,1); + nodiFZ_Mese(conta0_Mese,1) = CoordZ(ris,1); + conta0_Mese = conta0_Mese + 1; + end + end + + % --- Sezione - GLOBALI --- + contaC = 1; + contaD = 1; + conta0 = 1; + for ris = 1:nn + if RIS_XZ(end,ris)< -0.5 + nodiCX_tot(contaC,1) = CoordX(ris,1); + nodiCZ_tot(contaC,1) = CoordZ(ris,1); + contaC = contaC + 1; + elseif RIS_XZ(end,ris)> 0.5 + nodiDX_tot(contaD,1) = CoordX(ris,1); + nodiDZ_tot(contaD,1) = CoordZ(ris,1); + contaD = contaD + 1; + else + nodiFX_tot(conta0,1) = CoordX(ris,1); + nodiFZ_tot(conta0,1) = CoordZ(ris,1); + conta0 = conta0 + 1; + end + end + + % Grafico Sezione Mese + figure(3) + CoordX = [CoordX(:,1); CoordX(1,1); CoordX(1,1)]; + CoordZ = [CoordZ(:,1); CoordZ(end,1); CoordZ(1,1)]; + sez = plot(cell2mat(CoordX(:,1)),cell2mat(CoordZ(:,1)),'-','Color','black'); + hold on + if contaC_Mese > 1 + sezC = plot(cell2mat(nodiCX_Mese(:,1)),cell2mat(nodiCZ_Mese(:,1)),'o','Color','red'); + set(sezC, 'markerfacecolor', get(sezC, 'color')); + end + if contaD_Mese > 1 + sezD = plot(cell2mat(nodiDX_Mese(:,1)),cell2mat(nodiDZ_Mese(:,1)),'o','Color',[0.4660 0.6740 0.1880]); + set(sezD, 'markerfacecolor', get(sezD, 'color')); + end + if conta0_Mese > 1 + sezF = plot(cell2mat(nodiFX_Mese(:,1)),cell2mat(nodiFZ_Mese(:,1)),'o','Color','black'); + set(sezF, 'markerfacecolor', get(sezF, 'color')); + end + if contaC_Mese > 1 && contaD_Mese > 1 && conta0_Mese > 1 + legend({'Geometria della sezione','Nodi convergenti','Nodi divergenti','Nodi stabili'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese > 1 && contaD_Mese > 1 && conta0_Mese == 1 + legend({'Geometria della sezione','Nodi convergenti','Nodi divergenti'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese > 1 && contaD_Mese == 1 && conta0_Mese > 1 + legend({'Geometria della sezione','Nodi convergenti','Nodi stabili'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese == 1 && contaD_Mese > 1 && conta0_Mese > 1 + legend({'Geometria della sezione','Nodi divergenti','Nodi stabili'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese > 1 && contaD_Mese == 1 && conta0_Mese == 1 + legend({'Geometria della sezione','Nodi convergenti'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese == 1 && contaD_Mese > 1 && conta0_Mese == 1 + legend({'Geometria della sezione','Nodi divergenti','Nodi stabili'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese == 1 && contaD_Mese == 1 && conta0_Mese > 1 + legend({'Geometria della sezione','Nodi stabili'},'Position',[0.37 0.37 0.3 0.2]); + end + title('Spostamenti Locali - Periodo di riferimento'); + xlabel('X [m]'); + ylabel('Z [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + grid off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezCIR.png')); + saveas(sez,TempName); + ChartSEZ = Image(TempName); + ChartSEZ.Style = {HAlign('center'),Height('6.5cm')}; + close(figure(3)) + + % ENG + if activeEN == 1 + % Grafico Sezione Mese + figure(4) + sez = plot(cell2mat(CoordX(:,1)),cell2mat(CoordZ(:,1)),'-','Color','black'); + hold on + if contaC_Mese > 1 + sezC = plot(cell2mat(nodiCX_Mese(:,1)),cell2mat(nodiCZ_Mese(:,1)),'o','Color','red'); + set(sezC, 'markerfacecolor', get(sezC, 'color')); + end + if contaD_Mese > 1 + sezD = plot(cell2mat(nodiDX_Mese(:,1)),cell2mat(nodiDZ_Mese(:,1)),'o','Color',[0.4660 0.6740 0.1880]); + set(sezD, 'markerfacecolor', get(sezD, 'color')); + end + if conta0_Mese > 1 + sezF = plot(cell2mat(nodiFX_Mese(:,1)),cell2mat(nodiFZ_Mese(:,1)),'o','Color','black'); + set(sezF, 'markerfacecolor', get(sezF, 'color')); + end + if contaC_Mese > 1 && contaD_Mese > 1 && conta0_Mese > 1 + legend({'Array geometry','Convergent nodes','Divergent nodes','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese > 1 && contaD_Mese > 1 && conta0_Mese == 1 + legend({'Array geometry','Convergent nodes','Divergent nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese > 1 && contaD_Mese == 1 && conta0_Mese > 1 + legend({'Array geometry','Convergent nodes','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese == 1 && contaD_Mese > 1 && conta0_Mese > 1 + legend({'Array geometry','Divergent nodes','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese > 1 && contaD_Mese == 1 && conta0_Mese == 1 + legend({'Array geometry','Convergent nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese == 1 && contaD_Mese > 1 && conta0_Mese == 1 + legend({'Array geometry','Divergent nodes','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese == 1 && contaD_Mese == 1 && conta0_Mese > 1 + legend({'Array geometry','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + end + title('Local displacements - Reference time period'); + xlabel('X [m]'); + ylabel('Z [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + grid off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezCIR_ENG.png')); + saveas(sez,TempName); + ChartSEZ_ENG = Image(TempName); + ChartSEZ_ENG.Style = {HAlign('center'),Height('6.5cm')}; + end + close(figure(4)) + + % Grafico Sezione Globali + figure(5) + sez = plot(cell2mat(CoordX(:,1)),cell2mat(CoordZ(:,1)),'-','Color','black'); + hold on + if contaC > 1 + sezC = plot(cell2mat(nodiCX_tot(:,1)),cell2mat(nodiCZ_tot(:,1)),'o','Color','red'); + set(sezC, 'markerfacecolor', get(sezC, 'color')); + end + if contaD > 1 + sezD = plot(cell2mat(nodiDX_tot(:,1)),cell2mat(nodiDZ_tot(:,1)),'o','Color',[0.4660 0.6740 0.1880]); + set(sezD, 'markerfacecolor', get(sezD, 'color')); + end + if conta0 > 1 + sezF = plot(cell2mat(nodiFX_tot(:,1)),cell2mat(nodiFZ_tot(:,1)),'o','Color','black'); + set(sezF, 'markerfacecolor', get(sezF, 'color')); + end + if contaC > 1 && contaD > 1 && conta0 > 1 + legend({'Geometria della sezione','Nodi convergenti','Nodi divergenti','Nodi stabili'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC > 1 && contaD > 1 && conta0 == 1 + legend({'Geometria della sezione','Nodi convergenti','Nodi divergenti'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC > 1 && contaD == 1 && conta0 > 1 + legend({'Geometria della sezione','Nodi convergenti','Nodi stabili'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC == 1 && contaD > 1 && conta0 > 1 + legend({'Geometria della sezione','Nodi divergenti','Nodi stabili'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC > 1 && contaD == 1 && conta0 == 1 + legend({'Geometria della sezione','Nodi convergenti'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC == 1 && contaD > 1 && conta0 == 1 + legend({'Geometria della sezione','Nodi divergenti','Nodi stabili'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC == 1 && contaD == 1 && conta0 > 1 + legend({'Geometria della sezione','Nodi stabili'},'Position',[0.37 0.37 0.3 0.2]); + end + title('Spostamenti Locali - Intero periodo'); + xlabel('X [m]'); + ylabel('Z [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + grid off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezCIR2.png')); + saveas(sez,TempName); + + ChartSEZ2 = Image(TempName); + ChartSEZ2.Style = {HAlign('center'),Height('6.5cm')}; + ChartSEZ_cap = Paragraph(['Fig. ' num2str(FIG) ' - Direzione della '... + 'risultante del vettore di spostamento 2D differenziale locale '... + 'registrata durante il periodo temporale di riferimento e a '... + 'partire dalla data di riferimento definita in Tabella 1']); + FIG = FIG+1; + ChartSEZ_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + lot = Table({ChartSEZ, ChartSEZ2}); + lot.Style = {ResizeToFitContents(false), Width('100%')}; + close(figure(5)) + + if activeEN == 1 + % Grafico Sezione Globali + figure(6) + sez = plot(cell2mat(CoordX(:,1)),cell2mat(CoordZ(:,1)),'-','Color','black'); + hold on + if contaC > 1 + sezC = plot(cell2mat(nodiCX_tot(:,1)),cell2mat(nodiCZ_tot(:,1)),'o','Color','red'); + set(sezC, 'markerfacecolor', get(sezC, 'color')); + end + if contaD > 1 + sezD = plot(cell2mat(nodiDX_tot(:,1)),cell2mat(nodiDZ_tot(:,1)),'o','Color',[0.4660 0.6740 0.1880]); + set(sezD, 'markerfacecolor', get(sezD, 'color')); + end + if conta0 > 1 + sezF = plot(cell2mat(nodiFX_tot(:,1)),cell2mat(nodiFZ_tot(:,1)),'o','Color','black'); + set(sezF, 'markerfacecolor', get(sezF, 'color')); + end + if contaC > 1 && contaD > 1 && conta0 > 1 + legend({'Array geometry','Convergent nodes','Divergent nodes','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC > 1 && contaD > 1 && conta0 == 1 + legend({'Array geometry','Convergent nodes','Divergent nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC > 1 && contaD == 1 && conta0 > 1 + legend({'Array geometry','Convergent nodes','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC == 1 && contaD > 1 && conta0 > 1 + legend({'Array geometry','Divergent nodes','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC > 1 && contaD == 1 && conta0 == 1 + legend({'Array geometry','Convergent nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC == 1 && contaD > 1 && conta0 == 1 + legend({'Array geometry','Divergent nodes','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC == 1 && contaD == 1 && conta0 > 1 + legend({'Array geometry','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + end + title('Local displacements - Complete monitoring period'); + xlabel('X [m]'); + ylabel('Z [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + grid off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezCIR2_ENG.png')); + saveas(sez,TempName); + + ChartSEZ2_ENG = Image(TempName); + ChartSEZ2_ENG.Style = {HAlign('center'),Height('6.5cm')}; + ChartSEZ_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Direction of the '... + '2D local differential displacement vector '... + 'observed during the reference time period and strarting from the reference date '... + 'reported in Table 1']); + FIG_ENG = FIG_ENG+1; + ChartSEZ_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + lot_ENG = Table({ChartSEZ_ENG, ChartSEZ2_ENG}); + lot_ENG.Style = {ResizeToFitContents(false), Width('100%')}; + end + close(figure(6)) + + % immagine stella di convergenza + nome = char(strcat(char(unitrif),'-', char(toolrif),'-Star.png')); + Star = Image(nome); + Star.Style = {Height('6.5cm')}; + Star_ENG = Image(nome); + Star_ENG.Style = {Height('6.5cm')}; + + % --- Segmenti di convergenza MESE --- + [~,cs] = size(stella_Mese); + for y = 1:cs + varseg_Mese(y,1) = stella_Mese(end,y); + end + maxseg_Mese = max(abs(varseg_Mese)); + maxsegindex_Mese = find(abs(varseg_Mese) == maxseg_Mese); + maxseg_Mese = varseg_Mese(maxsegindex_Mese); + + % --- Segmenti di convergenza Globale --- + [~,cs] = size(stella_Rif); + for y = 1:cs + varseg_tot(y,1) = stella_Rif(end,y); + numseg(y,1) = y; + end + maxseg = max(abs(varseg_tot)); + maxsegindex = find(abs(varseg_tot) == maxseg); + maxseg = varseg_tot(maxsegindex); + + figure(7) + Seg = [varseg_Mese varseg_tot]; + segmenti = barh(numseg,Seg); + title('Variazione dei segmenti di convergenza'); + ylabel('Segmento [-]'); + xlabel('Variazione di lunghezza [mm]'); + h = gca; + h.XAxis.MinorTick = 'on'; + Max(1) = max(varseg_Mese); + Max(2) = max(varseg_tot); + MAX = max(Max); + Min(1) = min(varseg_Mese); + Min(2) = min(varseg_tot); + MIN = min(Min); + MAXX = max(abs(MIN),MAX); + MM = [abs(MIN) MAX]; + in3 = find(MM == MAXX); % Dx-Sx + if in3 == 1 % DX + legend('Periodo di riferimento','Intero periodo','Location','northeast'); + else % SX + legend('Periodo di riferimento','Intero periodo','Location','northwest'); + end + ylim([0 cs+2]); + yticks(0:1:nn); + if MAXX < 10 % mm + xlim([-10 10]); + else + xlim([-MAXX MAXX]) + end + + grid on + grid minor + TempName = char(strcat('Report',siteID,'-', char(toolrif),'StarSeg.png')); + saveas(segmenti(1),TempName); + ChartSEG = Image(TempName); + ChartSEG.Style = {Height('6.8cm')}; + ChartSEG_cap = Paragraph(['Fig. ' num2str(FIG) ' - Variazione della '... + 'lunghezza dei segmenti di convergenza durante il periodo temporale '... + 'di riferimento e l''intero periodo di monitoraggio']); + FIG = FIG+1; + ChartSEG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + lot2 = Table({Star, ChartSEG}); + lot2.Style = {ResizeToFitContents(false), Width('100%')}; + close(figure(7)) + + if activeEN == 1 + figure(8) + segmenti = barh(numseg,Seg); + title('Convergence segments variation'); + ylabel('Segment [-]'); + xlabel('Length variation [mm]'); + h = gca; + h.XAxis.MinorTick = 'on'; + in3 = find(MM == MAXX); % Dx-Sx + if in3 == 1 % DX + legend('Reference time period','Complete monitoring period','Location','northeast'); + else % SX + legend('Reference time period','Complete monitoring period','Location','northwest'); + end + ylim([0 cs+2]); + yticks(0:1:nn); + if MAXX < 10 % mm + xlim([-10 10]); + else + xlim([-MAXX MAXX]) + end + + grid on + grid minor + TempName = char(strcat('Report',siteID,'-', char(toolrif),'StarSeg_ENG.png')); + saveas(segmenti(1),TempName); + ChartSEG_ENG = Image(TempName); + ChartSEG_ENG.Style = {Height('6.8cm')}; + ChartSEG_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Length variations of each convergence segment '... + 'recorded during the reference and the complete monitoring periods']); + FIG_ENG = FIG_ENG+1; + ChartSEG_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + lot2_ENG = Table({Star_ENG, ChartSEG_ENG}); + lot2_ENG.Style = {ResizeToFitContents(false), Width('100%')}; + end + close(figure(8)) + + sezCIR = Heading3('Tunnel Link'); + sezCIR.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + CC = Section(); + CC.Title = sezCIR; + % Testi relativi all'ultimo mese + testo1M = Paragraph(['Il grafico riportato di seguito mostra l''entit' char(224) ' e '... + 'la direzione dei vettori di spostamento differenziale locale nel piano '... + 'della sezione, misurati dai sensori Tunnel Link '... + 'relativamente al periodo temporale di riferimento e all''intero periodo di monitoraggio. '... + 'Il vettore ' char(232) ' ottenuto come risultante '... + 'delle componenti nel piano X-Z, ovvero larghezza ed altezza della sezione. '... + 'In particolare, valori negativi di spostamento indicano una convergenza '... + 'del nodo verso il centro della sezione, mentre spostamenti '... + 'positivi caratterizzano una divergenza del sensore in oggetto.']); + parte1 = ['La figura seguente riassume la direzione dei singoli nodi '... + 'rappresentati sulla geometria di progetto della sezione. Nel periodo '... + 'temporale di riferimento, l''analisi degli spostamenti ha evidenziato ' ... + num2str(contaC_Mese-1) ]; + if contaC_Mese-1 == 1 + parte2 = ' nodo convergente'; + else + parte2 = ' nodi convergenti'; + end + parte3 = [', ' num2str(contaD_Mese-1) ]; + if contaD_Mese-1 == 1 + parte4 = ' nodo divergente '; + else + parte4 = ' nodi divergenti '; + end + parte5 = ['e ' num2str(conta0_Mese-1) ]; + if conta0_Mese-1 == 1 + parte6 = ' nodo stabile. '; + else + parte6 = ' nodi stabili. '; + end + parte7 = ['La medesima analisi con riferimento all''intero '... + 'periodo di monitoraggio mostra ' num2str(contaC-1) ]; + if conta0-1 == 0 + if contaC-1 == 1 + parte8 = [' nodo convergente e ' num2str(contaD-1)]; + else + parte8 = [' nodi convergenti e ' num2str(contaD-1)]; + end + if contaD-1 == 1 + parte9 = ' nodo divergente. '; + else + parte9 = ' nodi divergenti. '; + end + else + if contaC-1 == 1 + parte8 = [' nodo convergente, ' num2str(contaD-1)]; + else + parte8 = [' nodi convergenti, ' num2str(contaD-1)]; + end + if contaD-1 == 1 + parte9 = ' nodo divergente '; + else + parte9 = ' nodi divergenti '; + end + parte10 = ['e ' num2str(conta0-1)]; + if conta0-1 == 1 + parte11 = ' nodo stabile. '; + else + parte11 = ' nodi stabili. '; + end + end + parte12 = ['Si noti che in questa rappresentazione vengono '... + 'considerati stabili i nodi caratterizzati da uno spostamento con '... + 'modulo inferiore a 0.5 mm.']; + if conta0-1 == 0 + testo2M = Paragraph([parte1 parte2 parte3 parte4 parte5 parte6 parte7 parte8 ... + parte9 parte12]); + else + testo2M = Paragraph([parte1 parte2 parte3 parte4 parte5 parte6 parte7 parte8 ... + parte9 parte10 parte11 parte12]); + end + testo3M = Paragraph(['Vengono inoltre riportate le variazioni di lunghezza '... + 'dei segmenti di convergenza durante il periodo temporale di riferimento '... + 'e l''intero periodo di monitoraggio. I segmenti sono definiti con '... + 'l''ausilio della stella topografica riportata in figura. ' ... + 'In particolare, la maggior variazione relativa al periodo di riferimento ' ... + char(232) ' osservabile nel segmento S' num2str(maxsegindex_Mese(1,1)) ... + ' ed ' char(232) ' pari a ' num2str(round(maxseg_Mese(1,1),1)) ' mm. '... + 'Facendo riferimento all''intero periodo, S' num2str(maxsegindex(1,1)) ... + ' risulta essere il segmento maggiormente attivo, con uno spostamento pari a '... + num2str(round(maxseg(1,1),1)) ' mm.']); + spazio = Paragraph(''); + testo1M.HAlign = 'justify'; + testo2M.HAlign = 'justify'; + testo3M.HAlign = 'justify'; + + add(DT,sezCIR); + add(DT,testo1M); + add(DT,ChartCIR); + add(DT,ChartCIR_cap); + add(DT,testo2M); + add(DT,spazio); + add(DT,lot); + add(DT,ChartSEZ_cap); + add(DT,testo3M); + add(DT,lot2); + add(DT,ChartSEG_cap); + add(DT,br); + + if activeEN == 1 + sezCIR_ENG = Heading3('Tunnel Link'); + sezCIR_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + CC_ENG = Section(); + CC_ENG.Title = sezCIR_ENG; + % Testi relativi all'ultimo mese + testo1M = Paragraph(['Following graphs display the magnitude and direction of local differential displacements in the section plane '... + 'measured by the 3D MEMS sensors, both during the reference and complete monitoring period. '... '... + 'The 2D vector is the resultant of displacement components in the X-Z plane, representing the section width and '... + 'height, respectively. In particular, negative values indicate that the node is converging towards the centre of '... + 'the section, while positive ones correspond to a divergent movement.']); + parte1 = ['The following figure summarizes the displacement direction of each single node, '... + 'which are represented on the section geometry. During the reference time period, the analysis evidenced '... + num2str(contaC_Mese-1) ]; + if contaC_Mese-1 == 1 + parte2 = ' convergent node'; + else + parte2 = ' convergent nodes'; + end + parte3 = [', ' num2str(contaD_Mese-1) ]; + if contaD_Mese-1 == 1 + parte4 = ' divergent sensor '; + else + parte4 = ' divergent sensors '; + end + parte5 = ['and ' num2str(conta0_Mese-1) ]; + if conta0_Mese-1 == 1 + parte6 = ' stable one. '; + else + parte6 = ' stable ones. '; + end + parte7 = ['The same analysis performed on the complete monitoring period '... + 'resulted in ' num2str(contaC-1) ]; + if conta0-1 == 0 + if contaC-1 == 1 + parte8 = [' convergent node and ' num2str(contaD-1)]; + else + parte8 = [' convergent nodes and ' num2str(contaD-1)]; + end + if contaD-1 == 1 + parte9 = ' divergent sensor. '; + else + parte9 = ' divergent sensors. '; + end + else + if contaC-1 == 1 + parte8 = [' convergent node, ' num2str(contaD-1)]; + else + parte8 = [' convergent nodes, ' num2str(contaD-1)]; + end + if contaD-1 == 1 + parte9 = ' divergent sensor '; + else + parte9 = ' divergent sensors '; + end + parte10 = ['and ' num2str(conta0-1)]; + if conta0-1 == 1 + parte11 = ' stable one. '; + else + parte11 = ' stable ones. '; + end + end + parte12 = ['In this specific representation, nodes featuring displacement values less than 0.5 mm '... + 'are assumed to be stable.']; + if conta0-1 == 0 + testo2M = Paragraph([parte1 parte2 parte3 parte4 parte5 parte6 parte7 parte8 ... + parte9 parte12]); + else + testo2M = Paragraph([parte1 parte2 parte3 parte4 parte5 parte6 parte7 parte8 ... + parte9 parte10 parte11 parte12]); + end + testo3M = Paragraph(['Moreover, the following graph reports the length variation of '... + 'each convergence segment referred to the monitored tunnel section, both during the reference '... + 'and complete monitoring periods. Segments definition is based on the topographic star displayed ' ... + 'in the corresponding figure. In this case, segment S' num2str(maxsegindex_Mese(1,1)) ' presented the '... + 'maximum length variation observed during the reference time period, ' ... + 'with a difference of ' num2str(round(maxseg_Mese(1,1),1)) ' mm. '... + 'Taking into account the complete monitoring period, the maximum variation is obsverved on segment S' num2str(maxsegindex(1,1)) ... + ', with a difference of '... + num2str(round(maxseg(1,1),1)) ' mm.']); + spazio = Paragraph(''); + testo1M.HAlign = 'justify'; + testo2M.HAlign = 'justify'; + testo3M.HAlign = 'justify'; + + add(DT_ENG,sezCIR_ENG); + add(DT_ENG,testo1M); + add(DT_ENG,ChartCIR_ENG); + add(DT_ENG,ChartCIR_ENG_cap); + add(DT_ENG,testo2M); + add(DT_ENG,spazio); + add(DT_ENG,lot); + add(DT_ENG,ChartSEZ_ENG_cap); + add(DT_ENG,testo3M); + add(DT_ENG,lot2); + add(DT_ENG,ChartSEG_ENG_cap); + add(DT_ENG,br); + end + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + check = 1; + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT,testo); + end + end + end + end +end + +text = 'report_TuL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_TuL_ENG.m b/ATD/report_TuL_ENG.m new file mode 100755 index 0000000..7e7cbd4 --- /dev/null +++ b/ATD/report_TuL_ENG.m @@ -0,0 +1,722 @@ +function [GI_Cir_Q1,GI_Cir_Q2,GI_Cir_Q3,GI_Cir_Q4,GI_Cir_Q1_Num,GI_Cir_Q2_Num,... + GI_Cir_Q3_Num,GI_Cir_Q4_Num,GI_Cir_Seg,GI_Cir_Z,GI_Cir_Date,GI_TuL_RL,... + ATTIVA,FIG] = report_TuL_ENG(IDcentralina,DTcatena,rTuL,m,NodoTunnelLink,toolrif,... + unitrif,datarif,firstdata_num,Font_caption,Font_tools,siteID,DT,FIG,br,colonna2,... + colonna2bis,status,ATTIVA,conn,FileName) + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +GI_Cir_Q1 = []; +GI_Cir_Q2 = []; +GI_Cir_Q3 = []; +GI_Cir_Q4 = []; +GI_Cir_Q1_Num = []; +GI_Cir_Q2_Num = []; +GI_Cir_Q3_Num = []; +GI_Cir_Q4_Num = []; +GI_Cir_Seg = []; +GI_Cir_Z = []; +GI_Cir_Date = []; +GI_TuL_RL = []; + +check = 0; +while check == 0 + if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('Array not installed or inactive.'); + add(DT,testo); + end + check = 1; + elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoring completed. Please log into the web-based platform '... + 'to access the complete dataset.']); + add(DT,testo); + end + check = 1; + else + [~,Segmenti,~,~,~,Antiorario] = star(IDcentralina,DTcatena,FileName); + [dim,~] = size(Segmenti); % numero di punti per il calcolo della stella + + NODATA(m,1) = 0; + Num = zeros(rTuL(m,1),1); + for n = 1:rTuL(m,1) + NodeNum = num2str(NodoTunnelLink(n,m)); + % dati del mese + comando = ['select EventDate, EventTime, XShift, ZShift, HShift, '... + 'HShift_local, X, Z 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; + Num(n,1) = NodoTunnelLink(n,m); + + datarifNEW = datestr(firstdata_num{m+1,1},'yyyy-mm-dd'); % data riferimento definita sul sito + temporifNEW = datestr(firstdata_num{m+1,1},'HH:MM:SS'); + % primo dato per la stella + comando = ['select HShift from ElabDataView where EventDate = ''' ... + datarifNEW ''' and EventTime >= ''' temporifNEW ''' and '... + 'ToolNameID = ''' char(toolrif) ''' and UnitName = ''' ... + char(unitrif) ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Stella1 = cell2mat(curs.Data); + + % Scarico ay che mi serve per orientare gli spostamenti in + % convergenze/divergenza a seconda del quadrante - Inizio mese + comando = ['select Val1, Val6 from RawDataView where Date >= ''' datarif ... + ''' and UnitName = ''' char(unitrif) ''' and ToolNameID = ''' char(toolrif) ... + ''' and NodeNum = ' NodeNum ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DatiaccY_Mese = curs.Data; + + % Scarico i parametri di calibrazione di ay + comando = ['select Cal0, Cal1, Cal2, Cal3, Cal4, Cal5, Cal6, Cal7, Cal8, '... + 'CalA, CalB from CalibrationView where UnitName = ''' char(unitrif) ... + ''' and ToolNameID = ''' char(toolrif) ''' and NodeNum = ''' NodeNum '''']; + curs = exec(conn,comando); + curs = fetch(curs); + DCalTuL = curs.Data; + [r,c] = size(DCalTuL); + MATconv = zeros(r,c); + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalTuL{ii,jj}; + end + end + DCalTuL = MATconv; + caY_Tu = DCalTuL(:,4); + pIntY_Tu = DCalTuL(:,5); + iIntY_Tu = DCalTuL(:,6); + + [rD,rC] = size(Dati); + if rC ~= 1 + T = [cell2mat(Dati(:,1)) repmat(' ', [rD,1]) cell2mat(Dati(:,2))]; + Date = datenum(T); % Data + if n == 1 % Il primo lo scrivo e creo la variabile di controllo + else + [rS,~] = size(asseX); + if rD ~= rS + NODATA(m,1) = 1; + check = 0; + break + else + check = 1; + end + end + + % divergenza/convergenza dei singoli nodi dall'inizio + asseX(:,n) = cell2mat((Dati(:,3))); + asseZ(:,n) = cell2mat(Dati(:,4)); + X_TuL_Mese(:,n) = cell2mat(Dati(:,7)); + Z_TuL_Mese(:,n) = cell2mat(Dati(:,8)); + accY_raw(:,n) = str2double(DatiaccY_Mese(:,1)); + t_TuL(:,n) = str2double(DatiaccY_Mese(:,2)); + accY_Mese(:,n) = accY_raw(:,n)*caY_Tu+(t_TuL(:,n)*pIntY_Tu+iIntY_Tu); + diffX(:,n) = asseX(:,n)-asseX(1,n); + diffZ(:,n) = asseZ(:,n)-asseZ(1,n); + RIS_XZ(:,n) = 1000*cell2mat((Dati(:,6))); + if n <= dim + stella_Rif(:,n) = 1000*(cell2mat(Dati(:,5))-Stella1(1,1)); + stella_Mese(:,n) = 1000*(cell2mat(Dati(:,5))-cell2mat(Dati(1,5))); + end + + % dati relativi al mese + RIS_XZ_Mese(1,n) = sqrt(diffX(end,n)^2 + diffZ(end,n)^2)*1000; + [rAY,~] = size(accY_Mese); + if isnan(accY_Mese(end,n)) == 1 + for d = 1:rAY + if isnan(accY_Mese(end-d+1,n)) == 0 + diffaccY(1,n) = accY_Mese(end-d+1,n)-accY_Mese(1,n); + break + end + end + else + diffaccY(1,n) = accY_Mese(end,n)-accY_Mese(1,n); + end + % correggo segno risultante + if diffaccY(1,n) < 0 + if Antiorario(n,1) == 1 || Antiorario(n,1) == 4 + RIS_XZ_Mese(1,n) = -1*RIS_XZ_Mese(1,n); + end + elseif diffaccY(1,n) > 0 + if Antiorario(n,1) == 2 || Antiorario(n,1) == 3 + RIS_XZ_Mese(1,n) = -1*RIS_XZ_Mese(1,n); + end + end + else + NODATA(m,1) = 1; + check = 1; + end + end + + if NODATA(m,1) == 0 + date = datestr(datenum(colonna2{m+1,1},'dd-mm-yyyy'),'yyyy-mm-dd'); % data riferimento definita sul sito + % posizione di progetto dei nodi + comando = ['select EventDate, EventTime, X, Z from ElabDataView where EventDate >= ''' ... + date ''' and ToolNameID = ''' char(toolrif) ''' and UnitName = ''' char(unitrif) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + SezioneXZ = curs.Data; + Datasez = SezioneXZ(1,1); + Orasez = SezioneXZ(1,2); + [rz,~] = size(SezioneXZ); + scrivi = 1; + for rr = 1:rz + if strcmp(SezioneXZ(rr,1),Datasez)==1 && strcmp(SezioneXZ(rr,2),Orasez) ==1 + CoordX(scrivi,1) = SezioneXZ(rr,3); + CoordZ(scrivi,1) = SezioneXZ(rr,4); + scrivi = scrivi+1; + end + end + if strcmp(colonna2bis(m+1,1),colonna2(m+1,1)) == 0 % data zero diversa data riferimento + datarifNEW = datestr(firstdata_num{m+1,1},'yyyy-mm-dd'); % data riferimento definita sul sito + for nw = 1:rTuL(m,1) + NodeNum = num2str(NodoTunnelLink(nw,m)); + comando = ['select EventDate, EventTime, XShift, ZShift, X, Z, '... + 'from ElabDataView where EventDate = ''' datarifNEW ''' and ToolNameID = ''' char(toolrif) ... + ''' and UnitName = ''' char(unitrif) ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DatiNEW = curs.Data; % dati registrati alla data di riferimento + Num(nw,1) = NodoTunnelLink(nw,m); + [~,rC] = size(DatiNEW); + if rC ~= 1 + % dalla data di riferimento + % divergenza/convergenza dei singoli nodi dall'inizio + asseX(:,nw) = asseX(:,nw)-cell2mat(DatiNEW(1,3)); + asseZ(:,nw) = asseZ(:,nw)-cell2mat(DatiNEW(1,4)); + X_TuL_Rif(:,nw) = cell2mat(DatiNEW(1,5)); + Z_TuL_Rif(:,nw) = cell2mat(DatiNEW(1,6)); + + % Scarico ay che mi serve per orientare gli spostamenti in + % convergenze/divergenza a seconda del quadrante - dati + % dalla data di riferimento + comando = ['select Val1, Val6 from RawDataView where Date >= ''' datarifNEW ... + ''' and UnitName = ''' char(unitrif) ''' and ToolNameID = ''' char(toolrif) ... + ''' and NodeNum = ' NodeNum ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DatiaccY_Rif = curs.Data; + + accY_raw(:,n) = str2double(DatiaccY(:,1)); + t_TuL(:,n) = str2double(DatiaccY(:,2)); + accY_Rif(:,n) = accY_raw(:,n)*caY_Tu+(t_TuL(:,n)*pIntY_Tu+iIntY_Tu); + + diffX(:,n) = asseX(:,n)-asseX(1,n); + diffZ(:,n) = asseZ(:,n)-asseZ(1,n); + + % Risultati dalla data di riferimento + RIS_XZ(:,n) = 1000*((asseX(:,n).^2+asseZ(:,n).^2).^0.5); + diffaccY_Rif(1,n) = accY_Mese(end,n)-accY_Rif(1,n); + % correggo segno risultante + if diffaccY_Rif(1,n) < 0 + if Antiorario(n,1) == 1 || Antiorario(n,1) == 4 + RIS_XZ(1,n) = -1*RIS_XZ(1,n); + end + elseif diffaccY_Rif(1,n) > 0 + if Antiorario(n,1) == 2 || Antiorario(n,1) == 3 + RIS_XZ(1,n) = -1*RIS_XZ(1,n); + end + end + + % dati relativi al mese + RIS_XZ_Mese(:,n) = sqrt(diffX(end,n).^2 + diffZ(end,n)^2)*1000; + diffaccY_Mese(:,n) = accY_Mese(:,n)-accY_Mese(1,n); + % correggo segno risultante + [rA,~] = size(accY_Mese); + for aa = 1:rA + if diffaccY_Mese(1,n) < 0 + if Antiorario(n,1) == 1 || Antiorario(n,1) == 4 + RIS_XZ_Mese(aa,n) = -1*RIS_XZ_Mese(aa,n); + end + elseif diffaccY_Mese(1,n) > 0 + if Antiorario(n,1) == 2 || Antiorario(n,1) == 3 + RIS_XZ_Mese(aa,n) = -1*RIS_XZ_Mese(aa,n); + end + end + end + else + NODATA(m,1) = 1; + end + end + end + + q1 = find(Antiorario==1); + q2 = find(Antiorario==2); + q3 = find(Antiorario==3); + q4 = find(Antiorario==4); + m1 = max(abs(RIS_XZ_Mese(end,q1))); + g1 = find(m1==abs(RIS_XZ_Mese)); + GI_Cir_Q1 = RIS_XZ_Mese(end,g1(1)); + m2 = max(abs(RIS_XZ_Mese(end,q2))); + g2 = find(m2==abs(RIS_XZ_Mese)); + GI_Cir_Q2 = RIS_XZ_Mese(end,g2(1)); + m3 = max(abs(RIS_XZ_Mese(end,q3))); + g3 = find(m3==abs(RIS_XZ_Mese)); + GI_Cir_Q3 = RIS_XZ_Mese(end,g3(1)); + m4 = max(abs(RIS_XZ_Mese(end,q4))); + g4 = find(m4==abs(RIS_XZ_Mese)); + GI_Cir_Q4 = RIS_XZ_Mese(end,g4(1)); + GI_Cir_Q1_Num = Num(g1(1)); + GI_Cir_Q2_Num = Num(g2(1)); + GI_Cir_Q3_Num = Num(g3(1)); + GI_Cir_Q4_Num = Num(g4(1)); + GI_Cir_Seg = stella_Mese(end,:); + GI_Cir_Date = Date; + + % Cerco eventuali correlazioni con PreConv Array + NomeFile = strcat('Report',siteID,'-PCLvsTuL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + Var = 0; + ind = 1; + while AAA < rF % A un Cir compete (se c'è) uno ed un solo PreConv. Lo vado a cercare + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono PreConv Array o non ci sono Cir + AAA = 2; + else + check2 = Filetesto(AAA+1,1); + if check1 == str2num(DTcatena(end-2:end)) % Il Cir è da prendere in considerazione ed è riportato nella prima riga del file + Nodo = Filetesto(AAA+2,1); + Var = 1; + elseif check2 == str2num(DTcatena(end-2:end)) % Il Cir è da prendere in considerazione ed è riportato nella seconda riga del file + Nodo = Filetesto(AAA+3,1); + Var = 1; + end + AAA = AAA+4; + end + end + if Var == 1 + GI_Cir_Z(:,ind) = (asseZ(:,Nodo)-asseZ(1,Nodo))*1000; + ind = ind+1; + Var = 0; + end + + % Cerco eventuali correlazioni con Rad Array + NomeFile = strcat('Report',siteID,'-TuLvsRL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + Var = 0; + ind = 1; + while AAA < rF % A un Cir compete un Rad Array. Lo vado a cercare + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono Rad Array o non ci sono Cir + AAA = 2; + else + check2 = Filetesto(AAA+1,1); + if check1 == str2num(DTcatena(end-2:end)) % Il Cir è da prendere in considerazione ed è riportato nella prima riga del file + Nodo = Filetesto(AAA+2,1); + Var = 1; + elseif check2 == str2num(DTcatena(end-2:end)) % Il Cir è da prendere in considerazione ed è riportato nella seconda riga del file + Nodo = Filetesto(AAA+3,1); + Var = 1; + end + AAA = AAA+4; + end + if Var == 1 + GI_TuL_RL(:,ind) = sqrt(diffX(:,Nodo).^2 + diffZ(:,Nodo).^2)*1000; % ad un Cir possono competere più Rad. Il cir è unico + ind = ind+1; + Var = 0; + end + end + + % Istogramma convergenza/divergenza dei singoli nodi + figure(1) + [~,nn] = size(RIS_XZ_Mese(end,:)); + for w = 1:nn + nodi_grafico(1,w) = w; + end + RIS = [RIS_XZ_Mese(end,:)' RIS_XZ(end,:)']; + div_conv = barh(nodi_grafico,RIS); + title('2D local displacement'); + xlabel('Displacement [mm]'); + ylabel('Node [-]'); + h = gca; + h.XAxis.MinorTick = 'on'; + h.YAxis.MinorTick = 'off'; + Max(1) = max(RIS_XZ_Mese(end,:)); + Max(2) = max(RIS_XZ(end,:)); + MAX = max(Max); + Min(1) = min(RIS_XZ_Mese(end,:)); + Min(2) = min(RIS_XZ(end,:)); + MIN = min(Min); + in1 = find(Max == MAX); + in2 = find(Min == MIN); + MM = [abs(MIN) MAX]; + MAXX = max(MM); + in3 = find(MM == MAXX); + if in3 == 1 % DX + if in2 == 1 + POS = find(RIS_XZ_Mese == Min(1)); + else + POS = find(RIS_XZ == Min(2)); + end + else % SX + if in1 == 1 + POS = find(RIS_XZ_Mese == Max(1)); + else + POS = find(RIS_XZ == Max(2)); + end + end + if MAXX < 10 % mm + xlim([-10 10]); + else + xlim([-MAXX MAXX]) + end + ylim([0 nn+2]); + yticks(0:1:nn); + grid on + if in3 == 1 % DX + legend('Reference time period','Complete monitoring period','Location','northeast'); + else % SX + legend('Reference time period','Complete monitoring period','Location','northwest'); + end + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Convergenza_ENG.png')); + saveas(div_conv(1),TempName); + ChartCIR = Image(TempName); + ChartCIR.Style = {HAlign('justify'),ScaleToFit}; + ChartCIR_cap = Paragraph(['Fig. ' num2str(FIG) ' - 2D Local differential displacements '... + 'recorded in the section plane by the 3D MEMS sensors during the reference and the '... + 'complete monitoring period']); + FIG = FIG+1; + ChartCIR_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + % --- Sezione - MESE --- + contaC_Mese = 1; + contaD_Mese = 1; + conta0_Mese = 1; + for ris = 1:nn + if RIS_XZ_Mese(end,ris)< -0.5 + nodiCX_Mese(contaC_Mese,1) = CoordX(ris,1); + nodiCZ_Mese(contaC_Mese,1) = CoordZ(ris,1); + contaC_Mese = contaC_Mese + 1; + elseif RIS_XZ_Mese(end,ris)> 0.5 + nodiDX_Mese(contaD_Mese,1) = CoordX(ris,1); + nodiDZ_Mese(contaD_Mese,1) = CoordZ(ris,1); + contaD_Mese = contaD_Mese + 1; + else + nodiFX_Mese(conta0_Mese,1) = CoordX(ris,1); + nodiFZ_Mese(conta0_Mese,1) = CoordZ(ris,1); + conta0_Mese = conta0_Mese + 1; + end + end + + % --- Sezione - GLOBALI --- + contaC = 1; + contaD = 1; + conta0 = 1; + for ris = 1:nn + if RIS_XZ(end,ris)< -0.5 + nodiCX_tot(contaC,1) = CoordX(ris,1); + nodiCZ_tot(contaC,1) = CoordZ(ris,1); + contaC = contaC + 1; + elseif RIS_XZ(end,ris)> 0.5 + nodiDX_tot(contaD,1) = CoordX(ris,1); + nodiDZ_tot(contaD,1) = CoordZ(ris,1); + contaD = contaD + 1; + else + nodiFX_tot(conta0,1) = CoordX(ris,1); + nodiFZ_tot(conta0,1) = CoordZ(ris,1); + conta0 = conta0 + 1; + end + end + + % Grafico Sezione Mese + figure(2) + CoordX = [CoordX(:,1); CoordX(1,1); CoordX(1,1)]; + CoordZ = [CoordZ(:,1); CoordZ(end,1); CoordZ(1,1)]; + sez = plot(cell2mat(CoordX(:,1)),cell2mat(CoordZ(:,1)),'-','Color','black'); + hold on + if contaC_Mese > 1 + sezC = plot(cell2mat(nodiCX_Mese(:,1)),cell2mat(nodiCZ_Mese(:,1)),'o','Color','red'); + set(sezC, 'markerfacecolor', get(sezC, 'color')); + end + hold on + if contaD_Mese > 1 + sezD = plot(cell2mat(nodiDX_Mese(:,1)),cell2mat(nodiDZ_Mese(:,1)),'o','Color',[0.4660 0.6740 0.1880]); + set(sezD, 'markerfacecolor', get(sezD, 'color')); + end + hold on + if conta0_Mese > 1 + sezF = plot(cell2mat(nodiFX_Mese(:,1)),cell2mat(nodiFZ_Mese(:,1)),'o','Color','black'); + set(sezF, 'markerfacecolor', get(sezF, 'color')); + end + if contaC_Mese > 1 && contaD_Mese > 1 && conta0_Mese > 1 + legend({'Array geometry','Convergent nodes','Divergent nodes','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese > 1 && contaD_Mese > 1 && conta0_Mese == 1 + legend({'Array geometry','Convergent nodes','Divergent nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese > 1 && contaD_Mese == 1 && conta0_Mese > 1 + legend({'Array geometry','Convergent nodes','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese == 1 && contaD_Mese > 1 && conta0_Mese > 1 + legend({'Array geometry','Divergent nodes','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese > 1 && contaD_Mese == 1 && conta0_Mese == 1 + legend({'Array geometry','Convergent nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese == 1 && contaD_Mese > 1 && conta0_Mese == 1 + legend({'Array geometry','Divergent nodes','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese == 1 && contaD_Mese == 1 && conta0_Mese > 1 + legend({'Array geometry','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + end + title('Local displacements - Reference time period'); + xlabel('X [m]'); + ylabel('Z [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + grid off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezCIR_ENG.png')); + saveas(sez,TempName); + ChartSEZ = Image(TempName); + ChartSEZ.Style = {HAlign('center'),Height('6.5cm')}; + + % Grafico Sezione Globali + figure(3) + sez = plot(cell2mat(CoordX(:,1)),cell2mat(CoordZ(:,1)),'-','Color','black'); + hold on + if contaC > 1 + sezC = plot(cell2mat(nodiCX_tot(:,1)),cell2mat(nodiCZ_tot(:,1)),'o','Color','red'); + set(sezC, 'markerfacecolor', get(sezC, 'color')); + end + hold on + if contaD > 1 + sezD = plot(cell2mat(nodiDX_tot(:,1)),cell2mat(nodiDZ_tot(:,1)),'o','Color',[0.4660 0.6740 0.1880]); + set(sezD, 'markerfacecolor', get(sezD, 'color')); + end + hold on + if conta0 > 1 + sezF = plot(cell2mat(nodiFX_tot(:,1)),cell2mat(nodiFZ_tot(:,1)),'o','Color','black'); + set(sezF, 'markerfacecolor', get(sezF, 'color')); + end + if contaC > 1 && contaD > 1 && conta0 > 1 + legend({'Array geometry','Convergent nodes','Divergent nodes','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC > 1 && contaD > 1 && conta0 == 1 + legend({'Array geometry','Convergent nodes','Divergent nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC > 1 && contaD == 1 && conta0 > 1 + legend({'Array geometry','Convergent nodes','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC == 1 && contaD > 1 && conta0 > 1 + legend({'Array geometry','Divergent nodes','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC > 1 && contaD == 1 && conta0 == 1 + legend({'Array geometry','Convergent nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC == 1 && contaD > 1 && conta0 == 1 + legend({'Array geometry','Divergent nodes','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC == 1 && contaD == 1 && conta0 > 1 + legend({'Array geometry','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + end + title('Local displacements - Complete monitoring period'); + xlabel('X [m]'); + ylabel('Z [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + grid off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezCIR2_ENG.png')); + saveas(sez,TempName); + + ChartSEZ2 = Image(TempName); + ChartSEZ2.Style = {HAlign('center'),Height('6.5cm')}; + ChartSEZ_cap = Paragraph(['Fig. ' num2str(FIG) ' - Direction of the '... + '2D local differential displacement vector '... + 'observed during the reference time period and strarting from the reference date '... + 'reported in Table 1']); + FIG = FIG+1; + ChartSEZ_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + lot = Table({ChartSEZ, ChartSEZ2}); + lot.Style = {ResizeToFitContents(false), Width('100%')}; + + % immagine stella di convergenza + nome = char(strcat(char(unitrif),'-', char(toolrif),'-Star.png')); + Star = Image(nome); + Star.Style = {Height('6.5cm')}; + Star2 = Image(nome); + Star2.Style = {Height('6.5cm')}; + + % --- Segmenti di convergenza MESE --- + [~,cs] = size(stella_Mese); + for y = 1:cs + varseg_Mese(y,1) = stella_Mese(end,y); + end + maxseg_Mese = max(abs(varseg_Mese)); + maxsegindex_Mese = find(abs(varseg_Mese) == maxseg_Mese); + maxseg_Mese = varseg_Mese(maxsegindex_Mese); + + % --- Segmenti di convergenza Globale --- + [~,cs] = size(stella_Rif); + for y = 1:cs + varseg_tot(y,1) = stella_Rif(end,y); + numseg(y,1) = y; + end + maxseg = max(abs(varseg_tot)); + maxsegindex = find(abs(varseg_tot) == maxseg); + maxseg = varseg_tot(maxsegindex); + + figure(4) + Seg = [varseg_Mese varseg_tot]; + segmenti = barh(numseg,Seg); + title('Convergence segments variation'); + ylabel('Segment [-]'); + xlabel('Length variation [mm]'); + h = gca; + h.XAxis.MinorTick = 'on'; + Max(1) = max(varseg_Mese); + Max(2) = max(varseg_tot); + MAX = max(Max); + Min(1) = min(varseg_Mese); + Min(2) = min(varseg_tot); + MIN = min(Min); + MAXX = max(abs(MIN),MAX); + MM = [abs(MIN) MAX]; + in3 = find(MM == MAXX); % Dx-Sx + if in3 == 1 % DX + legend('Reference time period','Complete monitoring period','Location','northeast'); + else % SX + legend('Reference time period','Complete monitoring period','Location','northwest'); + end + ylim([0 cs+2]); + yticks(0:1:nn); + if MAXX < 10 % mm + xlim([-10 10]); + else + xlim([-MAXX MAXX]) + end + + grid on + grid minor + TempName = char(strcat('Report',siteID,'-', char(toolrif),'StarSeg_ENG.png')); + saveas(segmenti(1),TempName); + ChartSEG = Image(TempName); + ChartSEG.Style = {Height('6.8cm')}; + ChartSEG_cap = Paragraph(['Fig. ' num2str(FIG) ' - Length variations of each convergence segment '... + 'recorded during the reference and the complete monitoring periods']); + FIG = FIG+1; + ChartSEG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + lot2 = Table({Star, ChartSEG}); + lot2.Style = {ResizeToFitContents(false), Width('100%')}; + + sezCIR = Heading3('Tunnel Link'); + sezCIR.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + CC = Section(); + CC.Title = sezCIR; + % Testi relativi all'ultimo mese + testo1M = Paragraph(['Following graphs display the magnitude and direction of local differential displacements in the section plane '... + 'measured by the 3D MEMS sensors, both during the reference and complete monitoring period. '... '... + 'The 2D vector is the resultant of displacement components in the X-Z plane, representing the section width and '... + 'height, respectively. In particular, negative values indicate that the node is converging towards the centre of '... + 'the section, while positive ones correspond to a divergent movement.']); + parte1 = ['The following figure summarizes the displacement direction of each single node, '... + 'which are represented on the section geometry. During the reference time period, the analysis evidenced '... + num2str(contaC_Mese-1) ]; + if contaC_Mese-1 == 1 + parte2 = ' convergent node'; + else + parte2 = ' convergent nodes'; + end + parte3 = [', ' num2str(contaD_Mese-1) ]; + if contaD_Mese-1 == 1 + parte4 = ' divergent sensor '; + else + parte4 = ' divergent sensors '; + end + parte5 = ['and ' num2str(conta0_Mese-1) ]; + if conta0_Mese-1 == 1 + parte6 = ' stable one. '; + else + parte6 = ' stable ones. '; + end + parte7 = ['The same analysis performed on the complete monitoring period '... + 'resulted in ' num2str(contaC-1) ]; + if conta0-1 == 0 + if contaC-1 == 1 + parte8 = [' convergent node and ' num2str(contaD-1)]; + else + parte8 = [' convergent nodes and ' num2str(contaD-1)]; + end + if contaD-1 == 1 + parte9 = ' divergent sensor. '; + else + parte9 = ' divergent sensors. '; + end + else + if contaC-1 == 1 + parte8 = [' convergent node, ' num2str(contaD-1)]; + else + parte8 = [' convergent nodes, ' num2str(contaD-1)]; + end + if contaD-1 == 1 + parte9 = ' divergent sensor '; + else + parte9 = ' divergent sensors '; + end + parte10 = ['and ' num2str(conta0-1)]; + if conta0-1 == 1 + parte11 = ' stable one. '; + else + parte11 = ' stable ones. '; + end + end + parte12 = ['In this specific representation, nodes featuring displacement values less than 0.5 mm '... + 'are assumed to be stable.']; + if conta0-1 == 0 + testo2M = Paragraph([parte1 parte2 parte3 parte4 parte5 parte6 parte7 parte8 ... + parte9 parte12]); + else + testo2M = Paragraph([parte1 parte2 parte3 parte4 parte5 parte6 parte7 parte8 ... + parte9 parte10 parte11 parte12]); + end + testo3M = Paragraph(['Moreover, the following graph reports the length variation of '... + 'each convergence segment referred to the monitored tunnel section, both during the reference '... + 'and complete monitoring periods. Segments definition is based on the topographic star displayed ' ... + 'in the corresponding figure. In this case, segment S' num2str(maxsegindex_Mese(1,1)) ' presented the '... + 'maximum length variation observed during the reference time period, ' ... + 'with a difference of ' num2str(round(maxseg_Mese(1,1),1)) ' mm. '... + 'Taking into account the complete monitoring period, the maximum variation is obsverved on segment S' num2str(maxsegindex(1,1)) ... + ', with a difference of '... + num2str(round(maxseg(1,1),1)) ' mm.']); + spazio = Paragraph(''); + testo1M.HAlign = 'justify'; + testo2M.HAlign = 'justify'; + testo3M.HAlign = 'justify'; + + add(DT,sezCIR); + add(DT,testo1M); + add(DT,ChartCIR); + add(DT,ChartCIR_cap); + add(DT,testo2M); + add(DT,spazio); + add(DT,lot); + add(DT,ChartSEZ_cap); + add(DT,testo3M); + add(DT,lot2); + add(DT,ChartSEG_cap); + add(DT,br); + + close(figure(1)); + close(figure(2)); + close(figure(3)); + close(figure(4)); + else + if ATTIVA == 1 + testo = Paragraph('No data available for the reference time period.'); + ATTIVA = 0; + add(DT,testo); + check = 1; + end + end + end +end + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_TuL_ENG function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_WEL.m b/ATD/report_WEL.m new file mode 100755 index 0000000..1222c2a --- /dev/null +++ b/ATD/report_WEL.m @@ -0,0 +1,411 @@ +function [FIG,FIG_ENG,battANALOG,ATTIVA] = report_WEL(rWEL,m,NodoWireExtensometerLink,toolrif,... + unitrif,contunit,datarif,Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,DT_ENG,... + FIG,FIG_ENG,br,activeEN,status,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_WEL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +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 + WE = Section(); + sezWEL = Heading3('Wire Extensometer Link'); + sezWEL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + WE.Title = sezWEL; + 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')}; + sezBATT = Paragraph('GMUX - Batteria e Temperatura'); + sezBATT.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + 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 + WE_ENG = Section(); + sezWEL_ENG = Heading3('Wire Extensometer Link'); + sezWEL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + WE_ENG.Title = sezWEL_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,sezWEL); + if activeEN == 1 + add(DT_ENG,sezWEL_ENG); + end + + for w = 1:rWEL(m,1) + NodeNum = num2str(NodoWireExtensometerLink(w,m)); + comando = ['select EventDate, EventTime, XShift, T_node 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 + allungamento = cell2mat(Dati(:,3)); % allungamento filo + var_X = allungamento - allungamento(1,:); + TempWEL = cell2mat(Dati(:,4)); % temperatura + + % grafico allungamento NELL'ULTIMO MESE + figure(10); + if isnan(TempWEL(1)) == 0 + yyaxis left + end + wire = plot(Date,var_X); + control = max(abs(var_X)); + if control < 1 % mm + ylim([-1 1]); + end + hold on + xlabel('Data [gg/mm/aaaa]'); + ylabel('Allungamento (+) / Accorciamento (-) [mm]'); + set(gca,'YColor','k'); + if isnan(TempWEL(1)) == 0 + yyaxis right + plot(Date,TempWEL,':','LineWidth',1.1); + ylabel(['Temperatura [' char(176) 'C]']); + set(gca,'YColor','k'); + str(1,1) = cellstr('Variazione lunghezza filo'); + str(2,1) = cellstr('Temperatura'); + MX(1) = max(TempWEL(1:10)); + MX(2) = min(TempWEL(1:10)); + MAX = max(abs(MX)); + IN = find(abs(MX)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + end + title(['Allungamento/accorciamento del filo del nodo numero ' NodeNum]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-WireExt', NodeNum, '.png')); + saveas(wire,TempName); + ChartWEL = Image(TempName); + ChartWEL.Style = {Height('7.3cm'),HAlign('center')}; + ChartWEL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Variazione di lunghezza '... + 'registrata dall''estensimetro numero ' NodeNum ', '... + 'durante il periodo temporale di riferimento']); + FIG = FIG+1; + ChartWEL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['I grafici seguenti rappresentano i dati relativi '... + 'alla variazione di lunghezza registrata dagli estensimetri a filo '... + 'collegati all''Analog Array. In particolare, valori positivi indicano '... + 'un allungamento, mentre numeri negativi rilevano un accorciamento.']); + testo2 = Paragraph(['Durante il periodo temporale di riferimento, '... + 'il nodo numero ' NodeNum ' ha registrato valori massimi e minimi di lunghezza rispettivamente pari a '... + num2str(round(max(var_X),2), '%0.2f') ' mm e ' num2str(round(min(var_X),2), '%0.2f')... + ' mm, con una variazione di circa '... + num2str(round(max(var_X),2)-round(min(var_X),2),'%0.2f') ' mm.' ]); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if w == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,ChartWEL); + add(DT,ChartWEL_cap); + if w == rWEL(m,1) + add(DT,br); + end + close(figure(10)); + + %--ENG-- + + if activeEN == 1 + % grafico allungamento NELL'ULTIMO MESE + figure(20); + if isnan(TempWEL(1)) == 0 + yyaxis left + end + wire = plot(Date,var_X); + control = max(abs(var_X)); + if control < 1 % mm + ylim([-1 1]); + end + hold on + xlabel('Date [dd/mm/yyyy]'); + ylabel('Wire length increase (+) / decrease (-) [mm]'); + set(gca,'YColor','k'); + if isnan(TempWEL(1)) == 0 + yyaxis right + plot(Date,TempWEL,':','LineWidth',1.1); + ylabel(['Temperature [' char(176) 'C]']); + set(gca,'YColor','k'); + str(1,1) = cellstr('Wire length variation'); + str(2,1) = cellstr('Temperature'); + MX(1) = max(TempWEL(1:10)); + MX(2) = min(TempWEL(1:10)); + MAX = max(abs(MX)); + IN = find(abs(MX)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + end + title(['Wire length increase/decrease, node ' NodeNum]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-WireExt', NodeNum, '_ENG.png')); + saveas(wire,TempName); + ChartWEL_ENG = Image(TempName); + ChartWEL_ENG.Style = {Height('7.3cm'),HAlign('center')}; + ChartWEL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Wire length variation '... + 'recorded by extensometer ' NodeNum ' '... + 'during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartWEL_ENG_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graphs display the wire length variation '... + 'recorded by wire extensometer sensors integrated in the '... + 'Analog Array. In particular, positive values represent a incresase of the '... + 'wire length, while negative values indicate a shortening of the wire length.']); + testo2 = Paragraph(['During the reference time period, '... + 'node ' NodeNum ' recorded maximum and minimum values of wire length equal to '... + num2str(round(max(var_X),2), '%0.2f') ' mm and ' num2str(round(min(var_X),2), '%0.2f')... + ' mm respectively, corresponding to a length variation of '... + num2str(round(max(var_X),2)-round(min(var_X),2),'%0.2f') ' mm.' ]); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if w == 1 + add(DT_ENG,testo); + end + add(DT_ENG,testo2); + add(DT_ENG,ChartWEL_ENG); + add(DT_ENG,ChartWEL_ENG_cap); + if w == rWEL(m,1) + add(DT_ENG,br); + end + close(figure(20)); + end + % pulisco variabili da riutilizzare per catena successiva + clear allungamento; + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + end + end + end + end +end + +text = 'report_WEL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_WEL_ENG.m b/ATD/report_WEL_ENG.m new file mode 100755 index 0000000..f98bc8c --- /dev/null +++ b/ATD/report_WEL_ENG.m @@ -0,0 +1,206 @@ +function [FIG,battANALOG,ATTIVA] = report_WEL_ENG(rWEL,m,NodoWireExtensometerLink,toolrif,... + unitrif,datarif,Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,FIG,br,status,conn,FileName) + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('GMUX not installed or inactive.'); + add(DT,testo); + end +elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoring completed. Please log into the web-based platoform '... + 'to access the complete dataset.']); + add(DT,testo); + end +else + WE = Section(); + sezWEL = Heading3('Wire Extensometer Link'); + sezWEL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + WE.Title = sezWEL; + 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(['The following chart reports the battery level trend recorded during the reference time period. '... + 'The correct functioning of the GMUX module is guaranteed for a minimum level of 12 V. The last '... + 'available data is equal to ' num2str(Batteria(end,1)) ' V.']); + testoB2 = Paragraph(['The GMUX module equips also a thermometer that allows the monitoring of the working '... + 'temperature and the identification of eventual malfunctioning. Temperature data are displayed below.']); + testoB1.HAlign = 'justify'; + testoB2.HAlign = 'justify'; + + % grafico batteria + figure(19) + plot(Date,Batteria); + hold on + title('Battery Level'); + xlabel('Date [dd/mm/yyyy]'); + ylabel('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')}; + if Batteria(end,1) >= 13 + TempName = char(strcat('B_13.jpg')); + elseif Batteria(end,1) >= 12 + TempName = char(strcat('B_12.jpg')); + elseif Batteria(end,1) >= 11 + 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) ' - Battery level and GMUX temperature recorded '... + 'during the reference time period']); + FIG = FIG+1; + lot_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + sezBATT = Paragraph('GMUX - Battery level and temperature'); + sezBATT.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + add(DT,sezBATT); + add(DT,testoB1); + add(DT,testoB2); + add(DT,lot); + add(DT,lot_cap); + add(DT,br); + close(figure(19)); + battANALOG = 1; + end + end + add(DT,sezWEL); + for w = 1:rWEL(m,1) + NodeNum = num2str(NodoWireExtensometerLink(w,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 + allungamento = cell2mat(Dati(:,3)); % allungamento filo + var_X = allungamento - allungamento(1,:); + + % grafico allungamento NELL'ULTIMO MESE + figure(10); + wire = plot(Date,var_X); + title(['Wire length variation - sensor ' NodeNum]); + xlabel('Date [dd/mm/yyyy]'); + ylabel('Wire lengthening(+)/shortening(-) [mm]'); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + control = max(abs(var_X)); + if control < 1 % mm + ylim([-1 1]); + end + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-WireExt', NodeNum, '_ENG.png')); + saveas(wire,TempName); + ChartWEL = Image(TempName); + ChartWEL.Style = {Height('7.3cm'),HAlign('center')}; + ChartWEL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Length variation of the wire connected to the extensometer ' NodeNum... + ' recorded during the reference time period']); + FIG = FIG+1; + ChartWEL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graph displays the wire length variation recorded by the wire extensometer ' NodeNum ... + '. Specifically, positive values indicate a lengthening of the wire, while'... + 'a shortening of the wire is represented by negative values.']); + testo2 = Paragraph(['DurantDuring the reference time period, '... + 'node ' NodeNum ' recorded a maximum value of wire length equal to'... + num2str(round(max(var_X),2), '%0.2f') ' mm and a minimum value of ' num2str(round(min(var_X),2), '%0.2f')... + ' mm, resulting in a variation of '... + num2str(round(max(var_X),2)-round(min(var_X),2),'%0.2f') ' mm.' ]); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if w == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,ChartWEL); + add(DT,ChartWEL_cap); + if w == rWEL(m,1) + add(DT,br); + end + close(figure(10)); + % pulisco variabili da riutilizzare per catena successiva + clear deform; + else + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('No data available for the reference time period'); + add(DT,testo); + add(DT,br); + end + end + end +end +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_WEL_ENG function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_WL.m b/ATD/report_WL.m new file mode 100755 index 0000000..0490523 --- /dev/null +++ b/ATD/report_WL.m @@ -0,0 +1,419 @@ +function [FIG,FIG_ENG,battANALOG,ATTIVA] = report_WL(rWL,m,NodoWeirLink,toolrif,... + unitrif,contunit,datarif,Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,... + DT_ENG,FIG,FIG_ENG,activeEN,br,status,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_WL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() +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 + WE = Section(); + sezWeir = Heading3('Weir Link'); + sezWeir.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + WE.Title = sezWeir; + 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 + WE_ENG = Section(); + sezWeir_ENG = Heading3('Weir Link'); + sezWeir_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + WE_ENG.Title = sezWeir_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,sezWeir); + if activeEN == 1 + add(DT_ENG,sezWeir_ENG); + end + + for ww = 1:rWL(m,1) + NodeNum = num2str(NodoWeirLink(ww,m)); + comando = ['select EventDate, EventTime, XShift, T_node 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 + LevelWL = cell2mat(Dati(:,3)); % livello + TempWL = cell2mat(Dati(:,4)); % temperatura + + % grafico livello NELL'ULTIMO MESE + figure(5); + if isnan(TempWL(1)) == 0 + yyaxis left + end + weir = plot(Date,LevelWL); +% Min = min(dW); +% Max = max(dW); +% if Min > -50 && Max < 50 +% ylim([-50 50]) +% end + hold on + ylabel('Livello [mm]'); + xlabel('Data [gg/mm/aaaa]'); + set(gca,'YColor','k'); + if isnan(TempWL(1)) == 0 + yyaxis right + plot(Date,TempWL,':','LineWidth',1.1); + ylabel(['Temperatura [' char(176) 'C]']); + set(gca,'YColor','k'); + str(1,1) = cellstr('Livello'); + str(2,1) = cellstr('Temperatura'); + MX(1) = max(TempWL(1:10)); + MX(2) = min(TempWL(1:10)); + MAX = max(abs(MX)); + IN = find(abs(MX)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + end + title(['Livello idrometrico rilevato dal nodo numero ' NodeNum]); + xlim([Date(1)-1 Date(end)+1]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + hold off + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-WL', NodeNum, '.png')); + saveas(weir,TempName); + ChartWL = Image(TempName); + ChartWL.Style = {Height('7.3cm'),HAlign('center')}; + % ChartEL.Style = {ScaleToFit}; + ChartWL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Livello d''acqua '... + 'misurato dal sensore idrometrico, nodo numero ' NodeNum... + ', nel periodo temporale di riferimento']); + FIG = FIG+1; + ChartWL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['Nei grafici seguenti sono rappresentati i dati relativi '... + 'al livello d''acqua registrati dai sensori idrometrici appartenenti all''Analog Array.']); + testo2 = Paragraph(['Durante il periodo temporale di riferimento, il nodo numero ' NodeNum ... + ' ha registrato valori massimi e minimi pari a '... + num2str(round(max(LevelWL),2),'%0.2f') ' mm e ' num2str(round(min(LevelWL),2),'%0.2f')... + ' mm, con una variazione massima di '... + num2str(round(max(LevelWL),2)-round(min(LevelWL),2),'%0.2f') ' mm.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if ww == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,ChartWL); + add(DT,ChartWL_cap); + if ww == rWL(m,1) + add(DT,br); + end + close(figure(5)); + + %--ENG-- + + if activeEN == 1 + % grafico deformazioni NELL'ULTIMO MESE + figure(15); + if isnan(TempWL(1)) == 0 + yyaxis left + end + weirEN = plot(Date,LevelWL); +% Min = min(LevelWL); +% Max = max(LevelWL); +% if Min > -50 && Max < 50 +% ylim([-50 50]) +% end + hold on + ylabel('Water level [mm]'); + xlabel('Date [dd/mm/yyyy]'); + set(gca,'YColor','k'); + if isnan(TempWL(1)) == 0 + yyaxis right + plot(Date,TempWL,':','LineWidth',1.1); + ylabel(['Temperature [' char(176) 'C]']); + set(gca,'YColor','k'); + str(1,1) = cellstr('Water level'); + str(2,1) = cellstr('Temperature'); + MX(1) = max(TempWL(1:10)); + MX(2) = min(TempWL(1:10)); + MAX = max(abs(MX)); + IN = find(abs(MX)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + end + title(['Water level - Node ' NodeNum]); + xlim([Date(1)-1 Date(end)+1]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + hold off + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-WL', NodeNum, '_ENG.png')); + saveas(weirEN,TempName); + ChartWL_ENG = Image(TempName); + ChartWL_ENG.Style = {Height('7.3cm'),HAlign('center')}; + % ChartEL.Style = {ScaleToFit}; + ChartWL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Water level '... + ' measured by weir monitor sensor ' NodeNum... + ' during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartWL_ENG_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graphs display water level data '... + 'recorded by weir monitor sensors integrated in the Analog Array.']); + testo2 = Paragraph(['During the reference time period, node ' NodeNum ... + ' measured maximum and minimum deformatio values of respectively '... + num2str(round(max(LevelWL),2),'%0.2f') ' mm and ' num2str(round(min(LevelWL),2),'%0.2f')... + ' mm, with a maximum variation of '... + num2str(round(max(LevelWL),2)-round(min(LevelWL),2),'%0.2f') ' mm.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if ww == 1 + add(DT_ENG,testo); + end + add(DT_ENG,testo2); + add(DT_ENG,ChartWL_ENG); + add(DT_ENG,ChartWL_ENG_cap); + if ww == rWL(m,1) + add(DT_ENG,br); + end + close(figure(15)) + end + + %pulisco variabili da riutilizzare per catena successiva + clear LevelWL; + clear TempWL + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + end + end + end + end +end + +text = 'report_WL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_appendix.m b/ATD/report_appendix.m new file mode 100755 index 0000000..a3c8c7e --- /dev/null +++ b/ATD/report_appendix.m @@ -0,0 +1,4090 @@ +function report_appendix(yesTL,yesIPL,yesIPLHR,yesTLH,yesPCL,yesTLHR,yesTLHRH,yesPCLHR,... + yesPL,yesBL,yesTuL,yesRaL,yesThL,yesKL,yesKLHR,yesRL,yesLL,yesPrL,yesPT100,... + yesCrL,yes3DCrL,yesEL,yes3DEL,yesWEL,yesMPBEL,yesTrL,nCAM,yesWL,yesPE,PL_A,PL_D,Font_section,... + Font_caption,Font_tools,FIG,FIG_ENG,dim,appendice,appendice_ENG,colonna4,colonna6,... + rpt,rpt_ENG,activeEN,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_appendix function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +%% Appendice - Elaborazione dati +partecomune = 0; +partecomune_ENG = 1; +ElabTitle = 0; +Titolo = Section(); + +testoTilt = Paragraph(['I dati immagazzinati dalla centralina (punti ADC) vengono '... + 'definiti ''grezzi'' e devono essere opportunamente elaborati per tradurre '... + 'i valori di accelerazione in spostamenti. In questa fase, ' char(232) ' inoltre possibile '... + 'identificare e ridurre eventuali derive strumentali, spike '... + 'e rumore del segnale. A questo scopo ' char(232) ' stato sviluppato (in ambiente Matlab) '... + 'un opportuno software, definito ''Tilt'', che fornisce il risultato cercato. '... + 'Occorre sottolineare come gli strumenti tradizionali siano caratterizzati da '... + 'un numero esiguo di letture, per le quali non ' char(232) ' possibile affrontare una trattazione '... + 'statistica dell''errore strumentale. Al contrario, la costituzione di un database popolato da '... + 'numerose misure permette di valutare l''evoluzione temporale dei fenomeni e di '... + 'validare l''attendibilit' char(224) ' dei dati elaborati.']); + +testoATD = Paragraph(['I dati immagazzinati dalla centralina (punti ADC) vengono '... + 'definiti ''grezzi'' e devono essere opportunamente elaborati per tradurre '... + 'i valori di accelerazione in spostamenti. In questa fase, ' char(232) ' inoltre '... + 'possibile identificare e ridurre eventuali derive strumentali, spike '... + 'e rumore del segnale. A questo scopo ' char(232) ' stato sviluppato (in '... + 'ambiente Matlab) un opportuno software, definito ''ATD'', che fornisce il '... + 'risultato cercato. Occorre sottolineare come gli strumenti tradizionali '... + 'siano caratterizzati da un numero esiguo di letture, per le quali non ' char(232)... + ' possibile affrontare una trattazione statistica dell''errore strumentale. '... + 'Al contrario, la costituzione di un database popolato da '... + 'numerose misure permette di valutare l''evoluzione temporale dei fenomeni e di '... + 'validare l''attendibilit' char(224) ' dei dati elaborati.']); + +testoRIS = Paragraph(['I dati raccolti in sito dalla centralina vengono trasmessi '... + 'al database di ASE, dal quale il software importa i dati grezzi e i parametri '... + 'di calibrazione. La procedura descritta ' char(232) ' completamente automatizzata: '... + 'nel momento in cui il dato viene ricevuto, ' char(232) ' trasformato in '... + 'unit' char(224) ' fisiche con conseguente calcolo degli spostamenti finali. '... + 'I risultati sono caricati in un tempo brevissimo su piattaforma dinamica web '... + 'ad accesso controllato, dove l''utente pu' char(242) ' visionarli e scaricarli.']); + +testoTilt.HAlign = 'justify'; +testoATD.HAlign = 'justify'; +testoRSN.HAlign = 'justify'; +testoMUSA.HAlign = 'justify'; +testoRIS.HAlign = 'justify'; + +% --- ENG --- + +if activeEN == 1 + + Titolo_ENG = Section(); + testoTilt_ENG = Paragraph(['ADC points stored in the SD card are defined ''raw data'' and they need '... + 'to be properly elaborated in order to convert acceleration data into displacement values. '... + 'Moreover, in this stage it is also possible to identify and correct any issue related to '... + 'data drifting, spike and/or instrumental noises. These results are achieved thanks to a '... + 'dedicated MATLAB-based software, named ''Tilt''. It should be taken into account that traditional '... + 'monitoring devices usually feature a sampling frequency that is too low to allow the '... + 'application of statistical analyses aimed to reduce any tool-related data noise. On the '... + 'other hand, the definition of a database including a great number of monitoring data permits '... + 'to evaluate the phenomena evolution over time and to assess the results reliability.']); + + testoATD_ENG = Paragraph(['ADC points stored in the SD card are defined ''raw data'' and they need '... + 'to be properly elaborated in order to convert acceleration data into displacement values. '... + 'Moreover, in this stage it is also possible to identify and correct any issue related to '... + 'data drifting, spike and/or instrumental noises. These results are achieved thanks to a '... + 'dedicated MATLAB-based software, named ''ATD''. It should be taken into account that traditional '... + 'monitoring devices usually feature a sampling frequency that is too low to allow the '... + 'application of statistical analyses aimed to reduce any tool-related data noise. On the '... + 'other hand, the definition of a database including a great number of monitoring data permits '... + 'to evaluate the phenomenon evolution over time and to assess the results reliability.']); + + testoRIS_ENG = Paragraph(['After collecting the monitoring data on-site, the datalogger sends them '... + 'to the ASE database, from where the software imports raw data and calibration parameters. '... + 'This is a completely automatic procedure: after receiveng new data, the elaboration centre '... + 'converts them into physical units, thus obtaining the actual displacement measured on-site. '... + 'After the results uploading phase, which takes a very short amount of time, the user can access '... + 'and download all monitoring data through the web-based platform.']); + + testoTilt_ENG.HAlign = 'justify'; + testoATD_ENG.HAlign = 'justify'; + testoRSN_ENG.HAlign = 'justify'; + testoMUSA_ENG.HAlign = 'justify'; + testoRIS_ENG.HAlign = 'justify'; +end + +% --- Vertical Array --- +if sum(yesTL) >= 1 || sum(yesTLHR) >= 1 + elabTL = Section(); + if ElabTitle == 0 + app = Heading2('Elaborazione dati'); + app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo.Title = app; + if activeEN == 1 + app_ENG = Heading2('Data elaboration'); + app_ENG.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo_ENG.Title = app_ENG; + end + ElabTitle = 1; + end + sezVA = Heading3('Vertical Array'); + sezVA.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabTL.Title = sezVA; + testo = Paragraph(['Ciascun nodo ' char(232) ' caratterizzato da una particolare giacitura'... + ' nello spazio, ricostruibile sulla base delle grandezze fisiche acquisite'... + ' dal sensore MEMS 3D (accelerometro, magnetometro e sensore di temperatura).'... + ' In particolare, mediante l''accelerometro si ' char(232) ' in grado di conoscere l''inclinazione'... + ' del sensore: a titolo di esempio, se un nodo fosse perfettamente verticale, asse'... + ' X e asse Y dell''accelerometro restituirebbero 0 g, mentre l''asse Z fornirebbe un'... + ' valore pari a 1 g. Mediante l''utilizzo del magnetometro ' char(232) ' possibile ricostruire'... + ' la direzione dello spostamento occorso. Confrontando le nuove posizioni con quelle'... + ' iniziali, si ' char(232) ' in grado di ricavare l''angolo di rotazione di ciascun nodo nello spazio:'... + ' essendo nota la distanza tra i nodi, ' char(232) ' immediato calcolare le componenti di' ... + ' spostamento in corrispondenza di ciascun sensore della catena.']); + img = Image(('vert.jpg')); + img.Style = {Height('7cm'),HAlign('center')}; + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Esempio di spostamento e nuova configurazione del sensore']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + add(elabTL,testo); + add(elabTL,testoTilt); + add(elabTL,img); + add(elabTL,ionhcaption); + add(elabTL,testoRIS); + add(appendice,elabTL); + br = PageBreak(); + add(appendice,br); + + %---ENG--- + if activeEN == 1 + elabTL_ENG = Section(); + sezVA_ENG = Heading3('Vertical Array'); + sezVA_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabTL_ENG.Title = sezVA_ENG; + testo = Paragraph(['When a displacement occurs, the node changes its position in order to '... + 'follow the slope movement. After been read, every tilt sensor records the new position '... + 'as an electrical signal (raw data) and sends the information to the control unit. '... + 'The datalogger saves the information on a volatile memory (SD card) and then transmits '... + 'them to the elaboration centre, where a software processes the electrical signals (ADC points) '... + 'to return information about the real displacement of the node (physical units). The accelerometer '... + 'gives information about the rotation of the node, referring to the constant gravity acceleration g. '... + 'The magnetometer allows to obtain the displacement direction of each node, referring to NED '... + 'reference system (North-East-Down). Finally, the on-board thermometer is necessary to correct the '... + 'thermal effects on the accelerometer, using the calibration values. This sensor also provides '... + 'the temperature along the vertical.']); + img = Image(('vert.jpg')); + img.Style = {Height('7cm'),HAlign('center')}; + ionhcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Effect of displacement on the tool and new configuration of the Array']); + FIG_ENG = FIG_ENG+1; + ionhcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + add(elabTL_ENG,testo); + add(elabTL_ENG,testoTilt_ENG); + add(elabTL_ENG,img); + add(elabTL_ENG,ionhcaption_ENG); + add(elabTL_ENG,testoRIS_ENG); + add(appendice_ENG,elabTL_ENG); + br = PageBreak(); + add(appendice_ENG,br); + end + partecomune = 1; + partecomune_ENG = 1; +end + +% --- In Place Array --- +if sum(yesIPL) >= 1 + elabIPL = Section(); + if ElabTitle == 0 + app = Heading2('Elaborazione dati'); + app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo.Title = app; + if activeEN == 1 + app_ENG = Heading2('Data elaboration'); + app_ENG.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo_ENG.Title = app_ENG; + end + ElabTitle = 1; + end + sezIPA = Heading3('In Place Array'); + sezIPA.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabIPL.Title = sezIPA; + testo = Paragraph(['Ciascun nodo ' char(232) ' caratterizzato da una particolare giacitura'... + ' nello spazio, ricostruibile sulla base delle grandezze fisiche acquisite'... + ' dal sensore MEMS 3D (accelerometro, magnetometro e sensore di temperatura).'... + ' In particolare, mediante l''accelerometro si ' char(232) ' in grado di conoscere l''inclinazione'... + ' del sensore: a titolo di esempio, se un nodo fosse perfettamente verticale, asse'... + ' X e asse Y dell''accelerometro restituirebbero 0 g, mentre l''asse Z fornirebbe un'... + ' valore pari a 1 g. Mediante l''utilizzo del magnetometro ' char(232) ' possibile ricostruire'... + ' la direzione dello spostamento occorso. Confrontando le nuove posizioni con quelle'... + ' iniziali, si ' char(232) ' in grado di ricavare l''angolo di rotazione di ciascun nodo nello spazio:'... + ' essendo nota la distanza tra i nodi, ' char(232) ' immediato calcolare le componenti di' ... + ' spostamento in corrispondenza di ciascun sensore della catena.']); + img = Image(('vert.jpg')); + img.Style = {Height('7cm'),HAlign('center')}; + imgcaption = Paragraph(['Fig. ' num2str(FIG) ' - Esempio di spostamento e nuova configurazione del sensore']); + FIG = FIG+1; + imgcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + add(elabIPL,testo); + add(elabIPL,img); + add(elabIPL,imgcaption); + if partecomune == 0 + add(elabIPL,testoTilt); + add(elabIPL,testoRIS); + partecomune = 1; + end + add(appendice,elabIPL); + br = PageBreak(); + add(appendice,br); + + %---ENG--- + if activeEN == 1 + elabIPL_ENG = Section(); + sezIPA_ENG = Heading3('In Place Array'); + sezIPA_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabIPL_ENG.Title = sezIPA_ENG; + testo = Paragraph(['When a displacement occurs, the node changes its position in order to '... + 'follow the slope movement. After been read, every tilt sensor records the new position '... + 'as an electrical signal (raw data) and sends the information to the control unit. '... + 'The datalogger saves the information on a volatile memory (SD card) and then transmits '... + 'them to the elaboration centre, where a software processes the electrical signals (ADC points) '... + 'to return information about the real displacement of the node (physical units). The accelerometer '... + 'gives information about the rotation of the node, referring to the constant gravity acceleration g. '... + 'The magnetometer allows to obtain the displacement direction of each node, referring to NED '... + 'reference system (North-East-Down). Finally, the on-board thermometer is necessary to correct the '... + 'thermal effects on the accelerometer, using the calibration values. This sensor also provides '... + 'the temperature along the vertical.']); + img = Image(('vert.jpg')); + img.Style = {Height('7cm'),HAlign('center')}; + imgcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - - Effect of displacement on the tool and new configuration of the Array']); + FIG_ENG = FIG_ENG+1; + ionhcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + add(elabIPL_ENG,testo); + add(elabIPL_ENG,img); + add(elabIPL_ENG,imgcaption_ENG); + if partecomune_ENG == 0 + add(elabIPL_ENG,testoTilt_ENG); + add(elabIPL_ENG,testoRIS_ENG); + partecomune_ENG = 1; + end + add(appendice_ENG,elabIPL_ENG); + br = PageBreak(); + add(appendice_ENG,br); + end +end + +nodoTunnel = 0; +nodoTunnel_ENG = 0; +% --- Cir Array --- +if sum(yesTuL) >= 1 + elabCIR = Section(); + if ElabTitle == 0 + app = Heading2('Elaborazione dati'); + app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo.Title = app; + if activeEN == 1 + app_ENG = Heading2('Data elaboration'); + app_ENG.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo_ENG.Title = app_ENG; + end + ElabTitle = 1; + end + sezCA = Heading3('Cir Array'); + sezCA.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabCIR.Title = sezCA; + testo = Paragraph(['Ciascun nodo ' char(232) ' caratterizzato da una '... + 'particolare giacitura nello spazio, ricostruibile sulla base delle '... + 'grandezze fisiche acquisite dal sensore MEMS 3D, equipaggiato con '... + 'accelerometro e sensore di temperatura. In particolare, mediante '... + 'l''accelerometro si ' char(232) ' in grado di conoscere l''inclinazione '... + 'del sensore: a titolo di esempio, se un nodo fosse perfettamente verticale, '... + 'asse X e asse Y dell''accelerometro restituirebbero 0 g, mentre l''asse Z '... + 'fornirebbe un valore pari a 1 g. Confrontando le nuove posizioni con quelle '... + 'iniziali, si ' char(232) ' in grado di ricavare l''angolo di rotazione di '... + 'ciascun nodo nello spazio: essendo note le distanze tra i nodi e le loro '... + 'posizioni di installazione all''interno della sezione, ' char(232) ' immediato '... + 'calcolare le componenti di spostamento in corrispondenza di ciascun sensore '... + 'della catena. Il termometro presente ' char(232) ' utilizzato per la correzione '... + 'degli effetti termici che incidono sul sensore accelerometrico, '... + 'previa calibrazione in camera climatica, fornendo inoltre la temperatura '... + 'lungo la catena.']); + testo2 = Paragraph(['Il sensore MEMS ' char(232) ' posizionato al centro di ogni nodo '... + 'e misura le tre componenti del campo gravitazionale terrestre nel proprio sistema '... + 'di riferimento, riferendosi ad una configurazione iniziale, o lettura di zero. '... + 'Nel momento in cui avviene uno spostamento, la variazione delle tre componenti '... + 'di gravit' char(224) ' permette di determinarne l''entit' char(224) ' '... + 'e la direzione: in questo modo ' char(232) ' possibile valutare la rotazione '... + 'del tunnel e gli spostamenti locali di ogni nodo rispetto al precedente, '... + 'dai quali pu' char(242) ' essere infine costruita la curva cumulata e la '... + 'conseguente deformata 3D della sezione monitorata. In aggiunta, il software '... + 'determina la variazione di lunghezza di segmenti di convergenza predefiniti, '... + 'unendo determinati punti di calcolo, come avviene usualmente nel caso della '... + 'topografia. Ogni Tunnel Link ha il proprio segmento di pertinenza che viene '... + 'assunto infinitamente rigido e si estende dal punto medio tra il nodo '... + 'considerato ed il precedente fino al punto medio con il suo successivo. '... + 'La distanza tra i vari Tunnel Link pu' char(242) ' essere personalizzata '... + 'in base alle esigenze sito specifiche. Distanze minori comportano risultati '... + 'maggiormente attendibili e precisi.']); + img = Image(('cir.png')); + img.Style = {Height('7cm'),HAlign('center')}; + imgcaption = Paragraph(['Fig. ' num2str(FIG) ' - Rappresentazione grafica del segmento di pertinenza '... + 'del sensore Tunnel Link e sistema di installazione in calotta']); + FIG = FIG+1; + imgcaption.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if nodoTunnel==0 + add(elabCIR,testo); + nodoTunnel = 1; + end + add(elabCIR,testo); + add(elabCIR,testo2); + add(elabCIR,img); + add(elabCIR,imgcaption); + if partecomune == 0 + add(elabCIR,testoATD); + add(elabCIR,testoRIS); + partecomune = 1; + end + add(appendice,elabCIR); + + % --- ENG --- + if activeEN == 1 + elabCIR_ENG = Section(); + sezCA_ENG = Heading3('Cir Array'); + sezCA_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabCIR_ENG.Title = sezCA_ENG; + testo = Paragraph(['When a displacement occurs, the node changes its position in order to '... + 'follow the section movement. After been read, every tilt sensor records the new position '... + 'as an electrical signal (raw data) and sends the information to the control unit. '... + 'The datalogger saves the information on a volatile memory (SD card) and then transmits '... + 'them to the elaboration centre, where a software processes the electrical signals (ADC points) '... + 'to return information about the real displacement of the node (physical units). The accelerometer '... + 'gives information about the rotation of the node, referring to the constant gravity acceleration g. '... + 'The on-board thermometer is necessary to correct the '... + 'thermal effects on the accelerometer, using the calibration values. This sensor also provides '... + 'the temperature along the array.']); + testo2 = Paragraph(['MEMS sensor is located at the centre of each Link and measures the three '... + 'components of the gravitational field in its own reference system, starting from an initial '... + 'configuration (zero reading). When a movement arises, the variation of the different gravity '... + 'components gives back the information of the displacement. In this way, it is possible to '... + 'calculate the tunnel rotation and the local displacement of each Link, and finally compute '... + 'a curve of cumulated displacements and the three-dimensional variation of the monitored section. '... + 'Moreover, the software determines the length variation of predefined convergence segments, created '... + 'by connecting specific calculation points with an approach similar to topography applications. '... + 'Each Tunnel Link has a Segment of Relevance, which is assumed as infinitely rigid, that starts from the middle '... + 'point between the considered and the previous Link and ends at the medium distance between the '... + 'considered and the following Link. It is possible to customize the distance between Links according to '... + 'specific monitoring necessities (smaller distances lead to more reliable and accurate results).']); + img = Image(('cir.png')); + img.Style = {Height('7cm'),HAlign('center')}; + imgcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Tunnel Link Segment of Relevance and '... + 'installation system']); + FIG_ENG = FIG_ENG+1; + imgcaption_ENG.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if nodoTunnel_ENG==0 + add(elabCIR_ENG,testo); + nodoTunnel_ENG = 1; + end + add(elabCIR_ENG,testo); + add(elabCIR_ENG,testo2); + add(elabCIR_ENG,img); + add(elabCIR_ENG,imgcaption_ENG); + if partecomune_ENG == 0 + add(elabCIR_ENG,testoATD_ENG); + add(elabCIR_ENG,testoRIS_ENG); + partecomune_ENG = 1; + end + add(appendice_ENG,elabCIR_ENG); + end +end + +% --- Rad Array --- +if sum(yesRaL) >= 1 + elabRAD = Section(); + if ElabTitle == 0 + app = Heading2('Elaborazione dati'); + app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo.Title = app; + if activeEN == 1 + app_ENG = Heading2('Data elaboration'); + app_ENG.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo_ENG.Title = app_ENG; + end + ElabTitle = 1; + end + sezRA = Heading3('Rad Array'); + sezRA.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabRAD.Title = sezRA; + testo = Paragraph(['Ciascun nodo ' char(232) ' caratterizzato da una '... + 'particolare giacitura nello spazio, ricostruibile sulla base delle '... + 'grandezze fisiche acquisite dal sensore MEMS 3D, equipaggiato con '... + 'accelerometro e sensore di temperatura. In particolare, mediante '... + 'l''accelerometro si ' char(232) ' in grado di conoscere l''inclinazione '... + 'del sensore: a titolo di esempio, se un nodo fosse perfettamente verticale, '... + 'asse X e asse Y dell''accelerometro restituirebbero 0 g, mentre l''asse Z '... + 'fornirebbe un valore pari a 1 g. Confrontando le nuove posizioni con quelle '... + 'iniziali, si ' char(232) ' in grado di ricavare l''angolo di rotazione di '... + 'ciascun nodo nello spazio: essendo note le distanze tra i nodi e le loro '... + 'posizioni di installazione all''interno della sezione, ' char(232) ' immediato '... + 'calcolare le componenti di spostamento in corrispondenza di ciascun sensore '... + 'della catena. Il termometro presente ' char(232) ' utilizzato per la correzione '... + 'degli effetti termici che incidono sul sensore accelerometrico, '... + 'previa calibrazione in camera climatica, fornendo inoltre la temperatura '... + 'lungo la catena.']); + testo2 = Paragraph(['Il sensore MEMS ' char(232) ' posizionato al centro di ogni nodo '... + 'e misura le tre componenti del campo gravitazionale terrestre nel proprio sistema '... + 'di riferimento, riferendosi ad una configurazione iniziale, o lettura di zero. '... + 'Nel momento in cui avviene uno spostamento, la variazione delle tre componenti '... + 'di gravit' char(224) ' ne permette di determinarne l''entit' char(224) ... + ' e la direzione: in questo modo ' char(232) ' possibile valutare le deformazioni '... + 'tridimensionali dell''ammasso roccioso al di fuori della sezione scavata. '... + 'Ogni nodo fornisce un''informazione locale secondo il sistema di riferimento X (larghezza), '... + 'Y (profondit' char(224) ') e Z (altezza). Sommando i singoli contributi si ' char(232) ... + ' in grado di risalire agli spostamenti cumulati e alla deformata 3D nello spazio. '... + 'Mettendo insieme le informazioni fornite dal Rad Array con quelle di un estensimetro '... + 'multibase, si ' char(232) ' in grado di determinare e distinguere le componenti di '... + 'deformazione radiale da quelle operanti nelle restanti direzioni. '... + 'Ogni sensore Radial Link ha il proprio segmento di pertinenza che viene '... + 'assunto infinitamente rigido e si estende dal punto medio tra il nodo '... + 'considerato ed il precedente fino al punto medio con il suo successivo. '... + 'La distanza tra i vari Radial Link pu' char(242) ' essere personalizzata '... + 'in base alle esigenze sito specifiche. Distanze minori comportano risultati '... + 'maggiormente attendibili e precisi.']); + img = Image(('rad.png')); + img.Style = {Height('7.5cm'),HAlign('center')}; + imgcaption = Paragraph(['Fig. ' num2str(FIG) ' - Rappresentazione grafica di due Rad Array '... + 'installati nella parte sommitale della sezione monitorata, con un''inclinazione di 45 '... + 'gradi rispetto all''orizzontale.']); + FIG = FIG+1; + imgcaption.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if nodoTunnel==0 + add(elabRAD,testo); + nodoTunnel = 1; + end + add(elabRAD,testo2); + add(elabRAD,img); + add(elabRAD,imgcaption); + if partecomune == 0 + add(elabRAD,testoATD); + add(elabRAD,testoRIS); + partecomune = 1; + end + add(appendice,elabRAD); + + % --- ENG --- + if activeEN == 1 + elabRAD_ENG = Section(); + sezRA_ENG = Heading3('Rad Array'); + sezRA_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabRAD_ENG.Title = sezRA_ENG; + testo = Paragraph(['When a displacement occurs, the node changes its position in order to '... + 'follow the rock mass movement. After been read, every tilt sensor records the new position '... + 'as an electrical signal (raw data) and sends the information to the control unit. '... + 'The datalogger saves the information on a volatile memory (SD card) and then transmits '... + 'them to the elaboration centre, where a software processes the electrical signals (ADC points) '... + 'to return information about the real displacement of the node (physical units). The accelerometer '... + 'gives information about the rotation of the node, referring to the constant gravity acceleration g. '... + 'The on-board thermometer is necessary to correct the '... + 'thermal effects on the accelerometer, using the calibration values. This sensor also provides '... + 'the temperature along the array.']); + testo2 = Paragraph(['MEMS sensor is located at the centre of each Link and measures the three '... + 'components of the gravitational field in its own reference system, starting from an initial '... + 'configuration (zero reading). When a movement arises, the variation of the different gravity '... + 'components gives back the information of the displacement. In this way, it is possible to '... + 'calculate the 3D displacement surrounding the monitored section. '... + 'Each single node provides a local information according to the 3D reference system X-Y-Z (respectively '... + 'width, depth and height). The resultant of these components allows to determine the cumulative displacement '... + 'and the three-dimensional position variation of the monitored element. Moreover, it is possible to couple a Rad '... + 'Array with a multi-point borehole extensometer in order to separate radial deformations from components acting '... + 'along other directions. '... + 'Each Radial Link has a Segment of Relevance, which is assumed as infinitely rigid, that starts from the middle '... + 'point between the considered and the previous Link and ends at the medium distance between the '... + 'considered and the following Link. It is possible to customize the distance between Links according to '... + 'specific monitoring necessities (smaller distances lead to more reliable and accurate results).']); + img = Image(('rad.png')); + img.Style = {Height('7.5cm'),HAlign('center')}; + imgcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Graphical illustration of two Rad Arrays located '... + 'on the upper part of the monitorign section and installed with a 45-degree tilt.']); + FIG_ENG = FIG_ENG+1; + imgcaption_ENG.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if nodoTunnel_ENG==0 + add(elabRAD_ENG,testo); + nodoTunnel_ENG = 1; + end + add(elabRAD_ENG,testo2); + add(elabRAD_ENG,img); + add(elabRAD_ENG,imgcaption_ENG); + if partecomune_ENG == 0 + add(elabRAD_ENG,testoATD_ENG); + add(elabRAD_ENG,testoRIS_ENG); + partecomune_ENG = 1; + end + add(appendice_ENG,elabRAD_ENG); + end +end + +% --- PreConv Array --- +if sum(yesPCL) >= 1 + elabPCL = Section(); + if ElabTitle == 0 + app = Heading2('Elaborazione dati'); + app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo.Title = app; + if activeEN == 1 + app_ENG = Heading2('Data elaboration'); + app_ENG.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo_ENG.Title = app_ENG; + end + ElabTitle = 1; + end + sezPCA = Heading3('PreConv Array'); + sezPCA.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabPCL.Title = sezPCA; + testo = Paragraph(['Ciascun nodo ' char(232) ' caratterizzato da una '... + 'particolare giacitura nello spazio, ricostruibile sulla base delle '... + 'grandezze fisiche acquisite dal sensore MEMS 3D, equipaggiato con '... + 'accelerometro e sensore di temperatura. In particolare, mediante '... + 'l''accelerometro si ' char(232) ' in grado di conoscere l''inclinazione '... + 'del sensore rispetto all''orizzontale: a titolo di esempio, se un nodo '... + 'di questa tipologia fosse perfettamente orizzontale, asse X e asse Y '... + 'dell''accelerometro restituirebbero 0 g, mentre l''asse Z '... + 'fornirebbe un valore pari a 1 g. Confrontando le nuove posizioni con quelle '... + 'iniziali, si ' char(232) ' in grado di ricavare l''angolo di rotazione di '... + 'ciascun nodo nello spazio: essendo note le distanze tra i nodi, ' char(232) ' immediato '... + 'calcolare le componenti di spostamento verticale in corrispondenza di ciascun sensore '... + 'della catena. Il termometro presente ' char(232) ' utilizzato per la correzione '... + 'degli effetti termici che incidono sul sensore accelerometrico, '... + 'previa calibrazione in camera climatica, fornendo inoltre la temperatura '... + 'dei singoli nodi.']); + testo2 = Paragraph(['Il sensore MEMS ' char(232) ' posizionato al centro di ogni nodo '... + 'e misura le tre componenti del campo gravitazionale terrestre nel proprio sistema '... + 'di riferimento, riferendosi ad una configurazione iniziale, o lettura di zero. '... + 'Nel momento in cui avviene uno spostamento, la variazione delle tre componenti '... + 'di gravit' char(224) ' permette di determinarne l''entit' char(224) ' '... + 'e la direzione: in questo modo ' char(232) ' possibile valutare l''eventuale movimento '... + 'di pre-convergenza della sezione ancora da scavare, la rotazione dei sensori su s' char(232) ' stessi '... + 'e gli spostamenti locali di ogni nodo rispetto al precedente, dai quali pu' char(242) ' '... + 'essere costruita la curva cumulata dei movimenti. Ogni PreConv Link ha il proprio '... + 'segmento di pertinenza che viene assunto infinitamente rigido e si estende dal punto medio tra il nodo '... + 'considerato ed il precedente fino al punto medio con il suo successivo. '... + 'La distanza tra i vari sensori pu' char(242) ' essere personalizzata '... + 'in base alle esigenze sito specifiche. Distanze minori comportano risultati '... + 'maggiormente attendibili e precisi.']); + img1 = Image(('PCA.png')); + img2 = Image(('PCA2.jpg')); + img1.Style = {Height('6cm'),HAlign('center')}; + imgcaption = Paragraph(['Fig. ' num2str(FIG) ' - Rappresentazione grafica '... + 'del comportamento deformativo atteso in seguito ad uno scavo in sotterraneo']); + FIG = FIG+1; + imgcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + img2.Style = {Height('14cm'),HAlign('center')}; + img2caption = Paragraph(['Fig. ' num2str(FIG) ' - Esempio di fasi di scavo successive '... + 'con installazione del sistema MUMS PreConv Array']); + FIG = FIG+1; + img2caption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if nodoTunnel == 0 + add(elabPCL,testo); + nodoTunnel = 1; + end + add(elabPCL,img1); + add(elabPCL,imgcaption); + add(elabPCL,testo2); + add(elabPCL,img2); + add(elabPCL,img2caption); + if partecomune == 0 + add(elabPCL,testoATD); + add(elabPCL,testoRIS); + partecomune = 1; + end + add(appendice,elabPCL); + + % --- ENG --- + if activeEN == 1 + elabPCL_ENG = Section(); + sezPCA_ENG = Heading3('PreConv Array'); + sezPCA_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabPCL_ENG.Title = sezPCA_ENG; + testo = Paragraph(['When a displacement occurs, the node changes its position in order to '... + 'follow the rock mass movement. After been read, every tilt sensor records the new position '... + 'as an electrical signal (raw data) and sends the information to the control unit. '... + 'The datalogger saves the information on a volatile memory (SD card) and then transmits '... + 'them to the elaboration centre, where a software processes the electrical signals (ADC points) '... + 'to return information about the real displacement of the node (physical units). The accelerometer '... + 'gives information about the rotation of the node, referring to the constant gravity acceleration g. '... + 'The on-board thermometer is necessary to correct the '... + 'thermal effects on the accelerometer, using the calibration values. This sensor also provides '... + 'the temperature along the array.']); + testo2 = Paragraph(['MEMS sensor is located at the centre of each Link and measures the three '... + 'components of the gravitational field in its own reference system, starting from an initial '... + 'configuration (zero reading). When a movement arises, the variation of the different gravity '... + 'components gives back the information of the displacement. In this way, it is possible to '... + 'calculate the pre-convergence component ahead of the tunnel face and the local displacement of each Link, '... + 'thus allowing to compute a curve of cumulated displacements.'... + 'Each PreConv Link has a Segment of Relevance, which is assumed as infinitely rigid, that starts from the middle '... + 'point between the considered and the previous Link and ends at the medium distance between the '... + 'considered and the following Link. It is possible to customize the distance between Links according to '... + 'specific monitoring necessities (smaller distances lead to more reliable and accurate results).']); + img1 = Image(('PCA.png')); + img2 = Image(('PCA2.jpg')); + img1.Style = {Height('6cm'),HAlign('center')}; + imgcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Graphical representation '... + 'of the expected deformation behaviour induced by underground excavation']); + FIG_ENG = FIG_ENG+1; + imgcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + img2.Style = {Height('14cm'),HAlign('center')}; + img2caption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - MUMS PreConv Array installation example']); + FIG_ENG = FIG_ENG+1; + img2caption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if nodoTunnel_ENG == 0 + add(elabPCL_ENG,testo_ENG); + nodoTunnel_ENG = 1; + end + add(elabPCL_ENG,img1); + add(elabPCL_ENG,imgcaption_ENG); + add(elabPCL_ENG,testo2); + add(elabPCL_ENG,img2); + add(elabPCL_ENG,img2caption_ENG); + if partecomune_ENG == 0 + add(elabPCL_ENG,testoATD_ENG); + add(elabPCL_ENG,testoRIS_ENG); + partecomune_ENG = 1; + end + add(appendice_ENG,elabPCL_ENG); + end +end + +% --- Analog Array --- +if sum(yesLL)>=1 || sum(yesPrL)>=1 || sum(yesPT100)>=1 || sum(yesCrL)>=1 || ... + sum(yes3DCrL)>=1 || sum(yesEL)>=1 || sum(yes3DEL)>=1 || sum(yesWEL)>=1 || sum(yesMPBEL)>=1 + elabAA = Section(); + if ElabTitle == 0 + app = Heading2('Elaborazione dati'); + app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo.Title = app; + if activeEN == 1 + app_ENG = Heading2('Data elaboration'); + app_ENG.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo_ENG.Title = app_ENG; + end + ElabTitle = 1; + end + sezAA = Heading3('Analog Array'); + sezAA.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabAA.Title = sezAA; + testo = Paragraph(['Gli Analog Array sono costituiti da sensori analogici tradizionali, '... + 'letti mediante centralina ASE801 e multiplexer analogico-digitale GMUX o centralina '... + 'ASE201. Tali datalogger permettono il campionamento di ogni tipologia di sensoristica '... + 'presente sul mercato e letta con grandezze quali Hz, mV/V, 0-5 V, 0-10 V, VW, 4-20 mA, NTC, PT100, etc.']); + testo2 = Paragraph(['Ogni sensore viene collegato nel canale designato e letto in automatico secondo '... + 'il periodo di campionamento impostato.']); + img = Image(('G201.png')); + img.Style = {Height('3cm'),HAlign('center')}; + imgcaption = Paragraph(['Fig. ' num2str(FIG) ' - Centralina ASE201 in grado di leggere '... + 'ogni tipologia di sensore analogico tradizionale, convertendo il segnale in ingresso '... + 'in un''uscita digitale.']); + FIG = FIG+1; + imgcaption.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + add(elabAA,testo); + add(elabAA,testo2); + add(elabAA,img); + add(elabAA,imgcaption); + if partecomune == 0 + add(elabAA,testoATD); + add(elabAA,testoRIS); + partecomune = 1; + end + add(appendice,elabAA); + + %---ENG--- + if activeEN == 1 + elabAA_ENG = Section(); + sezAA_ENG = Heading3('Analog Array'); + sezAA_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabAA_ENG.Title = sezAA_ENG; + testo = Paragraph(['Analog Arrays are composed of traditional analog sensors, connected to the ASE801 '... + 'datalogger thanks to a dedicated GMUX module that converts an analog '... + 'signal into a digital one, or by installing an ASE201 control unit. '... + 'This datalogger is able to read any traditional sensors featuring different '... + 'output signals (e.g. Hz, mV/V, 0-5 V, 0-10 V, VW, 4-20 mA, NTC, PT100, etc.).']); + testo2 = Paragraph(['Each single sensor is connected to a dedicated channel, and the recording process is performed '... + 'automatically according to the appropriate sampling frequency.']); + img = Image(('G201.png')); + img.Style = {Height('3cm'),HAlign('center')}; + imgcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - ASE201 control unit, designed to read any traditional analog '... + 'monitoring device by converting its signal into a digital output']); + FIG_ENG = FIG_ENG+1; + imgcaption_ENG.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + add(elabAA_ENG,testo); + add(elabAA_ENG,testo2); + add(elabAA_ENG,img); + add(elabAA_ENG,imgcaption_ENG); + if partecomune_ENG == 0 + add(elabAA_ENG,testoATD_ENG); + add(elabAA_ENG,testoRIS_ENG); + partecomune_ENG = 1; + end + add(appendice_ENG,elabAA_ENG); + end +end + +%% Appendice sensori +% ---Tilt Link HR 3D V--- +elabSE = Section(); +SE = Section(); +app = Heading2('Descrizione sensori'); +app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso +elabSE.Title = app; +add(appendice,elabSE); +if activeEN == 1 + elabSE_ENG = Section(); + SE_ENG = Section(); + app_ENG = Heading2('Sensors description'); + app_ENG.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + elabSE_ENG.Title = app_ENG; + add(appendice_ENG,elabSE_ENG); +end +TL3D = 0; +for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Tilt Link HR 3D V') == 1 + if TL3D == 0 + SE = Section(); + end + sezTilt = Heading3('Tilt Link HR 3D V'); + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SE.Title = sezTilt; + text = Paragraph(['I Tilt Link HR 3D V sono caratterizzati dalla presenza '... + 'simultanea di una coppia di sensori nella medesima scheda elettronica. Il primo, '... + 'di tipo MEMS 3D, ' char(232) ' equipaggiato con accelerometro, magnetometro e termometro, '... + 'con inclinazioni dei sensori registrate dal primo elemento. La seconda tipologia, '... + 'cella elettrolitica 2D, ' char(232) ' in grado di fornire lo spostamento lungo gli assi strumentali '... + 'X e Y, a partire dalle inclinazioni ottenute mediante un''elettrolivella. La cella elettrolitica '... + '' char(232) ' orientata mediante il magnetometro del MEMS, dal momento che gli assi '... + 'strumentali X e Y dei due sensori possono ritenersi coincidenti. Nel dettaglio, '... + 'il sensore MEMS dispone di una portata teoricamente infinita (pu' char(242) ' essere ruotato in '... + 'ogni direzione dello spazio senza particolari problemi) e nasce per misurare spostamenti significativi, '... + 'mentre per quanto riguarda le piccole deformazioni risente dei disturbi legati al proprio '... + 'rumore di fondo di natura elettrica. La cella elettrolitica ha una sensibilit' char(224) ' molto elevata, '... + 'tale da percepire vibrazioni anche molto piccole, con il difetto di finire fuori scala per '... + 'valori di inclinazione assoluta pari a ' char(177) ' 25' char(176) ' (in tal senso ' char(232) ' importante sottolineare che, '... + 'se al momento dell''installazione il sensore presenta gi' char(224) ' un''inclinazione verso valle di '... + 'qualche grado, la portata del sensore ne risulter' char(224) ' conseguentemente ridotta).']); + text.HAlign = 'justify'; + + %---ENG--- + if activeEN == 1 + if TL3D == 0 + SE_ENG = Section(); + end + sezTilt_ENG = Heading3('Tilt Link HR 3D V'); + sezTilt_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SE_ENG.Title = sezTilt_ENG; + text_ENG = Paragraph(['Tilt Link HR 3D V follows the same working principle of Tilt Link V. '... + 'The main improvement refers to the 2D electrolytic cell, which permits to monitor small '... + 'displacements with a 10 times higher accuracy. Contrary to the MEMS sensor, which has a theoretically '... + 'infinite measure range, the electrolytic cell is limited to a ' char(177) '25' char(186) ' absolute tilt range. Since the '... + 'instrumental axes X and Y of this sensor coincide '... + 'with the two corresponding MEMS axes, the MEMS magnetometer can be used to define also the electrolytic cell '... + 'orientation. The simultaneous presence of two different '... + 'type of sensors in the same Link gives redundancy to results, which is fundamental to reduce '... + 'the uncertainties and have a robust interpretation of the occurring phenomenon.']); + text_ENG.HAlign = 'justify'; + end + if TL3D == 0 + add(SE,text); + imgTL = Image(('Tilt Link HR 3D V.tif')); + add(SE,imgTL); + imgTL.Style = {Height('5cm'),HAlign('center')}; + imgTLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Tilt Link HR 3D V']); + imgTLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SE,imgTLcaption); + FIG = FIG+1; + if activeEN == 1 + add(SE_ENG,text_ENG); + imgTL = Image(('Tilt Link HR 3D V.tif')); + add(SE_ENG,imgTL); + imgTL.Style = {Height('5cm'),HAlign('center')}; + imgTLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Tilt Link HR 3D V sensor']); + imgTLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SE_ENG,imgTLcaption_ENG); + FIG_ENG = FIG_ENG+1; + end + TL3D = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Tilt Link HR 3D V') == 1 + if TL3D == 0 + SE = Section(); + end + sezTilt = Heading3('Tilt Link HR 3D V'); + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SE.Title = sezTilt; + text = Paragraph(['I Tilt Link HR 3D V sono caratterizzati dalla presenza '... + 'simultanea di una coppia di sensori nella medesima scheda elettronica. Il primo, '... + 'di tipo MEMS 3D, ' char(232) ' equipaggiato con accelerometro, magnetometro e termometro, '... + 'con inclinazioni dei sensori registrate dal primo elemento. La seconda tipologia, '... + 'cella elettrolitica 2D, ' char(232) ' in grado di fornire lo spostamento lungo gli assi strumentali '... + 'X e Y, a partire dalle inclinazioni ottenute mediante un''elettrolivella. La cella elettrolitica '... + char(232) ' orientata mediante il magnetometro del MEMS, dal momento che gli assi '... + 'strumentali X e Y dei due sensori possono ritenersi coincidenti. Nel dettaglio, '... + 'il sensore MEMS dispone di una portata teoricamente infinita (pu' char(242) ' essere ruotato in '... + 'ogni direzione dello spazio senza particolari problemi) e nasce per misurare spostamenti significativi, '... + 'mentre per quanto riguarda le piccole deformazioni risente dei disturbi legati al proprio '... + 'rumore di fondo di natura elettrica. La cella elettrolitica ha una sensibilit' char(224) ' molto elevata, '... + 'tale da percepire vibrazioni anche molto piccole, con il difetto di finire fuori scala per '... + 'valori di inclinazione assoluta pari a ' char(177) ' 25' char(176) ' (in tal senso ' char(232) ' importante sottolineare che, '... + 'se al momento dell''installazione il sensore presenta gi' char(224) ' un''inclinazione verso valle di '... + 'qualche grado, la portata del sensore ne risulter' char(224) ' conseguentemente ridotta).']); + text.HAlign = 'justify'; + + %---ENG--- + if activeEN == 1 + if TL3D == 0 + SE_ENG = Section(); + end + sezTilt_ENG = Heading3('Tilt Link HR 3D V'); + sezTilt_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SE_ENG.Title = sezTilt_ENG; + text_ENG = Paragraph(['Tilt Link HR 3D V follows the same working principle of Tilt Link V. '... + 'The main improvement refers to the 2D electrolytic cell, which permits to monitor small '... + 'displacements with a 10 times higher accuracy. Contrary to the MEMS sensor, which has a theoretically '... + 'infinite measure range, the electrolytic cell is limited to a ' char(177) '25' char(186) ' absolute tilt range. Since the '... + 'instrumental axes X and Y of this sensor coincide '... + 'with the two corresponding MEMS axes, the MEMS magnetometer can be used to define also the electrolytic cell '... + 'orientation. The simultaneous presence of two different '... + 'type of sensors in the same Link gives redundancy to results, which is fundamental to reduce '... + 'the uncertainties and have a robust interpretation of the occurring phenomenon.']); + text_ENG.HAlign = 'justify'; + end + if TL3D == 0 + add(SE,text); + imgTL = Image(('Tilt Link HR 3D V.tif')); + add(SE,imgTL); + imgTL.Style = {Height('5cm'),HAlign('center')}; + imgTLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Tilt Link HR 3D V']); + imgTLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SE,imgTLcaption); + FIG = FIG+1; + if activeEN == 1 + add(SE_ENG,text); + imgTL = Image(('Tilt Link HR 3D V.tif')); + add(SE_ENG,imgTL); + imgTL.Style = {Height('5cm'),HAlign('center')}; + imgTLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Tilt Link HR 3D V sensor']); + imgTLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SE_ENG,imgTLcaption_ENG); + FIG_ENG = FIG_ENG+1; + end + TL3D = 1; + end + break + end + end + end +end +add(appendice,SE); +if activeEN == 1 + add(appendice_ENG,SE_ENG); +end + +% --- Tilt Link V --- +TL = 0; +ST = Section(); +if activeEN == 1 + ST_ENG = Section(); +end + +for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Tilt Link V') == 1 + if TL == 0 + ST = Section(); + end + sezTilt = Heading3('Tilt Link V'); + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + ST.Title = sezTilt; + text = Paragraph(['I Tilt Link V sono caratterizzati dalla presenza '... + 'del sensore MEMS 3D, equipaggiato con accelerometro, magnetometro e termometro. Il primo '... + 'elemento registra le inclinazioni del sensore, mentre il secondo definisce la direzione '... + 'di inclinazione. Il termometro ' char(232) ' utilizzato per la compensazione termica delle singole misure. '... + 'Nel dettaglio, il sensore dispone di una portata teoricamente infinita (pu' char(242) ' essere ruotato in '... + 'ogni direzione dello spazio senza particolari problemi) e nasce per misurare spostamenti significativi, '... + 'mentre per quanto riguarda le piccole deformazioni risente dei disturbi legati al proprio '... + 'rumore di fondo di natura elettrica.']); + + %--ENG-- + if activeEN == 1 + if TL_ENG == 0 + ST_ENG = Section(); + end + sezTilt_ENG = Heading3('Tilt Link V'); + sezTilt_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + ST_ENG.Title = sezTilt_ENG; + text_ENG = Paragraph(['Each Tilt Link V features a 3D MEMS sensor, which equips an accelerometer, a '... + 'magnetometer, and a thermometer. The first element is able to record the sensor tilt, '... + 'while the second one defines its direction. The thermometer provides the sensor temperature, and it '... + 'is used to correct the thermal effects on the accelerometer. Form a theoretical point of view, '... + 'the MEMS features an infinite range of tilt measure, while small variations in its '... + 'position are influenced by electrical noises.']); + end + if TL == 0 + text.HAlign = 'justify'; + add(ST,text); + img = Image(('Tilt Link V.tif')); + img.Style = {Height('5cm'),HAlign('center')}; + add(ST,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Tilt Link V']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(ST,ionhcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(ST_ENG,text_ENG); + img = Image(('Tilt Link V.tif')); + img.Style = {Height('5cm'),HAlign('center')}; + add(ST,img); + ionhcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Tilt Link V sensor']); + FIG_ENG = FIG_ENG+1; + ionhcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(ST,ionhcaption_ENG); + end + TL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Tilt Link V') == 1 + if TL == 0 + ST = Section(); + end + sezTilt = Heading3('Tilt Link V'); + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + ST.Title = sezTilt; + text = Paragraph(['I Tilt Link V sono caratterizzati dalla presenza '... + 'del sensore MEMS 3D, equipaggiato con accelerometro, magnetometro e termometro. Il primo '... + 'elemento registra le inclinazioni del sensore, mentre il secondo definisce la direzione '... + 'di inclinazione. Il termometro ' char(232) ' utilizzato per la compensazione termica delle singole misure. '... + 'Nel dettaglio, il sensore dispone di una portata teoricamente infinita (pu' char(242) ' essere ruotato in '... + 'ogni direzione dello spazio senza particolari problemi) e nasce per misurare spostamenti significativi, '... + 'mentre per quanto riguarda le piccole deformazioni risente dei disturbi legati al proprio '... + 'rumore di fondo di natura elettrica.']); + %--ENG-- + if activeEN == 1 + if TL_ENG == 0 + ST_ENG = Section(); + end + sezTilt_ENG = Heading3('Tilt Link V'); + sezTilt_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + ST_ENG.Title = sezTilt_ENG; + text_ENG = Paragraph(['Each Tilt Link V features a 3D MEMS sensor, which equips an accelerometer, a '... + 'magnetometer, and a thermometer. The first element is able to record the sensor tilt, '... + 'while the second one defines its direction. The thermometer provides the sensor temperature, and it '... + 'is used to correct the thermal effects on the accelerometer. Form a theoretical point of view, '... + 'the MEMS features an infinite range of tilt measure, while small variations in its '... + 'position are influenced by electrical noises.']); + end + if TL == 0 + text.HAlign = 'justify'; + add(ST,text); + img = Image(('Tilt Link V.tif')); + img.Style = {Height('5cm'),HAlign('center')}; + add(ST,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Tilt Link V']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(ST,ionhcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(ST_ENG,text_ENG); + img = Image(('Tilt Link V.tif')); + img.Style = {Height('5cm'),HAlign('center')}; + add(ST,img); + ionhcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Tilt Link V sensor']); + FIG_ENG = FIG_ENG+1; + ionhcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(ST,ionhcaption_ENG); + end + TL = 1; + end + break + end + end + end +end +add(appendice,ST); +if activeEN == 1 + add(appendice_ENG,ST_ENG); +end + +% --- In Place Link HR 3D --- +SIPI3D = Section(); +if activeEN == 1 + SIPI3D_ENG = Section(); +end +IPL3D = 0; +for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'In Place Link HR 3D') == 1 + if IPL3D == 0 + SIPI3D = Section(); + end + sezIPI = Heading3('In Place Link HR 3D'); + sezIPI.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SIPI3D.Title = sezIPI; + text = Paragraph(['Gli In Place Link HR sono caratterizzati dalla presenza '... + 'simultanea di una coppia di sensori nella medesima scheda elettronica. Il primo, '... + 'di tipo MEMS 3D, ' char(232) ' equipaggiato con accelerometro, magnetometro e termometro, '... + 'con inclinazioni dei sensori registrate dal primo elemento. La seconda tipologia, '... + 'cella elettrolitica 2D, ' char(232) ' in grado di fornire lo spostamento lungo gli assi strumentali '... + 'X e Y, a partire dalle inclinazioni ottenute mediante un''elettrolivella. La cella elettrolitica '... + '' char(232) ' orientata mediante il magnetometro del MEMS, dal momento che gli assi '... + 'strumentali X e Y dei due sensori possono ritenersi coincidenti. Nel dettaglio, '... + 'il sensore MEMS dispone di una portata teoricamente infinita (pu' char(242) ' essere ruotato in '... + 'ogni direzione dello spazio senza particolari problemi) e nasce per misurare spostamenti significativi, '... + 'mentre per quanto riguarda le piccole deformazioni risente dei disturbi legati al proprio '... + 'rumore di fondo di natura elettrica. La cella elettrolitica ha una sensibilit' char(224) ' molto elevata, '... + 'tale da percepire vibrazioni anche molto piccole, con il difetto di finire fuori scala per '... + 'valori di inclinazione assoluta pari a ' char(177) ' 25' char(176) ' (in tal senso ' char(232) ' importante sottolineare che, '... + 'se al momento dell''installazione il sensore presenta gi' char(224) ' un''inclinazione verso valle di '... + 'qualche grado, la portata del sensore ne risulter' char(224) ' conseguentemente ridotta).']); + text.HAlign = 'justify'; + + %--ENG-- + if activeEN == 1 + if IPL3D == 0 + SIPI3D_ENG = Section(); + end + sezIPI_ENG = Heading3('In Place Link HR 3D'); + sezIPI_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SIPI3D_ENG.Title = sezIPI_ENG; + text_ENG = Paragraph(['In Place HR 3D follows the same working principle of In Place Link. '... + 'The main improvement refers to the 2D electrolytic cell, which permits to monitor small '... + 'displacements with a 10 times higher accuracy. Contrary to the MEMS sensor, which has a theoretically '... + 'infinite measure range, the electrolytic cell is limited to a ' char(177) '25' char(186) ' absolute tilt range. Since the '... + 'instrumetal axes X and Y of this sensor coincide '... + 'with the two corresponding MEMS axes, the MEMS magnetometer can be used to define also the electrolytic cell '... + 'orientation. The simultaneous presence of two different '... + 'type of sensors in the same link gives redundancy to results, which is fundamental to reduce '... + 'the uncertainties and have a robust interpretation of the occurring phenomenon.']); + text_ENG.HAlign = 'justify'; + end + if IPL3D == 0 + add(SIPI3D,text); + imgIPL = Image(('Tilt Link HR 3D V.tif')); + add(SIPI3D,imgIPL); + imgIPL.Style = {Height('5cm'),HAlign('center')}; + imgIPLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore In Place Link HR 3D']); + imgIPLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SIPI3D,imgIPLcaption); + FIG = FIG+1; + if activeEN == 1 + add(SIPI3D_ENG,text_ENG); + imgIPL = Image(('Tilt Link HR 3D V.tif')); + add(SIPI3D_ENG,imgIPL); + imgIPL.Style = {Height('5cm'),HAlign('center')}; + imgIPLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - In Place Link HR 3D sensor']); + FIG_ENG = FIG_ENG+1; + imgIPLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SIPI3D,imgIPLcaption_ENG); + end + IPL3D = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'In Place Link HR 3D') == 1 + if IPL3D == 0 + SIPI3D = Section(); + end + sezIPI = Heading3('In Place Link HR 3D'); + sezIPI.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SIPI3D.Title = sezIPI; + text = Paragraph(['Gli In Place Link HR 3D sono caratterizzati dalla presenza '... + 'simultanea di una coppia di sensori nella medesima scheda elettronica. Il primo, '... + 'di tipo MEMS 3D, ' char(232) ' equipaggiato con accelerometro, magnetometro e termometro, '... + 'con inclinazioni dei sensori registrate dal primo elemento. La seconda tipologia, '... + 'cella elettrolitica 2D, ' char(232) ' in grado di fornire lo spostamento lungo gli assi strumentali '... + 'X e Y, a partire dalle inclinazioni ottenute mediante un''elettrolivella. La cella elettrolitica '... + char(232) ' orientata mediante il magnetometro del MEMS, dal momento che gli assi '... + 'strumentali X e Y dei due sensori possono ritenersi coincidenti. Nel dettaglio, '... + 'il sensore MEMS dispone di una portata teoricamente infinita (pu' char(242) ' essere ruotato in '... + 'ogni direzione dello spazio senza particolari problemi) e nasce per misurare spostamenti significativi, '... + 'mentre per quanto riguarda le piccole deformazioni risente dei disturbi legati al proprio '... + 'rumore di fondo di natura elettrica. La cella elettrolitica ha una sensibilit' char(224) ' molto elevata, '... + 'tale da percepire vibrazioni anche molto piccole, con il difetto di finire fuori scala per '... + 'valori di inclinazione assoluta pari a ' char(177) ' 25' char(176) ' (in tal senso ' char(232) ' importante sottolineare che, '... + 'se al momento dell''installazione il sensore presenta gi' char(224) ' un''inclinazione verso valle di '... + 'qualche grado, la portata del sensore ne risulter' char(224) ' conseguentemente ridotta).']); + text.HAlign = 'justify'; + %--ENG-- + if activeEN == 1 + if IPL3D == 0 + SIPI3D_ENG = Section(); + end + sezIPI_ENG = Heading3('In Place Link HR 3D'); + sezIPI_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SIPI3D_ENG.Title = sezIPI_ENG; + text_ENG = Paragraph(['In Place HR 3D follows the same working principle of In Place Link. '... + 'The main improvement refers to the 2D electrolytic cell, which permits to monitor small '... + 'displacements with a 10 times higher accuracy. Contrary to the MEMS sensor, which has a theoretically '... + 'infinite measure range, the electrolytic cell is limited to a ' char(177) '25' char(186) ' absolute tilt range. Since the '... + 'instrumetal axes X and Y of this sensor coincide '... + 'with the two corresponding MEMS axes, the MEMS magnetometer can be used to define also the electrolytic cell '... + 'orientation. The simultaneous presence of two different '... + 'type of sensors in the same link gives redundancy to results, which is fundamental to reduce '... + 'the uncertainties and have a robust interpretation of the occurring phenomenon.']); + text_ENG.HAlign = 'justify'; + end + if IPL3D == 0 + add(SIPI3D,text); + imgIPL = Image(('Tilt Link HR 3D V.tif')); + add(SIPI3D,imgIPL); + imgIPL.Style = {Height('5cm'),HAlign('center')}; + imgIPLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore In Place Link HR 3D']); + FIG = FIG+1; + imgIPLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SIPI3D,imgIPLcaption); + if activeEN == 1 + add(SIPI3D_ENG,text_ENG); + imgIPL = Image(('Tilt Link HR 3D V.tif')); + add(SIPI3D_ENG,imgIPL); + imgIPL.Style = {Height('5cm'),HAlign('center')}; + imgIPLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - In Place Link HR 3D sensor']); + FIG_ENG = FIG_ENG+1; + imgIPLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SIPI3D,imgIPLcaption_ENG); + end + IPL3D = 1; + end + break + end + end + end +end +add(appendice,SIPI3D); +if activeEN == 1 + add(appendice_ENG,SIPI3D_ENG); +end + +% --- In Place Link --- +IPL = 0; +SIPI = Section(); +if activeEN == 1 + SIPI_ENG = Section(); +end +for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'In Place Link') == 1 + if IPL == 0 + SIPI = Section(); + end + sezIPI = Heading3('In Place Link'); + sezIPI.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SIPI.Title = sezIPI; + text = Paragraph(['Gli In Place Link sono caratterizzati dalla presenza '... + 'del sensore MEMS 3D, equipaggiato con accelerometro, magnetometro e termometro. Il primo '... + 'elemento registra le inclinazioni del sensore, mentre il secondo definisce la direzione '... + 'di inclinazione. Il termometro ' char(232) ' utilizzato per la compensazione termica delle singole misure. '... + 'Nel dettaglio, il sensore dispone di una portata teoricamente infinita (pu' char(242) ' essere ruotato in '... + 'ogni direzione dello spazio senza particolari problemi) e nasce per misurare spostamenti significativi, '... + 'mentre per quanto riguarda le piccole deformazioni risente dei disturbi legati al proprio '... + 'rumore di fondo di natura elettrica.']); + + %--ENG-- + if activeEN == 1 + if IPL == 0 + SIPI_ENG = Section(); + end + sezIPI_ENG = Heading3('In Place Link'); + sezIPI_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SIPI_ENG.Title = sezIPI_ENG; + text_ENG = Paragraph(['Each In Place Link features a 3D MEMS sensor, which equips an accelerometer, a '... + 'magnetometer, and a thermometer. The first element is able to record the node tilt, '... + 'while the second one defines its direction. The thermometer provides the sensor temperature, and it '... + 'is used to correct the thermal effects on the accelerometer. From a theoretical point of view, '... + 'the MEMS features an infinite range of tilt measure, while small variations in its '... + 'position are influenced by electrical noises.']); + end + if IPL == 0 + text.HAlign = 'justify'; + add(SIPI,text); + img = Image(('Tilt Link V.tif')); + img.Style = {Height('5cm'),HAlign('center')}; + add(SIPI,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore In Place Link']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SIPI,ionhcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(SIP_ENGI,text_ENG); + img = Image(('Tilt Link V.tif')); + img.Style = {Height('5cm'),HAlign('center')}; + add(SIPI,img); + ionhcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - In Place Link sensor']); + FIG_ENG = FIG_ENG+1; + ionhcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SIPI_ENG,ionhcaption_ENG); + end + IPL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'In Place Link') == 1 + if IPL == 0 + SIPI = Section(); + end + sezIPI = Heading3('In Place Link'); + sezIPI.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SIPI.Title = sezIPI; + text = Paragraph(['Gli In Place Link sono caratterizzati dalla presenza '... + 'del sensore MEMS 3D, equipaggiato con accelerometro, magnetometro e termometro. Il primo '... + 'elemento registra le inclinazioni del sensore, mentre il secondo definisce la direzione '... + 'di inclinazione. Il termometro ' char(232) ' utilizzato per la compensazione termica delle singole misure. '... + 'Nel dettaglio, il sensore dispone di una portata teoricamente infinita (pu' char(242) ' essere ruotato in '... + 'ogni direzione dello spazio senza particolari problemi) e nasce per misurare spostamenti significativi, '... + 'mentre per quanto riguarda le piccole deformazioni risente dei disturbi legati al proprio '... + 'rumore di fondo di natura elettrica.']); + %--ENG-- + if activeEN == 1 + if IPL == 0 + SIPI_ENG = Section(); + end + sezIPI_ENG = Heading3('In Place Link'); + sezIPI_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SIPI_ENG.Title = sezIPI_ENG; + text_ENG = Paragraph(['Each In Place Link features a 3D MEMS sensor, which equips an accelerometer, a '... + 'magnetometer, and a thermometer. The first element is able to record the node tilt, '... + 'while the second one defines its direction. The thermometer provides the sensor temperature, and it '... + 'is used to correct the thermal effects on the accelerometer. From a theoretical point of view, '... + 'the MEMS features an infinite range of tilt measure, while small variations in its '... + 'position are influenced by electrical noises.']); + end + if IPL == 0 + text.HAlign = 'justify'; + add(SIPI,text); + img = Image(('Tilt Link V.tif')); + img.Style = {Height('5cm'),HAlign('center')}; + add(SIPI,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore In Place Link']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SIPI,ionhcaption); + + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(SIP_ENGI,text_ENG); + img = Image(('Tilt Link V.tif')); + img.Style = {Height('5cm'),HAlign('center')}; + add(SIPI,img); + ionhcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - In Place Link sensor']); + FIG_ENG = FIG_ENG+1; + ionhcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SIPI_ENG,ionhcaption_ENG); + end + IPL = 1; + end + break + end + end + end +end +add(appendice,SIPI); +if activeEN == 1 + add(appendice_ENG,SIPI_ENG); +end + +% --- In Place Link HR --- +if yesIPL == 0 + IPLHR = 0; + SIPIHR = Section(); + if activeEN == 1 + SIPIHR_ENG = Section(); + end + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'In Place Link HR') == 1 + if IPLHR == 0 + SIPIHR = Section(); + end + sezIPIHR = Heading3('In Place Link HR'); + sezIPIHR.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SIPIHR.Title = sezIPIHR; + text = Paragraph(['Gli In Place Link HR sono caratterizzati dalla simultanea presenza '... + 'del sensore elettrolitico 2D e di un termometro. Il primo '... + 'elemento registra le inclinazioni assolute del sensore rispetto al piano orizzontale, mentre '... + 'il termometro fornisce il dato di temperatura, molto utile nell''individuazione degli effetti termici. '... + 'A seconda delle impostazioni definite al momento dell''installazione, il sensore va fuori scala '... + 'per un determinato angolo assoluto positivo o negativo.']); + + %--ENG-- + if activeEN == 1 + if IPLHR == 0 + SIPIHR = Section(); + end + sezIPIHR = Heading3('In Place Link HR'); + sezIPIHR.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SIPIHR.Title = sezIPIHR; + text_ENG = Paragraph(['Each In Place Link HR features a 2D electrolytic tilt sensor and a thermometer. '... + 'The first element is able to record the absolute tilt of the node, '... + 'while the thermometer provides the sensor temperature, and it '... + 'is used to correct the thermal effects on the tilt sensor. Depending on the installation '... + 'configuration, the elctrolytic sensor could reach out-of-range positions for specific values '... + 'of absolute tilt of the node (both positive and/or negative). ']); + end + if IPLHR == 0 + text.HAlign = 'justify'; + add(SIPIHR,text); + img = Image(('IPLHR.jpg')); + img.Style = {Height('3cm'),HAlign('center')}; + add(SIPIHR,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore In Place Link HR']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SIPIHR,ionhcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(SIPIHR_ENG,text_ENG); + img = Image(('IPLHR.jpg')); + img.Style = {Height('3cm'),HAlign('center')}; + add(SIPIHR_ENG,img); + ionhcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - In Place Link HR sensor']); + FIG_ENG = FIG_ENG+1; + ionhcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SIPIHR,ionhcaption_ENG); + end + IPLHR = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'In Place Link HR') == 1 + if IPLHR == 0 + SIPIHR = Section(); + end + sezIPIHR = Heading3('In Place Link HR'); + sezIPIHR.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SIPIHR.Title = sezIPIHR; + text = Paragraph(['Gli In Place Link HR sono caratterizzati dalla simultanea presenza '... + 'del sensore elettrolitico 2D e di un termometro. Il primo '... + 'elemento registra le inclinazioni assolute del sensore rispetto al piano orizzontale, mentre '... + 'il termometro fornisce il dato di temperatura, molto utile nell''individuazione degli effetti termici. '... + 'A seconda delle impostazioni definite al momento dell''installazione, il sensore va fuori scala '... + 'per un determinato angolo assoluto positivo o negativo.']); + %--ENG-- + if activeEN == 1 + if IPLHR == 0 + SIPIHR = Section(); + end + sezIPIHR = Heading3('In Place Link HR'); + sezIPIHR.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SIPIHR.Title = sezIPIHR; + text_ENG = Paragraph(['Each In Place Link HR features a 2D electrolytic tilt sensor and a thermometer. '... + 'The first element is able to record the absolute tilt of the node, '... + 'while the thermometer provides the sensor temperature, and it '... + 'is used to correct the thermal effects on the tilt sensor. Depending on the installation '... + 'configuration, the elctrolytic sensor could reach out-of-range positions for specific values '... + 'of absolute tilt of the node (both positive and/or negative). ']); + end + if IPLHR == 0 + text.HAlign = 'justify'; + add(SIPIHR,text); + img = Image(('IPLHR.jpg')); + img.Style = {Height('3cm'),HAlign('center')}; + add(SIPIHR,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore In Place Link HR']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SIPIHR,ionhcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(SIPIHR_ENG,text_ENG); + img = Image(('IPLHR.jpg')); + img.Style = {Height('3cm'),HAlign('center')}; + add(SIPIHR_ENG,img); + ionhcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - In Place Link HR sensor']); + FIG_ENG = FIG_ENG+1; + ionhcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SIPIHR,ionhcaption_ENG); + end + IPLHR = 1; + end + break + end + end + end + end + add(appendice,SIPIHR); + if activeEN == 1 + add(appendice_ENG,SIPIHR_ENG); + end +end + +if sum(yesPL) >= 1 + % --- Piezo Link --- + PL = 0; + if isempty(PL_A) == 1 && isempty(PL_D) == 1 + tipoPL = 'assoluta '; + figuraPL = 'Piezo Link D.jpg'; + capPL = 'digitale'; + baroPL = ', accoppiati con un sensore barometrico, '; + else + if sum(PL_A) > 0 && sum(PL_D) > 0 + tipoPL = 'assoluta (digitali) e relativa (analogici) '; + figuraPL = 'Piezo Link DA.jpg'; + capPL = 'digitale (a sinistra) e analogico (a destra)'; + baroPL = ' '; + elseif sum(PL_A) > 0 + tipoPL = 'relativa '; + figuraPL = 'Piezo Link A.png'; + capPL = 'analogico'; + baroPL = ' '; + elseif sum(PL_D) > 0 + tipoPL = 'assoluta '; + figuraPL = 'Piezo Link D.jpg'; + capPL = 'digitale'; + baroPL = ', accoppiati con un sensore barometrico, '; + end + end + + if activeEN == 1 + if isempty(PL_A) == 1 && isempty(PL_D) == 1 + tipoPL_ENG = 'absolute '; + figuraPL = 'Piezo Link D.jpg'; + capPL_ENG = 'digitale'; + baroPL_ENG = ', coupled with a barometer, it also allows '; + else + if sum(PL_A) > 0 && sum(PL_D) > 0 + tipoPL_ENG = 'absolute (digital) and relative (analog) '; + figuraPL = 'Piezo Link DA.jpg'; + capPL_ENG = 'digital (left) and analog (right)'; + baroPL_ENG = ' '; + elseif sum(PL_A) > 0 + tipoPL_ENG = 'relative '; + figuraPL = 'Piezo Link A.png'; + capPL_ENG = 'analog'; + baroPL_ENG = ' '; + elseif sum(PL_D) > 0 + tipoPL_ENG = 'absolute '; + figuraPL = 'Piezo Link D.jpg'; + capPL_ENG = 'digital'; + baroPL_ENG = ', coupled with a barometer, it also allows '; + end + end + end + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Piezo Link') == 1 + if PL == 0 + PE = Section(); + end + sezTilt = Heading3('Piezo Link'); + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PE.Title = sezTilt; + text = Paragraph(['I sensori Piezo Link sono rilevatori di pressione ' tipoPL... + 'che' baroPL 'permettono di calcolare la pressione '... + 'interstiziale e, conoscendo la profondit' char(224) ' del piezometro, la stima della colonna d''acqua.']); + %--ENG-- + if activeEN == 1 + if PL == 0 + PE_ENG = Section(); + end + sezTilt_ENG = Heading3('Piezo Link'); + sezTilt_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PE_ENG.Title = sezTilt_ENG; + text_ENG = Paragraph(['Piezo Link is a sensor able to measure the ' tipoPL_ENG 'pressure and' baroPL_ENG ... + 'to calculate the water table level.']); + end + + if PL == 0 + text.HAlign = 'justify'; + add(PE,text); + imgPL = Image(figuraPL); + imgPL.Style = {Height('5.5cm'),HAlign('center')}; + add(PE,imgPL); + PLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Piezo Link ' capPL]); + FIG = FIG+1; + PLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(PE,PLcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(PE_ENG,text_ENG); + imgPL = Image(figuraPL); + imgPL.Style = {Height('5.5cm'),HAlign('center')}; + add(PE_ENG,imgPL); + PLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Piezo Link sensor, ' capPL_ENG]); + FIG_ENG = FIG_ENG+1; + PLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(PE_ENG,PLcaption_ENG); + end + PL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Piezo Link') == 1 + if PL == 0 + PE = Section(); + end + sezTilt = Heading3('Piezo Link'); + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PE.Title = sezTilt; + text = Paragraph(['I sensori Piezo Link sono rilevatori di pressione ' tipoPL... + 'che' baroPL 'permettono di calcolare la pressione '... + 'interstiziale e, conoscendo la profondit' char(224) ' del piezometro, la stima della colonna d''acqua.']); + %--ENG-- + if activeEN == 1 + if PL == 0 + PE_ENG = Section(); + end + sezTilt_ENG = Heading3('Piezo Link'); + sezTilt_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PE_ENG.Title = sezTilt_ENG; + text_ENG = Paragraph(['Piezo Link is a sensor able to measure the ' tipoPL_ENG 'pressure and' baroPL_ENG ... + 'to calculate the water table level.']); + end + if PL == 0 + text.HAlign = 'justify'; + add(PE,text); + imgPL = Image(figuraPL); + imgPL.Style = {Height('5.5cm'),HAlign('center')}; + add(PE,imgPL); + PLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Piezo Link ' capPL]); + FIG = FIG+1; + PLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(PE,PLcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(PE_ENG,text_ENG); + imgPL = Image(figuraPL); + imgPL.Style = {Height('5.5cm'),HAlign('center')}; + add(PE_ENG,imgPL); + PLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Piezo Link sensor, ' capPL_ENG]); + FIG_ENG = FIG_ENG+1; + PLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(PE_ENG,PLcaption_ENG); + end + PL = 1; + end + break + end + end + end + end + % ---Baro Link--- + if sum(yesBL) >= 1 + BL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Baro Link') == 1 + if BL == 0 + BE = Section(); + end + sezTilt = Heading3('Baro Link'); + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + BE.Title = sezTilt; + text = Paragraph(['Il sensore Baro Link ' char(232) ' un rilevatore di pressione assoluta. '... + 'Le informazioni che si ottengono permettono di stimare le condizioni '... + 'meteorologiche del sito e calcolare la pressione interstiziale, se '... + 'accoppiato alle informazioni di un piezometro assoluto']); + + if activeEN == 1 + if BL == 0 + BE_ENG = Section(); + end + sezTilt_ENG = Heading3('Baro Link'); + sezTilt_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + BE_ENG.Title = sezTilt_ENG; + text_ENG = Paragraph(['Baro Link is a sensor designed to measure the atmospheric pressure, allowing to '... + 'evaluate the meteorological conditions of the monitored site and to estimate the pore water pressure, '... + 'when coupled with a piezometer.']); + end + if BL == 0 + text.HAlign = 'justify'; + add(BE,text); + imgBL = Image(('Barometro.png')); + imgBL.Style = {Height('2.8cm'),HAlign('center')}; + add(BE,imgBL); + BLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Baro Link']); + FIG = FIG+1; + BLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(BE,BLcaption); + if activeEN ==1 + text_ENG.HAlign = 'justify'; + add(BE_ENG,text_ENG); + imgBL = Image(('Barometro.png')); + imgBL.Style = {Height('2.8cm'),HAlign('center')}; + add(BE_ENG,imgBL); + BLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Baro Link sensor']); + FIG_ENG = FIG_ENG+1; + BLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(BE_ENG,BLcaption_ENG); + end + BL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Baro Link') == 1 + if BL == 0 + BE = Section(); + end + sezTilt = Heading3('Baro Link'); + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + BE.Title = sezTilt; + text = Paragraph(['Il sensore Baro Link ' char(232) ' un rilevatore di pressione assoluta. '... + 'Le informazioni che si ottengono permettono di stimare le condizioni '... + 'meteorologiche del sito e calcolare la pressione interstiziale, se '... + 'accoppiato alle informazioni di un piezometro assoluto.']); + if activeEN == 1 + if BL == 0 + BE_ENG = Section(); + end + sezTilt_ENG = Heading3('Baro Link'); + sezTilt_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + BE_ENG.Title = sezTilt_ENG; + text_ENG = Paragraph(['Baro Link is a sensor designed to measure the atmospheric pressure, allowing to '... + 'evaluate the meteorological conditions of the monitored site and to estimate the pore water pressure, '... + 'when coupled with a piezometer.']); + end + if BL == 0 + text.HAlign = 'justify'; + add(BE,text); + imgBL = Image(('Barometro.png')); + imgBL.Style = {Height('2.8cm'),HAlign('center')}; + add(BE,imgBL); + BLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Baro Link']); + FIG = FIG+1; + BLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(BE,BLcaption) + if activeEN ==1 + text_ENG.HAlign = 'justify'; + add(BE_ENG,text_ENG); + imgBL = Image(('Barometro.png')); + imgBL.Style = {Height('2.8cm'),HAlign('center')}; + add(BE_ENG,imgBL); + BLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Baro Link sensor']); + FIG_ENG = FIG_ENG+1; + BLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(BE_ENG,BLcaption_ENG); + end + BL = 1; + end + break + end + end + end + end + add(appendice,BE); + if activeEN == 1 + add(appendice_ENG,BE_ENG); + end + end + add(appendice,PE); + if activeEN == 1 + add(appendice_ENG,PE_ENG); + end +end + +% ---Klino Link--- +if sum(yesKL) >= 1 + KL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(char(colonna4(a,1)),'Klino Array D2W') == 1 % Clinometro Wi-Fi + if KL == 0 + KE = Section(); + end + sezKlino = Heading3('Klino Link'); + sezKlino.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KE.Title = sezKlino; + text = Paragraph(['I sensori Klino Link D2W sono clinometri Wi-Fi '... + 'caratterizzati dalla presenza di un sensore MEMS 2D '... + 'ed un termometro. I dispositivi sono in grado di monitorare '... + 'l''inclinazione assoluta e differenziale della struttura a cui sono fissati, '... + 'oltre alla temperatura della stessa.']); + + %--ENG-- + if activeEN == 1 + if KL == 0 + KE_ENG = Section(); + end + sezKlino_ENG = Heading3('Klino Link'); + sezKlino_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KE_ENG.Title = sezKlino_ENG; + text_ENG = Paragraph(['Klino Link D2W are wireless tilt sensors, '... + 'integrating a 2D MEMS and a thermometer. These devices are able to measure the '... + 'the absolute and relative tilt of the monitored structure, providing also '... + 'a temperature value.']); + end + + if KL == 0 + text.HAlign = 'justify'; + add(KE,text); + imgKL = Image(('ClinometroES.jpg')); + imgKL.Style = {Height('3cm'),HAlign('center')}; + add(KE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Klino Link D2W']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(KE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(KE_ENG,text); + imgKL = Image(('ClinometroES.jpg')); + imgKL.Style = {Height('3cm'),HAlign('center')}; + add(KE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Klino Link D2W sensor']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(KE_ENG,KEcaption_ENG); + end + KL = 1; + end + break + else + if strcmp(colonna6(a,1),'Klino Link HR 3D') == 1 + if KL == 0 + KE = Section(); + end + sezKlino = Heading3('Klino Link HR 3D'); + sezKlino.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KE.Title = sezKlino; + text = Paragraph(['I sensori Klino Link HR 3D sono clinometri '... + 'caratterizzati dalla simultanea presenza di un sensore MEMS 3D '... + 'ed un sensore elettrolitico 2D, in grado di monitorare '... + 'l''inclinazione della struttura a cui sono fissati, '... + 'oltre alla temperatura della stessa.']); + + %--ENG-- + if activeEN == 1 + if KL == 0 + KE_ENG = Section(); + end + sezKlino_ENG = Heading3('Klino Link HR 3D'); + sezKlino_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KE_ENG.Title = sezKlino_ENG; + text_ENG = Paragraph(['Klino Link HR 3D is a sensor that integrates a 3D MEMS sensor and an electrolytic '... + 'tilt sensor, able to measure the tilt of the element on which is installed. It also '... + 'includes a thermometer to collect temperature values.']); + end + + if KL == 0 + text.HAlign = 'justify'; + add(KE,text); + imgKL = Image(('Klino.png')); + imgKL.Style = {Height('3cm'),HAlign('center')}; + add(KE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Klino Link HR 3D']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(KE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(KE_ENG,text); + imgKL = Image(('Klino.jpg')); + imgKL.Style = {Height('3cm'),HAlign('center')}; + add(KE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Klino Link HR 3d sensor']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(KE_ENG,KEcaption_ENG); + end + KL = 1; + end + break + end + end + else + for aC = 1:dimC + if strcmp(char(colonna4(m+1,1)),'Klino Array D2W') == 1 % Clinometro Wi-Fi + if KL == 0 + KE = Section(); + end + sezKlino = Heading3('Klino Link'); + sezKlino.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KE.Title = sezKlino; + text = Paragraph(['I sensori Klino Link D2W sono clinometri Wi-Fi '... + 'caratterizzati dalla presenza di un sensore MEMS 2D '... + 'ed un termometro. I dispositivi sono in grado di monitorare '... + 'l''inclinazione assoluta e differenziale della struttura a cui sono fissati, '... + 'oltre alla temperatura della stessa.']); + %--ENG-- + if activeEN == 1 + if KL == 0 + KE_ENG = Section(); + end + sezKlino_ENG = Heading3('Klino Link'); + sezKlino_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KE_ENG.Title = sezKlino_ENG; + text_ENG = Paragraph(['Klino Link D2W are wireless tilt sensors, '... + 'integrating a 2D MEMS and a thermometer. These devices are able to measure the '... + 'the absolute and relative tilt of the monitored structure, providing also '... + 'a temperature value.']); + end + if KL == 0 + text.HAlign = 'justify'; + add(KE,text); + imgKL = Image(('ClinometroES.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(KE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Klino Link D2W']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(KE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(KE_ENG,text); + imgKL = Image(('ClinometroES.png')); + imgKL.Style = {Height('3cm'),HAlign('center')}; + add(KE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Klino Link D2W sensor']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(KE_ENG,KEcaption_ENG); + end + KL = 1; + end + break + else + if strcmp(colonna6{a, 1}{aC, 1},'Klino Link HR 3D') == 1 + if KL == 0 + KE = Section(); + end + sezKlino = Heading3('Klino Link HR 3D'); + sezKlino.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KE.Title = sezKlino; + text = Paragraph(['I sensori Klino Link HR 3D sono clinometri '... + 'caratterizzati dalla simultanea presenza di un sensore MEMS 3D '... + 'ed un sensore elettrolitico 2D, in grado di monitorare '... + 'l''inclinazione della struttura a cui sono fissati, '... + 'oltre alla temperatura della stessa.']); + + %--ENG-- + if activeEN == 1 + if KL == 0 + KE_ENG = Section(); + end + sezKlino_ENG = Heading3('Klino Link HR 3D'); + sezKlino_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KE_ENG.Title = sezKlino_ENG; + text_ENG = Paragraph(['Klino Link HR 3D is a sensor that integrates a 3D MEMS sensor and an electrolytic '... + 'tilt sensor, able to measure the tilt of the element on which is installed. It also '... + 'includes a thermometer to collect temperature values.']); + end + if KL == 0 + text.HAlign = 'justify'; + add(KE,text); + imgKL = Image(('Klino.png')); + imgKL.Style = {Height('5cm'),HAlign('center')}; + add(KE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Klino Link HR 3D']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(KE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(KE_ENG,text); + imgKL = Image(('Klino.jpg')); + imgKL.Style = {Height('3cm'),HAlign('center')}; + add(KE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Klino Link HR 3D sensor']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(KE_ENG,KEcaption_ENG); + end + KL = 1; + end + break + end + end + end + end + end + add(appendice,KE); + if activeEN == 1 + add(appendice_ENG,KE_ENG); + end +end + +% ---Klino Link HR--- +if sum(yesKL) == 0 && sum(yesKLHR) >= 1 + KLHR = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Klino Link HR') == 1 + if KLHR == 0 + KLE = Section(); + end + sezKlinoHR = Heading3('Klino Link HR'); + sezKlinoHR.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KLE.Title = sezKlinoHR; + text = Paragraph(['I sensori Klino Link HR sono clinometri '... + 'caratterizzati dalla presenza di un sensore elettrolitico 2D, '... + 'in grado di monitorare l''inclinazione della struttura a cui sono fissati, '... + 'oltre alla temperatura della stessa.']); + + %--ENG-- + if activeEN == 1 + if KLHR == 0 + KLE_ENG = Section(); + end + sezKlinoHR_ENG = Heading3('Klino Link HR'); + sezKlinoHR_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KLE_ENG.Title = sezKlinoHR_ENG; + text_ENG = Paragraph(['Klino Link HR is a sensor that integrates an electrolytic '... + 'tilt sensor, able to measure the tilt of the element on which is installed. It also '... + 'includes a thermometer to collect temperature data.']); + end + + if KLHR == 0 + text.HAlign = 'justify'; + add(KLE,text); + imgKL = Image(('KlinoHR.png')); + imgKL.Style = {Height('3.7cm'),HAlign('center')}; + add(KLE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Klino Link HR']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(KLE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(KLE_ENG,text_ENG); + imgKL = Image(('KlinoHR.png')); + imgKL.Style = {Height('3.7cm'),HAlign('center')}; + add(KLE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Klino Link HR sensor']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(KLE_ENG,KEcaption_ENG); + end + KLHR = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Klino Link HR') == 1 + if KLHR == 0 + KLE = Section(); + end + sezKlinoHR = Heading3('Klino Link HR'); + sezKlinoHR.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KLE.Title = sezKlinoHR; + text = Paragraph(['I sensori Klino Link HR sono clinometri '... + 'caratterizzati dalla presenza di un sensore elettrolitico 2D, '... + 'in grado di monitorare l''inclinazione della struttura a cui sono fissati, '... + 'oltre alla temperatura della stessa.']); + + %--ENG-- + if activeEN == 1 + if KLHR == 0 + KLE_ENG = Section(); + end + sezKlinoHR_ENG = Heading3('Klino Link HR'); + sezKlinoHR_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KLE_ENG.Title = sezKlinoHR_ENG; + text_ENG = Paragraph(['Klino Link HR is a sensor that integrates an electrolytic '... + 'tilt sensor, able to measure the tilt of the element on which is installed. It also '... + 'includes a thermometer to collect temperature data.']); + end + + if KLHR == 0 + text.HAlign = 'justify'; + add(KLE,text); + imgKL = Image(('KlinoHR.png')); + imgKL.Style = {Height('3.7cm'),HAlign('center')}; + add(KLE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Klino Link HR']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(KLE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(KLE_ENG,text_ENG); + imgKL = Image(('KlinoHR.png')); + imgKL.Style = {Height('3.7cm'),HAlign('center')}; + add(KLE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Klino Link HR sensor']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(KLE_ENG,KEcaption_ENG); + end + KLHR = 1; + end + break + end + end + end + end + add(appendice,KLE); + if activeEN == 1 + add(appendice_ENG,KLE_ENG); + end +end + +% --- Therm Link --- +if sum(yesThL) >= 1 + ThL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Therm Link') == 1 + if ThL == 0 + ThE = Section(); + end + sezTherm = Heading3('Therm Link'); + sezTherm.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + ThE.Title = sezTherm; + text = Paragraph(['I sensori Therm Link sono termometri '... + 'ad alta precisione e ripetibilit' char(224) ', in grado di monitorare '... + 'la temperatura a differenti profondit' char(224) ', sfruttando un '... + 'unico cavo elettrico quadripolare.']); + + %--ENG-- + if activeEN == 1 + if ThL == 0 + ThE_ENG = Section(); + end + sezTherm_ENG = Heading3('Therm Link'); + sezTherm_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + ThE_ENG.Title = sezTherm_ENG; + text_ENG = Paragraph(['Therm Link sensor is composed of a thermometer '... + 'featuring high accuracy and repeatability, '... + 'able to measure temperature values at different depths by '... + 'exploiting a single quadrupole cable that '... + 'connects different Links in a single array.']); + end + + if ThL == 0 + text.HAlign = 'justify'; + add(ThE,text); + imgThL = Image(('Tilt Link.jpg')); + imgThL.Style = {Height('5cm'),HAlign('center')}; + add(ThE,imgThL); + ThEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Therm Link']); + FIG = FIG+1; + ThEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(ThE,ThEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(ThE_ENG,text_ENG); + imgThL = Image(('Tilt Link.jpg')); + imgThL.Style = {Height('5cm'),HAlign('center')}; + add(ThE_ENG,imgThL); + ThEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Therm Link sensor']); + FIG_ENG = FIG_ENG+1; + ThEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(ThE_ENG,ThEcaption_ENG); + end + ThL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Therm Link') == 1 + if ThL == 0 + ThE = Section(); + end + sezTherm = Heading3('Therm Link'); + sezTherm.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + ThE.Title = sezTherm; + text = Paragraph(['I sensori Therm Link sono termometri '... + 'ad alta precisione e ripetibilit' char(224) ', in grado di monitorare '... + 'la temperatura a differenti profondit' char(224) ', sfruttando un '... + 'unico cavo elettrico quadripolare.']); + + %--ENG-- + if activeEN == 1 + if ThL == 0 + ThE_ENG = Section(); + end + sezTherm_ENG = Heading3('Therm Link'); + sezTherm_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + ThE_ENG.Title = sezTherm_ENG; + text_ENG = Paragraph(['Therm Link sensor is composed of a thermometer '... + 'featuring high accuracy and repeatability, '... + 'able to measure temperature values at different depths by '... + 'exploiting a single quadrupole cable that '... + 'connects different Links in a single array.']); + end + if ThL == 0 + text.HAlign = 'justify'; + add(ThE,text); + imgThL = Image(('Tilt Link.jpg')); + imgThL.Style = {Height('5cm'),HAlign('center')}; + add(ThE,imgThL); + ThEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Therm Link']); + FIG = FIG+1; + ThEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(ThE,ThEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(ThE_ENG,text_ENG); + imgThL = Image(('Tilt Link.jpg')); + imgThL.Style = {Height('5cm'),HAlign('center')}; + add(ThE_ENG,imgThL); + ThEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Therm Link sensor']); + FIG_ENG = FIG_ENG+1; + ThEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(ThE_ENG,ThEcaption_ENG); + end + ThL = 1; + end + break + end + end + end + end + add(appendice,ThE); + if activeEN == 1 + add(appendice_ENG,ThE_ENG); + end +end + +% --- PT100 Link --- +if sum(yesPT100) >= 1 + PT100 = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'PT100 Link') == 1 + if PT100 == 0 + PT100E = Section(); + end + sezPT100 = Heading3('PT100 Link'); + sezPT100.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PT100E.Title = sezPT100; + text = Paragraph(['I sensori PT100 sono termoresistenze al platino '... + 'che sfruttano la variazione di resistivit' char(224) ' del materiale per '... + 'rilevare la temperatura mediante un legame lineare. Questa tipologia '... + 'di sensori non richiede calibrazione.']); + + %--ENG-- + if activeEN == 1 + if PT100 == 0 + PT100E_ENG = Section(); + end + sezPT100_ENG = Heading3('PT100 Link'); + sezPT100_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PT100E_ENG.Title = sezPT100_ENG; + text_ENG = Paragraph(['PT100 is a platinum resistance thermometer that exploits the material resistivity '... + 'variation to evaluate the temperature with a linear correlation. This type of sensor does not need '... + 'any calibration.']); + end + if PT100 == 0 + text.HAlign = 'justify'; + add(PT100E,text); + imgPT100 = Image(('PT100.jpg')); + imgPT100.Style = {Height('3cm'),HAlign('center')}; + add(PT100E,imgPT100); + PT100caption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore PT100 Link']); + FIG = FIG+1; + PT100caption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(PT100E,PT100caption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(PT100E_ENG,text_ENG); + imgPT100 = Image(('PT100.jpg')); + imgPT100.Style = {Height('3cm'),HAlign('center')}; + add(PT100E_ENG,imgPT100); + PT100caption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - PT100 Link sensor']); + FIG_ENG = FIG_ENG+1; + PT100caption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(PT100E_ENG,PT100caption_ENG); + end + PT100 = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'PT100 Link') == 1 + if PT100 == 0 + PT100E = Section(); + end + sezPT100 = Heading3('PT100 Link'); + sezPT100.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PT100E.Title = sezPT100; + text = Paragraph(['I sensori PT100 sono termoresistenze al platino '... + 'che sfruttano la variazione di resistivit' char(224) ' del materiale per '... + 'rilevare la temperatura mediante un legame lineare. Questa tipologia '... + 'di sensori non richiede calibrazione.']); + %--ENG-- + if activeEN == 1 + if PT100 == 0 + PT100E_ENG = Section(); + end + sezPT100_ENG = Heading3('PT100 Link'); + sezPT100_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PT100E_ENG.Title = sezPT100_ENG; + text_ENG = Paragraph(['PT100 is a platinum resistance thermometer that exploits the material resistivity '... + 'variation to evaluate the temperature with a linear correlation. This type of sensor does not need '... + 'any calibration.']); + end + if PT100 == 0 + text.HAlign = 'justify'; + add(PT100E,text); + imgPT100 = Image(('PT100.jpg')); + imgPT100.Style = {Height('3cm'),HAlign('center')}; + add(PT100E,imgPT100); + PT100caption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore PT100 Link']); + FIG = FIG+1; + PT100caption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(PT100E,PT100caption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(PT100E_ENG,text_ENG); + imgPT100 = Image(('PT100.jpg')); + imgPT100.Style = {Height('3cm'),HAlign('center')}; + add(PT100E_ENG,imgPT100); + PT100caption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - PT100 Link sensor']); + FIG_ENG = FIG_ENG+1; + PT100caption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(PT100E_ENG,PT100caption_ENG); + end + PT100 = 1; + end + break + end + end + end + end + add(appendice,PT100E); + if activeEN == 1 + add(appendice_ENG,PT100E_ENG); + end +end + +% --- Tunnel Link --- +TuL = 0; +if sum(yesTuL) >= 1 + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Tunnel Link') == 1 + if TuL == 0 + STu = Section(); + end + sezTunnel = Heading3('Tunnel Link'); + sezTunnel.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + STu.Title = sezTunnel; + text = Paragraph(['I Tunnel Link sono caratterizzati dalla presenza '... + 'di un sensore MEMS 3D, equipaggiato con accelerometro e termometro. Il primo '... + 'elemento registra le inclinazioni del sensore, mentre Il termometro '... + char(232) ' utilizzato per la compensazione termica delle singole misure. '... + 'Nel dettaglio, il sensore dispone di una portata teoricamente infinita '... + '(pu' char(242) ' essere ruotato in ogni direzione dello spazio senza '... + 'particolari problemi) e nasce per misurare spostamenti significativi, '... + 'mentre per quanto riguarda le deformazioni sub-millimetriche risente dei disturbi '... + 'legati al proprio rumore di fondo di natura elettrica.']); + + %--ENG-- + if activeEN == 1 + if TuL == 0 + STu_ENG = Section(); + end + sezTunnel_ENG = Heading3('Tunnel Link'); + sezTunnel_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + STu_ENG.Title = sezTunnel_ENG; + text_ENG = Paragraph(['Each Tunnel Link features a 3D MEMS sensor, which equips an accelerometer '... + 'and a thermometer. The first element is able to record the node tilt, '... + 'while the second one provides the sensor temperature and it '... + 'is used to correct the thermal effects on the accelerometer. From a theoretical point of view, '... + 'the MEMS features an infinite range of tilt measure, while small variations in its '... + 'position are influenced by electrical noises.']); + end + if TuL == 0 + text.HAlign = 'justify'; + add(STu,text); + img = Image(('Tunnel Link.png')); + img.Style = {Height('4.5cm'),HAlign('center')}; + add(STu,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Tunnel Link']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(STu,ionhcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(STu_ENG,text_ENG); + img = Image(('Tunnel Link.png')); + img.Style = {Height('4.5cm'),HAlign('center')}; + add(STu_ENG,img); + ionhcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Tunnel Link sensor']); + FIG_ENG = FIG_ENG+1; + ionhcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(STu_ENG,ionhcaption_ENG); + end + TuL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Tunnel Link') == 1 + if TuL == 0 + STu = Section(); + end + sezTunnel = Heading3('Tunnel Link'); + sezTunnel.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + STu.Title = sezTunnel; + text = Paragraph(['I Tunnel Link sono caratterizzati dalla presenza '... + 'di un sensore MEMS 3D, equipaggiato con accelerometro e termometro. Il primo '... + 'elemento registra le inclinazioni del sensore, mentre. Il termometro '... + char(232) ' utilizzato per la compensazione termica delle singole misure. '... + 'Nel dettaglio, il sensore dispone di una portata teoricamente infinita '... + '(pu' char(242) ' essere ruotato in ogni direzione dello spazio senza '... + 'particolari problemi) e nasce per misurare spostamenti significativi, '... + 'mentre per quanto riguarda le deformazioni sub-millimetriche risente dei disturbi '... + 'legati al proprio rumore di fondo di natura elettrica.']); + %--ENG-- + if activeEN == 1 + if TuL == 0 + STu_ENG = Section(); + end + sezTunnel_ENG = Heading3('Tunnel Link'); + sezTunnel_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + STu_ENG.Title = sezTunnel_ENG; + text_ENG = Paragraph(['Each Tunnel Link features a 3D MEMS sensor, which equips an accelerometer '... + 'and a thermometer. The first element is able to record the node tilt, '... + 'while the second one provides the sensor temperature and it '... + 'is used to correct the thermal effects on the accelerometer. From a theoretical point of view, '... + 'the MEMS features an infinite range of tilt measure, while small variations in its '... + 'position are influenced by electrical noises.']); + end + if TuL == 0 + text.HAlign = 'justify'; + add(STu,text); + img = Image(('Tunnel Link.png')); + img.Style = {Height('4.5cm'),HAlign('center')}; + add(STu,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Tunnel Link']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(STu,ionhcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(STu_ENG,text_ENG); + img = Image(('Tunnel Link.png')); + img.Style = {Height('4.5cm'),HAlign('center')}; + add(STu_ENG,img); + ionhcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Tunnel Link sensor']); + FIG_ENG = FIG_ENG+1; + ionhcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(STu_ENG,ionhcaption_ENG); + end + TuL = 1; + end + break + end + end + end + end + add(appendice,STu); + if activeEN == 1 + add(appendice,STu); + end +end + +% --- Radial Link --- +RaL = 0; +if sum(yesRaL) >= 1 + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Radial Link') == 1 + if RaL == 0 + SRaL = Section(); + end + sezRadial = Heading3('Radial Link'); + sezRadial.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SRaL.Title = sezRadial; + text = Paragraph(['I Radial Link sono caratterizzati dalla presenza '... + 'di un sensore MEMS 3D, equipaggiato con accelerometro e termometro. Il primo '... + 'elemento registra le inclinazioni del sensore, mentre Il termometro '... + char(232) ' utilizzato per la compensazione termica delle singole misure. '... + 'Nel dettaglio, il sensore dispone di una portata teoricamente infinita '... + '(pu' char(242) ' essere ruotato in ogni direzione dello spazio senza '... + 'particolari problemi) e nasce per misurare spostamenti significativi, '... + 'mentre per quanto riguarda le deformazioni sub-millimetriche risente dei disturbi '... + 'legati al proprio rumore di fondo di natura elettrica.']); + %--ENG-- + if activeEN == 1 + if RaL == 0 + SRaL_ENG = Section(); + end + sezRadial_ENG = Heading3('Radial Link'); + sezRadial_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SRaL_ENG.Title = sezRadial_ENG; + text_ENG = Paragraph(['Each Radial Link features a 3D MEMS sensor, which equips an accelerometer '... + 'and a thermometer. The first component is able to record the node tilt, '... + 'while the second one provides the sensor temperature and it '... + 'is used to correct the thermal effects on the accelerometer. Form a theoretical point of view, '... + 'the MEMS features an infinite range of tilt measure, while small variations in its '... + 'position are influenced by electrical noises.']); + end + + if RaL == 0 + text.HAlign = 'justify'; + add(SRaL,text); + img = Image(('Tunnel Link.png')); + img.Style = {Height('4.5cm'),HAlign('center')}; + add(SRaL,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Radial Link']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SRaL,ionhcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(SRaL_ENG,text_ENG); + img = Image(('Tunnel Link.png')); + img.Style = {Height('4.5cm'),HAlign('center')}; + add(SRaL_ENG,img); + ionhcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Radial Link sensor']); + FIG_ENG = FIG_ENG+1; + ionhcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SRaL_ENG,ionhcaption_ENG); + end + RaL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Radial Link') == 1 + if RaL == 0 + SRaL = Section(); + end + sezRadial = Heading3('Radial Link'); + sezRadial.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SRaL.Title = sezRadial; + text = Paragraph(['I Radial Link sono caratterizzati dalla presenza '... + 'di un sensore MEMS 3D, equipaggiato con accelerometro e termometro. Il primo '... + 'elemento registra le inclinazioni del sensore, mentre. Il termometro '... + char(232) ' utilizzato per la compensazione termica delle singole misure. '... + 'Nel dettaglio, il sensore dispone di una portata teoricamente infinita '... + '(pu' char(242) ' essere ruotato in ogni direzione dello spazio senza '... + 'particolari problemi) e nasce per misurare spostamenti significativi, '... + 'mentre per quanto riguarda le deformazioni sub-millimetriche risente dei disturbi '... + 'legati al proprio rumore di fondo di natura elettrica.']); + + %--ENG-- + if activeEN == 1 + if RaL == 0 + SRaL_ENG = Section(); + end + sezRadial_ENG = Heading3('Radial Link'); + sezRadial_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SRaL_ENG.Title = sezRadial_ENG; + text_ENG = Paragraph(['Each Radial Link features a 3D MEMS sensor, which equips an accelerometer '... + 'and a thermometer. The first component is able to record the node tilt, '... + 'while the second one provides the sensor temperature and it '... + 'is used to correct the thermal effects on the accelerometer. Form a theoretical point of view, '... + 'the MEMS features an infinite range of tilt measure, while small variations in its '... + 'position are influenced by electrical noises.']); + end + if RaL == 0 + text.HAlign = 'justify'; + add(SRaL,text); + img = Image(('Tunnel Link.png')); + img.Style = {Height('4.5cm'),HAlign('center')}; + add(SRaL,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Radial Link']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SRaL,ionhcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(SRaL_ENG,text_ENG); + img = Image(('Tunnel Link.png')); + img.Style = {Height('4.5cm'),HAlign('center')}; + add(SRaL_ENG,img); + ionhcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Radial Link sensor']); + FIG_ENG = FIG_ENG+1; + ionhcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SRaL_ENG,ionhcaption_ENG); + end + RaL = 1; + end + break + end + end + end + end + add(appendice,SRaL); + if activeEN == 1 + add(appendice_ENG,SRaL_ENG); + end +end + +% --- PreConv Link --- +PCL = 0; +if sum(yesPCL) >= 1 + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'PreConv Link') == 1 + if PCL == 0 + SPCL = Section(); + end + sezPCL = Heading3('PreConv Link'); + sezPCL.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SPCL.Title = sezPCL; + text = Paragraph(['I PreConv Link sono sensori caratterizzati dalla presenza '... + 'di un MEMS 3D, equipaggiato con accelerometro e termometro. Il primo '... + 'elemento registra le inclinazioni del nodo rispetto all''orizzontale, mentre Il termometro '... + 'viene utilizzato per la compensazione termica delle singole misure. '... + 'Nel dettaglio, il sensore dispone di una portata teoricamente infinita '... + '(pu' char(242) ' essere ruotato in ogni direzione dello spazio senza '... + 'particolari problemi) e nasce per misurare spostamenti nell''ordine dei 0.2 mm/m, '... + 'mentre deformazioni pi' char(249) ' piccole sono indistinguibili '... + 'dal proprio rumore di fondo di natura elettrica.']); + %--ENG-- + if activeEN == 1 + if PCL == 0 + SPCL_ENG = Section(); + end + sezPCL_ENG = Heading3('PreConv Link'); + sezPCL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SPCL_ENG.Title = sezPCL_ENG; + text_ENG = Paragraph(['Each PreConv Link features a 3D MEMS sensor, which equips an accelerometer '... + 'and a thermometer. The first element is able to record the node tilt, '... + 'while the second one provides the sensor temperature and it '... + 'is used to correct the thermal effects on the accelerometer. Form a theoretical point of view, '... + 'the MEMS features an infinite range of tilt measure, while small variations in its '... + 'position are influenced by electrical noises.']); + end + if PCL == 0 + text.HAlign = 'justify'; + add(SPCL,text); + img = Image(('Klino.png')); + img.Style = {Height('4cm'),HAlign('center')}; + add(SPCL,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore PreConv Link']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SPCL,ionhcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(SPCL_ENG,text_ENG); + img = Image(('Klino.png')); + img.Style = {Height('4cm'),HAlign('center')}; + add(SPCL_ENG,img); + ionhcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - PreConv Link sensor']); + FIG_ENG = FIG_ENG+1; + ionhcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SPCL_ENG,ionhcaption_ENG); + end + PCL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'PreConv Link') == 1 + if PCL == 0 + SPCL = Section(); + end + sezPCL = Heading3('PreConv Link'); + sezPCL.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SPCL.Title = sezPCL; + text = Paragraph(['I PreConv Link sono sensori caratterizzati dalla presenza '... + 'di un MEMS 3D, equipaggiato con accelerometro e termometro. Il primo '... + 'elemento registra le inclinazioni del nodo rispetto all''orizzontale, mentre Il termometro '... + 'viene utilizzato per la compensazione termica delle singole misure. '... + 'Nel dettaglio, il sensore dispone di una portata teoricamente infinita '... + '(pu' char(242) ' essere ruotato in ogni direzione dello spazio senza '... + 'particolari problemi) e nasce per misurare spostamenti nell''ordine dei 0.2 mm/m, '... + 'mentredeformazioni pi' char(242) ' piccole sono indistinguibili '... + 'dal proprio rumore di fondo di natura elettrica.']); + %--ENG-- + if activeEN == 1 + if PCL == 0 + SPCL_ENG = Section(); + end + sezPCL_ENG = Heading3('PreConv Link'); + sezPCL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SPCL_ENG.Title = sezPCL_ENG; + text_ENG = Paragraph(['Each PreConv Link features a 3D MEMS sensor, which equips an accelerometer '... + 'and a thermometer. The first element is able to record the node tilt, '... + 'while the second one provides the sensor temperature and it '... + 'is used to correct the thermal effects on the accelerometer. Form a theoretical point of view, '... + 'the MEMS features an infinite range of tilt measure, while small variations in its '... + 'position are influenced by electrical noises.']); + end + if PCL == 0 + text.HAlign = 'justify'; + add(SPCL,text); + img = Image(('Klino.png')); + img.Style = {Height('4cm'),HAlign('center')}; + add(SPCL,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore PreConv Link']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SPCL,ionhcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(SPCL_ENG,text_ENG); + img = Image(('Klino.png')); + img.Style = {Height('4cm'),HAlign('center')}; + add(SPCL_ENG,img); + ionhcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - PreConv Link sensor']); + FIG_ENG = FIG_ENG+1; + ionhcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SPCL_ENG,ionhcaption_ENG); + end + PCL = 1; + end + break + end + end + end + end + add(appendice,SPCL); + if activeEN == 1 + add(appendice_ENG,SPCL_ENG); + end +end + +% --- Rain Link --- +if sum(yesRL) >= 1 + RL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Rain Link') == 1 + if RL == 0 + RLE = Section(); + end + sezRain = Heading3('Rain Link'); + sezRain.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + RLE.Title = sezRain; + text = Paragraph(['Il sensore Rain Link ' char(232) ' un pluviometro '... + 'in grado di misurare l''altezza di pioggia secondo il '... + 'periodo di campionamento specificato.']); + %--ENG-- + if activeEN == 1 + if RL == 0 + RLE_ENG = Section(); + end + sezRain_ENG = Heading3('Rain Link'); + sezRain_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + RLE_ENG.Title = sezRain_ENG; + text_ENG = Paragraph(['Rain Link is a rain gauge sensor able to collect rainfall data '... + 'with a predefined sampling period.']); + end + if RL == 0 + text.HAlign = 'justify'; + add(RLE,text); + imgRL = Image(('Rain.png')); + imgRL.Style = {Height('3.5cm'),HAlign('center')}; + add(RLE,imgRL); + REcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Rain Link']); + FIG = FIG+1; + REcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(RLE,REcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(RLE_ENG,text_ENG); + imgRL = Image(('Rain.png')); + imgRL.Style = {Height('3.5cm'),HAlign('center')}; + add(RLE_ENG,imgRL); + REcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Rain Link sensor']); + FIG_ENG = FIG_ENG+1; + REcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(RLE_ENG,REcaption_ENG); + end + RL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Rain Link') == 1 + if RL == 0 + RLE = Section(); + end + sezRain = Heading3('Rain Link'); + sezRain.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + RLE.Title = sezRain; + text = Paragraph(['Il sensore Rain Link ' char(232) ' un pluviometro '... + 'in grado di misurare l''altezza di pioggia secondo il '... + 'periodo di campionamento specificato.']); + %--ENG-- + if activeEN == 1 + if RL == 0 + RLE_ENG = Section(); + end + sezRain_ENG = Heading3('Rain Link'); + sezRain_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + RLE_ENG.Title = sezRain_ENG; + text_ENG = Paragraph(['Rain Link is a rain gauge sensor able to collect rainfall data '... + 'with a predefined sampling period.']); + end + if RL == 0 + text.HAlign = 'justify'; + add(RLE,text); + imgRL = Image(('Rain.png')); + imgRL.Style = {Height('3.5cm'),HAlign('center')}; + add(RLE,imgRL); + REcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Rain Link']); + FIG = FIG+1; + REcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(RLE,REcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(RLE_ENG,text_ENG); + imgRL = Image(('Rain.png')); + imgRL.Style = {Height('3.5cm'),HAlign('center')}; + add(RLE_ENG,imgRL); + REcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Rain Link sensor']); + FIG_ENG = FIG_ENG+1; + REcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(RLE_ENG,REcaption_ENG); + end + RL = 1; + end + break + end + end + end + end + add(appendice,RLE); + if activeEN == 1 + add(appendice_ENG,RLE_ENG); + end +end + +% --- Crack Link --- +if sum(yesCrL) >= 1 + CrL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Crack Link') == 1 + if CrL == 0 + CrE = Section(); + end + sezCrack = Heading3('Crack Link'); + sezCrack.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + CrE.Title = sezCrack; + text = Paragraph(['I sensori Crack Link sono fessurimetri analogici '... + 'che vengono letti mediante un modulo GMUX, convertitore di segnale '... + 'da analogico a digitale, o centralina ASE201. I fessurimetri vengono '... + 'posti perpendicolarmente a cavallo di fessure esistenti '... + 'o nelle zone in cui con maggiore probabilit' char(224) ' '... + 'potrebbero svilupparsi delle fessurazioni.']); + + %--ENG-- + if activeEN == 1 + if CrL == 0 + CrE_ENG = Section(); + end + 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_ENG; + text_ENG = Paragraph(['Crack Link sensor is an analog crack meter, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. Crack meters are located across surface cracks, or in specific areas '... + 'where the generation of surface fissures is expected.']); + end + if CrL == 0 + text.HAlign = 'justify'; + add(CrE,text); + imgKL = Image(('Crack.jpg')); + imgKL.Style = {Height('4.5cm'),HAlign('center')}; + add(CrE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Crack Link']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(CrE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(CrE_ENG,text_ENG); + imgKL = Image(('Crack.jpg')); + imgKL.Style = {Height('4.5cm'),HAlign('center')}; + add(CrE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Crack Link sensor']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(CrE_ENG,KEcaption_ENG); + end + CrL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Crack Link') == 1 + if CrL == 0 + CrE = Section(); + end + sezCrack = Heading3('Crack Link'); + sezCrack.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + CrE.Title = sezCrack; + text = Paragraph(['I sensori Crack Link sono fessurimetri analogici '... + 'che vengono letti mediante un modulo GMUX, convertitore di segnale '... + 'da analogico a digitale, o centralina ASE201. I fessurimetri vengono '... + 'posti perpendicolarmente a cavallo di fessure esistenti '... + 'o nelle zone in cui con maggiore probabilit' char(224) ' '... + 'potrebbero svilupparsi delle fessurazioni.']); + %--ENG-- + if activeEN == 1 + if CrL == 0 + CrE_ENG = Section(); + end + 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_ENG; + text_ENG = Paragraph(['Crack Link sensor is an analog crack meter, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. Crack meters are located across surface cracks, or in specific areas '... + 'where the generation of surface fissures is expected.']); + end + if CrL == 0 + text.HAlign = 'justify'; + add(CrE,text); + imgKL = Image(('Crack.jpg')); + imgKL.Style = {Height('4.5cm'),HAlign('center')}; + add(CrE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Crack Link']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(CrE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(CrE_ENG,text_ENG); + imgKL = Image(('Crack.jpg')); + imgKL.Style = {Height('4.5cm'),HAlign('center')}; + add(CrE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Crack Link sensor']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(CrE_ENG,KEcaption_ENG); + end + CrL = 1; + end + break + end + end + end + end + add(appendice,CrE); + if activeEN == 1 + add(appendice_ENG,CrE_ENG); + end +end + +% --- 3D Crack Link --- +if sum(yes3DCrL) >= 1 + CrL3D = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'3D Crack Link') == 1 + if CrL3D == 0 + Cr3DE = Section(); + end + sezCrack3D = Heading3('3D Crack Link'); + sezCrack3D.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + Cr3DE.Title = sezCrack3D; + text = Paragraph(['I sensori 3D Crack Link sono fessurimetri tridimensionali analogici, '... + 'letti mediante un modulo GMUX, convertitore di segnale '... + 'da analogico a digitale, o una centralina ASE201. I fessurimetri '... + 'vengono posti perpendicolarmente a cavallo di fessure esistenti o nelle zone in cui '... + 'con maggiore probabilit' char(224) 'potrebbero svilupparsi delle fessurazioni lungo '... + 'tre dimensioni fra loro perpendicolari.']); + %--ENG-- + if activeEN == 1 + if CrL3D == 0 + Cr3DE_ENG = Section(); + end + sezCrack3D_ENG = Heading3('3D Crack Link'); + sezCrack3D_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + Cr3DE_ENG.Title = sezCrack3D_ENG; + text_ENG = Paragraph(['3D Crack Link sensor is a three-dimension analog crack meter, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. 3D Crack meters are located across surface cracks, or in specific areas '... + 'where the generation of surface fissures is expected.']); + end + if CrL3D == 0 + text.HAlign = 'justify'; + add(Cr3DE,text); + imgKL = Image(('3DCrack.jpg')); + imgKL.Style = {Height('5cm'),HAlign('center')}; + add(Cr3DE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore 3D Crack Link (fonte: Pizzi Instruments)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Cr3DE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(Cr3DE_ENG,text_ENG); + imgKL = Image(('3DCrack.jpg')); + imgKL.Style = {Height('5cm'),HAlign('center')}; + add(Cr3DE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - 3D Crack Link sensor (source: Pizzi Instruments)']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Cr3DE_ENG,KEcaption_ENG); + end + CrL3D = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'3D Crack Link') == 1 + if CrL3D == 0 + Cr3DE = Section(); + end + sezCrack3D = Heading3('3D Crack Link'); + sezCrack3D.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + Cr3DE.Title = sezCrack3D; + text = Paragraph(['I sensori 3D Crack Link sono fessurimetri tridimensionali analogici, '... + 'letti mediante un modulo GMUX, convertitore di segnale '... + 'da analogico a digitale, o una centralina ASE201. I fessurimetri '... + 'vengono posti perpendicolarmente a cavallo di fessure esistenti o nelle zone in cui '... + 'con maggiore probabilit' char(224) 'potrebbero svilupparsi delle fessurazioni lungo '... + 'tre dimensioni fra loro perpendicolari.']); + %--ENG-- + if activeEN == 1 + if CrL3D == 0 + Cr3DE_ENG = Section(); + end + sezCrack3D_ENG = Heading3('3D Crack Link'); + sezCrack3D_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + Cr3DE_ENG.Title = sezCrack3D_ENG; + text_ENG = Paragraph(['3D Crack Link sensor is a three-dimension analog crack meter, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. 3D Crack meters are located across surface cracks, or in specific areas '... + 'where the generation of surface fissures is expected.']); + end + if CrL3D == 0 + text.HAlign = 'justify'; + add(Cr3DE,text); + imgKL = Image(('3DCrack.jpg')); + imgKL.Style = {Height('5cm'),HAlign('center')}; + add(Cr3DE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore 3D Crack Link (fonte: Pizzi Instruments)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Cr3DE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(Cr3DE_ENG,text_ENG); + imgKL = Image(('3DCrack.jpg')); + imgKL.Style = {Height('5cm'),HAlign('center')}; + add(Cr3DE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - 3D Crack Link sensor (source: Pizzi Instruments)']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Cr3DE_ENG,KEcaption_ENG); + end + CrL3D = 1; + end + break + end + end + end + end + add(appendice,Cr3DE); + if activeEN == 1 + add(appendice_ENG,r3DE_ENG); + end +end + +% --- Extensometer Link --- +if sum(yesEL) >= 1 + EL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Extensometer Link') == 1 + if EL == 0 + EE = Section(); + end + sezExtensometer = Heading3('Extensometer Link'); + sezExtensometer.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE.Title = sezExtensometer; + text = Paragraph(['I sensori Extensometer Link sono barrette estensimetriche analogiche '... + 'che vengono lette mediante un modulo GMUX, convertitore di segnale '... + 'da analogico a digitale, o centralina ASE201. Le barrette vengono poste a cavallo '... + 'delle zone da monitorare e rilevano microfessurazioni '... + 'adimensionalizzate rispetto alla lunghezza della barretta stessa.']); + + %--ENG-- + if activeEN == 1 + if EL == 0 + EE_ENG = Section(); + end + sezExtensometer_ENG = Heading3('Extensometer Link'); + sezExtensometer_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE_ENG.Title = sezExtensometer_ENG; + text_ENG = Paragraph(['Extensometer Link is a sensor composed of an analog extensometer, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. Extensometers are located in specific areas in order to '... + 'detect the formation of micro-fractures, which are measured with a parameter that depends on the '... + 'length of the monitoring tool.']); + end + if EL == 0 + text.HAlign = 'justify'; + add(EE,text); + imgKL = Image(('Extensometer.png')); + imgKL.Style = {Height('2.7cm'),HAlign('center')}; + add(EE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Extensometer Link (fonte: Earth System)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(EE_ENG,text_ENG); + imgKL = Image(('Extensometer.png')); + imgKL.Style = {Height('2.7cm'),HAlign('center')}; + add(EE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Extensometer Link sensor (source: Earth System)']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE_ENG,KEcaption_ENG); + end + EL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Extensometer Link') == 1 + if EL == 0 + EE = Section(); + end + sezExtensometer = Heading3('Extensometer Link'); + sezExtensometer.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE.Title = sezExtensometer; + text = Paragraph(['I sensori Extensometer Link sono barrette estensimetriche analogiche '... + 'che vengono lette mediante un modulo GMUX, convertitore di segnale '... + 'da analogico a digitale, o centralina ASE201. Le barrette vengono poste a cavallo '... + 'delle zone da monitorare e rilevano microfessurazioni '... + 'adimensionalizzate rispetto alla lunghezza della barretta stessa.']); + %--ENG-- + if activeEN == 1 + if EL == 0 + EE_ENG = Section(); + end + sezExtensometer_ENG = Heading3('Extensometer Link'); + sezExtensometer_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE_ENG.Title = sezExtensometer_ENG; + text_ENG = Paragraph(['Extensometer Link is a sensor composed of an analog extensometer, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. Extensometers are located in specific areas in order to '... + 'detect the formation of micro-fractures, which are measured with a parameter that depends on the '... + 'length of the monitoring tool.']); + end + if EL == 0 + text.HAlign = 'justify'; + add(EE,text); + imgKL = Image(('Extensometer.png')); + imgKL.Style = {Height('2.7cm'),HAlign('center')}; + add(EE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Extensometer Link (fonte: Earth System)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(EE_ENG,text_ENG); + imgKL = Image(('Extensometer.png')); + imgKL.Style = {Height('2.7cm'),HAlign('center')}; + add(EE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Extensometer Link sensor (source: Earth System)']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE_ENG,KEcaption_ENG); + end + EL = 1; + end + break + end + end + end + end + add(appendice,EE); + if activeEN == 1 + add(appendice_ENG,EE_ENG); + end +end + +% --- 3D Extensometer Link --- +if sum(yes3DEL) >= 1 + EL3D = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'3D Extensometer Link') == 1 + if EL3D == 0 + EE = Section(); + end + sez3DExtensometer = Heading3('3D Extensometer Link'); + sez3DExtensometer.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE.Title = sez3DExtensometer; + text = Paragraph(['I sensori 3D Extensometer Link sono terne di '... + 'barrette estensimetriche analogiche, lette mediante modulo GMUX, '... + 'convertitore di segnale da analogico a digitale, o centralina ASE201. '... + 'Le barrette vengono poste a cavallo delle zone da monitorare e rilevano '... + 'microfessurazioni adimensionalizzate rispetto alla lunghezza della barretta '... + 'stessa. A seconda della tipologia di impiego, si distinguono in barrette '... + 'da calcestruzzo o a saldare.']); + %--ENG-- + if acriveEN == 1 + if EL3D == 0 + EE_ENG = Section(); + end + sez3DExtensometer_ENG = Heading3('3D Extensometer Link'); + sez3DExtensometer_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE_ENG.Title = sez3DExtensometer_ENG; + text_ENG = Paragraph(['3D Extensometer Link is a sensor composed of three analog strain gauges, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. Strain gauges are located in specific areas in order to '... + 'detect the formation of micro-fractures, which are measured with a parameter that depends on the '... + 'length of the monitoring tool.']); + end + if EL3D == 0 + text.HAlign = 'justify'; + add(EE,text); + imgKL = Image(('3DExtensometer.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore 3D Extensometer Link (fonte: Earth System)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(EE_ENG,text_ENG); + imgKL = Image(('3DExtensometer.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - 3D Extensometer Link sensor (source: Earth System)']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE_ENG,KEcaption_ENG); + end + EL3D = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'3D Extensometer Link') == 1 + if EL3D == 0 + EE = Section(); + end + sez3DExtensometer = Heading3('3D Extensometer Link'); + sez3DExtensometer.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE.Title = sez3DExtensometer; + text = Paragraph(['I sensori 3D Extensometer Link sono terne di '... + 'barrette estensimetriche analogiche, lette mediante modulo GMUX, '... + 'convertitore di segnale da analogico a digitale, o centralina ASE201. '... + 'Le barrette vengono poste a cavallo delle zone da monitorare e rilevano '... + 'microfessurazioni adimensionalizzate rispetto alla lunghezza della barretta '... + 'stessa. A seconda della tipologia di impiego, si distinguono in barrette '... + 'da calcestruzzo o a saldare.']); + %--ENG-- + if acriveEN == 1 + if EL3D == 0 + EE_ENG = Section(); + end + sez3DExtensometer_ENG = Heading3('3D Extensometer Link'); + sez3DExtensometer_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE_ENG.Title = sez3DExtensometer_ENG; + text_ENG = Paragraph(['3D Extensometer Link is a sensor composed of three analog strain gauges, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. Strain gauges are located in specific areas in order to '... + 'detect the formation of micro-fractures, which are measured with a parameter that depends on the '... + 'length of the monitoring tool.']); + end + if EL3D == 0 + text.HAlign = 'justify'; + add(EE,text); + imgKL = Image(('3DExtensometer.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore 3D Extensometer Link (fonte: Earth System)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(EE_ENG,text_ENG); + imgKL = Image(('3DExtensometer.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - 3D Extensometer Link sensor (source: Earth System)']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE_ENG,KEcaption_ENG); + end + EL3D = 1; + end + break + end + end + end + end + add(appendice,EE); + if activeEN == 1 + add(appendice_ENG,EE_ENG); + end +end + +% --- Wire Extensometer Link --- +if sum(yesWEL) >= 1 + WEL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Wire Extensometer Link') == 1 + if WEL == 0 + EE = Section(); + end + sezWireExtensometer = Heading3('Wire Extensometer Link'); + sezWireExtensometer.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE.Title = sezWireExtensometer; + text = Paragraph(['I sensori Wire Extensometer Link sono estensimetri a filo analogici, '... + 'letti mediante modulo GMUX, convertitore di segnale da analogico a digitale, o centralina ASE201. '... + 'Lo strumento viene posto a cavallo delle zone da monitorare, con la base '... + 'da un lato della fessura ed il filo fissato dall''altro lato e rileva '... + 'l''allungamento o l''accorciamento del filo stesso, indice dell''apertura '... + 'o chiusura della fessura presente nella zona monitorata. ']); + %--ENG-- + if activeEN == 1 + if WEL == 0 + EE_ENG = Section(); + end + sezWireExtensometer_ENG = Heading3('Wire Extensometer Link'); + sezWireExtensometer_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE_ENG.Title = sezWireExtensometer_ENG; + text_ENG = Paragraph(['Wire Extensometer Link is an analog wire extensometer sensor, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. The device is placed in specific areas where fissures are observed, by installing the '... + 'base on one side and fixing the wire on the other one. The aim is to determine the crack opening/closing '... + 'according to the wire length variation.']); + end + if WEL == 0 + text.HAlign = 'justify'; + add(EE,text); + imgKL = Image(('wire.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Wire Extensometer Link (fonte: Earth System)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(EE_ENG,text_ENG); + imgKL = Image(('wire.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Wire Extensometer Link sensor (source: Earth System)']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE_ENG,KEcaption_ENG); + end + WEL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Wire Extensometer Link') == 1 + if WEL == 0 + EE = Section(); + end + sezWireExtensometer = Heading3('Wire Extensometer Link'); + sezWireExtensometer.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE.Title = sezWireExtensometer; + text = Paragraph(['I sensori Wire Extensometer Link sono estensimetri a filo analogici, '... + 'letti mediante modulo GMUX, convertitore di segnale da analogico a digitale, o centralina ASE201. '... + 'Lo strumento viene posto a cavallo delle zone da monitorare, con la base '... + 'da un lato della fessura ed il filo fissato dall''altro lato e rileva '... + 'l''allungamento o l''accorciamento del filo stesso, indice dell''apertura '... + 'o chiusura della fessura presente nella zona monitorata. ']); + %--ENG-- + if activeEN == 1 + if WEL == 0 + EE_ENG = Section(); + end + sezWireExtensometer_ENG = Heading3('Wire Extensometer Link'); + sezWireExtensometer_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE_ENG.Title = sezWireExtensometer_ENG; + text_ENG = Paragraph(['Wire Extensometer Link is an analog wire extensometer sensor, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. The device is placed in specific areas where fissures are observed, by installing the '... + 'base on one side and fixing the wire on the other one. The aim is to determine the crack opening/closing '... + 'according to the wire length variation.']); + end + if WEL == 0 + text.HAlign = 'justify'; + add(EE,text); + imgKL = Image(('wire.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Wire Extensometer Link (fonte: Earth System)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(EE_ENG,text_ENG); + imgKL = Image(('wire.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Wire Extensometer Link sensor (source: Earth System)']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE_ENG,KEcaption_ENG); + end + WEL = 1; + end + break + end + end + end + end + add(appendice,EE); + if activeEN == 1 + add(appendice_ENG,EE_ENG); + end +end + +% --- MultiPoint Borehole Extensometer --- +if sum(yesMPBEL) >= 1 + MPBEL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Multi Point Borehole Extensometer Link') == 1 + if MPBEL == 0 + EE = Section(); + end + sezMPBEL = Heading3('Multi Point Borehole Rod Extensometer'); + sezMPBEL.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE.Title = sezMPBEL; + text = Paragraph(['I sensori Multi Point Borehole Rod Extensometer sono estensimetri multibase '... + 'analogici, letti mediante modulo GMUX, convertitore di segnale da analogico a digitale, o '... + 'centralina ASE201. Lo strumento viene posto all''interno di perforazioni radiali '... + 'ed ' char(232) ' caratterizzato dalla presenza di una o pi' char(250) ' basi a lunghezza differente. '... + 'Comparando le deformazioni delle singole basi, si ' char(232) ' in grado di risalire '... + 'alla zona in cui si sono sviluppati i movimenti radiali.']); + %--ENG-- + if activeEN == 1 + if MPBEL == 0 + EE_ENG = Section(); + end + sezMPBEL_ENG = Heading3('Multi Point Borehole Rod Extensometer'); + sezMPBEL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE_ENG.Title = sezMPBEL_ENG; + text_ENG = Paragraph(['Multi Point Borehole Extensometer Link is '... + 'an analog multi point borehole rod extensometer '... + 'sensor, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. The device is placed inside a radial drilling borehole, and features one or more rods in different positions. '... + 'The tool allows to identify the areas experiencing higher deformations, by comparing data coming from different rods.']); + end + if MPBEL == 0 + text.HAlign = 'justify'; + add(EE,text); + imgKL = Image(('MPBEL.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Multi Point Borehole Rod Extensometer Link (fonte: Earth System)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(EE_ENG,text_ENG); + imgKL = Image(('MPBEL.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Multi Point Borehole Rod Extensometer Link sensor (source: Earth System)']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE_ENG,KEcaption_ENG); + end + MPBEL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Multi Point Borehole Extensometer Link') == 1 + if MPBEL == 0 + EE = Section(); + end + sezMPBEL = Heading3('Multi Point Borehole Rod Extensometer'); + sezMPBEL.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE.Title = sezMPBEL; + text = Paragraph(['I sensori Multi Point Borehole Rod Extensometer sono estensimetri multibase '... + 'analogici, letti mediante modulo GMUX, convertitore di segnale da analogico a digitale, o '... + 'centralina ASE201. Lo strumento viene posto all''interno di perforazioni radiali '... + 'ed ' char(232) ' caratterizzato dalla presenza di una o pi' char(250) ' basi a lunghezza differente. '... + 'Comparando le deformazioni delle singole basi, si ' char(232) ' in grado di risalire '... + 'alla zona in cui si sono sviluppati i movimenti radiali.']); + %--ENG-- + if activeEN == 1 + if MPBEL == 0 + EE_ENG = Section(); + end + sezMPBEL_ENG = Heading3('Multi Point Borehole Rod Extensometer'); + sezMPBEL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE_ENG.Title = sezMPBEL_ENG; + text_ENG = Paragraph(['Multi Point Borehole Extensometer Link is '... + 'an analog multi point borehole rod extensometer '... + 'sensor, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. The device is placed inside a radial drilling borehole, and features one or more rods in different positions. '... + 'The tool allows to identify the areas experiencing higher deformations, by comparing data coming from different rods.']); + end + if MPBEL == 0 + text.HAlign = 'justify'; + add(EE,text); + imgKL = Image(('MPBEL.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Multi Point Borehole Rod Extensometer Link (fonte: Earth System)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(EE_ENG,text_ENG); + imgKL = Image(('MPBEL.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Multi Point Borehole Rod Extensometer Link sensor (source: Earth System)']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE_ENG,KEcaption_ENG); + end + MPBEL = 1; + end + break + end + end + end + end + add(appendice,EE); + if activeEN == 1 + add(appendice_ENG,EE_ENG); + end +end + +% --- Load Link --- +if sum(yesLL)>=1 + LL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Load Link') == 1 + if LL == 0 + SL = Section(); + end + sezLL = Heading3('Load Link'); + sezLL.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SL.Title = sezLL; + text = Paragraph(['I sensori Load Link sono celle di carico '... + 'analogiche, lette mediante modulo GMUX, convertitore di segnale da analogico a digitale, o '... + 'centralina ASE201/G201. Lo strumento, a seconda della tipologia, misura il carico di compressione '... + 'o trazione che agisce perpendicolarmente rispetto allo stesso.']); + + %--ENG-- + if activeEN == 1 + if LL == 0 + SL_ENG = Section(); + end + sezLL_ENG = Heading3('Load Link'); + sezLL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SL_ENG.Title = sezLL_ENG; + text = Paragraph(['Load Link is an analog load sensor, '... + 'read by implementing a GMUX module able to convert its signal into '... + 'a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. Depending on the sensor working principle, the device is able to measure '... + 'compression or traction loads acting in perpendicular direction.']); + end + if LL == 0 + text.HAlign = 'justify'; + add(SL,text); + imgLL = Image(('LL.jpg')); + imgLL.Style = {Height('4cm'),HAlign('center')}; + add(SL,imgLL); + LLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Load Link (fonte: Earth System)']); + FIG = FIG+1; + LLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SL,LLcaption); + LL = 1; + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(SL_ENG,text_ENG); + imgLL = Image(('LL.jpg')); + imgLL.Style = {Height('4cm'),HAlign('center')}; + add(SL_ENG,imgLL); + LLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Load Link sensor (source: Earth System)']); + FIG_ENG = FIG_ENG+1; + LLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SL_ENG,LLcaption_ENG); + LL = 1; + end + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Load Link') == 1 + if LL == 0 + SL = Section(); + end + sezLL = Heading3('Load Link'); + sezLL.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SL.Title = sezLL; + text = Paragraph(['I sensori Load Link sono celle di carico '... + 'analogiche, lette mediante modulo GMUX, convertitore di segnale da analogico a digitale, o '... + 'centralina ASE201/G201. Lo strumento, a seconda della tipologia, misura il carico di compressione '... + 'o trazione che agisce perpendicolarmente rispetto allo stesso.']); + %--ENG-- + if activeEN == 1 + if LL == 0 + SL_ENG = Section(); + end + sezLL_ENG = Heading3('Load Link'); + sezLL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SL_ENG.Title = sezLL_ENG; + text = Paragraph(['Load Link is an analog load sensor, '... + 'read by implementing a GMUX module able to convert its signal into '... + 'a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. Depending on the sensor working principle, the device is able to measure '... + 'compression or traction loads acting in perpendicular direction.']); + end + if LL == 0 + text.HAlign = 'justify'; + add(SL,text); + imgLL = Image(('LL.jpg')); + imgLL.Style = {Height('4cm'),HAlign('center')}; + add(SL,imgLL); + LLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Load Link (fonte: Earth System)']); + FIG = FIG+1; + LLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SL,LLcaption); + if activeEN == 1 + + text_ENG.HAlign = 'justify'; + add(SL_ENG,text_ENG); + imgLL = Image(('LL.jpg')); + imgLL.Style = {Height('4cm'),HAlign('center')}; + add(SL_ENG,imgLL); + LLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Load Link sensor (source: Earth System)']); + FIG_ENG = FIG_ENG+1; + LLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SL_ENG,LLcaption_ENG); + end + LL = 1; + end + break + end + end + end + end + add(appendice,SL); + if activeEN == 1 + add(appendice_ENG,SL_ENG); + end +end + +% --- Trigger Link --- +if sum(yesTrL)>=1 + FC = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Trigger Link') == 1 + if FC == 0 + TRL = Section(); + end + sezTRL = Heading3('Trigger Link'); + sezTRL.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + TRL.Title = sezTRL; + text = Paragraph(['Il Trigger Link è un sensore analogico costituito da un finecorsa elettro-meccanico, '... + 'la cui attivazione serve a inizializzare una serie di procedure predefinite sulla centralina a cui '... + 'è collegato (e.g. lettura dei sensori, trasmissione dati, ecc.).']); + + %--ENG-- + if activeEN == 1 + if FC == 0 + TRL_ENG = Section(); + end + sezTRL_ENG = Heading3('Trigger Link'); + sezTRL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + TRL_ENG.Title = sezTRL_ENG; + text_ENG = Paragraph(['Trigger Link is an analog sensor integrating an electro-mechanical switch, '... + 'whose activation leads to the initialization of predefined procedures involving the control unit '... + 'to which it is connected (e.g. sensors reading, data transmission, etc.).']); + end + if FC == 0 + text.HAlign = 'justify'; + add(TRL,text); + imgTRL = Image(('TRL.jpg')); + imgTRL.Style = {Height('4cm'),HAlign('center')}; + add(TRL,imgTRL); + TRLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Trigger Link']); + FIG = FIG+1; + TRLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(TRL,TRLcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(TRL_ENG,text_ENG); + imgTRL = Image(('TRL.jpg')); + imgTRL.Style = {Height('4cm'),HAlign('center')}; + add(TRL_ENG,imgTRL); + TRLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Trigger Link sensor']); + FIG_ENG = FIG_ENG+1; + TRLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(TRL_ENG,TRLcaption_ENG); + end + FC = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Trigger Link') == 1 + if FC == 0 + TRL = Section(); + end + sezTRL = Heading3('Trigger Link'); + sezTRL.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + TRL.Title = sezTRL; + text = Paragraph(['Il Trigger Link è un sensore analogico costituito da un finecorsa elettro-meccanico, '... + 'la cui attivazione serve a inizializzare une serie di procedure predefinite sulla centralina a cui '... + 'è collegato (e.g. lettura dei sensori, trasmissione dati, ecc.).']); + + %--ENG-- + if activeEN == 1 + if FC == 0 + TRL_ENG = Section(); + end + sezTRL_ENG = Heading3('Trigger Link'); + sezTRL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + TRL_ENG.Title = sezTRL_ENG; + text_ENG = Paragraph(['Trigger Link is an analog sensor integrating an electro-mechanical switch, '... + 'whose activation leads to the initialization of predefined procedures involving the control unit '... + 'to which it is connected (e.g. sensors reading, data transmission, etc.).']); + end + if FC == 0 + text.HAlign = 'justify'; + add(TRL,text); + imgTRL = Image(('TRL.jpg')); + imgTRL.Style = {Height('4cm'),HAlign('center')}; + add(TRL,imgTRL); + TRLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Trigger Link']); + FIG = FIG+1; + TRLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(TRL,TRLcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(TRL_ENG,text_ENG); + imgTRL = Image(('TRL.jpg')); + imgTRL.Style = {Height('4cm'),HAlign('center')}; + add(TRL_ENG,imgTRL); + TRLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Trigger Link sensor']); + FIG_ENG = FIG_ENG+1; + TRLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(TRL_ENG,TRLcaption_ENG); + end + FC = 1; + end + break + end + end + end + end + add(appendice,TRL); + if activeEN == 1 + add(appendice_ENG,TRL_ENG); + end +end + +% --- ASECam --- +if nCAM >= 1 + CM = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Camera') == 1 + if CM == 0 + SCM = Section(); + end + sezCM = Heading3('ASE Cam'); + sezCM.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SCM.Title = sezCM; + text = Paragraph(['ASECam ' char(232) ' una videocamera ad alta risoluzione, appositamente sviluppata per uso esterno, '... + ' in grado di acquisire immagini '... + 'dell''area monitorata con cadenza periodica o al verificarsi di un evento critico.']); + + %--ENG-- + if activeEN == 1 + if CM == 0 + SCM_ENG = Section(); + end + sezCM_ENG = Heading3('ASE Cam'); + sezCM_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SCM_ENG.Title = sezCM_ENG; + text = Paragraph(['ASECam is a high resolution video camera, specifically developed for outdoor use. '... + 'It is able to acquire images of the monitored area with '... + 'a predefined sampling frequency, or at the occurrence of a critical event.']); + end + if CM == 0 + text.HAlign = 'justify'; + add(SCM,text); + imgCAM = Image(('ASECam.jpg')); + imgCAM.Style = {Height('4cm'),HAlign('center')}; + add(SCM,imgCAM); + CAMcaption = Paragraph(['Fig. ' num2str(FIG) ' - Videocamera ASECam']); + FIG = FIG+1; + CAMcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SCM,CAMcaption); + CM = 1; + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(SCM_ENG,text_ENG); + imgCAM = Image(('ASECam.jpg')); + imgCAM.Style = {Height('4cm'),HAlign('center')}; + add(SCM_ENG,imgCAM); + CAMcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - ASECam video camera']); + FIG_ENG = FIG_ENG+1; + CAMcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SCM_ENG,CAMcaption_ENG); + CM = 1; + end + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Camera') == 1 + if CM == 0 + SCM = Section(); + end + sezCM = Heading3('ASE Cam'); + sezCM.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SCM.Title = sezCM; + text = Paragraph(['ASECam ' char(232) ' una videocamera ad alta risoluzione, appositamente sviluppata per uso esterno, '... + ' in grado di acquisire immagini '... + 'dell''area monitorata con cadenza periodica o al verificarsi di un evento critico.']); + %--ENG-- + if activeEN == 1 + if CM == 0 + SCM_ENG = Section(); + end + sezCM_ENG = Heading3('ASE Cam'); + sezCM_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SCM_ENG.Title = sezCM_ENG; + text = Paragraph(['ASECam is a high resolution video camera, specifically developed for outdoor use. '... + 'It is able to acquire images of the monitored area with '... + 'a predefined sampling frequency, or at the occurrence of a critical event.']); + end + if CM == 0 + text.HAlign = 'justify'; + add(SCM,text); + imgCAM = Image(('ASECam.jpg')); + imgCAM.Style = {Height('4cm'),HAlign('center')}; + add(SCM,imgCAM); + CAMcaption = Paragraph(['Fig. ' num2str(FIG) ' - Videocamera ASECam']); + FIG = FIG+1; + CAMcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SCM,CAMcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(SCM_ENG,text_ENG); + imgCAM = Image(('ASECam.jpg')); + imgCAM.Style = {Height('4cm'),HAlign('center')}; + add(SCM_ENG,imgCAM); + CAMcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - ASECam video camera']); + FIG_ENG = FIG_ENG+1; + CAMcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SCM_ENG,CAMcaption_ENG); + end + CM = 1; + end + break + end + end + end + end + add(appendice,SCM); + if activeEN == 1 + add(appendice_ENG,SCM_ENG); + end +end + +% --- Weir Link --- +if sum(yesWL) >= 1 + WeirL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Weir Link') == 1 + if WeirL == 0 + WeirLE = Section(); + end + sezWeirL = Heading3('Weir Link'); + sezWeirL.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + WeirLE.Title = sezWeirL; + text = Paragraph(['Il sensore Weir Link ' char(232) ' un idrometro '... + 'in grado di misurare l''altezza del livello d''acqua '... + 'tramite un trasduttore finestrato a corda vibrante combinato con '... + 'un contrappeso cilindrico sospeso.']); + %--ENG-- + if activeEN == 1 + if WeirL == 0 + WeirLE_ENG = Section(); + end + sezWeirL_ENG = Heading3('Weir Link'); + sezWeirL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + WeirLE_ENG.Title = sezWeirL_ENG; + text_ENG = Paragraph(['Weir Link is a sensor that utilises a vented vibrating wire force '... + 'transducer in combination with a cylindrical weight suspended '... + 'from it to monitor water levels.']); + end + if WeirL == 0 + text.HAlign = 'justify'; + add(WeirLE,text); + imgWL = Image(('Weir.png')); + imgWL.Style = {Height('3.5cm'),HAlign('center')}; + add(WeirLE,imgWL); + WeirLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Weir Link']); + FIG = FIG+1; + WeirLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(WeirLE,WeirLcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(WeirLE_ENG,text_ENG); + imgWL = Image(('Weir.png')); + imgWL.Style = {Height('3.5cm'),HAlign('center')}; + add(WeirLE_ENG,imgWL); + WeirLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Weir Link sensor']); + FIG_ENG = FIG_ENG+1; + WeirLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(WeirLE_ENG,WeirLcaption_ENG); + end + WeirL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Weir Link') == 1 + if WeirL == 0 + WeirLE = Section(); + end + sezWeirL = Heading3('Weir Link'); + sezWeirL.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + WeirLE.Title = sezWeirL; + text = Paragraph(['Il sensore Weir Link ' char(232) ' un idrometro '... + 'in grado di misurare l''altezza del livello d''acqua '... + 'tramite un trasduttore finestrato a corda vibrante combinato con '... + 'un contrappeso cilindrico sospeso.']); + %--ENG-- + if activeEN == 1 + if WeirL == 0 + WeirLE_ENG = Section(); + end + sezWeirL_ENG = Heading3('Weir Link'); + sezWeirL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + WeirLE_ENG.Title = sezWeirL_ENG; + text_ENG = Paragraph(['Weir Link is a sensor that utilises a vented vibrating wire force '... + 'transducer in combination with a cylindrical weight suspended '... + 'from it to monitor water levels.']); + end + if WeirL == 0 + text.HAlign = 'justify'; + add(WeirLE,text); + imgWL = Image(('Weir.png')); + imgWL.Style = {Height('3.5cm'),HAlign('center')}; + add(WeirLE,imgWL); + WeirLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Weir Link']); + FIG = FIG+1; + WeirLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(WeirLE,WeirLcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(WeirLE_ENG,text_ENG); + imgWL = Image(('Weir.png')); + imgWL.Style = {Height('3.5cm'),HAlign('center')}; + add(WeirLE_ENG,imgWL); + WeirLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Weir Link sensor']); + FIG_ENG = FIG_ENG+1; + WeirLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(WeirLE_ENG,WeirLcaption_ENG); + end + WeirL = 1; + end + break + end + end + end + end + add(appendice,WeirLE); + if activeEN == 1 + add(appendice_ENG,WeirLE_ENG); + end +end + +% --- Pendulum --- +if sum(yesPE) >= 1 + PNDL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Pendulum') == 1 + if PNDL == 0 + PN = Section(); + end + sezPendulum = Heading3('Pendolo'); + sezPendulum.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PN.Title = sezPendulum; + text = Paragraph(['Il pendolo ' char(232) ' un sensore '... + 'per la misura degli spostamenti nel piano orizzontale, eseguita '... + 'grazie a un filo verticale tensionato di cui viene registrata la '... + 'posizione all''interno di un sistema di riferimento predefinito.']); + %--ENG-- + if activeEN == 1 + if PNDL == 0 + PN_ENG = Section(); + end + sezPendulum_ENG = Heading3('Pendulum'); + sezPendulum_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PN_ENG.Title = sezPendulum_ENG; + text_ENG = Paragraph(['The Pendulum system is a sensor able to measure displacements '... + 'eperienced by the structure in the horizontal plane. The working principle exploits a '... + 'tensioned vertical wire, recording its position in a planar reference system.']); + end + if PNDL == 0 + text.HAlign = 'justify'; + add(PN,text); + imgPE = Image(('Pendulum.png')); + imgPE.Style = {Height('3.5cm'),HAlign('center')}; + add(PN,imgPE); + Pendcaption = Paragraph(['Fig. ' num2str(FIG) ' - Pendolo']); + FIG = FIG+1; + Pendcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(PN,Pendcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(PN_ENG,text_ENG); + imgPE = Image(('Pendulum.png')); + imgPE.Style = {Height('3.5cm'),HAlign('center')}; + add(PN_ENG,imgPE); + Pendcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Pendulum system']); + FIG_ENG = FIG_ENG+1; + Pendcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(PN_ENG,Pendcaption_ENG); + end + PNDL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Pendulum') == 1 + if PNDL == 0 + PN = Section(); + end + sezPendulum = Heading3('Pendolo'); + sezPendulum.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PN.Title = sezPendulum; + text = Paragraph(['Il pendolo ' char(232) ' un sensore '... + 'per la misura degli spostamenti nel piano orizzontale, eseguita '... + 'grazie a un filo verticale tensionato di cui viene registrata la '... + 'posizione all''interno di un sistema di riferimento predefinito.']); + %--ENG-- + if activeEN == 1 + if PNDL == 0 + PN_ENG = Section(); + end + sezPendulum_ENG = Heading3('Pendulum'); + sezPendulum_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PN_ENG.Title = sezPendulum_ENG; + text_ENG = Paragraph(['The Pendulum system is a sensor able to measure displacements '... + 'eperienced by the structure in the horizontal plane. The working principle exploits a '... + 'tensioned vertical wire, recording its position in a planar reference system.']); + end + if PNDL == 0 + text.HAlign = 'justify'; + add(PN,text); + imgPE = Image(('Pendulum.png')); + imgPE.Style = {Height('3.5cm'),HAlign('center')}; + add(PN,imgPE); + Pendcaption = Paragraph(['Fig. ' num2str(FIG) ' - Pendolo']); + FIG = FIG+1; + Pendcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(PN,Pendcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(PN_ENG,text_ENG); + imgPE = Image(('Pendulum.png')); + imgPE.Style = {Height('3.5cm'),HAlign('center')}; + add(PN_ENG,imgPE); + Pendcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Pendulum system']); + FIG_ENG = FIG_ENG+1; + Pendcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(PN_ENG,Pendcaption_ENG); + end + PNDL = 1; + end + break + end + end + end + end + add(appendice,PN); + if activeEN == 1 + add(appendice_ENG,PN_ENG); + end +end + +add(rpt,appendice); +template(rpt); +if activeEN == 1 + add(rpt_ENG,appendice_ENG); + template(rpt_ENG); +end + +text = 'report_appendix function executed correctly. report_appendix function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_appendix_ENG.m b/ATD/report_appendix_ENG.m new file mode 100755 index 0000000..55bc429 --- /dev/null +++ b/ATD/report_appendix_ENG.m @@ -0,0 +1,1680 @@ +function report_appendix_ENG(yesTL,yesIPL,yesTLH,yesPCL,yesTLHR,yesTLHRH,yesPCLHR,... + yesPL,yesBL,yesTuL,yesRaL,yesThL,yesKL,yesKLHR,yesRL,yesLL,yesPrL,yesPT100,... + yesCrL,yes3DCrL,yesEL,yes3DEL,yesWEL,yesMPBEL,PL_A,PL_D,Font_section,... + Font_caption,Font_tools,FIG,dim,appendice,colonna6,rpt,FileName) + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +%% Appendice - Data elaboration +partecomune = 0; +ElabTitle = 0; +Titolo = Section(); + +testoTilt = Paragraph(['ADC points stored in the SD card are defined ''raw data'' and they need '... + 'to be properly elaborated in order to convert acceleration data into displacement values. '... + 'Moreover, in this stage it is also possible to identify and correct any issue related to '... + 'data drifting, spike and/or instrumental noises. These results are achieved thanks to a '... + 'dedicated MATLAB-based software, named ''Tilt''. It should be taken into account that traditional '... + 'monitoring devices usually feature a sampling frequency that is too low to allow the '... + 'application of statistical analyses aimed to reduce any tool-related data noise. On the '... + 'other hand, the definition of a database including a great number of monitoring data permits '... + 'to evaluate the phenomena evolution over time and to assess the results reliability.']); + +testoATD = Paragraph(['ADC points stored in the SD card are defined ''raw data'' and they need '... + 'to be properly elaborated in order to convert acceleration data into displacement values. '... + 'Moreover, in this stage it is also possible to identify and correct any issue related to '... + 'data drifting, spike and/or instrumental noises. These results are achieved thanks to a '... + 'dedicated MATLAB-based software, named ''ATD''. It should be taken into account that traditional '... + 'monitoring devices usually feature a sampling frequency that is too low to allow the '... + 'application of statistical analyses aimed to reduce any tool-related data noise. On the '... + 'other hand, the definition of a database including a great number of monitoring data permits '... + 'to evaluate the phenomenon evolution over time and to assess the results reliability.']); + +testoRIS = Paragraph(['After collecting the monitoring data on-site, the datalogger sends them '... + 'to the ASE database, from where the software imports raw data and calibration parameters. '... + 'This is a completely automatic procedure: after receiving new data, a dedicated procedure '... + 'converts them into physical units, thus obtaining the actual displacement measured on-site. '... + 'After the results uploading phase, which takes a very short amount of time, the user can access '... + 'and download all monitoring data through the web-based platform.']); + +testoTilt.HAlign = 'justify'; +testoATD.HAlign = 'justify'; +testoRSN.HAlign = 'justify'; +testoMUSA.HAlign = 'justify'; +testoRIS.HAlign = 'justify'; + +% --- Vertical Array --- +if sum(yesTL) >= 1 || sum(yesTLHR) >= 1 + elabTL = Section(); + if ElabTitle == 0 + app = Heading2('Data elaboration'); + app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo.Title = app; + ElabTitle = 1; + end + sezVA = Heading3('Vertical Array'); + sezVA.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabTL.Title = sezVA; + testo = Paragraph(['When a displacement occurs, the node changes its position in order to '... + 'follow the slope movement. After been read, every tilt sensor records the new position '... + 'as an electrical signal (raw data) and sends the information to the control unit. '... + 'The datalogger saves the information on a volatile memory (SD card) and then transmits '... + 'them to the elaboration centre, where a software processes the electrical signals (ADC points) '... + 'to return information about the real displacement of the node (physical units). The accelerometer '... + 'gives information about the rotation of the node, referring to the constant gravity acceleration g. '... + 'The magnetometer allows to obtain the displacement direction of each node, referring to NED '... + 'reference system (North-East-Down). Finally, the on-board thermometer is necessary to correct the '... + 'thermal effects on the accelerometer, using the calibration values. This sensor also provides '... + 'the temperature along the vertical.']); + img = Image(('vert.jpg')); + img.Style = {Height('7cm'),HAlign('center')}; + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Effect of displacement on the tool and new configuration of the Array']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + add(elabTL,testo); + add(elabTL,testoTilt); + add(elabTL,img); + add(elabTL,ionhcaption); + add(elabTL,testoRIS); + partecomune = 1; + add(appendice,elabTL); + br = PageBreak(); + add(appendice,br); +end + +% --- In Place Array --- +if sum(yesIPL) >= 1 + elabIPL = Section(); + if ElabTitle == 0 + app = Heading2('Data elaboration'); + app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo.Title = app; + ElabTitle = 1; + end + sezIPA = Heading3('In Place Array'); + sezIPA.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabIPL.Title = sezIPA; + testo = Paragraph(['When a displacement occurs, the node changes its position in order to '... + 'follow the slope movement. After been read, every tilt sensor records the new position '... + 'as an electrical signal (raw data) and sends the information to the control unit. '... + 'The datalogger saves the information on a volatile memory (SD card) and then transmits '... + 'them to the elaboration centre, where a software processes the electrical signals (ADC points) '... + 'to return information about the real displacement of the node (physical units). The accelerometer '... + 'gives information about the rotation of the node, referring to the constant gravity acceleration g. '... + 'The magnetometer allows to obtain the displacement direction of each node, referring to NED '... + 'reference system (North-East-Down). Finally, the on-board thermometer is necessary to correct the '... + 'thermal effects on the accelerometer, using the calibration values. This sensor also provides '... + 'the temperature along the vertical.']); + img = Image(('vert.jpg')); + img.Style = {Height('7cm'),HAlign('center')}; + imgcaption = Paragraph(['Fig. ' num2str(FIG) ' - Effect of displacement on the tool and new configuration of the Array']); + FIG = FIG+1; + imgcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + add(elabIPL,testo); + add(elabIPL,img); + add(elabIPL,imgcaption); + if partecomune == 0 + add(elabIPL,testoTilt); + add(elabIPL,testoRIS); + partecomune = 1; + end + add(appendice,elabIPL); + br = PageBreak(); + add(appendice,br); +end + +nodoTunnel = 0; +% --- Cir Array --- +if sum(yesTuL) >= 1 + elabCIR = Section(); + if ElabTitle == 0 + app = Heading2('Data elaboration'); + app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo.Title = app; + ElabTitle = 1; + end + sezCA = Heading3('Cir Array'); + sezCA.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabCIR.Title = sezCA; + testo = Paragraph(['When a displacement occurs, the node changes its position in order to '... + 'follow the section movement. After been read, every tilt sensor records the new position '... + 'as an electrical signal (raw data) and sends the information to the control unit. '... + 'The datalogger saves the information on a volatile memory (SD card) and then transmits '... + 'them to the elaboration centre, where a software processes the electrical signals (ADC points) '... + 'to return information about the real displacement of the node (physical units). The accelerometer '... + 'gives information about the rotation of the node, referring to the constant gravity acceleration g. '... + 'The on-board thermometer is necessary to correct the '... + 'thermal effects on the accelerometer, using the calibration values. This sensor also provides '... + 'the temperature along the array.']); + testo2 = Paragraph(['MEMS sensor is located at the centre of each Link and measures the three '... + 'components of the gravitational field in its own reference system, starting from an initial '... + 'configuration (zero reading). When a movement arises, the variation of the different gravity '... + 'components gives back the information about the displacement. In this way, it is possible to '... + 'calculate the tunnel rotation and the local displacement of each Link, and finally compute '... + 'a curve of cumulated displacements and the three-dimensional variation of the monitored section. '... + 'Moreover, the software determines the length variation of predefined convergence segments, created '... + 'by connecting specific calculation points with an approach similar to topography applications. '... + 'Each Tunnel Link has a Segment of Relevance, which is assumed as infinitely rigid, that starts from the middle '... + 'point between the considered and the previous Link and ends at the medium distance between the '... + 'considered and the following Link. It is possible to customize the distance between Links according to '... + 'specific monitoring necessities (smaller distances lead to more reliable and accurate results).']); + img = Image(('cir_ENG.png')); + img.Style = {Height('7cm'),HAlign('center')}; + imgcaption = Paragraph(['Fig. ' num2str(FIG) ' - Tunnel Link Segment of Relevance and '... + 'installation system']); + FIG = FIG+1; + imgcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + add(elabCIR,testo); + nodoTunnel = 1; + add(elabCIR,testo2); + add(elabCIR,img); + add(elabCIR,imgcaption); + if partecomune == 0 + add(elabCIR,testoATD); + add(elabCIR,testoRIS); + partecomune = 1; + end + add(appendice,elabCIR); +end + +% --- Rad Array --- +if sum(yesRaL) >= 1 + elabRAD = Section(); + if ElabTitle == 0 + app = Heading2('Data elaboration'); + app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo.Title = app; + ElabTitle = 1; + end + sezRA = Heading3('Rad Array'); + sezRA.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabRAD.Title = sezRA; + testo = Paragraph(['When a displacement occurs, the node changes its position in order to '... + 'follow the rock mass movement. After been read, every tilt sensor records the new position '... + 'as an electrical signal (raw data) and sends the information to the control unit. '... + 'The datalogger saves the information on a volatile memory (SD card) and then transmits '... + 'them to the elaboration centre, where a software processes the electrical signals (ADC points) '... + 'to return information about the real displacement of the node (physical units). The accelerometer '... + 'gives information about the rotation of the node, referring to the constant gravity acceleration g. '... + 'The on-board thermometer is necessary to correct the '... + 'thermal effects on the accelerometer, using the calibration values. This sensor also provides '... + 'the temperature along the array.']); + testo2 = Paragraph(['MEMS sensor is located at the centre of each Link and measures the three '... + 'components of the gravitational field in its own reference system, starting from an initial '... + 'configuration (zero reading). When a movement arises, the variation of the different gravity '... + 'components gives back the information of the displacement. In this way, it is possible to '... + 'calculate the 3D displacement surrounding the monitored section. '... + 'Each single node provides a local information according to the 3D reference system X-Y-Z (respectively '... + 'width, depth and height). The resultant of these components allows to determine the cumulative displacement '... + 'and the three-dimensional position variation of the monitored element. Moreover, it is possible to couple a Rad '... + 'Array with a multi-point borehole extensometer in order to separate radial deformations from components acting '... + 'along other directions. '... + 'Each Radial Link has a Segment of Relevance, which is assumed as infinitely rigid, that starts from the middle '... + 'point between the considered and the previous Link and ends at the medium distance between the '... + 'considered and the following Link. It is possible to customize the distance between Links according to '... + 'specific monitoring necessities (smaller distances lead to more reliable and accurate results).']); + img = Image(('rad.png')); + img.Style = {Height('7.5cm'),HAlign('center')}; + imgcaption = Paragraph(['Fig. ' num2str(FIG) ' - Graphical illustration of two Rad Arrays located '... + 'on the upper part of the monitorign section and installed with a 45-degree tilt.']); + FIG = FIG+1; + imgcaption.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if nodoTunnel==0 + add(elabRAD,testo); + nodoTunnel = 1; + end + add(elabRAD,testo2); + add(elabRAD,img); + add(elabRAD,imgcaption); + if partecomune == 0 + add(elabRAD,testoATD); + add(elabRAD,testoRIS); + partecomune = 1; + end + add(appendice,elabRAD); +end + +% --- PreConv Array --- +if sum(yesPCL) >= 1 + elabPCL = Section(); + if ElabTitle == 0 + app = Heading2('Data elaboration'); + app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo.Title = app; + ElabTitle = 1; + end + sezPCA = Heading3('PreConv Array'); + sezPCA.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabPCL.Title = sezPCA; + testo = Paragraph(['When a displacement occurs, the node changes its position in order to '... + 'follow the rock mass movement. After been read, every tilt sensor records the new position '... + 'as an electrical signal (raw data) and sends the information to the control unit. '... + 'The datalogger saves the information on a volatile memory (SD card) and then transmits '... + 'them to the elaboration centre, where a software processes the electrical signals (ADC points) '... + 'to return information about the real displacement of the node (physical units). The accelerometer '... + 'gives information about the rotation of the node, referring to the constant gravity acceleration g. '... + 'The on-board thermometer is necessary to correct the '... + 'thermal effects on the accelerometer, using the calibration values. This sensor also provides '... + 'the temperature along the array.']); + testo2 = Paragraph(['MEMS sensor is located at the centre of each Link and measures the three '... + 'components of the gravitational field in its own reference system, starting from an initial '... + 'configuration (zero reading). When a movement arises, the variation of the different gravity '... + 'components gives back the information of the displacement. In this way, it is possible to '... + 'calculate the pre-convergence component ahead of the tunnel face and the local displacement of each Link, '... + 'thus allowing to compute a curve of cumulated displacements. '... + 'Each PreConv Link has a Segment of Relevance, which is assumed as infinitely rigid, that starts from the middle '... + 'point between the considered and the previous Link and ends at the medium distance between the '... + 'considered and the following Link. It is possible to customize the distance between Links according to '... + 'specific monitoring necessities (smaller distances lead to more reliable and accurate results).']); + img1 = Image(('PCA.png')); + img2 = Image(('PCA2_ENG.jpg')); + img1.Style = {Height('6cm'),HAlign('center')}; + imgcaption = Paragraph(['Fig. ' num2str(FIG) ' - Graphical representation '... + 'of the expected deformation behaviour induced by the underground excavation']); + FIG = FIG+1; + imgcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + img2.Style = {Height('14cm'),HAlign('center')}; + img2caption = Paragraph(['Fig. ' num2str(FIG) ' - MUMS PreConv Array installation example']); + FIG = FIG+1; + img2caption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if nodoTunnel == 0 + add(elabPCL,testo); + nodoTunnel = 1; + end + add(elabPCL,img1); + add(elabPCL,imgcaption); + add(elabPCL,testo2); + add(elabPCL,img2); + add(elabPCL,img2caption); + if partecomune == 0 + add(elabPCL,testoATD); + add(elabPCL,testoRIS); + partecomune = 1; + end + add(appendice,elabPCL); +end + +% --- Analog Array --- +if sum(yesLL)>=1 || sum(yesPrL)>=1 || sum(yesPT100)>=1 || sum(yesCrL)>=1 || ... + sum(yes3DCrL)>=1 || sum(yesEL)>=1 || sum(yes3DEL)>=1 || sum(yesWEL)>=1 || sum(yesMPBEL)>=1 + elabAA = Section(); + if ElabTitle == 0 + app = Heading2('Data elaboration'); + app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo.Title = app; + ElabTitle = 1; + end + sezAA = Heading3('Analog Array'); + sezAA.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabAA.Title = sezAA; + testo = Paragraph(['Analog Arrays are composed of traditional analog sensors, connected to the ASE801 '... + 'datalogger thanks to a dedicated GMUX module that converts an analog '... + 'signal into a digital one, or by installing an ASE201 control unit. This datalogger is able to read any traditional sensors featuring different '... + 'output signals (e.g. Hz, mV/V, 0-5 V, 0-10 V, VW, 4-20 mA, NTC, PT100, etc.).']); + img = Image(('G201.png')); + img.Style = {Height('3.5cm'),HAlign('center')}; + imgcaption = Paragraph(['Fig. ' num2str(FIG) ' - ASE201 control unit, designed to read any traditional analog '... + 'monitoring device by converting its signal into a digital output']); + FIG = FIG+1; + imgcaption.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + add(elabAA,testo); + add(elabAA,img); + add(elabAA,imgcaption); + if partecomune == 0 + add(elabAA,testoATD); + add(elabAA,testoRIS); + partecomune = 1; + end + add(appendice,elabAA); +end + +%% Appendice sensori +% ---Tilt Link HR 3D V--- +elabSE = Section(); +SE = Section(); +app = Heading2('Sensors description'); +app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso +elabSE.Title = app; +add(appendice,elabSE); +TL3D = 0; +for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Tilt Link HR 3D V') == 1 + if TL3D == 0 + SE = Section(); + end + sezTilt = Heading3('Tilt Link HR 3D V'); + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SE.Title = sezTilt; + text = Paragraph(['Tilt Link HR 3D V follows the same working principle of Tilt Link V. '... + 'The main improvement refers to the 2D electrolytic cell, which permits to monitor small '... + 'displacements with a 10 times higher accuracy. Contrary to the MEMS sensor, which has a theoretically '... + 'infinite measure range, the electrolytic cell is limited to a ' char(177) '25' char(186) ' absolute tilt range. Since the '... + 'instrumental axes X and Y of this sensor coincide '... + 'with the two corresponding MEMS axes, the MEMS magnetometer can be used to define also the electrolytic cell '... + 'orientation. The simultaneous presence of two different '... + 'type of sensors in the same Link gives redundancy to results, which is fundamental to reduce '... + 'the uncertainties and have a robust interpretation of the occurring phenomenon.']); + text.HAlign = 'justify'; + if TL3D == 0 + add(SE,text); + imgTL = Image(('Tilt Link HR 3D V.tif')); + add(SE,imgTL); + imgTL.Style = {Height('6.5cm'),HAlign('center')}; + imgTLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Tilt Link HR 3D V sensor']); + add(SE,imgTLcaption); + FIG = FIG+1; + imgTLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + TL3D = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Tilt Link HR 3D V') == 1 + if TL3D == 0 + SE = Section(); + end + sezTilt = Heading3('Tilt Link HR 3D V'); + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SE.Title = sezTilt; + text = Paragraph(['Tilt Link HR 3D V follows the same working principle of Tilt Link V. '... + 'The main improvement refers to the 2D electrolytic cell, which permits to monitor small '... + 'displacements with a 10 times higher accuracy. Contrary to the MEMS sensor, which has a theoretically '... + 'infinite measure range, the electrolytic cell is limited to a ' char(177) '25' char(186) ' absolute tilt range. Since the '... + 'instrumental axes X and Y of this sensor coincide '... + 'with the two corresponding MEMS axes, the MEMS magnetometer can be used to define also the electrolytic cell '... + 'orientation. The simultaneous presence of two different '... + 'type of sensors in the same Link gives redundancy to results, which is fundamental to reduce '... + 'the uncertainties and have a robust interpretation of the occurring phenomenon.']); + text.HAlign = 'justify'; + if TL3D == 0 + add(SE,text); + imgTL = Image(('Tilt Link HR 3D V.tif')); + add(SE,imgTL); + imgTL.Style = {Height('6.5cm'),HAlign('center')}; + imgTLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Tilt Link HR 3D V sensor']); + add(SE,imgTLcaption); + FIG = FIG+1; + imgTLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + TL3D = 1; + end + break + end + end + end +end +add(appendice,SE); + +% --- Tilt Link V --- +TL = 0; +ST = Section(); +for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Tilt Link V') == 1 + if TL == 0 + ST = Section(); + end + sezTilt = Heading3('Tilt Link V'); + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + ST.Title = sezTilt; + text = Paragraph(['Each Tilt Link V features a 3D MEMS sensor, which equips an accelerometer, a '... + 'magnetometer, and a thermometer. The first element is able to record the sensor tilt, '... + 'while the second one defines its direction. The thermometer provides the sensor temperature, and it '... + 'is used to correct the thermal effects on the accelerometer. From a theoretical point of view, '... + 'MEMS features an infinite range of tilt measure, while small variations '... + 'are influenced by electrical noises.']); + if TL == 0 + text.HAlign = 'justify'; + add(ST,text); + img = Image(('Tilt Link V.tif')); + img.Style = {Height('5.5cm'),HAlign('center')}; + add(ST,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Tilt Link V sensor']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(ST,ionhcaption); + TL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Tilt Link V') == 1 + if TL == 0 + ST = Section(); + end + sezTilt = Heading3('Tilt Link V'); + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + ST.Title = sezTilt; + text = Paragraph(['Each Tilt Link V features a 3D MEMS sensor, which equips an accelerometer, a '... + 'magnetometer, and a thermometer. The first element is able to record the sensor tilt, '... + 'while the second one defines its direction. The thermometer provides the sensor temperature, and it '... + 'is used to correct the thermal effects on the accelerometer. From a theoretical point of view, '... + 'MEMS features an infinite range of tilt measure, while small variations '... + 'are influenced by electrical noises.']); + if TL == 0 + text.HAlign = 'justify'; + add(ST,text); + img = Image(('Tilt Link V.tif')); + img.Style = {Height('5.5cm'),HAlign('center')}; + add(ST,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Tilt Link V sensor']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(ST,ionhcaption); + TL = 1; + end + break + end + end + end +end +add(appendice,ST); + +% --- In Place Link HR 3D --- +SIPI3D = Section(); +IPL3D = 0; +for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'In Place Link HR 3D') == 1 + if IPL3D == 0 + SIPI3D = Section(); + end + sezIPI = Heading3('In Place Link HR 3D'); + sezIPI.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SIPI3D.Title = sezIPI; + text = Paragraph(['In Place HR 3D follows the same working principle of In Place Link. '... + 'The main improvement refers to the 2D electrolytic cell, which permits to monitor small '... + 'displacements with a 10 times higher accuracy. Contrary to the MEMS sensor, which has a theoretically '... + 'infinite measure range, the electrolytic cell is limited to a ' char(177) '25' char(186) ' absolute tilt range. Since the '... + 'instrumetal axes X and Y of this sensor coincide '... + 'with the two corresponding MEMS axes, the MEMS magnetometer can be used to define also the electrolytic cell '... + 'orientation. The simultaneous presence of two different '... + 'type of sensors in the same link gives redundancy to results, which is fundamental to reduce '... + 'the uncertainties and have a robust interpretation of the occurring phenomenon.']); + text.HAlign = 'justify'; + if IPL3D == 0 + add(SIPI3D,text); + imgIPL = Image(('Tilt Link HR 3D V.tif')); + add(SIPI3D,imgIPL); + imgIPL.Style = {Height('5.5cm'),HAlign('center')}; + imgIPLcaption = Paragraph(['Fig. ' num2str(FIG) ' - In Place Link HR 3D sensor']); + add(SIPI3D,imgIPLcaption); + FIG = FIG+1; + imgIPLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + IPL3D = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'In Place Link HR 3D') == 1 + if IPL3D == 0 + SIPI3D = Section(); + end + sezIPI = Heading3('In Place Link HR 3D'); + sezIPI.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SIPI3D.Title = sezIPI; + text = Paragraph(['In Place HR 3D follows the same working principle of In Place Link. '... + 'The main improvement refers to the 2D electrolytic cell, which permits to monitor small '... + 'displacements with a 10 times higher accuracy. Contrary to the MEMS sensor, which has a theoretically '... + 'infinite measure range, the electrolytic cell is limited to a ' char(177) '25' char(186) ' absolute tilt range. Since the '... + 'instrumetal axes X and Y of this sensor coincide '... + 'with the two corresponding MEMS axes, the MEMS magnetometer can be used to define also the electrolytic cell '... + 'orientation. The simultaneous presence of two different '... + 'type of sensors in the same link gives redundancy to results, which is fundamental to reduce '... + 'the uncertainties and have a robust interpretation of the occurring phenomenon.']); + text.HAlign = 'justify'; + if IPL3D == 0 + add(SIPI3D,text); + imgIPL = Image(('Tilt Link HR 3D V.tif')); + add(SIPI3D,imgIPL); + imgIPL.Style = {Height('5.5cm'),HAlign('center')}; + imgIPLcaption = Paragraph(['Fig. ' num2str(FIG) ' - In Place Link HR 3D sensor']); + add(SIPI3D,imgIPLcaption); + FIG = FIG+1; + imgIPLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + IPL3D = 1; + end + break + end + end + end +end +add(appendice,SIPI3D); + +% --- In Place Link --- +IPL = 0; +SIPI = Section(); +for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'In Place Link') == 1 + if IPL == 0 + SIPI = Section(); + end + sezIPI = Heading3('In Place Link'); + sezIPI.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SIPI.Title = sezIPI; + text = Paragraph(['Each In Place Link features a 3D MEMS sensor, which equips an accelerometer, a '... + 'magnetometer, and a thermometer. The first element is able to record the node tilt, '... + 'while the second one defines its direction. The thermometer provides the sensor temperature, and it '... + 'is used to correct the thermal effects on the accelerometer. From a theoretical point of view, '... + 'the MEMS features an infinite range of tilt measure, while small variations in its '... + 'position are influenced by electrical noises.']); + if IPL == 0 + text.HAlign = 'justify'; + add(SIPI,text); + img = Image(('Tilt Link V.tif')); + img.Style = {Height('5.5cm'),HAlign('center')}; + add(SIPI,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - In Place Link sensor']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SIPI,ionhcaption); + IPL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'In Place Link') == 1 + if IPL == 0 + SIPI = Section(); + end + sezIPI = Heading3('In Place Link'); + sezIPI.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SIPI.Title = sezIPI; + text = Paragraph(['Each In Place Link features a 3D MEMS sensor, which equips an accelerometer, a '... + 'magnetometer, and a thermometer. The first element is able to record the node tilt, '... + 'while the second one defines its direction. The thermometer provides the sensor temperature, and it '... + 'is used to correct the thermal effects on the accelerometer. From a theoretical point of view, '... + 'the MEMS features an infinite range of tilt measure, while small variations in its '... + 'position are influenced by electrical noises.']); + if IPL == 0 + text.HAlign = 'justify'; + add(SIPI,text); + img = Image(('Tilt Link V.tif')); + img.Style = {Height('5.5cm'),HAlign('center')}; + add(SIPI,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - In Place Link sensor']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SIPI,ionhcaption); + IPL = 1; + end + break + end + end + end +end +add(appendice,SIPI); + +if sum(yesPL) >= 1 + % --- Piezo Link --- + PL = 0; + if sum(PL_A) > 0 && sum(PL_D) > 0 + tipoPL = 'absolute (digital) and relative (analog) '; + figuraPL = 'Piezo Link DA.jpg'; + capPL = 'digital (left) and analog (right) models'; + baroPL = ' '; + elseif sum(PL_A) > 0 + tipoPL = 'relative '; + figuraPL = 'Piezo Link A.png'; + capPL = 'analog model'; + baroPL = ' '; + elseif sum(PL_D) > 0 + tipoPL = 'absolute '; + figuraPL = 'Piezo Link D.jpg'; + capPL = 'digital model'; + baroPL = ', when coupled with a barometer, it also allows '; + end + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Piezo Link') == 1 + if PL == 0 + PE = Section(); + end + sezTilt = Heading3('Piezo Link'); + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PE.Title = sezTilt; + text = Paragraph(['Piezo Link is a sensor able to measure the ' tipoPL 'pressure and' baroPL ... + 'to calculate the water table level.']); + if PL == 0 + text.HAlign = 'justify'; + add(PE,text); + imgPL = Image(figuraPL); + imgPL.Style = {Height('5.5cm'),HAlign('center')}; + add(PE,imgPL); + FIG = FIG+1; + PLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Piezo Link sensor, ' capPL]); + PLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(PE,PLcaption); + PL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Piezo Link') == 1 + if PL == 0 + PE = Section(); + end + sezTilt = Heading3('Piezo Link'); + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PE.Title = sezTilt; + text = Paragraph(['Piezo Link is a sensor able to measure the ' tipoPL 'pressure and' baroPL ... + 'to compute the water table level.']); + if PL == 0 + text.HAlign = 'justify'; + add(PE,text); + imgPL = Image(figuraPL); + imgPL.Style = {Height('5.5cm'),HAlign('center')}; + add(PE,imgPL); + PLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Piezo Link sensor, ' capPL]); + FIG = FIG+1; + PLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(PE,PLcaption); + PL = 1; + end + break + end + end + end + end + % ---Baro Link--- + if sum(yesBL) >= 1 + BL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Baro Link') == 1 + if BL == 0 + BE = Section(); + end + sezTilt = Heading3('Baro Link'); + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + BE.Title = sezTilt; + text = Paragraph(['Baro Link is a sensor designed to measure the atmospheric pressure, allowing to '... + 'evaluate the meteorological conditions of the monitored site and to estimate the pore water pressure, '... + 'when coupled with a piezometer.']); + if BL == 0 + text.HAlign = 'justify'; + add(BE,text); + imgBL = Image(('Barometro.png')); + imgBL.Style = {Height('4cm'),HAlign('center')}; + add(BE,imgBL); + BLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Baro Link sensor']); + FIG = FIG+1; + BLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(BE,BLcaption); + BL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Baro Link') == 1 + if BL == 0 + BE = Section(); + end + sezTilt = Heading3('Baro Link'); + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + BE.Title = sezTilt; + text = Paragraph(['Baro Link is a sensor designed to measure the atmospheric pressure, allowing to '... + 'evaluate the meteorological conditions of the monitored site and to estimate the pore water pressure, '... + 'when coupled with a piezometer.']); + if BL == 0 + text.HAlign = 'justify'; + add(BE,text); + imgBL = Image(('Barometro.png')); + imgBL.Style = {Height('4cm'),HAlign('center')}; + add(BE,imgBL); + BLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Baro Link sensor']); + FIG = FIG+1; + BLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(BE,BLcaption) + BL = 1; + end + break + end + end + end + end + add(appendice,BE); + end + add(appendice,PE); +end + +% ---Klino Link--- +if sum(yesKL) >= 1 + KL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Klino Link HR 3D') == 1 + if KL == 0 + KE = Section(); + end + sezKlino = Heading3('Klino Link HR 3D'); + sezKlino.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KE.Title = sezKlino; + text = Paragraph(['Klino Link HR 3D is a sensor that integrates a 3D MEMS sensor and an electrolytic '... + 'tilt sensor, able to measure the tilt of the element on which is installed. It also '... + 'includes a thermometer to collect temperature values.']); + if KL == 0 + text.HAlign = 'justify'; + add(KE,text); + imgKL = Image(('Klino.png')); + imgKL.Style = {Height('5cm'),HAlign('center')}; + add(KE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Klino Link HR 3D sensor']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(KE,KEcaption); + KL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Klino Link HR 3D') == 1 + if KL == 0 + KE = Section(); + end + sezKlino = Heading3('Klino Link HR 3D'); + sezKlino.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KE.Title = sezKlino; + text = Paragraph(['Klino Link HR 3D is a sensor that integrates a 3D MEMS sensor and an electrolytic '... + 'tilt sensor, able to measure the tilt of the element on which is installed. It also '... + 'includes a thermometer to collect temperature values.']); + if KL == 0 + text.HAlign = 'justify'; + add(KE,text); + imgKL = Image(('Klino.png')); + imgKL.Style = {Height('5cm'),HAlign('center')}; + add(KE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Klino Link HR 3D sensor']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(KE,KEcaption); + KL = 1; + end + break + end + end + end + end + add(appendice,KE); +end + +% ---Klino Link HR--- +if sum(yesKL) == 0 && sum(yesKLHR) >= 1 + KLHR = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Klino Link HR') == 1 + if KLHR == 0 + KLE = Section(); + end + sezKlinoHR = Heading3('Klino Link HR'); + sezKlinoHR.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KLE.Title = sezKlinoHR; + text = Paragraph(['Klino Link HR is a sensor that integrates an electrolytic '... + 'tilt sensor, able to measure the tilt of the element on which is installed. It also '... + 'includes a thermometer to collect temperature values.']); + if KLHR == 0 + text.HAlign = 'justify'; + add(KLE,text); + imgKL = Image(('KlinoHR.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(KLE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Klino Link HR sensor']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(KLE,KEcaption); + KLHR = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Klino Link HR') == 1 + if KLHR == 0 + KLE = Section(); + end + sezKlinoHR = Heading3('Klino Link HR'); + sezKlinoHR.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KLE.Title = sezKlinoHR; + text = Paragraph(['Klino Link HR is a sensor that integrates an electrolytic '... + 'tilt sensor, able to measure the tilt of the element on which is installed. It also '... + 'includes a thermometer to collect temperature values.']); + if KLHR == 0 + text.HAlign = 'justify'; + add(KLE,text); + imgKL = Image(('KlinoHR.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(KLE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Klino Link HR sensor']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(KLE,KEcaption); + KLHR = 1; + end + break + end + end + end + end + add(appendice,KLE); +end + +% --- Therm Link --- +if sum(yesThL) >= 1 + ThL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Therm Link') == 1 + if ThL == 0 + ThE = Section(); + end + sezTherm = Heading3('Therm Link'); + sezTherm.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + ThE.Title = sezTherm; + text = Paragraph(['Therm Link sensor is composed of a thermometer featuring high accuracy and repeatability, '... + 'able to measure temperature values at different depths by exploiting a single quadrupole cable, which '... + 'connects different Links in a single chain.']); + if ThL == 0 + text.HAlign = 'justify'; + add(ThE,text); + imgThL = Image(('Tilt Link.jpg')); + imgThL.Style = {Height('5cm'),HAlign('center')}; + add(ThE,imgThL); + ThEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Therm Link sensor']); + FIG = FIG+1; + ThEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(ThE,ThEcaption); + ThL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Therm Link') == 1 + if ThL == 0 + ThE = Section(); + end + sezTherm = Heading3('Therm Link'); + sezTherm.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + ThE.Title = sezTherm; + text = Paragraph(['Therm Link sensor is composed of a thermometer featuring high accuracy and repeatability, '... + 'able to measure temperature values at different depths by exploiting a single quadrupole cable, which '... + 'connects different Links in a single chain.']); + if ThL == 0 + text.HAlign = 'justify'; + add(ThE,text); + imgThL = Image(('Tilt Link.jpg')); + imgThL.Style = {Height('5cm'),HAlign('center')}; + add(ThE,imgThL); + ThEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Therm Link sensor']); + FIG = FIG+1; + ThEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(ThE,ThEcaption); + ThL = 1; + end + break + end + end + end + end + add(appendice,ThE); +end + +% --- PT100 Link --- +if sum(yesPT100) >= 1 + PT100 = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'PT100 Link') == 1 + if PT100 == 0 + PT100E = Section(); + end + sezPT100 = Heading3('PT100 Link'); + sezPT100.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PT100E.Title = sezPT100; + text = Paragraph(['PT100 is a platinum resistance thermometer that exploits the material resistivity '... + 'variation to evaluate the temperature with a linear correlation. This type of sensor does not need '... + 'any calibration.']); + if PT100 == 0 + text.HAlign = 'justify'; + add(PT100E,text); + imgPT100 = Image(('PT100.jpg')); + imgPT100.Style = {Height('3cm'),HAlign('center')}; + add(PT100E,imgPT100); + PT100caption = Paragraph(['Fig. ' num2str(FIG) ' - PT100 Link sensor']); + FIG = FIG+1; + PT100caption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(PT100E,PT100caption); + PT100 = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'PT100 Link') == 1 + if PT100 == 0 + PT100E = Section(); + end + sezPT100 = Heading3('PT100 Link'); + sezPT100.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PT100E.Title = sezPT100; + text = Paragraph(['PT100 is a platinum resistance thermometer that exploits the material resistivity '... + 'variation to evaluate the temperature with a linear correlation. This type of sensor does not need '... + 'any calibration.']); + if PT100 == 0 + text.HAlign = 'justify'; + add(PT100E,text); + imgPT100 = Image(('PT100.jpg')); + imgPT100.Style = {Height('3cm'),HAlign('center')}; + add(PT100E,imgPT100); + PT100caption = Paragraph(['Fig. ' num2str(FIG) ' - PT100 Link sensor']); + FIG = FIG+1; + PT100caption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(PT100E,PT100caption); + PT100 = 1; + end + break + end + end + end + end + add(appendice,PT100E); +end + +% --- Tunnel Link --- +TuL = 0; +if sum(yesTuL) >= 1 + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Tunnel Link') == 1 + if TuL == 0 + STu = Section(); + end + sezTunnel = Heading3('Tunnel Link'); + sezTunnel.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + STu.Title = sezTunnel; + text = Paragraph(['Each Tunnel Link features a 3D MEMS sensor, which equips an accelerometer '... + 'and a thermometer. The first element is able to record the sensor tilt, '... + 'while the second one provides the sensor temperature and it '... + 'is used to correct the thermal effects on the accelerometer. From a theoretical point of view, '... + 'MEMS features an infinite range of tilt measure, while small variations '... + 'are influenced by electrical noises.']); + if TuL == 0 + text.HAlign = 'justify'; + add(STu,text); + img = Image(('Tunnel Link.png')); + img.Style = {Height('4.5cm'),HAlign('center')}; + add(STu,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Tunnel Link sensor']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(STu,ionhcaption); + TuL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Tunnel Link') == 1 + if TuL == 0 + STu = Section(); + end + sezTunnel = Heading3('Tunnel Link'); + sezTunnel.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + STu.Title = sezTunnel; + text = Paragraph(['Each Tunnel Link features a 3D MEMS sensor, which equips an accelerometer '... + 'and a thermometer. The first element is able to record the sensor tilt, '... + 'while the second one provides the sensor temperature and it '... + 'is used to correct the thermal effects on the accelerometer. From a theoretical point of view, '... + 'MEMS features an infinite range of tilt measure, while small variations '... + 'are influenced by electrical noises.']); + if TuL == 0 + text.HAlign = 'justify'; + add(STu,text); + img = Image(('Tunnel Link.png')); + img.Style = {Height('4.5cm'),HAlign('center')}; + add(STu,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Tunnel Link sensor']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(STu,ionhcaption); + TuL = 1; + end + break + end + end + end + end + add(appendice,STu); +end + +% --- Radial Link --- +RaL = 0; +if sum(yesRaL) >= 1 + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Radial Link') == 1 + if RaL == 0 + SRaL = Section(); + end + sezRadial = Heading3('Radial Link'); + sezRadial.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SRaL.Title = sezRadial; + text = Paragraph(['Each Radial Link features a 3D MEMS sensor, which equips an accelerometer '... + 'and a thermometer. The first element is able to record the sensor tilt, '... + 'while the second one provides the sensor temperature and it '... + 'is used to correct the thermal effects on the accelerometer. From a theoretical point of view, '... + 'MEMS features an infinite range of tilt measure, while small variations '... + 'are influenced by electrical noises.']); + if RaL == 0 + text.HAlign = 'justify'; + add(SRaL,text); + img = Image(('Tunnel Link.png')); + img.Style = {Height('4.5cm'),HAlign('center')}; + add(SRaL,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Radial Link sensor']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SRaL,ionhcaption); + RaL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Radial Link') == 1 + if RaL == 0 + SRaL = Section(); + end + sezRadial = Heading3('Radial Link'); + sezRadial.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SRaL.Title = sezRadial; + text = Paragraph(['Each Radial Link features a 3D MEMS sensor, which equips an accelerometer '... + 'and a thermometer. The first element is able to record the sensor tilt, '... + 'while the second one provides the sensor temperature and it '... + 'is used to correct the thermal effects on the accelerometer. From a theoretical point of view, '... + 'MEMS features an infinite range of tilt measure, while small variations '... + 'are influenced by electrical noises.']); + if RaL == 0 + text.HAlign = 'justify'; + add(SRaL,text); + img = Image(('Tunnel Link.png')); + img.Style = {Height('4.5cm'),HAlign('center')}; + add(SRaL,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Radial Link sensor']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SRaL,ionhcaption); + RaL = 1; + end + break + end + end + end + end + add(appendice,SRaL); +end + +% --- PreConv Link --- +PCL = 0; +if sum(yesPCL) >= 1 + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'PreConv Link') == 1 + if PCL == 0 + SPCL = Section(); + end + sezPCL = Heading3('PreConv Link'); + sezPCL.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SPCL.Title = sezPCL; + text = Paragraph(['Each PreConv Link features a 3D MEMS sensor, which equips an accelerometer '... + 'and a thermometer. The first element is able to record the sensor tilt, '... + 'while the second one provides the sensor temperature and it '... + 'is used to correct the thermal effects on the accelerometer. From a theoretical point of view, '... + 'MEMS features an infinite range of tilt measure, while small variations '... + 'are influenced by electrical noises.']); + if PCL == 0 + text.HAlign = 'justify'; + add(SPCL,text); + img = Image(('Klino.png')); + img.Style = {Height('4cm'),HAlign('center')}; + add(SPCL,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - PreConv Link sensor']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SPCL,ionhcaption); + PCL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'PreConv Link') == 1 + if PCL == 0 + SPCL = Section(); + end + sezPCL = Heading3('PreConv Link'); + sezPCL.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SPCL.Title = sezPCL; + text = Paragraph(['Each PreConv Link features a 3D MEMS sensor, which equips an accelerometer '... + 'and a thermometer. The first element is able to record the sensor tilt, '... + 'while the second one provides the sensor temperature and it '... + 'is used to correct the thermal effects on the accelerometer. From a theoretical point of view, '... + 'MEMS features an infinite range of tilt measure, while small variations '... + 'are influenced by electrical noises.']); + if PCL == 0 + text.HAlign = 'justify'; + add(SPCL,text); + img = Image(('Klino.png')); + img.Style = {Height('4cm'),HAlign('center')}; + add(SPCL,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - PreConv Link sensor']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SPCL,ionhcaption); + PCL = 1; + end + break + end + end + end + end + add(appendice,SPCL); +end + +% --- Rain Link --- +if sum(yesRL) >= 1 + RL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Rain Link') == 1 + if RL == 0 + RLE = Section(); + end + sezRain = Heading3('Rain Link'); + sezRain.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + RLE.Title = sezRain; + text = Paragraph(['Rain Link is a rain gauge sensor able to collect rainfall data '... + 'with a predefined sampling period.']); + if RL == 0 + text.HAlign = 'justify'; + add(RLE,text); + imgRL = Image(('Rain.png')); + imgRL.Style = {Height('3.5cm'),HAlign('center')}; + add(RLE,imgRL); + REcaption = Paragraph(['Fig. ' num2str(FIG) ' - Rain Link sensor']); + FIG = FIG+1; + REcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(RLE,REcaption); + RL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Rain Link') == 1 + if RL == 0 + RLE = Section(); + end + sezRain = Heading3('Rain Link'); + sezRain.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + RLE.Title = sezRain; + text = Paragraph(['Rain Link is a rain gauge sensor able to collect rainfall data '... + 'with a predefined sampling period.']); + if RL == 0 + text.HAlign = 'justify'; + add(RLE,text); + imgRL = Image(('Rain.png')); + imgRL.Style = {Height('3.5cm'),HAlign('center')}; + add(RLE,imgRL); + REcaption = Paragraph(['Fig. ' num2str(FIG) ' - Rain Link sensor']); + FIG = FIG+1; + REcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(RLE,REcaption); + RL = 1; + end + break + end + end + end + end + add(appendice,RLE); +end + +% --- Crack Link --- +if sum(yesCrL) >= 1 + CrL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Crack Link') == 1 + if CrL == 0 + CrE = Section(); + end + sezCrack = Heading3('Crack Link'); + sezCrack.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + CrE.Title = sezCrack; + text = Paragraph(['Crack Link sensor is an analog crack meter, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. Crack meters are located across surface cracks, or in specific areas '... + 'where the generation of surface fissures is expected.']); + if CrL == 0 + text.HAlign = 'justify'; + add(CrE,text); + imgKL = Image(('Crack.jpg')); + imgKL.Style = {Height('5cm'),HAlign('center')}; + add(CrE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Crack Link sensor']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(CrE,KEcaption); + CrL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Crack Link') == 1 + if CrL == 0 + CrE = Section(); + end + sezCrack = Heading3('Crack Link'); + sezCrack.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + CrE.Title = sezCrack; + text = Paragraph(['Crack Link sensor is an analog crack meter, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. Crack meters are located across surface cracks, or in specific areas '... + 'where the generation of surface fissures is expected.']); + if CrL == 0 + text.HAlign = 'justify'; + add(CrE,text); + imgKL = Image(('Crack.jpg')); + imgKL.Style = {Height('5cm'),HAlign('center')}; + add(CrE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Crack Link sensor']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(CrE,KEcaption); + CrL = 1; + end + break + end + end + end + end + add(appendice,CrE); +end + +% --- 3D Crack Link --- +if sum(yes3DCrL) >= 1 + CrL3D = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'3D Crack Link') == 1 + if CrL3D == 0 + Cr3DE = Section(); + end + sezCrack3D = Heading3('3D Crack Link'); + sezCrack3D.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + Cr3DE.Title = sezCrack3D; + text = Paragraph(['3D Crack Link sensor is a three-dimension analog crack meter, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. 3D Crack meters are located across surface cracks, or in specific areas '... + 'where the generation of surface fissures is expected.']); + if CrL3D == 0 + text.HAlign = 'justify'; + add(Cr3DE,text); + imgKL = Image(('3DCrack.jpg')); + imgKL.Style = {Height('5cm'),HAlign('center')}; + add(Cr3DE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - 3D Crack Link sensor (source: Pizzi Instruments)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Cr3DE,KEcaption); + CrL3D = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'3D Crack Link') == 1 + if CrL3D == 0 + Cr3DE = Section(); + end + sezCrack3D = Heading3('3D Crack Link'); + sezCrack3D.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + Cr3DE.Title = sezCrack3D; + text = Paragraph(['3D Crack Link sensor is a three-dimension analog crack meter, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. 3D Crack meters are located across surface cracks, or in specific areas '... + 'where the generation of surface fissures is expected.']); + if CrL3D == 0 + text.HAlign = 'justify'; + add(Cr3DE,text); + imgKL = Image(('3DCrack.jpg')); + imgKL.Style = {Height('5cm'),HAlign('center')}; + add(Cr3DE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - 3D Crack Link sensor (source: Pizzi Instruments)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Cr3DE,KEcaption); + CrL3D = 1; + end + break + end + end + end + end + add(appendice,Cr3DE); +end + +% --- Extensometer Link --- +if sum(yesEL) >= 1 + EL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Extensometer Link') == 1 + if EL == 0 + EE = Section(); + end + sezExtensometer = Heading3('Extensometer Link'); + sezExtensometer.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE.Title = sezExtensometer; + text = Paragraph(['Extensometer Link is a sensor composed of an analog extensometer, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. Extensometers are located in specific areas in order to '... + 'detect the formation of micro-fractures, which are measured with a parameter that depends on the '... + 'length of the monitoring tool.']); + if EL == 0 + text.HAlign = 'justify'; + add(EE,text); + imgKL = Image(('Extensometer.png')); + imgKL.Style = {Height('3cm'),HAlign('center')}; + add(EE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Extensometer Link sensor (fonte: Earth System)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE,KEcaption); + EL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Extensometer Link') == 1 + if EL == 0 + EE = Section(); + end + sezExtensometer = Heading3('Extensometer Link'); + sezExtensometer.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE.Title = sezExtensometer; + text = Paragraph(['Extensometer Link is a sensor composed of an analog extensometer, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. Extensometers are located in specific areas in order to '... + 'detect the formation of micro-fractures, which are measured with a parameter that depends on the '... + 'length of the monitoring tool.']); + if EL == 0 + text.HAlign = 'justify'; + add(EE,text); + imgKL = Image(('Extensometer.png')); + imgKL.Style = {Height('3cm'),HAlign('center')}; + add(EE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Extensometer Link sensor (fonte: Earth System)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE,KEcaption); + EL = 1; + end + break + end + end + end + end + add(appendice,EE); +end + +% --- 3D Extensometer Link --- +if sum(yes3DEL) >= 1 + EL3D = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'3D Extensometer Link') == 1 + if EL3D == 0 + EE = Section(); + end + sez3DExtensometer = Heading3('3D Extensometer Link'); + sez3DExtensometer.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE.Title = sez3DExtensometer; + text = Paragraph(['3D Extensometer Link is a sensor composed of three analog strain gauges, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. Strain gauges are located in specific areas in order to '... + 'detect the formation of micro-fractures, which are measured with a parameter that depends on the '... + 'length of the monitoring tool.']); + if EL3D == 0 + text.HAlign = 'justify'; + add(EE,text); + imgKL = Image(('3DExtensometer.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - 3D Extensometer Link sensor (source: Earth System)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE,KEcaption); + EL3D = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'3D Extensometer Link') == 1 + if EL3D == 0 + EE = Section(); + end + sez3DExtensometer = Heading3('3D Extensometer Link'); + sez3DExtensometer.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE.Title = sez3DExtensometer; + text = Paragraph(['3D Extensometer Link is a sensor composed of three analog strain gauges, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. Strain gauges are located in specific areas in order to '... + 'detect the formation of micro-fractures, which are measured with a parameter that depends on the '... + 'length of the monitoring tool.']); + if EL3D == 0 + text.HAlign = 'justify'; + add(EE,text); + imgKL = Image(('3DExtensometer.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - 3D Extensometer Link sensor (source: Earth System)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE,KEcaption); + EL3D = 1; + end + break + end + end + end + end + add(appendice,EE); +end + +% --- Wire Extensometer Link --- +if sum(yesWEL) >= 1 + WEL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Wire Extensometer Link') == 1 + if WEL == 0 + EE = Section(); + end + sezWireExtensometer = Heading3('Wire Extensometer Link'); + sezWireExtensometer.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE.Title = sezWireExtensometer; + text = Paragraph(['Wire Extensometer Link is an analog wire extensometer sensor, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. The device is placed in specific areas where fissures are observed, by installing the '... + 'base on one side and fixing the wire on the other one. The aim is to determine the crack opening/closing '... + 'according to the wire length variation.']); + if WEL == 0 + text.HAlign = 'justify'; + add(EE,text); + imgKL = Image(('wire.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Wire Extensometer Link sensor (source: Earth System)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE,KEcaption); + WEL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Wire Extensometer Link') == 1 + if WEL == 0 + EE = Section(); + end + sezWireExtensometer = Heading3('Wire Extensometer Link'); + sezWireExtensometer.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE.Title = sezWireExtensometer; + text = Paragraph(['Wire Extensometer Link is an analog wire extensometer sensor, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. The device is placed in specific areas where fissures are observed, by installing the '... + 'base on one side and fixing the wire on the other one. The aim is to determine the crack opening/closing '... + 'according to the wire length variation.']); + if WEL == 0 + text.HAlign = 'justify'; + add(EE,text); + imgKL = Image(('wire.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Wire Extensometer Link sensor (source: Earth System)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE,KEcaption); + WEL = 1; + end + break + end + end + end + end + add(appendice,EE); +end + +% --- MultiPoint Borehole Extensometer --- +if sum(yesMPBEL) >= 1 + MPBEL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Multi Point Borehole Extensometer Link') == 1 + if MPBEL == 0 + EE = Section(); + end + sezMPBEL = Heading3('Multi Point Borehole Rod Extensometer'); + sezMPBEL.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE.Title = sezMPBEL; + text = Paragraph(['Multi Point Borehole Extensometer Link is an analog multi point borehole rod extensometer (MPBX) '... + 'sensor, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. The device is placed inside radial drilling and it features one or more anchors in different positions. '... + 'The tool allow to determine the ares experiencing higher deformations by comparing data coming from different anchors.']); + if MPBEL == 0 + text.HAlign = 'justify'; + add(EE,text); + imgKL = Image(('MPBEL.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Multi Point Borehole Extensometer Link (source: Earth System)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE,KEcaption); + MPBEL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Multi Point Borehole Extensometer Link') == 1 + if MPBEL == 0 + EE = Section(); + end + sezMPBEL = Heading3('Multi Point Borehole Rod Extensometer'); + sezMPBEL.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE.Title = sezMPBEL; + text = Paragraph(['Multi Point Borehole Extensometer Link is an analog multi point borehole rod extensometer (MPBX) '... + 'sensor, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. The device is placed inside radial drilling and it features one or more anchors in different positions. '... + 'The tool allow to determine the ares experiencing higher deformations by comparing data coming from different anchors.']); + if MPBEL == 0 + text.HAlign = 'justify'; + add(EE,text); + imgKL = Image(('MPBEL.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Multi Point Borehole Extensometer Link (source: Earth System)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE,KEcaption); + MPBEL = 1; + end + break + end + end + end + end + add(appendice,EE); +end + +add(rpt,appendice); +template(rpt); + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_appendix_ENG function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_ini.m b/ATD/report_ini.m new file mode 100755 index 0000000..67a2664 --- /dev/null +++ b/ATD/report_ini.m @@ -0,0 +1,56 @@ +function [GI_Disp_TL,GI_Date_TL,GI_Prof_TL,GI_Disp_IPL,GI_Date_IPL,GI_Prof_IPL,... + GI_Disp_IPLHR,GI_Date_IPLHR,GI_Prof_IPLHR,GI_Level_PL,GI_Prof_PL,GI_Date_PL,... + GI_Rain_RL,GI_Date_RL,GI_Angolo_KL,GI_Date_KL,GI_Num_KL,GI_Disp_CrL,GI_Date_CrL,... + GI_Num_CrL,PL_A,PL_D,GI_Q1_TuL,GI_Q2_TuL,GI_Q3_TuL,GI_Q4_TuL,GI_Q1_Num_TuL,... + GI_Q2_Num_TuL,GI_Q3_Num_TuL,GI_Q4_Num_TuL,GI_Seg_TuL,GI_NumSeg_TuL,GI_Z_TuL,... + GI_Date_TuL,GI_XYZ_Rad,GI_Num_Rad,GI_dS_RL_MPB,GI_dS_RL_TuL,GI_dS_TuL_RL,... + GI_Date_Rad,GI_Z_PCL,GI_Date_PCL,GI_Date_MPB,GI_dS_MPB,GI_MPB_Base,GI_dS_MPB_RL] = report_ini + +GI_Disp_TL = []; +GI_Date_TL = []; +GI_Prof_TL = []; +GI_Disp_IPL = []; +GI_Date_IPL = []; +GI_Prof_IPL = []; +GI_Disp_IPLHR = []; +GI_Date_IPLHR = []; +GI_Prof_IPLHR = []; +GI_Level_PL = []; +GI_Prof_PL = []; +GI_Date_PL = []; +GI_Rain_RL = []; +GI_Date_RL = []; +GI_Angolo_KL = []; +GI_Date_KL = []; +GI_Num_KL = []; +GI_Disp_CrL = []; +GI_Date_CrL = []; +GI_Num_CrL = []; +PL_A = []; +PL_D = []; +GI_Q1_TuL = []; +GI_Q2_TuL = []; +GI_Q3_TuL = []; +GI_Q4_TuL = []; +GI_Q1_Num_TuL = []; +GI_Q2_Num_TuL = []; +GI_Q3_Num_TuL = []; +GI_Q4_Num_TuL = []; +GI_Seg_TuL = []; +GI_NumSeg_TuL = []; +GI_Z_TuL = []; +GI_Date_TuL = []; +GI_Z_PCL = []; +GI_Date_PCL = []; +GI_Date_MPB = []; +GI_dS_MPB = []; +GI_MPB_Base = []; +GI_dS_MPB_RL = []; +GI_XYZ_Rad = []; +GI_Num_Rad = []; +GI_dS_RL_MPB = []; +GI_dS_RL_TuL = []; +GI_dS_TuL_RL = []; +GI_Date_Rad = []; + +end \ No newline at end of file diff --git a/ATD/report_table.m b/ATD/report_table.m new file mode 100755 index 0000000..c77a6c2 --- /dev/null +++ b/ATD/report_table.m @@ -0,0 +1,600 @@ +function [status,firstdata_num,datasample,colonna1,colonna2,colonna2bis,colonna3,... + colonna4,colonna5,colonna6,colonna6_short,colonna7,yesKLHR3D,c1trigger,c6trigger,cA] = ... + report_table(info_sito,controlsito,tipoarray,tipoalarms,alarms,chainID,Chain_Scheme,... + yesTL,yesTLHR,yesTLH,yesTLHRH,yesPL,yesBL,yesLL,yesRL,yesKL,yesKLHR,yesThL,... + yesPT100,yesIPL,yesIPLHR,yesTuL,yesRaL,yesPCL,yesPCLHR,yesPrL,yesEL,yes3DEL,... + yesWEL,yesMPBEL,yesCrL,yes3DCrL,yesBML,yesHL,yesLuxL,yesCO2,yesRSN,yesRSNHR,yesTrL,... + yesPE,yesWL,yes2DCrL,yesGF,yesGS,rTL,rTLHR,rTLH,rTLHRH,rKL,rKLHR,rIPL,rIPLHR,nCT,... + num_nodi,time,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_table function started'; +fprintf(fileID,fmt,text); + +[rS,~] = size(info_sito); +[~,cCT] = size(controlsito); +rCT = nCT; +status = zeros(rS,1); % Stato dei Tool presenti in sito + +% Riga 1 - ID +for j = 1:rS + coppia = {char(info_sito(j,1)) ' ' char(info_sito(j,2))}; + info = cellstr(strjoin(coppia)); + colonna1(1,j+1) = info; +end +colonna1(1,1) = {'ID'}; +[rA,cA] = size(alarms); +if cA > 1 + for j = 1:rA + IDallarme = {char(alarms(j,2))}; + colonna1(1,rS+1+j) = IDallarme; + end + c1trigger = colonna1{1,rS+2:end}; +else + c1trigger = []; +end +colonna1 = colonna1'; + +% Riga 2 - prima lettura valida disponibile +date_start = '2010-01-01'; % data "artificiale" per trovare la prima lettura +Data(1,1) = cellstr(date_start); +Data(1,2) = cellstr(time); +colonna2(1,1) = {'Prima lettura disponibile [gg-mm-aaaa]'}; +for t = 1:rS + datalogger = num2str(cell2mat((chainID(t,1)))); + array = char(info_sito(t,2)); + comando = ['select statustool_id from tools where unit_ID like ''' ... + datalogger ''' and name like ''' array ''' ']; + status(t,1) = cell2mat(fetch(conn,comando)); + if status(t,1) == 1 % Inactive + colonna2{t+1,1} = 'Strumento non ancora installato o inattivo'; + firstdata_num{t+1,1} = 0; + elseif status(t,1) == 3 % Monitoring Completed + colonna2{t+1,1} = 'Monitoraggio completato'; + firstdata_num{t+1,1} = 0; + elseif status(t,1) == 2 || status(t,1) == 4 % Active o Manual Upload + comando = ['select prod_date from tools where unit_ID like ''' ... + datalogger ''' and name like ''' array ''' ']; + data_ini = fetch(conn,comando); + Datab = datestr(data_ini(1,1),'yyyy-mm-dd HH:MM:SS'); + [rI,cI] = size(Datab); + if rI && cI == 1 + data1b = 0; + else + data1b = datenum(Datab); + end + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + if data1b > data1a + data1 = data1b; + else + data1 = data1a; + end + if data1 == data1a + colonna2{t+1,1} = 'Strumento non ancora installato'; + firstdata_num{t+1,1} = 0; + else + colonna2{t+1,1} = datestr(data1,'dd-mm-yyyy'); + firstdata_num{t+1,1} = data1; % mi serve per definire catena più recente in Centralina + end + else + firstdata_num{t+1,1} = 0; + end +end +if cCT > 1 + for t = 1:rCT + array = char(alarms(t,2)); + comando = ['select EventDate, EventTime from ELABDATACTRL where EventDate > ''' ... + date_start ''' and CtrlToolName = ''' ... + array ''' and NodeNum = 1 ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + Data_num_ini = [cell2mat(D_num_ini(1,1)) repmat(' ', [1,1]) cell2mat(D_num_ini(1,2))]; + [rI,cI] = size(D_num_ini); + if rI && cI == 1 + Data_num_ini = 0; + end + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = datenum(Data_num_ini(1,:)); + if data1b > data1a + data1 = data1b; + else + data1 = data1a; + end + if data1 == data1a + colonna2{t+rS+1,1} = 'Dispositivo non ancora installato'; + firstdata_num{t+1,1} = 0; + else + colonna2{t+rS+1,1} = datestr(data1,'dd-mm-yyyy'); + firstdata_num{t+1,1} = data1; % mi serve per definire catena più recente in Centralina + end + end +end + +% Riga 2 Bis - Lettura di riferimento +date_start = '2010-01-01'; % data "artificiale" per trovare la prima lettura +Data(1,1) = cellstr(date_start); +Data(1,2) = cellstr(time); +colonna2bis(1,1) = {'Lettura di riferimento [gg-mm-aaaa]'}; +for t = 1:rS + if status(t,1) == 1 % Inactive + colonna2bis{t+1,1} = '-'; + elseif status(t,1) == 3 % Monitoring Completed + colonna2bis{t+1,1} = '-'; + elseif status(t,1) == 2 || status(t,1) == 4 % Active o Manual Upload + datalogger = num2str(cell2mat((chainID(t,1)))); + array = char(info_sito(t,2)); + comando = ['select graph_prod_date from tools where unit_ID like ''' datalogger ''' and name like ''' array ''' ']; + data_ini = fetch(conn,comando); + stringa = cell2mat(data_ini); + [~,cS] = size(stringa); + esci = 0; + if cS == 4 + esci = 1; + else + date = stringa(1,1:10); + time = stringa(1,11:21); + clear Datab + Datab(1,1) = cellstr(date); + Datab(1,2) = cellstr(time); + Datab = [cell2mat(Datab(1,1)) repmat(' ', [1,1]) cell2mat(Datab(1,2))]; + data1b = datenum(Datab); + end + if esci == 0 + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + if data1b > data1a + data1 = data1b; + else + data1 = data1a; + end + if data1 == data1a + colonna2bis{t+1,1} = 'Strumento non ancora installato'; + else + colonna2bis{t+1,1} = datestr(data1,'dd-mm-yyyy'); + firstdata_num{t+1,1} = data1; % mi serve per definire catena più recente in Centralina + end + else + colonna2bis{t+1,1} = colonna2{t+1,1}; + end + end +end +if nCT > 0 + for c = 1:nCT + colonna2bis{rS+1+c:rS+c+1,1} = colonna2{rS+1+c:rS+c+1,1}; + end +end + +% Riga 3 - Ultima lettura disponibile +colonna3(1,1) = {'Ultima lettura disponibile [gg-mm-aaaa]'}; +for i = 1:rS + datalogger = char(info_sito(i,1)); + array = char(info_sito(i,2)); + dataU = datestr(today,'yyyy-mm-dd'); + OK = 0; + if status(i,1) == 1 % Inactive + colonna3{i+1,1} = '-'; + datasample{i+1,1} = 9999; + OK = 1; + end + while OK == 0 + % trovo la data dell'ultima lettura disponibile + if strcmp(tipoarray(i),'MUSA') == 1 + comando = ['select EventDate, EventTime from ElabDataMusaView where EventDate >= ''' dataU ''' and UnitName = ''' datalogger... + ''' and ToolNameID = ''' array ''' and NodeNum = 1 ']; + else + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' dataU ''' and UnitName = ''' datalogger... + ''' and ToolNameID = ''' array ''' and NodeNum = 1 ']; + end + curs = exec(conn,comando); + curs = fetch(curs); + Letture = curs.Data; + [~,cu] = size(Letture); + if cu == 1 % nessun dato trovato + dataU = datestr((datenum(dataU) - 1),'yyyy-mm-dd'); % provo con la data precedente + else + dataUL = datestr(dataU,'dd-mm-yyyy'); + datasample{i+1,1} = datenum(dataU); % date numeriche per scegliere, a partità di centralina, la catena con i dati più recenti + colonna3{i+1,1} = dataUL; + OK = 1; + end + end +end +if cCT > 1 + for t = 1:rCT + array = char(alarms(t,2)); + comando = ['select EventDate, EventTime from ELABDATACTRL where EventDate > ''' ... + date_start ''' and CtrlToolName = ''' ... + array ''' and NodeNum = 1 ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + Data_num_ini = [cell2mat(D_num_ini(end,1)) repmat(' ', [1,1]) cell2mat(D_num_ini(end,2))]; + [rI,cI] = size(D_num_ini); + if rI && cI == 1 + Data_num_ini = 0; + end + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = datenum(Data_num_ini(1,:)); + if data1b > data1a + data1 = data1b; + else + data1 = data1a; + end + if data1 == data1a + colonna3{t+rS+1,1} = 'Dispositivo non ancora installato'; + else + colonna3{t+rS+1,1} = datestr(data1,'dd-mm-yyyy'); + end + end +end + +% Riga 4 - tipologia catena +colonna4(1,1) = {'Tipologia di Array'}; +colonna4 = [colonna4, tipoarray']; +if cCT > 1 + colonna4 = [colonna4, tipoalarms']; +end +colonna4 = colonna4'; + +% Riga 5 - Lunghezza catena +colonna5(1,1) = {'Lunghezza [m]'}; +c = 0; +for k = 1:rS + L(k+1,1) = max(cell2mat(Chain_Scheme(:,2+c))); + conv2 = num2str(L(k+1,1)); + [~,cc2] = size(conv2); + corretto = 0; + for cc = 1:cc2 + if strcmp(conv2(cc),'.') % Cerco la virgola + corretto = 1; % Significa che ho trovato la virgola + if cc == cc2-1 % Un solo decimale + conv2 =[conv2 '0']; + break + end + end + end + if corretto == 0 + conv2 = [conv2 '.00']; + end + colonna5(k+1,1) = {conv2}; + if strcmp(colonna5(k+1,1),'0') || strcmp(colonna5(k+1,1),'0.00') + colonna5(k+1,1) = cellstr('-'); + end + c = c+3; +end +if cCT > 1 + colonna5(rS+2:rS+rCT+1,1) = cellstr('-'); +end + +% Riga 6 - tipologia sensori +colonna6(1,1) = {'Tipologia di sensori o dispositivi'}; +colonna6_short(1,1) = {'Tipologia di sensori o dispositivi'}; +for nn = 1:rS + s = 1; % conta sensori di tipo diverso + if yesTL(nn) == 1 % Tilt Link V + if yesTLHR(nn) == 1 % se ho Tilt Link HR elimino Tilt Link dalla lista + if rTL(nn) == rTLHR(nn) + riga6temp(s,1) = {'Tilt Link HR 3D V'}; + riga6short(s,1) = {'Tilt Link HR 3D V'}; + else + riga6temp(s,1) = {'Tilt Link V'}; + riga6short(s,1) = {'Tilt Link V'}; + end + else + riga6temp(s,1) = {'Tilt Link V'}; + riga6short(s,1) = {'Tilt Link V'}; + end + s = s+1; + end + if yesTLHR(nn) == 1 % Tilt Link HR V + if yesTL(nn) ~= 1 % Tilt Link V + riga6temp(s,1) = {'Tilt Link HR V'}; + riga6short(s,1) = {'Tilt Link HR V'}; + s = s+1; + end + end + if yesTLH(nn) == 1 % Tilt Link H + if yesTLHRH(nn) == 1 % se ho Tilt Link HR H elimino Tilt Link H dalla lista + if rTLH(nn) == rTLHRH(nn) + riga6temp(s,1) = {'Tilt Link HR 3D H'}; + riga6short(s,1) = {'Tilt Link HR 3D H'}; + else + riga6temp(s,1) = {'Tilt Link H'}; + riga6short(s,1) = {'Tilt Link H'}; + end + else + riga6temp(s,1) = {'Tilt Link H'}; + riga6short(s,1) = {'Tilt Link H'}; + end + s = s+1; + end + if yesTLHRH(nn) == 1 % Tilt Link HR H + if yesTLH(nn) ~= 1 % Tilt Link H + riga6temp(s,1) = {'Tilt Link HR H'}; + riga6short(s,1) = {'Tilt Link HR H'}; + s = s+1; + end + end + if yesPL(nn) == 1 % Piezo Link + riga6temp(s,1) = {'Piezo Link'}; + riga6short(s,1) = {'Piezo Link'}; + s = s+1; + end + if yesBL(nn) == 1 || yesBML(nn) == 1 % Baro Link (normale o MUSA) + riga6temp(s,1) = {'Baro Link'}; + riga6short(s,1) = {'Baro Link'}; + s = s+1; + end + if yesLL(nn) == 1 % Load Link + riga6temp(s,1) = {'Load Link'}; + riga6short(s,1) = {'Load Link'}; + s = s+1; + end + if yesRL(nn) == 1 % Rain Link + riga6temp(s,1) = {'Rain Link'}; + riga6short(s,1) = {'Rain Link'}; + s = s+1; + end + if yesKL(nn) == 1 % Klino Link + if yesKLHR(nn) == 1 % se ho Klino Link HR elimino Klino Link dalla lista + if rKL(nn) == rKLHR(nn) + yesKLHR3D(nn,1) = 1; + riga6temp(s,1) = {'Klino Link HR 3D'}; + riga6short(s,1) = {'Klino Link HR 3D'}; + else + yesKLHR3D(nn,1) = 0; + riga6temp(s,1) = {'Klino Link'}; + riga6short(s,1) = {'Klino Link'}; + end + else + yesKLHR3D(nn,1) = 0; + riga6temp(s,1) = {'Klino Link'}; + riga6short(s,1) = {'Klino Link'}; + end + s = s+1; + else + yesKLHR3D(nn,1) = 0; + end + if yesKLHR(nn) == 1 % Klino Link HR + if yesKL(nn) ~= 1 % Klino Link + riga6temp(s,1) = {'Klino Link HR'}; + riga6short(s,1) = {'Klino Link HR'}; + s = s+1; + end + end + if yesThL(nn) == 1 % Therm Link + riga6temp(s,1) = {'Therm Link'}; + riga6short(s,1) = {'Therm Link'}; + s = s+1; + end + if yesPT100(nn) == 1 % PT100 Link + riga6temp(s,1) = {'PT100 Link'}; + riga6short(s,1) = {'PT100 Link'}; + s = s+1; + end + if yesIPL(nn) == 1 % In Place Link + if yesIPLHR(nn) == 1 % se ho In Place Link HR elimino In Place Link dalla lista + if rIPL(nn) == rIPLHR(nn) + riga6temp(s,1) = {'In Place Link HR 3D'}; + riga6short(s,1) = {'IP Link HR 3D'}; + else + riga6temp(s,1) = {'In Place Link'}; + riga6short(s,1) = {'In Place Link'}; + end + else + riga6temp(s,1) = {'In Place Link'}; + riga6short(s,1) = {'In Place Link'}; + end + s = s+1; + end + if yesIPLHR(nn) == 1 % In Place Link HR + if yesIPL(nn) ~= 1 % In Place Link + riga6temp(s,1) = {'In Place Link HR'}; + riga6short(s,1) = {'IP Link HR'}; + s = s+1; + end + end + if yesTuL(nn) == 1 % Tunnel Link + riga6temp(s,1) = {'Tunnel Link'}; + riga6short(s,1) = {'Tunnel Link'}; + s = s+1; + end + if yesRaL(nn) == 1 % Radial Link + riga6temp(s,1) = {'Radial Link'}; + riga6short(s,1) = {'Radial Link'}; + s = s+1; + end + if yesPCL(nn) == 1 % PreConv Link + if yesPCLHR(nn) == 1 % se ho PreConv Link HR elimino PreConv Link dalla lista + if rPCL(nn) == rPCLHR(nn) + riga6temp(s,1) = {'PreConv Link HR 3D'}; + riga6short(s,1) = {'PC Link HR 3D'}; + else + riga6temp(s,1) = {'PreConv Link'}; + riga6short(s,1) = {'PreConv Link'}; + end + else + riga6temp(s,1) = {'PreConv Link'}; + riga6short(s,1) = {'PreConv Link'}; + end + s = s+1; + end + if yesPCLHR(nn) == 1 % PreConv Link HR + if yesPCL(nn) ~= 1 % PreConv Link + riga6temp(s,1) = {'PreConv Link HR'}; + riga6short(s,1) = {'PC Link HR'}; + s = s+1; + end + end + if yesPrL(nn) == 1 % Pressure Link + riga6temp(s,1) = {'Pressure Link'}; + riga6short(s,1) = {'Press. Link'}; + s = s+1; + end + if yesEL(nn) == 1% Extensometer Link + riga6temp(s,1) = {'Extensometer Link'}; + riga6short(s,1) = {'Extens. Link'}; + s = s+1; + end + if yes3DEL(nn) == 1 % 3D Extensometer Link + riga6temp(s,1) = {'3D Extensometer Link'}; + riga6short(s,1) = {'3D Ext. Link'}; + s = s+1; + end + if yesWEL(nn) == 1 % Wire Extensometer Link + riga6temp(s,1) = {'Wire Extensometer Link'}; + riga6short(s,1) = {'Wire Ex. Link'}; + s = s+1; + end + if yesMPBEL(nn) == 1 % Multi Point Borehole Extensometer Link + riga6temp(s,1) = {'Multi Point Borehole Extensometer Link'}; + riga6short(s,1) = {'MPBX Link'}; + s = s+1; + end + if yesCrL(nn) == 1 % Crack Link + riga6temp(s,1) = {'Crack Link'}; + riga6short(s,1) = {'Crack Link'}; + s = s+1; + end + if yes2DCrL(nn) == 1 % 2D Crack Link + riga6temp(s,1) = {'2D Crack Link'}; + riga6short(s,1) = {'2D Crack Link'}; + s = s+1; + end + if yes3DCrL(nn) == 1 % 3D Crack Link + riga6temp(s,1) = {'3D Crack Link'}; + riga6short(s,1) = {'3D Cr. Link'}; + s = s+1; + end + if yesHL(nn) == 1 % Humidity Link + riga6temp(s,1) = {'Humidity Link'}; + riga6short(s,1) = {'Humidity Link'}; + s = s+1; + end + if yesLuxL(nn) == 1 % Lux Link + riga6temp(s,1) = {'Lux Link'}; + riga6short(s,1) = {'Lux Link'}; + s = s+1; + end + if yesCO2(nn) == 1 % CO2 Link + riga6temp(s,1) = {'CO2 Link'}; + riga6short(s,1) = {'CO2 Link'}; + s = s+1; + end + if yesRSN(nn) == 1 % RSN Link + if yesRSNHR(nn) == 1 % se ho RSN Link HR elimino RSN Link dalla lista + if rPRSN(nn) == rRSNHR(nn) + riga6temp(s,1) = {'RSN Link HR 3D'}; + riga6short(s,1) = {'RSN Link HR 3D'}; + else + riga6temp(s,1) = {'RSN Link'}; + riga6short(s,1) = {'RSN Link'}; + end + else + riga6temp(s,1) = {'RSN Link'}; + riga6short(s,1) = {'RSN Link'}; + end + s = s+1; + end + if yesRSNHR(nn) == 1 % RSN Link HR + if yesRSN(nn) ~= 1 % RSN Link + riga6temp(s,1) = {'RSN Link HR'}; + riga6short(s,1) = {'RSN Link HR'}; + s = s+1; + end + end + if yesTrL(nn) == 1 % Trigger Link + riga6temp(s,1) = {'Trigger Link'}; + riga6short(s,1) = {'Trigger Link'}; + s = s+1; + end + if yesPE(nn) == 1 % Pendulum + riga6temp(s,1) = {'Pendulum'}; + riga6short(s,1) = {'Pendulum'}; + s = s+1; + end + if yesWL(nn) == 1 % Weir Link + riga6temp(s,1) = {'Weir Link'}; + riga6short(s,1) = {'Weir Link'}; + s = s+1; + end + if yesGF(nn) == 1 % G-Flow Link + riga6temp(s,1) = {'G-Flow Link'}; + riga6short(s,1) = {'G-Flow Link'}; + s = s+1; + end + if yesGS(nn) == 1 % G-Shock Link + riga6temp(s,1) = {'G-Shock Link'}; + riga6short(s,1) = {'G-Shock Link'}; + s = s+1; + end + if s == 2 + colonna6(1,nn+1) = riga6temp(:,1); + colonna6_short(1,nn+1) = riga6short(:,1); + clear riga6temp + clear riga6short + else + colonna6{1,nn+1} = splitlines(strjoin(cellstr(riga6temp(:,1)), '\n')); + colonna6_short{1,nn+1} = splitlines(strjoin(cellstr(riga6short(:,1)), '\n')); + clear riga6temp; + clear riga6short + end +end +if cCT > 1 + ct = 1; % conta dispositivi di tipo diverso + for mm = 1:nCT + if strcmp(char(tipoalarms(mm)),'Variable Message System') + CTtemp(ct,1) = {'Pannello a messaggio variabile'}; + CTtemp_short(ct,1) = {'PMV'}; + ct = ct +1; + elseif strcmp(char(tipoalarms(mm)),'Traffic Lights') + CTtemp(ct,1) = {'Impianto semaforico'}; + CTtemp_short(ct,1) = {'Semafori'}; + ct = ct +1; + elseif strcmp(char(tipoalarms(mm)),'Alarms') + CTtemp(ct,1) = {'Allarme acustico e/o visivo'}; + CTtemp_short(ct,1) = {'Sistema di Allarme'}; + ct = ct +1; + elseif strcmp(char(tipoalarms(mm)),'Camera') + CTtemp(ct,1) = {'Camera'}; + CTtemp_short(ct,1) = {'Camera'}; + ct = ct +1; + end + colonna6{1,rS+1+mm} = strjoin(cellstr(CTtemp(mm,1)), ', '); + colonna6_short{1,rS+1+mm} = strjoin(cellstr(CTtemp_short(mm,1)), ', '); + end + c6trigger = colonna6{1,rS+2:end}; +else + c6trigger = []; + clear CTtemp +end +colonna6 = colonna6'; +colonna6_short = colonna6_short'; + +% Riga 7 - numero sensori +colonna7(1,1)={'Numero di sensori o dispositivi'}; +for s = 1:rS + if strcmp(cellstr(colonna4(s+1,1)),'Vertical Array') || strcmp(cellstr(colonna4(s+1,1)),'In Place Array')... + || strcmp(cellstr(colonna4(s+1,1)),'Therm Array') || strcmp(cellstr(colonna4(s+1,1)),'Piezo Array')... + || strcmp(cellstr(colonna4(s+1,1)),'Cir Array') || strcmp(cellstr(colonna4(s+1,1)),'Rad Array')... + || strcmp(cellstr(colonna4(s+1,1)),'PreConv Array') || strcmp(cellstr(colonna4(s+1,1)),'Horizontal Array')... + || strcmp(cellstr(colonna4(s+1,1)),'Vertical Array Structure') + colonna7(s+1,1) = cellstr(num2str(num_nodi(s,1)-1)); + else + colonna7(s+1,1) = cellstr(num2str(num_nodi(s,1))); + end +end +if cCT > 1 + colonna7(rS+2:rS+1+rCT) = cellstr('1'); +end + +text = 'report_table function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/report_table_ENG.m b/ATD/report_table_ENG.m new file mode 100755 index 0000000..f1c4818 --- /dev/null +++ b/ATD/report_table_ENG.m @@ -0,0 +1,602 @@ +function [status,firstdata_num,datasample,colonna1,colonna2,colonna2bis,colonna3,... + colonna4,colonna5,colonna6,colonna6_short,colonna7,yesKLHR3D,c1trigger,c6trigger,cA]... + = report_table_ENG(info_sito,controlsito,tipoarray,tipoalarms,alarms,chainID,Chain_Scheme,... + yesTL,yesTLHR,yesTLH,yesTLHRH,yesPL,yesBL,yesLL,yesRL,yesKL,yesKLHR,yesThL,... + yesPT100,yesIPL,yesIPLHR,yesTuL,yesRaL,yesPCL,yesPCLHR,yesPrL,yesEL,yes3DEL,... + yesWEL,yesMPBEL,yesCrL,yes3DCrL,yesBML,yesHL,yesLuxL,yesCO2,yesRSN,yesRSNHR,yesTrL,... + yesPE,yesWL,yes2DCrL,yesGF,yesGS,rTL,rTLHR,rTLH,rTLHRH,rKL,rKLHR,rIPL,rIPLHR,nCT,... + num_nodi,time,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_table_ENG started executed'; +fprintf(fileID,fmt,text); + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_table_ENG function started'; +fprintf(fileID,fmt,text); + +[rS,~] = size(info_sito); +[~,cCT] = size(controlsito); +rCT = nCT; +status = zeros(rS,1); % Stato dei Tool presenti in sito + +% Riga 1 - ID +for j = 1:rS + coppia = {char(info_sito(j,1)) ' ' char(info_sito(j,2))}; + info = cellstr(strjoin(coppia)); + colonna1(1,j+1) = info; +end +colonna1(1,1) = {'ID'}; +[rA,cA] = size(alarms); +if cA > 1 + for j = 1:rA + IDallarme = {char(alarms(j,2))}; + colonna1(1,rS+1+j) = IDallarme; + end + c1trigger = colonna1{1,rS+2:end}; +else + c1trigger = []; +end +colonna1 = colonna1'; + +% Riga 2 - prima lettura valida disponibile +date_start = '2010-01-01'; % data "artificiale" per trovare la prima lettura +Data(1,1) = cellstr(date_start); +Data(1,2) = cellstr(time); +colonna2(1,1) = {'First available reading date [dd-mm-yyyy]'}; +for t = 1:rS + datalogger = num2str(cell2mat((chainID(t,1)))); + array = char(info_sito(t,2)); + comando = ['select statustool_id from tools where unit_ID like ''' ... + datalogger ''' and name like ''' array ''' ']; + status(t,1) = cell2mat(fetch(conn,comando)); + if status(t,1) == 1 % Inactive + colonna2{t+1,1} = 'Tool not installed or inactive'; + firstdata_num{t+1,1} = 0; + elseif status(t,1) == 3 % Monitoring Completed + colonna2{t+1,1} = 'Monitoring Completed'; + firstdata_num{t+1,1} = 0; + elseif status(t,1) == 2 || status(t,1) == 4 % Active o Manual Upload + comando = ['select prod_date from tools where unit_ID like ''' ... + datalogger ''' and name like ''' array ''' ']; + data_ini = fetch(conn,comando); + Datab = datestr(data_ini(1,1),'yyyy-mm-dd HH:MM:SS'); + [rI,cI] = size(Datab); + if rI && cI == 1 + data1b = 0; + else + data1b = datenum(Datab); + end + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + if data1b > data1a + data1 = data1b; + else + data1 = data1a; + end + if data1 == data1a + colonna2{t+1,1} = 'Tool not installed'; + firstdata_num{t+1,1} = 0; + else + colonna2{t+1,1} = datestr(data1,'dd-mm-yyyy'); + firstdata_num{t+1,1} = data1; % mi serve per definire catena più recente in Centralina + end + else + firstdata_num{t+1,1} = 0; + end +end +if cCT > 1 + for t = 1:rCT + array = char(alarms(t,2)); + comando = ['select EventDate, EventTime from ELABDATACTRL where EventDate > ''' ... + date_start ''' and CtrlToolName = ''' ... + array ''' and NodeNum = 1 ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + Data_num_ini = [cell2mat(D_num_ini(1,1)) repmat(' ', [1,1]) cell2mat(D_num_ini(1,2))]; + [rI,cI] = size(D_num_ini); + if rI && cI == 1 + Data_num_ini = 0; + end + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = datenum(Data_num_ini(1,:)); + if data1b > data1a + data1 = data1b; + else + data1 = data1a; + end + if data1 == data1a + colonna2{t+rS+1,1} = 'Device not installed'; + firstdata_num{t+1,1} = 0; + else + colonna2{t+rS+1,1} = datestr(data1,'dd-mm-yyyy'); + firstdata_num{t+1,1} = data1; % mi serve per definire catena più recente in Centralina + end + end +end + +% Riga 2 Bis - Lettura di riferimento +date_start = '2010-01-01'; % data "artificiale" per trovare la prima lettura +Data(1,1) = cellstr(date_start); +Data(1,2) = cellstr(time); +colonna2bis(1,1) = {'Reference reading date [dd-mm-yyyy]'}; +for t = 1:rS + if status(t,1) == 1 % Inactive + colonna2bis{t+1,1} = '-'; + elseif status(t,1) == 3 % Monitoring Completed + colonna2bis{t+1,1} = '-'; + elseif status(t,1) == 2 || status(t,1) == 4 % Active o Manual Upload + datalogger = num2str(cell2mat((chainID(t,1)))); + array = char(info_sito(t,2)); + comando = ['select graph_prod_date from tools where unit_ID like ''' datalogger ''' and name like ''' array ''' ']; + data_ini = fetch(conn,comando); + stringa = cell2mat(data_ini); + [~,cS] = size(stringa); + esci = 0; + if cS == 4 + esci = 1; + else + date = stringa(1,1:10); + time = stringa(1,11:21); + clear Datab + Datab(1,1) = cellstr(date); + Datab(1,2) = cellstr(time); + Datab = [cell2mat(Datab(1,1)) repmat(' ', [1,1]) cell2mat(Datab(1,2))]; + data1b = datenum(Datab); + end + if esci == 0 + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + if data1b > data1a + data1 = data1b; + else + data1 = data1a; + end + if data1 == data1a + colonna2bis{t+1,1} = 'Tool not installed'; + else + colonna2bis{t+1,1} = datestr(data1,'dd-mm-yyyy'); + firstdata_num{t+1,1} = data1; % mi serve per definire catena più recente in Centralina + end + else + colonna2bis{t+1,1} = colonna2{t+1,1}; + end + end +end +if nCT > 0 + for c = 1:nCT + colonna2bis{rS+1+c:rS+c+1,1} = colonna2{rS+1+c:rS+c+1,1}; + end +end + +% Riga 3 - Ultima lettura disponibile +colonna3(1,1) = {'Last available reading date [dd-mm-yyyy]'}; +for i = 1:rS + datalogger = char(info_sito(i,1)); + array = char(info_sito(i,2)); + dataU = datestr(today,'yyyy-mm-dd'); + OK = 0; + if status(i,1) == 1 % Inactive + colonna3{i+1,1} = '-'; + datasample{i+1,1} = 9999; + OK = 1; + end + while OK == 0 + % trovo la data dell'ultima lettura disponibile + if strcmp(tipoarray(i),'MUSA') == 1 + comando = ['select EventDate, EventTime from ElabDataMusaView where EventDate >= ''' dataU ''' and UnitName = ''' datalogger... + ''' and ToolNameID = ''' array ''' and NodeNum = 1 ']; + else + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' dataU ''' and UnitName = ''' datalogger... + ''' and ToolNameID = ''' array ''' and NodeNum = 1 ']; + end + curs = exec(conn,comando); + curs = fetch(curs); + Letture = curs.Data; + [~,cu] = size(Letture); + if cu == 1 % nessun dato trovato + dataU = datestr((datenum(dataU) - 1),'yyyy-mm-dd'); % provo con la data precedente + else + dataUL = datestr(dataU,'dd-mm-yyyy'); + datasample{i+1,1} = datenum(dataU); % date numeriche per scegliere, a partità di centralina, la catena con i dati più recenti + colonna3{i+1,1} = dataUL; + OK = 1; + end + end +end +if cCT > 1 + for t = 1:rCT + array = char(alarms(t,2)); + comando = ['select EventDate, EventTime from ELABDATACTRL where EventDate > ''' ... + date_start ''' and CtrlToolName = ''' ... + array ''' and NodeNum = 1 ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + Data_num_ini = [cell2mat(D_num_ini(end,1)) repmat(' ', [1,1]) cell2mat(D_num_ini(end,2))]; + [rI,cI] = size(D_num_ini); + if rI && cI == 1 + Data_num_ini = 0; + end + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = datenum(Data_num_ini(1,:)); + if data1b > data1a + data1 = data1b; + else + data1 = data1a; + end + if data1 == data1a + colonna3{t+rS+1,1} = 'Device not installed'; + else + colonna3{t+rS+1,1} = datestr(data1,'dd-mm-yyyy'); + end + end +end + +% Riga 4 - tipologia catena +colonna4(1,1) = {'Array typology'}; +colonna4 = [colonna4, tipoarray']; +if cCT > 1 + colonna4 = [colonna4, tipoalarms']; +end +colonna4 = colonna4'; + +% Riga 5 - Lunghezza catena +colonna5(1,1) = {'Length [m]'}; +c = 0; +for k = 1:rS + L(k+1,1) = max(cell2mat(Chain_Scheme(:,2+c))); + conv2 = num2str(L(k+1,1)); + [~,cc2] = size(conv2); + corretto = 0; + for cc = 1:cc2 + if strcmp(conv2(cc),'.') % Cerco la virgola + corretto = 1; % Significa che ho trovato la virgola + if cc == cc2-1 % Un solo decimale + conv2 =[conv2 '0']; + break + end + end + end + if corretto == 0 + conv2 = [conv2 '.00']; + end + colonna5(k+1,1) = {conv2}; + if strcmp(colonna5(k+1,1),'0') || strcmp(colonna5(k+1,1),'0.00') + colonna5(k+1,1) = cellstr('-'); + end + c = c+3; +end +if cCT > 1 + colonna5(rS+2:rS+rCT+1,1) = cellstr('-'); +end + +% Riga 6 - tipologia sensori +colonna6(1,1) = {'Typology of sensors/devices'}; +colonna6_short(1,1) = {'Typology of sensors/devices'}; +for nn = 1:rS + s = 1; % conta sensori di tipo diverso + if yesTL(nn) == 1 % Tilt Link V + if yesTLHR(nn) == 1 % se ho Tilt Link HR elimino Tilt Link dalla lista + if rTL(nn) == rTLHR(nn) + riga6temp(s,1) = {'Tilt Link HR 3D V'}; + riga6short(s,1) = {'Tilt Link HR 3D V'}; + else + riga6temp(s,1) = {'Tilt Link V'}; + riga6short(s,1) = {'Tilt Link V'}; + end + else + riga6temp(s,1) = {'Tilt Link V'}; + riga6short(s,1) = {'Tilt Link V'}; + end + s = s+1; + end + if yesTLHR(nn) == 1 % Tilt Link HR V + if yesTL(nn) ~= 1 % Tilt Link V + riga6temp(s,1) = {'Tilt Link HR V'}; + riga6short(s,1) = {'Tilt Link HR V'}; + s = s+1; + end + end + if yesTLH(nn) == 1 % Tilt Link H + if yesTLHRH(nn) == 1 % se ho Tilt Link HR H elimino Tilt Link H dalla lista + if rTLH(nn) == rTLHRH(nn) + riga6temp(s,1) = {'Tilt Link HR 3D H'}; + riga6short(s,1) = {'Tilt Link HR 3D H'}; + else + riga6temp(s,1) = {'Tilt Link H'}; + riga6short(s,1) = {'Tilt Link H'}; + end + else + riga6temp(s,1) = {'Tilt Link H'}; + riga6short(s,1) = {'Tilt Link H'}; + end + s = s+1; + end + if yesTLHRH(nn) == 1 % Tilt Link HR H + if yesTLH(nn) ~= 1 % Tilt Link H + riga6temp(s,1) = {'Tilt Link HR H'}; + riga6short(s,1) = {'Tilt Link HR H'}; + s = s+1; + end + end + if yesPL(nn) == 1 % Piezo Link + riga6temp(s,1) = {'Piezo Link'}; + riga6short(s,1) = {'Piezo Link'}; + s = s+1; + end + if yesBL(nn) == 1 || yesBML(nn) == 1 % Baro Link (normale o MUSA) + riga6temp(s,1) = {'Baro Link'}; + riga6short(s,1) = {'Baro Link'}; + s = s+1; + end + if yesLL(nn) == 1 % Load Link + riga6temp(s,1) = {'Load Link'}; + riga6short(s,1) = {'Load Link'}; + s = s+1; + end + if yesRL(nn) == 1 % Rain Link + riga6temp(s,1) = {'Rain Link'}; + riga6short(s,1) = {'Rain Link'}; + s = s+1; + end + if yesKL(nn) == 1 % Klino Link + if yesKLHR(nn) == 1 % se ho Klino Link HR elimino Klino Link dalla lista + if rKL(nn) == rKLHR(nn) + yesKLHR3D(nn,1) = 1; + riga6temp(s,1) = {'Klino Link HR 3D'}; + riga6short(s,1) = {'Klino Link HR 3D'}; + else + yesKLHR3D(nn,1) = 0; + riga6temp(s,1) = {'Klino Link'}; + riga6short(s,1) = {'Klino Link'}; + end + else + yesKLHR3D(nn,1) = 0; + riga6temp(s,1) = {'Klino Link'}; + riga6short(s,1) = {'Klino Link'}; + end + s = s+1; + else + yesKLHR3D(nn,1) = 0; + end + if yesKLHR(nn) == 1 % Klino Link HR + if yesKL(nn) ~= 1 % Klino Link + riga6temp(s,1) = {'Klino Link HR'}; + riga6short(s,1) = {'Klino Link HR'}; + s = s+1; + end + end + if yesThL(nn) == 1 % Therm Link + riga6temp(s,1) = {'Therm Link'}; + riga6short(s,1) = {'Therm Link'}; + s = s+1; + end + if yesPT100(nn) == 1 % PT100 Link + riga6temp(s,1) = {'PT100 Link'}; + riga6short(s,1) = {'PT100 Link'}; + s = s+1; + end + if yesIPL(nn) == 1 % In Place Link + if yesIPLHR(nn) == 1 % se ho In Place Link HR elimino In Place Link dalla lista + if rIPL(nn) == rIPLHR(nn) + riga6temp(s,1) = {'In Place Link HR 3D'}; + riga6short(s,1) = {'IP Link HR 3D'}; + else + riga6temp(s,1) = {'In Place Link'}; + riga6short(s,1) = {'In Place Link'}; + end + else + riga6temp(s,1) = {'In Place Link'}; + riga6short(s,1) = {'In Place Link'}; + end + s = s+1; + end + if yesIPLHR(nn) == 1 % In Place Link HR + if yesIPL(nn) ~= 1 % In Place Link + riga6temp(s,1) = {'In Place Link HR'}; + riga6short(s,1) = {'IP Link HR'}; + s = s+1; + end + end + if yesTuL(nn) == 1 % Tunnel Link + riga6temp(s,1) = {'Tunnel Link'}; + riga6short(s,1) = {'Tunnel Link'}; + s = s+1; + end + if yesRaL(nn) == 1 % Radial Link + riga6temp(s,1) = {'Radial Link'}; + riga6short(s,1) = {'Radial Link'}; + s = s+1; + end + if yesPCL(nn) == 1 % PreConv Link + if yesPCLHR(nn) == 1 % se ho PreConv Link HR elimino PreConv Link dalla lista + if rPCL(nn) == rPCLHR(nn) + riga6temp(s,1) = {'PreConv Link HR 3D'}; + riga6short(s,1) = {'PC Link HR 3D'}; + else + riga6temp(s,1) = {'PreConv Link'}; + riga6short(s,1) = {'PreConv Link'}; + end + else + riga6temp(s,1) = {'PreConv Link'}; + riga6short(s,1) = {'PreConv Link'}; + end + s = s+1; + end + if yesPCLHR(nn) == 1 % PreConv Link HR + if yesPCL(nn) ~= 1 % PreConv Link + riga6temp(s,1) = {'PreConv Link HR'}; + riga6short(s,1) = {'PC Link HR'}; + s = s+1; + end + end + if yesPrL(nn) == 1 % Pressure Link + riga6temp(s,1) = {'Pressure Link'}; + riga6short(s,1) = {'Press. Link'}; + s = s+1; + end + if yesEL(nn) == 1% Extensometer Link + riga6temp(s,1) = {'Extensometer Link'}; + riga6short(s,1) = {'Extens. Link'}; + s = s+1; + end + if yes3DEL(nn) == 1 % 3D Extensometer Link + riga6temp(s,1) = {'3D Extensometer Link'}; + riga6short(s,1) = {'3D Ext. Link'}; + s = s+1; + end + if yesWEL(nn) == 1 % Wire Extensometer Link + riga6temp(s,1) = {'Wire Extensometer Link'}; + riga6short(s,1) = {'Wire Ex. Link'}; + s = s+1; + end + if yesMPBEL(nn) == 1 % Multi Point Borehole Extensometer Link + riga6temp(s,1) = {'Multi Point Borehole Extensometer Link'}; + riga6short(s,1) = {'MPBX Link'}; + s = s+1; + end + if yesCrL(nn) == 1 % Crack Link + riga6temp(s,1) = {'Crack Link'}; + riga6short(s,1) = {'Crack Link'}; + s = s+1; + end + if yes2DCrL(nn) == 1 % 2D Crack Link + riga6temp(s,1) = {'2D Crack Link'}; + riga6short(s,1) = {'2D Crack Link'}; + s = s+1; + end + if yes3DCrL(nn) == 1 % 3D Crack Link + riga6temp(s,1) = {'3D Crack Link'}; + riga6short(s,1) = {'3D Cr. Link'}; + s = s+1; + end + if yesHL(nn) == 1 % Humidity Link + riga6temp(s,1) = {'Humidity Link'}; + riga6short(s,1) = {'Humidity Link'}; + s = s+1; + end + if yesLuxL(nn) == 1 % Lux Link + riga6temp(s,1) = {'Lux Link'}; + riga6short(s,1) = {'Lux Link'}; + s = s+1; + end + if yesCO2(nn) == 1 % CO2 Link + riga6temp(s,1) = {'CO2 Link'}; + riga6short(s,1) = {'CO2 Link'}; + s = s+1; + end + if yesRSN(nn) == 1 % RSN Link + if yesRSNHR(nn) == 1 % se ho RSN Link HR elimino RSN Link dalla lista + if rPRSN(nn) == rRSNHR(nn) + riga6temp(s,1) = {'RSN Link HR 3D'}; + riga6short(s,1) = {'RSN Link HR 3D'}; + else + riga6temp(s,1) = {'RSN Link'}; + riga6short(s,1) = {'RSN Link'}; + end + else + riga6temp(s,1) = {'RSN Link'}; + riga6short(s,1) = {'RSN Link'}; + end + s = s+1; + end + if yesRSNHR(nn) == 1 % RSN Link HR + if yesRSN(nn) ~= 1 % RSN Link + riga6temp(s,1) = {'RSN Link HR'}; + riga6short(s,1) = {'RSN Link HR'}; + s = s+1; + end + end + if yesTrL(nn) == 1 % Trigger Link + riga6temp(s,1) = {'Trigger Link'}; + riga6short(s,1) = {'Trigger Link'}; + end + if yesPE(nn) == 1 % Pendulum + riga6temp(s,1) = {'Pendulum'}; + riga6short(s,1) = {'Pendulum'}; + end + if yesWL(nn) == 1 % Weir Link + riga6temp(s,1) = {'Weir Link'}; + riga6short(s,1) = {'Weir Link'}; + end + if yesGF(nn) == 1 % G-Flow Link + riga6temp(s,1) = {'G-Flow Link'}; + riga6short(s,1) = {'G-Flow Link'}; + s = s+1; + end + if yesGS(nn) == 1 % G-Shock Link + riga6temp(s,1) = {'G-Shock Link'}; + riga6short(s,1) = {'G-Shock Link'}; + s = s+1; + end + if s == 2 + colonna6(1,nn+1) = riga6temp(:,1); + colonna6_short(1,nn+1) = riga6short(:,1); + clear riga6temp + clear riga6short + else + colonna6{1,nn+1} = splitlines(strjoin(cellstr(riga6temp(:,1)), '\n')); + colonna6_short{1,nn+1} = splitlines(strjoin(cellstr(riga6short(:,1)), '\n')); + clear riga6temp; + clear riga6short + end +end +if cCT > 1 + ct = 1; % conta dispositivi di tipo diverso + for mm = 1:nCT + if strcmp(char(tipoalarms(mm)),'Variable Message System') + CTtemp(ct,1) = {'Variable Message System'}; + CTtemp_short(ct,1) = {'VMS'}; + ct = ct +1; + elseif strcmp(char(tipoalarms(mm)),'Traffic Lights') + CTtemp(ct,1) = {'Traffic Lights'}; + CTtemp_short(ct,1) = {'Traffic Lights'}; + ct = ct +1; + elseif strcmp(char(tipoalarms(mm)),'Alarms') + CTtemp(ct,1) = {'Visual-acoustic alarm'}; + CTtemp_short(ct,1) = {'Alarm system'}; + ct = ct +1; + elseif strcmp(char(tipoalarms(mm)),'Camera') + CTtemp(ct,1) = {'Camera'}; + CTtemp_short(ct,1) = {'Camera'}; + ct = ct +1; + end + colonna6{1,rS+1+mm} = strjoin(cellstr(CTtemp(mm,1)), ', '); + colonna6_short{1,rS+1+mm} = strjoin(cellstr(CTtemp_short(mm,1)), ', '); + end + c6trigger = colonna6{1,rS+2:end}; +else + c6trigger = []; + clear CTtemp +end +colonna6 = colonna6'; +colonna6_short = colonna6_short'; + +% Riga 7 - numero sensori +colonna7(1,1)={'Number of sensors/devices'}; +for s = 1:rS + if strcmp(cellstr(colonna4(s+1,1)),'Vertical Array') || strcmp(cellstr(colonna4(s+1,1)),'In Place Array')... + || strcmp(cellstr(colonna4(s+1,1)),'Therm Array') || strcmp(cellstr(colonna4(s+1,1)),'Piezo Array')... + || strcmp(cellstr(colonna4(s+1,1)),'Cir Array') || strcmp(cellstr(colonna4(s+1,1)),'Rad Array')... + || strcmp(cellstr(colonna4(s+1,1)),'PreConv Array') || strcmp(cellstr(colonna4(s+1,1)),'Horizontal Array')... + || strcmp(cellstr(colonna4(s+1,1)),'Vertical Array Structure') + colonna7(s+1,1) = cellstr(num2str(num_nodi(s,1)-1)); + else + colonna7(s+1,1) = cellstr(num2str(num_nodi(s,1))); + end +end +if cCT > 1 + colonna7(rS+2:rS+1+rCT) = cellstr('1'); +end + +text = 'report_table_ENG function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/scarico.m b/ATD/scarico.m new file mode 100755 index 0000000..f48b9b0 --- /dev/null +++ b/ATD/scarico.m @@ -0,0 +1,84 @@ +function [NuovoZeroTuL,NuovoZeroRL,NuovoZeroTLH,NuovoZeroTLHRH,NuovoZeroPCL,... + NuovoZeroPCLHR,NuovoZeroAL,NuovoZeroPrL,NuovoZeroLL,NuovoZeroEL,NuovoZero3DEL,... + NuovoZeroWEL,NuovoZeroMPBEL,NuovoZeroCrL,NuovoZero2DCrL,NuovoZero3DCrL,NuovoZeroSM,... + DatiElabTunnelLink,DatiElabRadialLink,DatiElabTiltLinkH,DatiElabTiltLinkHRH,... + DatiElabPreConvLink,DatiElabPreConvLinkHR,... + datainiTuL,datainiRL,datainiTLH,datainiTLHRH,datainiPCL,datainiPCLHR,... + tempoiniTuL,tempoiniRL,tempoiniTLH,tempoiniTLHRH,tempoiniPCL,tempoiniPCLHR,... + datainiPL,datainiLL,datainiEL,dataini3DEL,datainiWEL,datainiCrL,dataini2DCrL,... + dataini3DCrL,datainiAL,datainiMPBEL,datainiPrL,datainiSM,tempoiniPL,tempoiniLL,... + tempoiniEL,tempoini3DEL,tempoiniWEL,tempoiniCrL,tempoini2DCrL,tempoini3DCrL,tempoiniAL,... + tempoiniMPBEL,tempoiniPrL,tempoiniSM,DatiElabAnalogLink,Date_Rif_EL,Date_Rif_3DEL,... + Date_Rif_SM,ay_TuL,ay_TuL_AC,t_TuL_AC,t_TuL,data1_AC] = scarico(date,time) + +%% Scarico dei dati +NuovoZeroTuL = 0; +NuovoZeroRL = 0; +NuovoZeroTLH = 0; +NuovoZeroTLHRH = 0; +NuovoZeroPCL = 0; +NuovoZeroPCLHR = 0; +NuovoZeroAL = 0; +NuovoZeroPrL = 0; +NuovoZeroLL = 0; +NuovoZeroEL = 0; +NuovoZero3DEL = 0; +NuovoZeroWEL = 0; +NuovoZeroMPBEL = 0; +NuovoZeroCrL = 0; +NuovoZero2DCrL = 0; +NuovoZero3DCrL = 0; +NuovoZeroSM = 0; +DatiElabTunnelLink = []; +DatiElabRadialLink = []; +DatiElabTiltLinkH = []; +DatiElabTiltLinkHRH = []; +DatiElabPreConvLink = []; +DatiElabPreConvLinkHR = []; +datainiTuL = date; +tempoiniTuL = time; +datainiRL = date; +tempoiniRL = time; +datainiTLH = date; +tempoiniTLH = time; +datainiTLHRH = date; +tempoiniTLHRH = time; +datainiPCL = date; +tempoiniPCL = time; +datainiPCLHR = date; +tempoiniPCLHR = time; +datainiPL = date; +tempoiniPL = time; +datainiLL = date; +tempoiniLL = time; +datainiEL = date; +tempoiniEL = time; +dataini3DEL = date; +tempoini3DEL = time; +datainiMPBEL = date; +tempoiniMPBEL = time; +datainiAL = date; +tempoiniAL = time; +datainiWEL = date; +tempoiniWEL = time; +datainiPrL = date; +tempoiniPrL = time; +datainiCrL = date; +tempoiniCrL = time; +dataini3DCrL = date; +tempoini3DCrL = time; +dataini2DCrL = date; +tempoini2DCrL = time; +datainiSM = date; +tempoiniSM = time; +DatiElabAnalogLink = []; +Date_Rif_EL = []; +Date_Rif_3DEL = []; +Date_Rif_SM = []; +ay_TuL = []; +ay_TuL_AC = []; +t_TuL_AC = []; +t_TuL = []; +data1_AC = 1; + +end diff --git a/ATD/schema.m b/ATD/schema.m new file mode 100755 index 0000000..7b1fbf3 --- /dev/null +++ b/ATD/schema.m @@ -0,0 +1,17 @@ +% Funzione che mi ricostruisce la composizione della catena + +function catena = schema(idTool,conn,FileName) + +text = 'Schema function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +comando = ['select nodetype_id, depth, num from nodes where tool_id = ''' idTool ''' order by num']; +catena = fetch(conn,comando); + +text = 'Schema function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/schemaSP.m b/ATD/schemaSP.m new file mode 100755 index 0000000..61bd8e2 --- /dev/null +++ b/ATD/schemaSP.m @@ -0,0 +1,286 @@ +% Funzione che ricostrusice i segmenti di pertinenza e la profondità dello +% spostamento relativo. In output si ha +% SpeTuL = segmento di pertinenza dei nodi di tipo Tunnel Link +% SpeRL = segmento di pertinenza dei nodi di tipo Radial Link + +function [SpeTuL,SpeRL,SpeTLH,PsTLH,SpeTLHRH,PsTLHRH,SpePCL,SpePCLHR]... + = schemaSP(yesTuL,yesRL,yesTLH,yesTLHRH,yesPCL,yesPCLHR,... + NodoTunnelLink,NodoRadialLink,NodoTiltLinkH,NodoTiltLinkHRH,... + NodoPreConvLink,NodoPreConvLinkHR,rTuL,rRL,rTLH,rTLHRH,rPCL,rPCLHR,... + catena,FileName) + +% Apro file di testo +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'schemaSP function started'; +fprintf(fileID,fmt,text); + +Nodi = [cell2mat(catena(:,3)) cell2mat(catena(:,2)) cell2mat(catena(:,1))]; + +%% Tunnel Link +if yesTuL == 1 +% Definizione dei segmenti di pertinenza dei singoli accelerometri +% SpeTuL = Segmento di Pertinenza del nodo (posizione i-esima del nodo i-esimo) + NodiTuL = cell2mat(NodoTunnelLink(:,2:3)); + % Costruisco il segmento di pertinenza + spe0 = 0; % segmento di pertinenza dell'ancora + spe1 = ((NodiTuL(1,2) + NodiTuL(2,2))/2); % segmento di pertinenza del primo nodo + if rTuL>2 + spe2 = zeros(rTuL-2,1); + for i = 2:(rTuL-1) + media1 = NodiTuL(i,2) + NodiTuL(i-1,2)/2; + media2 = NodiTuL(i,2) + NodiTuL(i+1,2)/2; + spei = media2 - media1; + spe2(i-1,1) = spei; + end + else + spe2 = []; + end + spelast = (NodiTuL(rTuL,2)-(NodiTuL(rTuL-1,2)+NodiTuL(rTuL,2))/2)*2; % segmento di pertinenza dell'ultimo nodo + SpeTuL = [spe0; spe1; spe2; spelast]; + text = 'Segments of relevance of Tunnel Link defined correctly'; + fprintf(fileID,fmt,text); +else + % Non ci sono nodi Tunnel Link + SpeTuL = []; + text = 'Segments of relevance of Tunnel Link not defined'; + fprintf(fileID,fmt,text); +end + +%% Radial Link +if yesRL == 1 +% Definizione dei segmenti di pertinenza dei singoli accelerometri +% SpeRL = Segmento di Pertinenza del nodo (posizione i-esima del nodo i-esimo) + NodiRL = cell2mat(NodoRadialLink(:,2:3)); + % Costruisco il segmento di pertinenza + spe0 = 0; % segmento di pertinenza dell'ancora + spe1 = ((NodiRL(1,2) + NodiRL(2,2))/2); % segmento di pertinenza del primo nodo + if rRL>2 + spe2 = zeros(rRL-2,1); + for i = 2:(rRL-1) + media1 = NodiRL(i,2) + NodiRL(i-1,2)/2; + media2 = NodiRL(i,2) + NodiRL(i+1,2)/2; + spei = media2 - media1; + spe2(i-1,1) = spei; + end + else + spe2 = []; + end + spelast = (NodiRL(rRL,2)-(NodiRL(rRL-1,2)+NodiRL(rRL,2))/2)*2; % segmento di pertinenza dell'ultimo nodo + SpeRL = [spe0; spe1; spe2; spelast]; + text = 'Segments of relevance of Radial Link defined correctly'; + fprintf(fileID,fmt,text); +else + % Non ci sono nodi Radial Link + SpeRL = []; + text = 'Segments of relevance of Radial Link not defined'; + fprintf(fileID,fmt,text); +end + +%% Tilt Link H +if yesTLH == 1 +% Definizione dei segmenti di pertinenza dei singoli accelerometri +% SpeTLH = Segmento di Pertinenza del nodo (posizione i-esima del nodo i-esimo) +% PsTLH = Posizione dello spostamento + NodiTLH = cell2mat(NodoTiltLinkH(:,2:3)); + % Costruisco il segmento di pertinenza + spe0 = 0; % segmento di pertinenza dell'ancora + spe1 = (NodiTLH(1,2) + NodiTLH(2,2))/2; % segmento di pertinenza del primo nodo, lo considero + + if rTLH > 2 + spe2 = zeros(rTLH-2,1); + for i = 2:(rTLH-1) + media1 = (abs(NodiTLH(i,2)) + abs(NodiTLH(i-1,2)))/2; + media2 = (abs(NodiTLH(i,2)) + abs(NodiTLH(i+1,2)))/2; + spei = media2 - media1; + spe2(i-1,1) = spei; % li considero positivi + end + else + spe2 = []; + end + % segmento di pertinenza dell'ultimo nodo + spelast = (NodiTLH(end,2)-((NodiTLH(rTLH-1,2)+NodiTLH(rTLH,2)))/2)*2; + SpeTLH = [spe0; spe1; spe2; spelast]; % raccolgo i segmenti di pertinenza + + % Calcolo la posizione dello spostamento relativo + ps0 = NodiTLH(1,2); % posizione dell'ancora + if spe1 <= 1 + ps1 = NodiTLH(1,2)+spe1; % la posizione del primo nodo TLH è data da + else + ps1 = cell2mat(NodoTiltLinkH(1,3))+0.5; + end + ps2 = zeros(rTLH-1,1); + for j = 2:rTLH + if j == 2 + if SpeTLH(j+1,1) <= 1 + psj = ps1 + SpeTLH(j+1,1); + else + psj = cell2mat(NodoTiltLinkH(j,3))+0.5; + end + % la posizione a cui il nodo j di tipo Tilt Link H rileva lo spostamento è data dalla + % somma fra il suo segmento di pertinenza e la posizione a cui rileva lo spostamento + % il nodo precedente + psPrec = psj; + % mi serve come appoggio per il calcolo della posizione dello spostamento del nodo successivo + else + if SpeTLH(j+1,1) <= 1 + psj = psPrec + SpeTLH(j+1,1); + else + psj = cell2mat(NodoTiltLinkH(j,3))+0.5; + end + psPrec = psj; + end + ps2(j-1,1) = psj; + end + PsTLH = [ps0; ps1; ps2]; + text = 'Segments of relevance of Tilt Link H defined correctly'; + fprintf(fileID,fmt,text); + for i = 2:rTLH+1 + if SpeTLH(i) > 1 + SpeTLH(i) = 1; + end + end +else + % Non ci sono nodi Tilt Link H + SpeTLH = []; + PsTLH = []; + text = 'Segments of relevance of Tilt Link H not defined'; + fprintf(fileID,fmt,text); +end + +%% Tilt Link HR H +if yesTLHRH == 1 + % Definizione dei segmenti di pertinenza delle ampolle + % PsTLHRH = posizione dello spostamento + NodiTLHRH = cell2mat(NodoTiltLinkHRH(:,2:3)); + % Costruisco il segmento di pertinenza + spe0 = 0; % segmento di pertinenza dell'ancora + spe1 = (NodiTLHRH(1,2) + NodiTLHRH(2,2))/2; % segmento di pertinenza del primo nodo, lo considero + + if rTLHRH > 2 + spe2 = zeros(rTLHRH-2,1); + for i = 2:(rTLHRH-1) + media1 = (abs(NodiTLHRH(i,2)) + abs(NodiTLHRH(i-1,2)))/2; + media2 = (abs(NodiTLHRH(i,2)) + abs(NodiTLHRH(i+1,2)))/2; + spei = media2 - media1; + spe2(i-1,1) = spei; % li considero positivi + end + else + spe2 = []; + end + % segmento di pertinenza dell'ultimo nodo + spelast = (NodiTLHRH(end,2)-((NodiTLHRH(rTLH-1,2)+NodiTLHRH(rTLHRH,2)))/2)*2; + SpeTLHRH = [spe0; spe1; spe2; spelast]; % raccolgo i segmenti di pertinenza + + % Calcolo la posizione dello spostamento relativo + ps0 = Nodi(1,2); % posizione dell'ancora + if spe1 <= 1 + ps1 = Nodi_HRH(1,2)+spe1; % la posizione del primo nodo TLHRH è data da ancora + segmento di pertinenza del primo nodo + else + ps1 = cell2mat(NodoTiltLinkHRH(1,3))+0.5; + end + ps2 = zeros(rTLHRH-1,1); + for j = 2:rTLHRH + if j == 2 + if SpeTLHRH(j+1,1) <= 1 + psj = ps1 + SpeTLHRH(j+1,1); + else + psj = cell2mat(NodoTiltLinkHRH(j,3))+0.5; + end + % la posizione a cui il nodo j di tipo Tilt Link H rileva lo spostamento è data dalla + % somma fra il suo segmento di pertinenza e la posizione a cui rileva lo spostamento + % il nodo precedente + psPrec = psj; + % mi serve come appoggio per il calcolo della posizione dello spostamento del nodo successivo + else + if SpeTLHRH(j+1,1) <= 1 + psj = psPrec + SpeTLHRH(j+1,1); + else + psj = cell2mat(NodoTiltLinkHRH(j,3))+0.5; + end + psPrec = psj; + end + ps2(j-1,1) = psj; + end + PsTLHRH = [ps0; ps1; ps2]; + for i = 2:rTLHRH+1 + if SpeTLHRH(i) > 1 + SpeTLHRH(i) = 1; + end + end + text = 'Segments of relevance of Tilt Link HR H defined correctly'; + fprintf(fileID,fmt,text); +else + % Non ci sono nodi Tilt Link HR H + SpeTLHRH = []; + PsTLHRH = []; + text = 'Segments of relevance of Tilt Link HR H not defined'; + fprintf(fileID,fmt,text); +end + +%% PreConv Link +if yesPCL == 1 +% Definizione dei segmenti di pertinenza dei singoli accelerometri +% SpePCL = Segmento di Pertinenza del nodo (posizione i-esima del nodo i-esimo) + NodiPCL = cell2mat(NodoPreConvLink(:,2:3)); + % Costruisco il segmento di pertinenza + spe0 = 0; % segmento di pertinenza dell'ancora + spe1 = (NodiPCL(1,2) + NodiPCL(2,2))/2; % segmento di pertinenza del primo nodo, lo considero + + if rPCL > 2 + spe2 = zeros(rPCL-2,1); + for i = 2:(rPCL-1) + media1 = (abs(NodiPCL(i,2)) + abs(NodiPCL(i-1,2)))/2; + media2 = (abs(NodiPCL(i,2)) + abs(NodiPCL(i+1,2)))/2; + spei = media2 - media1; + spe2(i-1,1) = spei; % li considero positivi + end + else + spe2 = []; + end + % segmento di pertinenza dell'ultimo nodo + spelast = (NodiPCL(end,2)-((NodiPCL(rPCL-1,2)+NodiPCL(rPCL,2)))/2)*2; + SpePCL = [spe0; spe1; spe2; spelast]; % raccolgo i segmenti di pertinenza + text = 'Segments of relevance of PreConv Link defined correctly'; + fprintf(fileID,fmt,text); +else + % Non ci sono nodi PreConv Link + SpePCL = []; + text = 'Segments of relevance of PreConv Link not defined'; + fprintf(fileID,fmt,text); +end + +%% Pre Conv Link HR +if yesPCLHR == 1 + % Definizione dei segmenti di pertinenza delle ampolle + NodiPCLHR = cell2mat(NodoPreConvLinkHR(:,2:3)); + % Costruisco il segmento di pertinenza + spe0 = 0; % segmento di pertinenza dell'ancora + spe1 = (NodiPCLHR(1,2) + NodiPCLHR(2,2))/2; % segmento di pertinenza del primo nodo, lo considero + + if rPCLHR > 2 + spe2 = zeros(rPCLHR-2,1); + for i = 2:(rPCLHR-1) + media1 = (abs(NodiPCLHR(i,2)) + abs(NodiPCLHR(i-1,2)))/2; + media2 = (abs(NodiPCLHR(i,2)) + abs(NodiPCLHR(i+1,2)))/2; + spei = media2 - media1; + spe2(i-1,1) = spei; % li considero positivi + end + else + spe2 = []; + end + % segmento di pertinenza dell'ultimo nodo + spelast = (NodiPCLHR(end,2)-((NodiPCLHR(rPCLHR-1,2)+NodiPCLHR(rPCLHR,2)))/2)*2; + SpePCLHR = [spe0; spe1; spe2; spelast]; % raccolgo i segmenti di pertinenza + + text = 'Segments of relevance of PreConv Link HR defined correctly'; + fprintf(fileID,fmt,text); +else + % Non ci sono nodi PreConv Link HR + SpePCLHR = []; + text = 'Segments of relevance of PreConv Link HR not defined'; + fprintf(fileID,fmt,text); +end + +%% Chiudo Testo +text = 'schemaSP function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/scrivo.m b/ATD/scrivo.m new file mode 100755 index 0000000..2e392c4 --- /dev/null +++ b/ATD/scrivo.m @@ -0,0 +1,134 @@ +% Funzione che attiva o disattiva la scrittura dei sensori +function [scrivoTuL,scrivoRL,scrivoTLH,scrivoTLHRH,scrivoPCL,scrivoPCLHR,scrivoPL,... + scrivoLL,scrivoEL,scrivo3DEL,scrivoWEL,scrivoMPBEL,scrivoAL,... + scrivoCrL,scrivo3DCrL,scrivo2DCrL,scrivoSM] = scrivo(X_TuL,X_RL,... + Z_TLH,Z_TLHRH,Z_PCL,Z_PCLHR,DatiPressure,DatiLoad,... + DatiExtensometer,DatiExtensometer3D,DatiWireExtensometer,DatiMultiBase,... + DatiAnalog,DatiCrack,Dati3DCrack,Dati2DCrack,DatiStress,FileName) + +TuL = isempty(X_TuL); +if TuL == 1 + scrivoTuL = 0; +else + scrivoTuL = 1; +end + +RL = isempty(X_RL); +if RL == 1 + scrivoRL = 0; +else + scrivoRL = 1; +end + +TLH = isempty(Z_TLH); +if TLH == 1 + scrivoTLH = 0; +else + scrivoTLH = 1; +end + +TLHRH = isempty(Z_TLHRH); +if TLHRH == 1 + scrivoTLHRH = 0; +else + scrivoTLHRH = 1; +end + +PCL = isempty(Z_PCL); +if PCL == 1 + scrivoPCL = 0; +else + scrivoPCL = 1; +end + +PCLHR = isempty(Z_PCLHR); +if PCLHR == 1 + scrivoPCLHR = 0; +else + scrivoPCLHR = 1; +end + +PL = isempty(DatiPressure); +if PL == 1 + scrivoPL = 0; +else + scrivoPL = 1; +end + +LL = isempty(DatiLoad); +if LL == 1 + scrivoLL = 0; +else + scrivoLL = 1; +end + +EL = isempty(DatiExtensometer); +if EL == 1 + scrivoEL = 0; +else + scrivoEL = 1; +end + +EL3D = isempty(DatiExtensometer3D); +if EL3D == 1 + scrivo3DEL = 0; +else + scrivo3DEL = 1; +end + +WEL = isempty(DatiWireExtensometer); +if WEL == 1 + scrivoWEL = 0; +else + scrivoWEL = 1; +end + +MPBEL = isempty(DatiMultiBase); +if MPBEL == 1 + scrivoMPBEL = 0; +else + scrivoMPBEL = 1; +end + +AL = isempty(DatiAnalog); +if AL == 1 + scrivoAL = 0; +else + scrivoAL = 1; +end + +CrL = isempty(DatiCrack); +if CrL == 1 + scrivoCrL = 0; +else + scrivoCrL = 1; +end + +CrL3D = isempty(Dati3DCrack); +if CrL3D == 1 + scrivo3DCrL = 0; +else + scrivo3DCrL = 1; +end + +CrL2D = isempty(Dati2DCrack); +if CrL2D == 1 + scrivo2DCrL = 0; +else + scrivo2DCrL = 1; +end + +SM = isempty(DatiStress); +if SM == 1 + scrivoSM = 0; +else + scrivoSM = 1; +end + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'scrivo function worked correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/segnoTuL.m b/ATD/segnoTuL.m new file mode 100755 index 0000000..95709a4 --- /dev/null +++ b/ATD/segnoTuL.m @@ -0,0 +1,69 @@ +function [indiceX,indiceZ] = segnoTuL(IDcentralina,DTcatena,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'segnoTuL function started'; +fprintf(fileID,fmt,text); + +NomeFile = strcat(IDcentralina,'-',DTcatena,'-','Azzeramenti.txt'); +if isfile(NomeFile) == 1 + Dati = importdata(NomeFile); +else + Dati = []; % Aggiunto 23/09/21 + fclose(fileID); + Parametro1 = 99999; + Parametro2 = 9999999999; + outdat = fopen(NomeFile,'wt+'); + fopen(NomeFile,'wt'); + fmt = '%d \r'; + fileA = fopen(NomeFile,'a'); + fprintf(fileA,fmt,Parametro1); + fprintf(fileA,fmt,Parametro2); + fclose(fileA); + + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'segnoTuL function created the reference file correctly'; + fprintf(fileID,fmt,text); +end +%% Calcolo orario +[r,~] = size(Dati); +indiceX = []; +n = 1; +for a = 1:r + if Dati(a) == 99999 + for ab = a+1:r + if Dati(ab) < 99999 + for aa = ab:r + if Dati(aa) == 9999999999 + break + else + indiceX(n) = Dati(aa); + n = n+1; + end + end + end + break + end + end +end + +%% Calcolo antiorario +nn = 1; +indiceZ = []; +for a = 1:r + if Dati(a) == 9999999999 + for aa = a+1:r + if Dati(aa) < 99999 + indiceZ(nn) = Dati(aa); + nn = nn+1; + end + end + end +end + +text = 'segnoTuL function worked correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/sendReportmail.m b/ATD/sendReportmail.m new file mode 100755 index 0000000..ab40db8 --- /dev/null +++ b/ATD/sendReportmail.m @@ -0,0 +1,155 @@ +function sendReportmail(NomeSito,Coordinate,meseadesso,NomeReport,NomeReport_ENG,... + Users_Report,recipients_ASE,Mail,Mail_ASE,activeEN,rU,cU,FileName) + +text = 'sendReportmail function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +%% Email +setpref('Internet','E_mail','aseparma@gmail.com'); +setpref('Internet','SMTP_Server','smtp.gmail.com'); +setpref('Internet','SMTP_Username','aseparma@gmail.com'); +setpref('Internet','SMTP_Password','Mums@2016'); +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 + +recipients_ITA = cell(1); +recipients_ENG = cell(1); + +% A chi mando la mail +nI = 1; +nE = 1; +if cU >1 % sono presenti utenti a cui inviare la mail + for i = 1:rU + if Users_Report{i,4} == 2 + recipients_ITA{nI,1} = Users_Report(i,3); + nI = nI+1; + else + recipients_ENG{nE,1} = Users_Report(i,3); + nE = nE+1; + end + end +end + +% report si riferisce al mese prima di quello attuale +if meseadesso == 1 + mesemail = 'Dicembre'; + mesemailENG = 'December'; +elseif meseadesso == 2 + mesemail = 'Gennaio'; + mesemailENG = 'January'; +elseif meseadesso == 3 + mesemail = 'Febbraio'; + mesemailENG = 'February'; +elseif meseadesso == 4 + mesemail = 'Marzo'; + mesemailENG = 'March'; +elseif meseadesso == 5 + mesemail = 'Aprile'; + mesemailENG = 'April'; +elseif meseadesso == 6 + mesemail = 'Maggio'; + mesemailENG = 'May'; +elseif meseadesso == 7 + mesemail = 'Giugno'; + mesemailENG = 'June'; +elseif meseadesso == 8 + mesemail = 'Luglio'; + mesemailENG = 'July'; +elseif meseadesso == 9 + mesemail = 'Agosto'; + mesemailENG = 'August'; +elseif meseadesso == 10 + mesemail = 'Settembre'; + mesemailENG = 'September'; +elseif meseadesso == 11 + mesemail = 'Ottobre'; + mesemailENG = 'October'; +elseif meseadesso == 12 + mesemail = 'Novembre'; + mesemailENG = 'November'; +end + +if meseadesso == 1 % gennaio + annomail = datestr(today-32,'yyyy'); % anno precedente +else % altri mesi + annomail = datestr(today,'yyyy'); +end + +latNS = 'N'; +lonEO = 'E'; +lonEO_ENG = 'E'; +if Coordinate(1) < 0 + latNS = 'S'; +end +if Coordinate(2) < 0 + lonEO = 'O'; + lonEO_ENG = 'W'; +end + +allegatoPDF = [NomeReport '.pdf']; +allegatoPDF_ENG = [NomeReport_ENG '.pdf']; + +%% ita +subject_ITA = (['Report Automatico ASE - ' mesemail ' ' annomail ' ' NomeSito '']); +testo = cellstr('Gentile utente,'); +testobis = cellstr(''); +testo2 = cellstr(['in allegato alla presente mail trover' char(224) ' il Report di monitoraggio '... + 'relativo al sito ' NomeSito ', con coordinate geografiche ' num2str(abs(Coordinate(1))) ' ' latNS ', '... + num2str(abs(Coordinate(2,:))) ' ' lonEO '. Il presente documento viene generato automaticamente dal '... + 'software proprietario sviluppato da ASE S.r.l. con cadenza mensile e '... + 'riporta i dati di maggior interesse registrati dalla strumentazione installata '... + 'in sito durante il periodo temporale di riferimento, che a meno di interruzioni '... + 'prolungate di trasmissione del dato coincide con l''ultimo mese di monitoraggio. '... + 'In particolare, il Report allegato a questa mail presenta i dati raccolti nel mese di ' mesemail ' ' annomail '.']); +testo3 = cellstr(['Si vuole sottolineare che questo documento ' char(232) ' generato completamente in automatico '... + 'e non contiene pertanto alcuna valutazione o validazione di carattere tecnico '... + 'relativamente ai risultati ottenuti dalla strumentazione installata. '... + 'Si ricorda inoltre che quanto riportato nel report ' char(232) ' inteso come un riassunto dei risultati '... + 'dell''attivit' char(224) ' di monitoraggio. Per la consultazione completa di tutti i dati '... + 'relativi al sito in esame, si rimanda alla piattaforma interattiva di ASE, accessibile al seguente link: ']); +Link = cellstr('https://www2.aseltd.eu'); +testo4 = cellstr('Eventuali segnalazioni relative al report automatico possono essere inoltrate al seguente indirizzo email: alessandro.valletta@aseltd.eu'); +message_ITA = [testo; testobis; testo2; testo3; Link; testobis; testo4; testobis]; +message = cellstr('Cordiali saluti, '); +message2 = cellstr('Il team di ASE S.r.l.'); +message_ITA = [message_ITA; message; message2]; + +%% eng +subject_ENG = (['ASE Automatic Report - ' mesemailENG ', ' annomail]); +testoENG = ('Dear user, '); +testo2ENG = (['please find attached to this email a Report of the monitoring activity performed on site: ' NomeSito ', coordinates '... + num2str(abs(Coordinate(1))) ' ' latNS ', ' num2str(abs(Coordinate(2,:))) ' ' lonEO_ENG '. '... + 'This document is generated monthly by the automatic software developed by ASE, '... + 'and it reports the main data recorded by the monitoring instrumentation installed '... + 'on-site in the last month. In particular, the automatic Report attached to this email '... + 'refers to monitoring data sampled during ' mesemailENG ', ' annomail '.']); +testo3ENG = (['We would like to remind you that the main objective of this document is to summarize only the key information provided by each sensor; '... + 'please refer to the web-based interactive platform available at the following link in order to browse all available monitoring data.']); +testo4ENG = ('For any comment regarding the automatic Report, please send a message to the following email address: alessandro.valletta@aseltd.eu'); +message_ENG = [testoENG; testobis; testo2ENG; testo3ENG; Link; testobis; testo4ENG; testobis]; +messageENG = cellstr('Best regards, '); +message2ENG = cellstr('The ASE S.r.l. Team'); +message_ENG = [message_ENG; messageENG; message2ENG]; + +if Mail == 1 || Mail_ASE == 1 + if Mail == 1 && cU >1 + recipients_ITA = [recipients_ITA; recipients_ASE]; + else + recipients_ITA = recipients_ASE; + end + sendmail(recipients_ITA, subject_ITA, message_ITA, allegatoPDF) + if activeEN == 1 + sendmail(recipients_ENG, subject_ENG, message_ENG, allegatoPDF_ENG) + end +end + +%scrivo invio nel logfile +text = (['Automatic Report of ' mesemailENG ' sent! sendReportmail function closed']); +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/soglie.m b/ATD/soglie.m new file mode 100755 index 0000000..d719771 --- /dev/null +++ b/ATD/soglie.m @@ -0,0 +1,3472 @@ +function [siteID,unitID,chainID,Chain_Scheme,num_nodi] = soglie(IDcentralina,... + yesTuL,yesRL,yesTLH,yesTLHRH,yesPCL,yesPCLHR,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; + +text = 'soglie function started'; +fprintf(fileID,fmt,text); + +%% Raccolgo Informazioni +% Cerco tutte le centraline presenti in quel sito +comando = ['select site_id from units where name = ''' IDcentralina ''' ']; % il rapporto centralina sito è di 1 a 1 +curs = exec(conn,comando); +curs = fetch(curs); +siteID = curs.Data; + +% Scarico tutte le centraline presenti in sito +comando = ['select id, name from units where site_id = ''' num2str(cell2mat(siteID)) ''' order by name']; % il rapporto centralina sito è di 1 a 1 +curs = exec(conn,comando); +curs = fetch(curs); +unitID = curs.Data; + +col = size(unitID); +chainID = cell(1,4); +ini = 1; +for c = 1:col(1,1) + % dalle centraline presenti, risalgo alle catene disponibili + comando = ['select id, name from tools where unit_id = ''' num2str(cell2mat(unitID(c,1))) ''' order by name']; + curs = exec(conn,comando); + curs = fetch(curs); + chainID_down = curs.Data; % id tool, nome tool + [fin,~] = size(chainID_down); + fin = fin+ini-1; + chainID(ini:fin,3:4) = chainID_down; + for j = ini:fin + chainID(j,1:2) = unitID(c,1:2); % Id centralina, nome centralina, id tool, nome tool + end + ini = fin+1; +end + +% Scarico gli schemi delle catene +[col,~] = size(chainID); % Numero di Array +Chain_Scheme = cell(1,3); +num_nodi = zeros(col,1); +ini = 1; +cont = 1; +for c = 1:col(1,1) + comando = ['select nodetype_id, depth, num from nodes where tool_id = ''' num2str(cell2mat(chainID(c,3))) ''' order by num']; + curs = exec(conn,comando); + curs = fetch(curs); + scheme_down = curs.Data; % id nodo, profondità, numero + [fin,~] = size(scheme_down); + num_nodi(cont) = fin; + Chain_Scheme(1:fin,ini:ini+2) = scheme_down; + ini = ini+3; + cont = cont+1; +end + +if yesTuL == 1 || yesRL == 1 || yesTLH == 1 || yesTLHRH == 1 || ... + yesPCL == 1 || yesPCLHR == 1 + + % Per ogni tipologia di nodo, riconosco se è presente o meno nella catena + yesTL = zeros(col,1); % Tilt Link V + yesTLHR = zeros(col,1); % Tilt Link HR V + yesTLH = zeros(col,1); % Tilt Link H + yesTLHRH = zeros(col,1); % Tilt Link HR H + yesIPL = zeros(col,1); % In Place Link + yesIPLHR = zeros(col,1); % In Place Link HR + yesTuL = zeros(col,1); % Tunnel Link + yesRL = zeros(col,1); % Radial Link + yesPCL = zeros(col,1); % PreConv Link + yesPCLHR = zeros(col,1); % PreConv Link HR + yesPL = zeros(col,1); % Piezo Link + yesKL = zeros(col,1); % Klino Link + yesKLHR = zeros(col,1); % Klino Link HR + yesRaL = zeros(col,1); % Rain Link + yesLL = zeros(col,1); % Load Link + yesPrL = zeros(col,1); % Pressure Link + yesEL = zeros(col,1); % Extensometer Link + yes3DEL = zeros(col,1); % 3D Extensometer Link + yesWEL = zeros(col,1); % Wire Extensometer Link + yesMPBEL = zeros(col,1); % Multi Point BoreHole Extensometer Link + yesCrL = zeros(col,1); % Crack Link + yes3DCrL = zeros(col,1); % 3D Crack Link + % Numero di nodi per catena + rTL = zeros(col,1); + rTLHR = zeros(col,1); + rTLH = zeros(col,1); + rTLHRH = zeros(col,1); + rIPL = zeros(col,1); + rIPLHR = zeros(col,1); + rTuL = zeros(col,1); + rRL = zeros(col,1); + rPCL = zeros(col,1); + rPCLHR = zeros(col,1); + rKL = zeros(col,1); + rKLHR = zeros(col,1); + rRaL = zeros(col,1); + rPL = zeros(col,1); + rLL = zeros(col,1); + rPrL = zeros(col,1); + rEL = zeros(col,1); + r3DEL = zeros(col,1); + rWEL = zeros(col,1); + rMPBEL = zeros(col,1); + rCrL = zeros(col,1); + r3DCrL = zeros(col,1); + indice = 1; + for a = 1:col % Array + nTL = 1; + nTLHR = 1; + nTLH = 1; + nTLHRH = 1; + nIPL = 1; + nIPLHR = 1; + nTuL = 1; + nRL = 1; + nPCL = 1; + nPCLHR = 1; + nKL = 1; + nKLHR = 1; + nRaL = 1; + nPL = 1; + nLL = 1; + nPrL = 1; + nEL = 1; + n3DEL = 1; + nMPBEL = 1; + nCrL = 1; + n3DCrL = 1; + nWEL = 1; + for b = 1:num_nodi(a) % Numero di nodi dell'Array + if cell2mat(Chain_Scheme(b,indice)) == 1 % Tilt Link V + yesTL(a) = 1; + NodoTiltLink(nTL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nTL = nTL+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 5 % Tilt Link HR V + yesTLHR(a) = 1; + NodoTiltLinkHR(nTLHR,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nTLHR = nTLHR+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 11 % Tilt Link H + yesTLH(a) = 1; + NodoTiltLinkH(nTLH,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nTLH = nTLH+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 12 % Tilt Link HR H + yesTLHRH(a) = 1; + NodoTiltLinkHRH(nTLHRH,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nTLHRH = nTLHRH+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 42 % In Place Link + yesIPL(a) = 1; + NodoInPlaceLink(nIPL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nIPL = nIPL+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 43 % In Place Link HR + yesIPLHR(a) = 1; + NodoInPlaceLinkHR(nIPLHR,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nIPLHR = nIPLHR+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 17 % Tunnel Link + yesTuL(a) = 1; + NodoTunnelLink(nTuL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nTuL = nTuL+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 18 % Radial Link + yesRL(a) = 1; + NodoRadialLink(nRL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nRL = nRL+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 23 % PreConv Link + yesPCL(a) = 1; + NodoPreConvLink(nPCL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nPCL = nPCL+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 24 % PreConv Link HR + yesPCLHR(a) = 1; + NodoPreConvLinkHR(nPCLHR,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nPCLHR = nPCLHR+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 2 % Piezo Link + yesPL(a) = 1; + NodoPiezoLink(nPL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nPL = nPL+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 26 % Klino Link + yesKL(a) = 1; + NodoKlinoLink(nKL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nKL = nKL+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 44 % Klino Link HR + yesKLHR(a) = 1; + NodoKlinoLinkHR(nKLHR,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nKLHR = nKLHR+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 27 % Rain Link + yesRaL(a) = 1; + NodoRainLink(nRaL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nRaL = nRaL+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 15 % Load Link + yesLL(a) = 1; + NodoLoadLink(nLL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nLL = nLL+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 21 % Pressure Link + yesPrL(a) = 1; + NodoPressureLink(nPrL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nPrL = nPrL+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 16 % Extensometer Link + yesEL(a) = 1; + NodoExtensometerLink(nEL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nEL = nEL+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 19 % 3D Extensometer Link + yes3DEL(a) = 1; + Nodo3DExtensometerLink(n3DEL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + n3DEL = n3DEL+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 22 % Wire Extensometer Link + yesWEL(a) = 1; + NodoWireExtensometerLink(nWEL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nWEL = nWEL+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 25 % Multi Point Borehole Extensometer Link + yesMPBEL(a) = 1; + NodoMultiPointExtensometerLink(nMPBEL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nMPBEL = nMPBEL+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 36 % Crack Link + yesCrL(a) = 1; + NodoCrackLink(nCrL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nCrL = nCrL+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 37 % 3D Crack Link + yes3DCrL(a) = 1; + Nodo3DCrackLink(n3DCrL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + n3DCrL = n3DCrL+1; + end + end + indice = indice+3; + rTL(a) = nTL-1; + rTLHR(a) = nTLHR-1; + rTLH(a) = nTLH-1; + rTLHRH(a) = nTLHRH-1; + rIPL(a) = nIPL-1; + rIPLHR(a) = nIPLHR-1; + rTuL(a) = nTuL-1; + rRL(a) = nRL-1; + rPCL(a) = nPCL-1; + rPCLHR(a) = nPCLHR-1; + rKL(a) = nKL-1; + rKLHR(a) = nKLHR-1; + rRaL(a) = nRaL-1; + rPL(a) = nPL-1; + rPrL(a) = nPrL-1; + rCrL(a) = nCrL-1; + r3DCrL(a) = n3DCrL-1; + rEL(a) = nEL-1; + r3DEL(a) = n3DEL-1; + rWEL(a) = nWEL-1; + rMPBEL(a) = nMPBEL-1; + end + + try + % --- Analizzo i singoli nodi --- + %% Tilt Link V + if isempty(find(yesTL)) == 1 % Non ho Tilt Link V + text = 'Tilt Link V have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_TL = 0; + else + TL = cumsum(rTL); + Alert_TL = zeros(1,TL(end)); % Livello di Allerta + Date_Alert_TL = zeros(1,TL(end)); % Data di Allerta + Node_Alert_TL = zeros(1,TL(end)); % Numero di nodo in Allerta + ID_Alert_TL = cell(1,TL(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesTL(n) == 1 + date_rif = now-15; % 15 giorni + for nn = 1:rTL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoTiltLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo la matrice date usando il primo nodo + end + comando = ['select XShift, YShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoTiltLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); % Dati del nodo N dell'Array X + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index:index+1) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index:index+1) = Control; + DatiElab(rCD+1:rDE,index:index+1) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index:index+1) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = sqrt((diff(cell2mat(DatiElab(index1(1):end,index))))... + .^2+(diff(cell2mat(DatiElab(index1(1):end,index+1)))).^2); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = sqrt((diff(cell2mat(DatiElab(:,index)))).^2+(diff(cell2mat(DatiElab(:,index+1)))).^2); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = sqrt((diff(cell2mat(DatiElab(index7(1):index1(1),index)))).^2+(diff(cell2mat(DatiElab(index7(1):index1(1),index+1)))).^2); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = sqrt((diff(cell2mat(DatiElab(index3(1):index1(1),index)))).^2+(diff(cell2mat(DatiElab(index3(1):index1(1),index+1)))).^2); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_TL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_TL(s,prog) = Date_1gg(s,n); + Node_Alert_TL(s,prog) = cell2mat(NodoTiltLink(nn,n)); + ID_Alert_TL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_TL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_TL(s,prog) = Date_1gg(s,n); + Node_Alert_TL(s,prog) = cell2mat(NodoTiltLink(nn,n)); + ID_Alert_TL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_TL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_TL(s,prog) = Date_1gg(s,n); + Node_Alert_TL(s,prog) = cell2mat(NodoTiltLink(nn,n)); + ID_Alert_TL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+2; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' Tilt Link V have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_TL,~] = size(rTL); + ini = 1; + fin = cumsum(rTL); + Num_Allarmi_TL = zeros(1,num_TL); + for AL = 1:num_TL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_TL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_TL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Tilt Link HR V + if isempty(find(yesTLHR)) == 1 % Non ho Tilt Link HR V + text = 'Tilt Link HR V have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_TLHR = 0; + else + clear Date_1gg + TLHR = cumsum(rTLHR); + Alert_TLHR = zeros(1,TLHR(end)); % Livello di Allerta + Date_Alert_TLHR = zeros(1,TLHR(end)); % Data di Allerta + Node_Alert_TLHR = zeros(1,TLHR(end)); % Numero di nodo in Allerta + ID_Alert_TLHR = cell(1,TLHR(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesTLHR(n) == 1 + date_rif = now-15; % 15 giorni + for nn = 1:rTLHR(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoTiltLinkHR(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select XShift, YShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoTiltLinkHR(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index:index+1) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index:index+1) = Control; + DatiElab(rCD+1:rDE,index:index+1) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index:index+1) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = sqrt((diff(cell2mat(DatiElab(index1(1):end,index))))... + .^2+(diff(cell2mat(DatiElab(index1(1):end,index+1)))).^2); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = sqrt((diff(cell2mat(DatiElab(:,index)))).^2+(diff(cell2mat(DatiElab(:,index+1)))).^2); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = sqrt((diff(cell2mat(DatiElab(index7(1):index1(1),index)))).^2+(diff(cell2mat(DatiElab(index7(1):index1(1),index+1)))).^2); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = sqrt((diff(cell2mat(DatiElab(index3(1):index1(1),index)))).^2+(diff(cell2mat(DatiElab(index3(1):index1(1),index+1)))).^2); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_TLHR(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_TLHR(s,prog) = Date_1gg(s,n); + Node_Alert_TLHR(s,prog) = cell2mat(NodoTiltLinkHR(nn,n)); + ID_Alert_TLHR(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_TLHR(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_TLHR(s,prog) = Date_1gg(s,n); + Node_Alert_TLHR(s,prog) = cell2mat(NodoTiltLinkHR(nn,n)); + ID_Alert_TLHR(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_TLHR(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_TLHR(s,prog) = Date_1gg(s,n); + Node_Alert_TLHR(s,prog) = cell2mat(NodoTiltLinkHR(nn,n)); + ID_Alert_TLHR(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+2; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' Tilt Link HR V have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_TLHR,~] = size(rTLHR); + ini = 1; + fin = cumsum(rTLHR); + Num_Allarmi_TLHR = zeros(1,num_TLHR); + for AL = 1:num_TLHR + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_TLHR(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_TLHR(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% In Place Link + if isempty(find(yesIPL)) == 1 % Non ho In Place Link + text = 'In Place Link have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_IPL = 0; + else + IPL = cumsum(rIPL); + Alert_IPL = zeros(1,IPL(end)); % Livello di Allerta + Date_Alert_IPL = zeros(1,IPL(end)); % Data di Allerta + Node_Alert_IPL = zeros(1,IPL(end)); % Numero di nodo in Allerta + ID_Alert_IPL = cell(1,IPL(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesIPL(n) == 1 + date_rif = now-15; % 15 giorni + for nn = 1:rIPL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' ... + num2str(cell2mat(NodoInPlaceLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo la matrice date usando il primo nodo + end + comando = ['select XShift, YShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' ... + num2str(cell2mat(NodoInPlaceLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); % Dati del nodo N dell'Array X + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index:index+1) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index:index+1) = Control; + DatiElab(rCD+1:rDE,index:index+1) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index:index+1) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = sqrt((diff(cell2mat(DatiElab(index1(1):end,index))))... + .^2+(diff(cell2mat(DatiElab(index1(1):end,index+1)))).^2); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = sqrt((diff(cell2mat(DatiElab(:,index)))).^2+(diff(cell2mat(DatiElab(:,index+1)))).^2); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = sqrt((diff(cell2mat(DatiElab(index7(1):index1(1),index)))).^2+(diff(cell2mat(DatiElab(index7(1):index1(1),index+1)))).^2); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = sqrt((diff(cell2mat(DatiElab(index3(1):index1(1),index)))).^2+(diff(cell2mat(DatiElab(index3(1):index1(1),index+1)))).^2); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_IPL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_IPL(s,prog) = Date_1gg(s,n); + Node_Alert_IPL(s,prog) = cell2mat(NodoInPlaceLink(nn,n)); + ID_Alert_IPL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_IPL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_IPL(s,prog) = Date_1gg(s,n); + Node_Alert_IPL(s,prog) = cell2mat(NodoInPlaceLink(nn,n)); + ID_Alert_IPL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_IPL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_IPL(s,prog) = Date_1gg(s,n); + Node_Alert_IPL(s,prog) = cell2mat(NodoInPlaceLink(nn,n)); + ID_Alert_IPL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+2; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' In Place Link have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_IPL,~] = size(rIPL); + ini = 1; + fin = cumsum(rIPL); + Num_Allarmi_IPL = zeros(1,num_IPL); + for AL = 1:num_IPL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_IPL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_IPL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% In Place Link HR + if isempty(find(yesIPLHR)) == 1 % Non ho In Place Link HR + text = 'In Place Link HR have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_IPLHR = 0; + else + clear Date_1gg + IPLHR = cumsum(rIPLHR); + Alert_IPLHR = zeros(1,IPLHR(end)); % Livello di Allerta + Date_Alert_IPLHR = zeros(1,IPLHR(end)); % Data di Allerta + Node_Alert_IPLHR = zeros(1,IPLHR(end)); % Numero di nodo in Allerta + ID_Alert_IPLHR = cell(1,IPLHR(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesIPLHR(n) == 1 + date_rif = now-15; % 15 giorni + for nn = 1:rIPLHR(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' ... + num2str(cell2mat(NodoInPlaceLinkHR(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select XShift, YShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' ... + num2str(cell2mat(NodoInPlaceLinkHR(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index:index+1) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index:index+1) = Control; + DatiElab(rCD+1:rDE,index:index+1) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index:index+1) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = sqrt((diff(cell2mat(DatiElab(index1(1):end,index))))... + .^2+(diff(cell2mat(DatiElab(index1(1):end,index+1)))).^2); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = sqrt((diff(cell2mat(DatiElab(:,index)))).^2+(diff(cell2mat(DatiElab(:,index+1)))).^2); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = sqrt((diff(cell2mat(DatiElab(index7(1):index1(1),index)))).^2+(diff(cell2mat(DatiElab(index7(1):index1(1),index+1)))).^2); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = sqrt((diff(cell2mat(DatiElab(index3(1):index1(1),index)))).^2+(diff(cell2mat(DatiElab(index3(1):index1(1),index+1)))).^2); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_IPLHR(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_IPLHR(s,prog) = Date_1gg(s,n); + Node_Alert_IPLHR(s,prog) = cell2mat(NodoInPlaceLinkHR(nn,n)); + ID_Alert_IPLHR(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_IPLHR(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_IPLHR(s,prog) = Date_1gg(s,n); + Node_Alert_IPLHR(s,prog) = cell2mat(NodoInPlaceLinkHR(nn,n)); + ID_Alert_IPLHR(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_IPLHR(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_IPLHR(s,prog) = Date_1gg(s,n); + Node_Alert_IPLHR(s,prog) = cell2mat(NodoInPlaceLinkHR(nn,n)); + ID_Alert_IPLHR(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+2; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' In Place Link HR have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_IPLHR,~] = size(rIPLHR); + ini = 1; + fin = cumsum(rIPLHR); + Num_Allarmi_IPLHR = zeros(1,num_IPLHR); + for AL = 1:num_IPLHR + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_IPLHR(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_IPLHR(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Tilt Link H + if isempty(find(yesTLH)) == 1 % Non ho Tilt Link H + text = 'Tilt Link H have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_TLH = 0; + else + clear Date_1gg + TLH = cumsum(rTLH); + Alert_TLH = zeros(1,TLH(end)); % Livello di Allerta + Date_Alert_TLH = zeros(1,TLH(end)); % Data di Allerta + Node_Alert_TLH = zeros(1,TLH(end)); % Numero di nodo in Allerta + ID_Alert_TLH = cell(1,TLH(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesTLH(n) == 1 + date_rif = now-15; % 15 giorni + for nn = 1:rTLH(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoTiltLinkH(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select ZShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoTiltLinkH(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index) = Control; + DatiElab(rCD+1:rDE,index) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_TLH(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_TLH(s,prog) = Date_1gg(s,n); + Node_Alert_TLH(s,prog) = cell2mat(NodoTiltLinkH(nn,n)); + ID_Alert_TLH(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_TLH(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_TLH(s,prog) = Date_1gg(s,n); + Node_Alert_TLH(s,prog) = cell2mat(NodoTiltLinkH(nn,n)); + ID_Alert_TLH(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_TLH(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_TLH(s,prog) = Date_1gg(s,n); + Node_Alert_TLH(s,prog) = cell2mat(NodoTiltLinkH(nn,n)); + ID_Alert_TLH(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+1; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' Tilt Link H have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_TLH,~] = size(rTLH); + ini = 1; + fin = cumsum(rTLH); + Num_Allarmi_TLH = zeros(1,num_TLH); + for AL = 1:num_TLH + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_TLH(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_TLH(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Tilt Link HR H + if isempty(find(yesTLHRH)) == 1 % Non ho Tilt Link HR H + text = 'Tilt Link HR H have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_TLHRH = 0; + else + clear Date_1gg + TLHRH = cumsum(rTLHRH); + Alert_TLHRH = zeros(1,TLHRH(end)); % Livello di Allerta + Date_Alert_TLHRH = zeros(1,TLHRH(end)); % Data di Allerta + Node_Alert_TLHRH = zeros(1,TLHRH(end)); % Numero di nodo in Allerta + ID_Alert_TLHRH = cell(1,TLHRH(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesTLHRH(n) == 1 + date_rif = now-15; % 15 giorni + for nn = 1:rTLHRH(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoTiltLinkHRH(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select ZShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoTiltLinkHRH(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index) = Control; + DatiElab(rCD+1:rDE,index) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_TLHRH(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_TLHRH(s,prog) = Date_1gg(s,n); + Node_Alert_TLHRH(s,prog) = cell2mat(NodoTiltLinkHRH(nn,n)); + ID_Alert_TLHRH(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_TLHRH(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_TLHRH(s,prog) = Date_1gg(s,n); + Node_Alert_TLHRH(s,prog) = cell2mat(NodoTiltLinkHRH(nn,n)); + ID_Alert_TLHRH(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_TLHRH(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_TLHRH(s,prog) = Date_1gg(s,n); + Node_Alert_TLHRH(s,prog) = cell2mat(NodoTiltLinkHRH(nn,n)); + ID_Alert_TLHRH(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+1; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' Tilt Link HR H have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_TLHRH,~] = size(rTLHRH); + ini = 1; + fin = cumsum(rTLHRH); + Num_Allarmi_TLHRH = zeros(1,num_TLHRH); + for AL = 1:num_TLHRH + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_TLHRH(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_TLHRH(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Tunnel Link + if isempty(find(yesTuL)) == 1 % Non ho Tunnel Link + text = 'Tunnel Link have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_TuL = 0; + else + TuL = cumsum(rTuL); + Alert_TuL = zeros(1,TuL(end)); % Livello di Allerta + Date_Alert_TuL = zeros(1,TuL(end)); % Data di Allerta + Node_Alert_TuL = zeros(1,TuL(end)); % Numero di nodo in Allerta + ID_Alert_TuL = cell(1,TuL(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesTuL(n) == 1 + date_rif = now-15; % 15 giorni + for nn = 1:rTuL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' ... + num2str(cell2mat(NodoTunnelLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo la matrice date usando il primo nodo + end + comando = ['select XShift, ZShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' ... + num2str(cell2mat(NodoTunnelLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); % Dati del nodo N dell'Array X + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index:index+1) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index:index+1) = Control; + DatiElab(rCD+1:rDE,index:index+1) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index:index+1) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = sqrt((diff(cell2mat(DatiElab(index1(1):end,index))))... + .^2+(diff(cell2mat(DatiElab(index1(1):end,index+1)))).^2); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = sqrt((diff(cell2mat(DatiElab(:,index)))).^2+(diff(cell2mat(DatiElab(:,index+1)))).^2); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = sqrt((diff(cell2mat(DatiElab(index7(1):index1(1),index)))).^2+(diff(cell2mat(DatiElab(index7(1):index1(1),index+1)))).^2); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = sqrt((diff(cell2mat(DatiElab(index3(1):index1(1),index)))).^2+(diff(cell2mat(DatiElab(index3(1):index1(1),index+1)))).^2); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_TuL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_TuL(s,prog) = Date_1gg(s,n); + Node_Alert_TuL(s,prog) = cell2mat(NodoTunnelLink(nn,n)); + ID_Alert_TuL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_TuL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_TuL(s,prog) = Date_1gg(s,n); + Node_Alert_TuL(s,prog) = cell2mat(NodoTunnelLink(nn,n)); + ID_Alert_TuL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_TuL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_TuL(s,prog) = Date_1gg(s,n); + Node_Alert_TuL(s,prog) = cell2mat(NodoTunnelLink(nn,n)); + ID_Alert_TuL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+2; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' Tunnel Link have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_TuL,~] = size(rTuL); + ini = 1; + fin = cumsum(rTuL); + Num_Allarmi_TuL = zeros(1,num_TuL); + for AL = 1:num_TuL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_TuL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_TuL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Radial Link + if isempty(find(yesRL)) == 1 % Non ho Radial Link + text = 'Radial Link have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_RL = 0; + else + RL = cumsum(rRL); + Alert_RL = zeros(1,RL(end)); % Livello di Allerta + Date_Alert_RL = zeros(1,RL(end)); % Data di Allerta + Node_Alert_RL = zeros(1,RL(end)); % Numero di nodo in Allerta + ID_Alert_RL = cell(1,RL(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesRL(n) == 1 + date_rif = now-15; % 15 giorni + for nn = 1:rRL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' ... + num2str(cell2mat(NodoRadialLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo la matrice date usando il primo nodo + end + comando = ['select XShift, YShift, ZShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' ... + num2str(cell2mat(NodoRadialLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); % Dati del nodo N dell'Array X + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index:index+2) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index:index+2) = Control; + DatiElab(rCD+1:rDE,index:index+2) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index:index+2) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = sqrt((diff(cell2mat(DatiElab(index1(1):end,index))))... + .^2+(diff(cell2mat(DatiElab(index1(1):end,index+1)))).^2+... + +(diff(cell2mat(DatiElab(index1(1):end,index+2)))).^2); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = sqrt((diff(cell2mat(DatiElab(:,index)))).^2+... + (diff(cell2mat(DatiElab(:,index+1)))).^2 ... + +(diff(cell2mat(DatiElab(:,index+2)))).^2); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = sqrt((diff(cell2mat(DatiElab(index7(1):index1(1),index)))).^2+... + (diff(cell2mat(DatiElab(index7(1):index1(1),index+1)))).^2+... + (diff(cell2mat(DatiElab(index7(1):index1(1),index+2)))).^2); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = sqrt((diff(cell2mat(DatiElab(index3(1):index1(1),index)))).^2+... + (diff(cell2mat(DatiElab(index3(1):index1(1),index+1)))).^2+... + (diff(cell2mat(DatiElab(index3(1):index1(1),index+2)))).^2); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_RL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_RL(s,prog) = Date_1gg(s,n); + Node_Alert_RL(s,prog) = cell2mat(NodoTiltLink(nn,n)); + ID_Alert_RL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_RL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_RL(s,prog) = Date_1gg(s,n); + Node_Alert_RL(s,prog) = cell2mat(NodoTiltLink(nn,n)); + ID_Alert_RL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_RL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_RL(s,prog) = Date_1gg(s,n); + Node_Alert_RL(s,prog) = cell2mat(NodoTiltLink(nn,n)); + ID_Alert_RL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+3; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' Radial Link have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_RL,~] = size(rRL); + ini = 1; + fin = cumsum(rRL); + Num_Allarmi_RL = zeros(1,num_RL); + for AL = 1:num_RL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_RL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_RL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% PreConv Link + if isempty(find(yesPCL)) == 1 % Non ho PreConv Link + text = 'PreConv Link have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_PCL = 0; + else + clear Date_1gg + PCL = cumsum(rPCL); + Alert_PCL = zeros(1,PCL(end)); % Livello di Allerta + Date_Alert_PCL = zeros(1,PCL(end)); % Data di Allerta + Node_Alert_PCL = zeros(1,PCL(end)); % Numero di nodo in Allerta + ID_Alert_PCL = cell(1,PCL(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesPCL(n) == 1 + date_rif = now-15; % 15 giorni + for nn = 1:rPCL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' ... + num2str(cell2mat(NodoPreConvLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select ZShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' ... + num2str(cell2mat(NodoPreConvLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index) = Control; + DatiElab(rCD+1:rDE,index) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_PCL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_PCL(s,prog) = Date_1gg(s,n); + Node_Alert_PCL(s,prog) = cell2mat(NodoPreConvLink(nn,n)); + ID_Alert_PCL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_PCL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_PCL(s,prog) = Date_1gg(s,n); + Node_Alert_PCL(s,prog) = cell2mat(NodoPreConvLink(nn,n)); + ID_Alert_PCL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_PCL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_PCL(s,prog) = Date_1gg(s,n); + Node_Alert_PCL(s,prog) = cell2mat(NodoPreConvLink(nn,n)); + ID_Alert_PCL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+1; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' PreConv Link have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_PCL,~] = size(rPCL); + ini = 1; + fin = cumsum(rPCL); + Num_Allarmi_PCL = zeros(1,num_PCL); + for AL = 1:num_PCL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_PCL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_PCL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% PreConv Link HR + if isempty(find(yesPCLHR)) == 1 % Non ho PreConv Link HR + text = 'PreConv Link HR have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_PCLHR = 0; + else + clear Date_1gg + PCLHR = cumsum(rPCLHR); + Alert_PCLHR = zeros(1,PCLHR(end)); % Livello di Allerta + Date_Alert_PCLHR = zeros(1,PCLHR(end)); % Data di Allerta + Node_Alert_PCLHR = zeros(1,PCLHR(end)); % Numero di nodo in Allerta + ID_Alert_PCLHR = cell(1,PCLHR(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesPCLHR(n) == 1 + date_rif = now-15; % 15 giorni + for nn = 1:rPCLHR(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' ... + num2str(cell2mat(NodoPreConvLinkHR(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select ZShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' ... + num2str(cell2mat(NodoPreConvLinkHR(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index) = Control; + DatiElab(rCD+1:rDE,index) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_PCLHR(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_PCLHR(s,prog) = Date_1gg(s,n); + Node_Alert_PCLHR(s,prog) = cell2mat(NodoTiltLinkH(nn,n)); + ID_Alert_PCLHR(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_PCLHR(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_PCLHR(s,prog) = Date_1gg(s,n); + Node_Alert_PCLHR(s,prog) = cell2mat(NodoTiltLinkH(nn,n)); + ID_Alert_PCLHR(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_PCLHR(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_PCLHR(s,prog) = Date_1gg(s,n); + Node_Alert_PCLHR(s,prog) = cell2mat(NodoTiltLinkH(nn,n)); + ID_Alert_PCLHR(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+1; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' PreConv Link HR have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_PCLHR,~] = size(rPCLHR); + ini = 1; + fin = cumsum(rPCLHR); + Num_Allarmi_PCLHR = zeros(1,num_PCLHR); + for AL = 1:num_PCLHR + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_PCLHR(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_PCLHR(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Piezo Link + if isempty(find(yesPL)) == 1 % Non ho Piezo Link + text = 'Piezo Link have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_PL = 0; + else + clear Date_1gg + PL = cumsum(rPL); + Alert_PL = zeros(1,PL(end)); % Livello di Allerta + Date_Alert_PL = zeros(1,PL(end)); % Data di Allerta + Node_Alert_PL = zeros(1,PL(end)); % Numero di nodo in Allerta + ID_Alert_PL = cell(1,PL(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesPL(n) == 1 + date_rif = now-15; % 15 giorni + for nn = 1:rPL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoPiezoLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo la matrice date usando il primo nodo + end + comando = ['select water_level from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoPiezoLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index) = Control; + DatiElab(rCD+1:rDE,index) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_PL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_PL(s,prog) = Date_1gg(s,n); + Node_Alert_PL(s,prog) = cell2mat(NodoPiezoLink(nn,n)); + ID_Alert_PL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_PL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_PL(s,prog) = Date_1gg(s,n); + Node_Alert_PL(s,prog) = cell2mat(NodoPiezoLink(nn,n)); + ID_Alert_PL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_PL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_PL(s,prog) = Date_1gg(s,n); + Node_Alert_PL(s,prog) = cell2mat(NodoPiezoLink(nn,n)); + ID_Alert_PL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+1; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' Piezo Link have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_PL,~] = size(rPL); + ini = 1; + fin = cumsum(rPL); + Num_Allarmi_PL = zeros(1,num_PL); + for AL = 1:num_PL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_PL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_PL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Klino Link + if isempty(find(yesKL)) == 1 % Non ho Klino Link + text = 'Klino Link have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_KL = 0; + else + clear Date_1gg + K = cumsum(rKL); + Alert_KL = zeros(1,K(end)); % Livello di Allerta + Date_Alert_KL = zeros(1,K(end)); % Data di Allerta + Node_Alert_KL = zeros(1,K(end)); % Numero di nodo in Allerta + ID_Alert_KL = cell(1,K(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesKL(n) == 1 + date_rif = now-15; % 15 giorni + for nn = 1:rKL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoKlinoLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select XShift, YShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoKlinoLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index:index+1) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index:index+1) = Control; + DatiElab(rCD+1:rDE,index:index+1) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index:index+1) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index:index+1)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index:index+1)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index:index+1)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index:index+1)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_KL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_KL(s,prog) = Date_1gg(s,n); + Node_Alert_KL(s,prog) = cell2mat(NodoKlinoLink(nn,n)); + ID_Alert_KL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_KL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_KL(s,prog) = Date_1gg(s,n); + Node_Alert_KL(s,prog) = cell2mat(NodoKlinoLink(nn,n)); + ID_Alert_KL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_KL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_KL(s,prog) = Date_1gg(s,n); + Node_Alert_KL(s,prog) = cell2mat(NodoKlinoLink(nn,n)); + ID_Alert_KL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+2; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' Klino Link have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_KL,~] = size(rKL); + ini = 1; + fin = cumsum(rKL); + Num_Allarmi_KL = zeros(1,num_KL); + for AL = 1:num_KL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_KL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_KL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Klino Link HR + if isempty(find(yesKLHR)) == 1 % Non ho Klino Link HR + text = 'Klino Link HR have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_KLHR = 0; + else + clear Date_1gg + KHR = cumsum(rKLHR); + Alert_KLHR = zeros(1,KHR(end)); % Livello di Allerta + Date_Alert_KLHR = zeros(1,KHR(end)); % Data di Allerta + Node_Alert_KLHR = zeros(1,KHR(end)); % Numero di nodo in Allerta + ID_Alert_KLHR = cell(1,KHR(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesKLHR(n) == 1 + date_rif = now-15; % 15 giorni + for nn = 1:rKLHR(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoKlinoLinkHR(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select XShift, YShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoKlinoLinkHR(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index:index+1) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index:index+1) = Control; + DatiElab(rCD+1:rDE,index:index+1) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index:index+1) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index:index+1)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index:index+1)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index:index+1)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index:index+1)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_KLHR(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_KLHR(s,prog) = Date_1gg(s,n); + Node_Alert_KLHR(s,prog) = cell2mat(NodoKlinoLinkHR(nn,n)); + ID_Alert_KLHR(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_KLHR(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_KLHR(s,prog) = Date_1gg(s,n); + Node_Alert_KLHR(s,prog) = cell2mat(NodoKlinoLinkHR(nn,n)); + ID_Alert_KLHR(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_KLHR(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_KLHR(s,prog) = Date_1gg(s,n); + Node_Alert_KLHR(s,prog) = cell2mat(NodoKlinoLinkHR(nn,n)); + ID_Alert_KLHR(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+2; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' Klino Link HR have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_KLHR,~] = size(rKLHR); + ini = 1; + fin = cumsum(rKLHR); + Num_Allarmi_KLHR = zeros(1,num_KLHR); + for AL = 1:num_KLHR + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_KLHR(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_KLHR(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Load Link + if isempty(find(yesLL)) == 1 % Non ho Load Link + text = 'Load Link have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_LL = 0; + else + clear Date_1gg + LL = cumsum(rLL); + Alert_LL = zeros(1,LL(end)); % Livello di Allerta + Date_Alert_LL = zeros(1,LL(end)); % Data di Allerta + Node_Alert_LL = zeros(1,LL(end)); % Numero di nodo in Allerta + ID_Alert_LL = cell(1,LL(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesLL(n) == 1 + status = system(['/usr/local/matlab_func/run_ATD_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 ' char(chainID(n,2)) ' ' char(chainID(n,4)) '']); + if status == 1 + break % se crasha il SW salto l'analisi + end + date_rif = now-15; % 15 giorni + for nn = 1:rLL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoLoadLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select load_value from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoLoadLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index) = Control; + DatiElab(rCD+1:rDE,index) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_LL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_LL(s,prog) = Date_1gg(s,n); + Node_Alert_LL(s,prog) = cell2mat(NodoLoadLink(nn,n)); + ID_Alert_LL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_LL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_LL(s,prog) = Date_1gg(s,n); + Node_Alert_LL(s,prog) = cell2mat(NodoLoadLink(nn,n)); + ID_Alert_LL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_LL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_LL(s,prog) = Date_1gg(s,n); + Node_Alert_LL(s,prog) = cell2mat(NodoLoadLink(nn,n)); + ID_Alert_LL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+1; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' Load Link have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_LL,~] = size(rLL); + ini = 1; + fin = cumsum(rLL); + Num_Allarmi_LL = zeros(1,num_LL); + for AL = 1:num_LL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_LL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_LL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Pressure Link + if isempty(find(yesPrL)) == 1 % Non ho Pressure Link + text = 'Pressure Link have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_PrL = 0; + else + clear Date_1gg + PrL = cumsum(rPrL); + Alert_PrL = zeros(1,PrL(end)); % Livello di Allerta + Date_Alert_PrL = zeros(1,PrL(end)); % Data di Allerta + Node_Alert_PrL = zeros(1,PrL(end)); % Numero di nodo in Allerta + ID_Alert_PrL = cell(1,PrL(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesPrL(n) == 1 + status = system(['/usr/local/matlab_func/run_ATD_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 ' char(chainID(n,2)) ' ' char(chainID(n,4)) '']); + if status == 1 + break % se crasha il SW salto l'analisi + end + date_rif = now-15; % 15 giorni + for nn = 1:rPrL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoPressureLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select pressure from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoPressureLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index) = Control; + DatiElab(rCD+1:rDE,index) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_PrL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_PrL(s,prog) = Date_1gg(s,n); + Node_Alert_PrL(s,prog) = cell2mat(NodoPressureLink(nn,n)); + ID_Alert_PrL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_PrL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_PrL(s,prog) = Date_1gg(s,n); + Node_Alert_PrL(s,prog) = cell2mat(NodoPressureLink(nn,n)); + ID_Alert_PrL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_PrL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_PrL(s,prog) = Date_1gg(s,n); + Node_Alert_PrL(s,prog) = cell2mat(NodoPressureLink(nn,n)); + ID_Alert_PrL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+1; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' Pressure Link have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_PrL,~] = size(rPrL); + ini = 1; + fin = cumsum(rPrL); + Num_Allarmi_PrL = zeros(1,num_PrL); + for AL = 1:num_PrL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_PrL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_PrL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Crack Link + if isempty(find(yesCrL)) == 1 % Non ho Crack Link + text = 'Crack Link have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_CrL = 0; + else + clear Date_1gg + C = cumsum(rCrL); + Alert_CrL = zeros(1,C(end)); % Livello di Allerta + Date_Alert_CrL = zeros(1,C(end)); % Data di Allerta + Node_Alert_CrL = zeros(1,C(end)); % Numero di nodo in Allerta + ID_Alert_CrL = cell(1,C(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesCrL(n) == 1 + status = system(['/usr/local/matlab_func/run_ATD_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 ' char(chainID(n,2)) ' ' char(chainID(n,4)) '']); + if status == 1 + break % se crasha il SW salto l'analisi + end + date_rif = now-15; % 15 giorni + for nn = 1:rCrL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoCrackLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select XShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoCrackLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index) = Control; + DatiElab(rCD+1:rDE,index) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_CrL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_CrL(s,prog) = Date_1gg(s,n); + Node_Alert_CrL(s,prog) = cell2mat(NodoCrackLink(nn,n)); + ID_Alert_CrL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_CrL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_CrL(s,prog) = Date_1gg(s,n); + Node_Alert_CrL(s,prog) = cell2mat(NodoCrackLink(nn,n)); + ID_Alert_CrL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_CrL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_CrL(s,prog) = Date_1gg(s,n); + Node_Alert_CrL(s,prog) = cell2mat(NodoCrackLink(nn,n)); + ID_Alert_CrL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+1; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' Crack Link have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_CrL,~] = size(rCrL); + ini = 1; + fin = cumsum(rCrL); + Num_Allarmi_CrL = zeros(1,num_CrL); + for AL = 1:num_CrL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_CrL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_CrL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% 3D Crack Link + if isempty(find(yes3DCrL)) == 1 % Non ho 3D Crack Link + text = '3D Crack Link have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_3DCrL = 0; + else + clear Date_1gg + CrL3D = cumsum(r3DCrL); + Alert_3DCrL = zeros(1,CrL3D(end)); % Livello di Allerta + Date_Alert_3DCrL = zeros(1,CrL3D(end)); % Data di Allerta + Node_Alert_3DCrL = zeros(1,CrL3D(end)); % Numero di nodo in Allerta + ID_Alert_3DCrL = cell(1,CrL3D(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yes3DCrL(n) == 1 + status = system(['/usr/local/matlab_func/run_ATD_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 ' char(chainID(n,2)) ' ' char(chainID(n,4)) '']); + if status == 1 + break % se crasha il SW salto l'analisi + end + date_rif = now-15; % 15 giorni + for nn = 1:r3DCrL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(Nodo3DCrackLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select XShift, YShift, ZShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(Nodo3DCrackLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index:index+2) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index:index+2) = Control; + DatiElab(rCD+1:rDE,index:index+2) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index:index+2) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index:index+2)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index:index+2)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index:index+2)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index:index+2)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_3DCrL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_3DCrL(s,prog) = Date_1gg(s,n); + Node_Alert_3DCrL(s,prog) = cell2mat(Nodo3DCrackLink(nn,n)); + ID_Alert_3DCrL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_3DCrL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_3DCrL(s,prog) = Date_1gg(s,n); + Node_Alert_3DCrL(s,prog) = cell2mat(Nodo3DCrackLink(nn,n)); + ID_Alert_3DCrL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_3DCrL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_3DCrL(s,prog) = Date_1gg(s,n); + Node_Alert_3DCrL(s,prog) = cell2mat(Nodo3DCrackLink(nn,n)); + ID_Alert_3DCrL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+3; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' 3D Crack Link have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_3DCrL,~] = size(r3DCrL); + ini = 1; + fin = cumsum(r3DCrL); + Num_Allarmi_3DCrL = zeros(1,num_3DCrL); + for AL = 1:num_3DCrL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_3DCrL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_3DCrL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Rain Link + if isempty(find(yesRaL)) == 1 % Non ho Rain Link + text = 'Rain Link have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_RaL = 0; + else + clear Date_1gg + RaL = cumsum(rRaL); + Alert_RaL = zeros(1,RaL(end)); % Livello di Allerta + Date_Alert_RaL = zeros(1,RaL(end)); % Data di Allerta + Node_Alert_RaL = zeros(1,RaL(end)); % Numero di nodo in Allerta + ID_Alert_RaL = cell(1,RaL(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesRaL(n) == 1 + date_rif = now-15; % 15 giorni + for nn = 1:rRaL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' ... + num2str(cell2mat(NodoRainLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select Z from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = '''... + num2str(cell2mat(NodoRainLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index) = Control; + DatiElab(rCD+1:rDE,index) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_RaL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_RaL(s,prog) = Date_1gg(s,n); + Node_Alert_RLa(s,prog) = cell2mat(NodoRainLink(nn,n)); + ID_Alert_RaL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_RaL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_RaL(s,prog) = Date_1gg(s,n); + Node_Alert_RaL(s,prog) = cell2mat(NodoRainLink(nn,n)); + ID_Alert_RaL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_RaL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_RaL(s,prog) = Date_1gg(s,n); + Node_Alert_RaL(s,prog) = cell2mat(NodoRainLink(nn,n)); + ID_Alert_RaL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+1; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' Rain Link have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_RaL,~] = size(rRaL); + ini = 1; + fin = cumsum(rRaL); + Num_Allarmi_RaL = zeros(1,num_RaL); + for AL = 1:num_RaL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_RaL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_RaL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Extensometer Link + if isempty(find(yesEL)) == 1 % Non ho Extensometer Link + text = 'Extensometer Link have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_EL = 0; + else + clear Date_1gg + EL = cumsum(rEL); + Alert_EL = zeros(1,EL(end)); % Livello di Allerta + Date_Alert_EL = zeros(1,EL(end)); % Data di Allerta + Node_Alert_EL = zeros(1,EL(end)); % Numero di nodo in Allerta + ID_Alert_EL = cell(1,EL(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesEL(n) == 1 + status = system(['/usr/local/matlab_func/run_ATD_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 ' char(chainID(n,2)) ' ' char(chainID(n,4)) '']); + if status == 1 + break % se crasha il SW salto l'analisi + end + date_rif = now-15; % 15 giorni + for nn = 1:rEL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoExtensometerLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo la matrice date usando il primo nodo + end + comando = ['select XShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoExtensometerLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index) = Control; + DatiElab(rCD+1:rDE,index) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_EL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_EL(s,prog) = Date_1gg(s,n); + Node_Alert_EL(s,prog) = cell2mat(NodoExtensometerLink(nn,n)); + ID_Alert_EL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_EL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_EL(s,prog) = Date_1gg(s,n); + Node_Alert_EL(s,prog) = cell2mat(NodoExtensometerLink(nn,n)); + ID_Alert_EL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_EL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_EL(s,prog) = Date_1gg(s,n); + Node_Alert_EL(s,prog) = cell2mat(NodoExtensometerLink(nn,n)); + ID_Alert_EL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+1; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' Extensometer Link have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_EL,~] = size(rEL); + ini = 1; + fin = cumsum(rEL); + Num_Allarmi_EL = zeros(1,num_EL); + for AL = 1:num_EL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_EL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_EL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% 3D Extensometer Link + if isempty(find(yes3DEL)) == 1 % Non ho 3D Extensometer Link + text = '3D Extensometer Link have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_3DEL = 0; + else + clear Date_1gg + EL3D = cumsum(r3DEL); + Alert_3DEL = zeros(1,EL3D(end)); % Livello di Allerta + Date_Alert_3DEL = zeros(1,EL3D(end)); % Data di Allerta + Node_Alert_3DEL = zeros(1,EL3D(end)); % Numero di nodo in Allerta + ID_Alert_3DEL = cell(1,EL3D(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yes3DEL(n) == 1 + status = system(['/usr/local/matlab_func/run_ATD_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 ' char(chainID(n,2)) ' ' char(chainID(n,4)) '']); + if status == 1 + break % se crasha il SW salto l'analisi + end + date_rif = now-15; % 15 giorni + for nn = 1:r3DEL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(Nodo3DExtensometerLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select XShift, YShift, ZShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(Nodo3DExtensometerLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index:index+2) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index:index+2) = Control; + DatiElab(rCD+1:rDE,index:index+2) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index:index+2)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index:index+2)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index:index+2)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index:index+2)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_3DEL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_3DEL(s,prog) = Date_1gg(s,n); + Node_Alert_3DEL(s,prog) = cell2mat(Nodo3DExtensometerLink(nn,n)); + ID_Alert_3DEL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_3DEL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_3DEL(s,prog) = Date_1gg(s,n); + Node_Alert_3DEL(s,prog) = cell2mat(Nodo3DExtensometerLink(nn,n)); + ID_Alert_3DEL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_3DEL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_3DEL(s,prog) = Date_1gg(s,n); + Node_Alert_3DEL(s,prog) = cell2mat(Nodo3DExtensometerLink(nn,n)); + ID_Alert_3DEL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+3; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' 3D Extensometer Link have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_3DEL,~] = size(r3DEL); + ini = 1; + fin = cumsum(r3DEL); + Num_Allarmi_3DEL = zeros(1,num_3DEL); + for AL = 1:num_3DEL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_3DEL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_3DEL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Wire Extensometer Link + if isempty(find(yesWEL)) == 1 % Non ho Wire Extensometer Link + text = 'Wire Extensometer Link have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_WEL = 0; + else + clear Date_1gg + WEL = cumsum(rWEL); + Alert_WEL = zeros(1,WEL(end)); % Livello di Allerta + Date_Alert_WEL = zeros(1,WEL(end)); % Data di Allerta + Node_Alert_WEL = zeros(1,WEL(end)); % Numero di nodo in Allerta + ID_Alert_WEL = cell(1,WEL(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesWEL(n) == 1 + status = system(['/usr/local/matlab_func/run_ATD_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 ' char(chainID(n,2)) ' ' char(chainID(n,4)) '']); + if status == 1 + break % se crasha il SW salto l'analisi + end + date_rif = now-15; % 15 giorni + for nn = 1:rWEL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoWireExtensometerLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select XShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoWireExtensometerLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index) = Control; + DatiElab(rCD+1:rDE,index) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_WEL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_WEL(s,prog) = Date_1gg(s,n); + Node_Alert_WEL(s,prog) = cell2mat(NodoWireExtensometerLink(nn,n)); + ID_Alert_WEL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_WEL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_WEL(s,prog) = Date_1gg(s,n); + Node_Alert_WEL(s,prog) = cell2mat(NodoWireExtensometerLink(nn,n)); + ID_Alert_WEL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_WEL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_WEL(s,prog) = Date_1gg(s,n); + Node_Alert_WEL(s,prog) = cell2mat(NodoWireExtensometerLink(nn,n)); + ID_Alert_WEL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+1; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' Wire Extensometer Link have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_WEL,~] = size(rWEL); + ini = 1; + fin = cumsum(rWEL); + Num_Allarmi_WEL = zeros(1,num_WEL); + for AL = 1:num_WEL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_WEL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_WEL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Multi Point Borehole Extensometer Link + if isempty(find(yesMPBEL)) == 1 % Non ho In Place Link + text = 'Multi Point Borehole Extensometer Link have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_MPBEL = 0; + else + clear Date_1gg + MPBEL = cumsum(rMPBEL); + Alert_MPBEL = zeros(1,MPBEL(end)); % Livello di Allerta + Date_Alert_MPBEL = zeros(1,MPBEL(end)); % Data di Allerta + Node_Alert_MPBEL = zeros(1,MPBEL(end)); % Numero di nodo in Allerta + ID_Alert_MPBEL = cell(1,MPBEL(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesMPBEL(n) == 1 + status = system(['/usr/local/matlab_func/run_ATD_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 ' char(chainID(n,2)) ' ' char(chainID(n,4)) '']); + if status == 1 + break % se crasha il SW salto l'analisi + end + date_rif = now-15; % 15 giorni + for nn = 1:rMPBEL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoMultiPointExtensometerLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select XShift, YShift, ZShift, X, Y, Z from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoMultiPointExtensometerLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index:index+5) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index:index+5) = Control; + DatiElab(rCD+1:rDE,index) = Control(end,1); + DatiElab(rCD+1:rDE,index+1) = Control(end,2); + DatiElab(rCD+1:rDE,index+2) = Control(end,3); + DatiElab(rCD+1:rDE,index+3) = Control(end,4); + DatiElab(rCD+1:rDE,index+4) = Control(end,5); + DatiElab(rCD+1:rDE,index+5) = Control(end,6); + RIF = rDE; + end + else + DatiElab(:,index:index+5) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rCD; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index:index+5)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index:index+5)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index:index+5)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index:index+5)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_MPBEL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_MPBEL(s,prog) = Date_1gg(s,n); + Node_Alert_MPBEL(s,prog) = cell2mat(NodoMultiPointExtensometerLink(nn,n)); + ID_Alert_MPBEL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_MPBEL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_MPBEL(s,prog) = Date_1gg(s,n); + Node_Alert_MPBEL(s,prog) = cell2mat(NodoMultiPointExtensometerLink(nn,n)); + ID_Alert_MPBEL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_MPBEL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_MPBEL(s,prog) = Date_1gg(s,n); + Node_Alert_MPBEL(s,prog) = cell2mat(NodoMultiPointExtensometerLink(nn,n)); + ID_Alert_MPBEL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+6; + prog = prog+1; + end + fprintf(fileID,fmt,text); + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' MultiPoint Extensometer Link have been analyzed']; + index = 1; + end + end + [num_MPBEL,~] = size(rMPBEL); + ini = 1; + fin = cumsum(rMPBEL); + Num_Allarmi_MPBEL = zeros(1,num_MPBEL); + for AL = 1:num_MPBEL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_MPBEL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_MPBEL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Valuto il numero di Array e Sensori che ho in sito + % In questa parte del codice ogni sensore posto in una posizione conta "1". + % Ad esempio due Vertical Array con 20 sensori Tilt Link V per ognuno conta + % 2 Sensori, mentre 3 clinometri in una stessa catena contano 3 + Num_Sensori = cumsum(yesTL + yesTLHR + yesTLH + yesTLHRH + yesIPL + yesIPLHR + ... + yesTuL + yesRL + yesPCL + yesPCLHR + rKL + rKLHR + rCrL + r3DCrL +... + rEL + r3DEL + + rLL + rPrL + rMPBEL + yesPL + rRaL + rWEL); + Num_Sensori = Num_Sensori(end); + + Num_Allarmi = cumsum(Num_Allarmi_TL) + cumsum(Num_Allarmi_TLHR) + cumsum(Num_Allarmi_TLH) +... + cumsum(Num_Allarmi_TLHRH) + cumsum(Num_Allarmi_IPL) + cumsum(Num_Allarmi_IPLHR) +... + cumsum(Num_Allarmi_TuL) + cumsum(Num_Allarmi_RL) + cumsum(Num_Allarmi_PCL) +... + cumsum(Num_Allarmi_PCLHR) + cumsum(Num_Allarmi_KL) + cumsum(Num_Allarmi_KLHR) +... + cumsum(Num_Allarmi_CrL) + cumsum(Num_Allarmi_3DCrL) + cumsum(Num_Allarmi_PL) +... + cumsum(Num_Allarmi_RaL) + cumsum(Num_Allarmi_MPBEL) + cumsum(Num_Allarmi_WEL) + ... + cumsum(Num_Allarmi_3DEL) + cumsum(Num_Allarmi_EL) + cumsum(Num_Allarmi_PrL) +... + cumsum(Num_Allarmi_LL); + Num_Allarmi = Num_Allarmi(end); + + Codice_Allerta = Num_Allarmi*100/(Num_Sensori*3); + if isnan(Codice_Allerta) == 1 + Codice_Allerta = 0; + end + + alert = 0; + alarm = 0; + Code = 0; + if Codice_Allerta <= 25 + Codex = 'White'; + Code = 1; + elseif Codice_Allerta > 25 && Codice_Allerta <= 50 + Codex = 'Green'; + Code = 2; + elseif Codice_Allerta > 50 && Codice_Allerta <= 75 + Codex = 'Yellow'; + Codice = 'Giallo'; + alert = 1; + Code = 3; + elseif Codice_Allerta > 75 && Codice_Allerta <= 90 + Codex = 'Orange'; + Codice = 'Arancione'; + alert = 1; + Code = 4; + elseif Codice_Allerta > 90 + Codex = 'Red'; + Codice = 'Rosso'; + if Num_Sensori < 5 + alarm = 0; + alert = 1; + Code = 4.5; + else + alarm = 1; + Code = 5; + end + end + + comando = ['select name from sites where id = ''' num2str(cell2mat(siteID)) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + sito = char(curs.Data); + FileNameFIFA = ['' sito '.txt']; + Date = importdata(FileNameFIFA); + if now > Date(1,1) +1 || Code > Date(2,1) + if alert == 1 || alarm == 1 + % Email + setpref('Internet','E_mail','aseparma@gmail.com'); + setpref('Internet','SMTP_Server','smtp.gmail.com'); + setpref('Internet','SMTP_Username','aseparma@gmail.com'); + setpref('Internet','SMTP_Password','Mums@2016'); + 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 + % A chi mando la mail + recipients_ITA{1,1} = 'alessandro.valletta@aseltd.eu'; + recipients_ITA{2,1} = 'andrea.carri@aseltd.eu'; + % Messaggio + if alert == 1 + text = 'Alert procedure activated'; + fprintf(fileID,fmt,text); + subject_ITA = ['ASE Alert: ALLERTA di codice ''' Codice ''' registrata nel sito di ''' sito ''' ']; + message_ITA = cellstr(['Gentile utente, si segnala un''allerta di codice ''' Codice... + ''' nel sito di ''' sito ''' con indice pari a ''' num2str(Codice_Allerta)... + ''' /100 .']); + elseif alarm == 1 + text = 'Alarm procedure activated'; + fprintf(fileID,fmt,text); + subject_ITA = ['ASE Alert: ALLARME di codice ''' Codice ''' registrato nel sito di ''' sito ''' ']; + message_ITA = cellstr(['Gentile utente, si segnala un''allarme di codice ''' Codice... + ''' nel sito di ''' sito ''' con indice pari a ''' num2str(Codice_Allerta)... + ''' /100 .']); +% Criterio = 'FIFA'; +% SMS(IDcentralina,DTcatena,Sito,siteID,conn,Criterio,alert,alarm,FileName); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + end + message = cellstr('Il team di ASE S.r.l.'); + message_ITA = [message_ITA; message]; + % Mando la mail + sendmail(recipients_ITA, subject_ITA, message_ITA) + end + end + + outdat = fopen(FileNameFIFA,'wt+'); + fileID_site = fopen(FileNameFIFA,'a'); + fmt_site = '%.10f \r'; + text = now; + fprintf(fileID_site,fmt_site,text); + text = Code; + fprintf(fileID_site,fmt_site,text); + fclose(fileID_site); + + text = 'soglie function worked correctly.'; + fprintf(fileID,fmt,text); + fclose(fileID); + + catch + text = 'soglie function CRASHED.'; + fprintf(fileID,fmt,text); + fclose(fileID); + end +else + text = 'soglie function executed with no calculations.'; + fprintf(fileID,fmt,text); + fclose(fileID); +end + +end \ No newline at end of file diff --git a/ATD/star.m b/ATD/star.m new file mode 100755 index 0000000..656d6a4 --- /dev/null +++ b/ATD/star.m @@ -0,0 +1,33 @@ +%% Funzione che considera i nodi per il calcolo della stella +% Verso: se uguale a 1 calcola il nodo in senso orario, se uguale a -1 lo +% calcola in senso antiorario, se = 0 lo calcola in entrambi i modi e ne fa +% la media +% Segmenti: dice fra quali nodi calcolare la stella. Per ogni riga, le +% colonne rappresentano i nodi +% Peso: assegna un peso nel calcolo della media fra calcolo orario e +% antiorario. La prima coppia sono i pesi da dare rispetivamente al +% calcolo orario e antiorario per il primo punto del segmento, la +% seconda coppia di ogni riga sono i medesimi valori per il secondo +% punto di un segmento. +% PosIniEnd: riporta la posizione iniziale e finale (per catena chiusa, +% coincidono). In riga le coordinate + +function [Verso,Segmenti,Peso,PosIniEnd,Punti_Noti,Antiorario] = star(... + IDcentralina,DTcatena,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; + +NomeFile = strcat(IDcentralina,'-',DTcatena,'.xlsx'); +Verso = xlsread(NomeFile,1); +Segmenti = xlsread(NomeFile,2); +Peso = xlsread(NomeFile,3); +PosIniEnd = xlsread(NomeFile,4); +Punti_Noti = xlsread(NomeFile,5); +Antiorario = xlsread(NomeFile,6); + +text = 'star function worked correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/ATD/template.m b/ATD/template.m new file mode 100755 index 0000000..c30b355 --- /dev/null +++ b/ATD/template.m @@ -0,0 +1,18 @@ +function template(rpt) + +% If compiling, make the DOM compilable +makeDOMCompilable() + +%% Intestazione e piè di pagina +import mlreportgen.dom.* +import mlreportgen.report.* + +wmPAG = Watermark('sfondoPAG.png'); + +% Construct the header +header = PDFPageHeader(); +footer = PDFPageFooter(); + +rpt.Layout.Watermark = wmPAG; + +end diff --git a/ATD/template_cover.m b/ATD/template_cover.m new file mode 100755 index 0000000..462bb63 --- /dev/null +++ b/ATD/template_cover.m @@ -0,0 +1,18 @@ +function template_cover(rpt) + +%% Intestazione e piè di pagina +import mlreportgen.dom.* +import mlreportgen.report.* + +% If compiling, make the DOM compilable +makeDOMCompilable() + +% Construct the header +header = PDFPageHeader(); +footer = PDFPageFooter(); +wm = Watermark('sfondo.png'); + +% %Adjust the space for the header and top page margin +rpt.Layout.Watermark = wm; + +end diff --git a/ATD/tipologiaNodi.m b/ATD/tipologiaNodi.m new file mode 100755 index 0000000..2589739 --- /dev/null +++ b/ATD/tipologiaNodi.m @@ -0,0 +1,505 @@ +% Funzione che ricostruisce la tipologia di nodi presenti +% NodoTiltLink ad esempio contiene numero del nodo e profondità per tutti i +% nodi di questo tipo +% idTool rappresenta l'identificativo con cui sono definite le +% installazioni su DB, serve più avanti nell'elaborazione +% idNode scrive gli identificativi dei nodi del DB. E' un output di +% controllo + +function [idTool,NodoTunnelLink,NodoRadialLink,NodoTiltLinkH,... + NodoTiltLinkHRH,NodoPreConvLink,NodoPreConvLinkHR,NodoDistoMTLink,NodoPressureLink,... + NodoLoadLink,NodoExtensometerLink,Nodo3DExtensometerLink,NodoWireExtensometerLink,... + NodoMultiPointRodExtensometer,NodoTiltLinkHR3DH,NodoPreConvLinkHR3D,... + NodoAnalogLink,NodoCrackLink,Nodo3DCrackLink,Nodo2DCrackLink,NodoStressMeter,... + rTuL,rRL,rTLH,rTLHRH,rPCL,rPCLHR,rPrL,rLL,rEL,r3DEL,rWEL,rMPBEL,rAL,rCrL,r3DCrL,... + r2DCrL,rSM,rTLHR3DH,rPCLHR3D,rDM] = tipologiaNodi(DTcatena,unitID,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'tipologiaNodi function started'; +fprintf(fileID,fmt,text); + +%% A partire dal nome della catena, risalgo all'identificativo con cui è +% definita nel Database (mi serve successivamente) +comando = ['select id from tools where name = ''' DTcatena ''' and unit_id = ''' unitID ''' ']; +idTool = num2str(cell2mat(fetch(conn,comando))); % leggo e converto in stringa + +%% Tunnel Link +% carico le informazioni relative al numero e alla posizione (rispetto all'ancora +% considerando la circonferenza come una retta verticale) per Tunnel LINK +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 17 order by num']; +Leggo = fetch(conn,comando); +[rTuL,cL] = size(Leggo); +if rTuL <= 1 && cL <= 1 + textTuL = 'There are not Tunnel Link;'; + NodoTunnelLink = []; + rTuL = 0; +else + % depth è la posizione del nodo (considerando una verticale progressiva) + depth = cell2mat(Leggo(:,2)); + depth = num2cell(depth); + nome = cell(rTuL,1); + for i=1:rTuL + nome(i,1) = cellstr('Tunnel Link'); + end + NodoTunnelLink = [nome Leggo(:,1) depth Leggo(:,3)]; + textTuL = ['There are ',num2str(rTuL),' Tunnel Link;']; +end +fprintf(fileID,fmt,textTuL); + +%% Radial Link +% carico le informazioni relative al numero e alla posizione (rispetto all'ancora +% considerando la circonferenza come una retta verticale) per Radial LINK +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 18 order by num']; +Leggo = fetch(conn,comando); +[rRL,cL] = size(Leggo); +if rRL <= 1 && cL <= 1 + textRL = 'There are not Radial Link;'; + NodoRadialLink = []; + rRL = 0; +else + % depth è la posizione del nodo (considerando una verticale progressiva) + depth = cell2mat(Leggo(:,2)); + depth = num2cell(depth); + nome = cell(rRL,1); + for i=1:rRL + nome(i,1) = cellstr('Radial Link'); + end + NodoRadialLink = [nome Leggo(:,1) depth Leggo(:,3)]; + textRL = ['There are ',num2str(rRL),' Radial Link;']; +end +fprintf(fileID,fmt,textRL); + +%% Tilt Link H +% carico le informazioni relative al numero e alla lunghezza per TILT LINK +% H (nodo orizzontale) +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 11 order by num']; +Leggo = fetch(conn,comando); +[rTLH,cL] = size(Leggo); +if rTLH <= 1 && cL <= 1 + textTLH = 'There are not Tilt Link H;'; + NodoTiltLinkH = []; + nodoTLH = 0; % mi serve nei Tilt Link H HR3D + rTLH = 0; +else + nodoTLH = 1; % mi serve nei Tilt Link H HR3D + % depth in questo caso è la lunghezza in orizzontale + depth = Leggo(:,2); + nome = cell(rTLH,1); + for i=1:rTLH + nome(i,1) = cellstr('Tilt Link H'); + end + NodoTiltLinkH = [nome Leggo(:,1) depth Leggo(:,3)]; + textTLH = ['There are ',num2str(rTLH),' Tilt Link H;']; +end +fprintf(fileID,fmt,textTLH); + +%% Tilt Link HR H +% carico le informazioni relative al numero e alla lunghezza per TILT LINK +% HR H (ampolla orizzontale) +comando = ['select num, depth from nodes where tool_id = ''' idTool ''' and nodetype_id = 12 order by num']; +Leggo = fetch(conn,comando); +[rTLHRH,cL] = size(Leggo); +if rTLHRH <= 1 && cL <= 1 + textTLHRH = 'There are not Tilt Link HR H;'; + NodoTiltLinkHRH = []; + nodoTLHRH = 0; % mi serve a riconoscere i Tilt Link HR3D H + rTLHRH = 0; +else + nodoTLHRH = 1; % mi serve a riconoscere i Tilt Link HR3D H + % la profondità in realtà indica la lunghezza in orizzontale + depth = Leggo(:,2); + nome = cell(rTLHRH,1); + for i=1:rTLHRH + nome(i,1) = cellstr('Tilt Link HR H'); + end + NodoTiltLinkHRH = [nome Leggo(:,1) depth]; + textTLHRH = ['There are ',num2str(rTLHRH),' Tilt Link HR H;']; +end +fprintf(fileID,fmt,textTLHRH); + +% confrontando le profondità (in realtà lunghezze in orizzontale) di Tilt +% Link H e Tilt Link HR H riconosco i TILT LINK HR 3D H +if nodoTLH == 1 && nodoTLHRH == 1 + NodoTiltLinkHR3Dwork = cell(rTLH,4); % creo matrice di zeri + p=1; + Control = 0; + for i=1:rTLH + for j=1:rTLHRH + if cell2mat(NodoTiltLinkH(i,3)) == cell2mat(NodoTiltLinkHRH(j,3)) + prof = NodoTiltLinkH(i,3); + nome = cellstr('Tilt Link HR 3D H'); + % il numero nodo del Tilt Link H lo faccio diventare il + % numero nodo del Tilt Link HR3D H + num = NodoTiltLinkH(i,2); + num2 = NodoTiltLinkHRH(i,2); + Leggo = [nome,num,num2,prof]; + NodoTiltLinkHR3Dwork(p,:) = Leggo; + p = p+1; + Control = 1; + end + end + end + % elimino gli zeri in più + q = 1; + r = 0; + while strcmp(NodoTiltLinkHR3Dwork(q,1),'Tilt Link HR 3D H') + q = q+1; + r = 1+r; % ultima riga con dati che non siano celle vuote + if q > rTLH || q > rTLHRH + break % esco dal ciclo while + end + end + if Control == 1 + NodoTiltLinkHR3DH = NodoTiltLinkHR3Dwork(1:r,:); + elseif Control == 0 + NodoTiltLinkHR3DH = []; + end + textTLHR3DH = ['There are ',num2str(r),' Tilt Link HR 3D H;']; +else + textTLHR3DH = 'There are not Tilt Link HR 3D H;'; + NodoTiltLinkHR3DH = []; + r = 0; +end +fprintf(fileID,fmt,textTLHR3DH); +rTLHR3DH = r; + +%% PreConv Link +% carico le informazioni relative al numero e alla lunghezza per PreConv +% Link (nodo per la misura di PRE-Convergenza) +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 23 order by num']; +Leggo = fetch(conn,comando); +[rPCL,cL] = size(Leggo); +if rPCL <= 1 && cL <= 1 + textPCL = 'There are not PreConv Link; '; + NodoPreConvLink = []; + nodoPCL = 0; % mi serve nei Pre Conv Link HR 3D + rPCL = 0; +else + nodoPCL = 1; % mi serve nei Pre Conv Link HR 3D + % depth in questo caso è la lunghezza in orizzontale + depth = Leggo(:,2); + nome = cell(rPCL,1); + for i=1:rPCL + nome(i,1) = cellstr('PreConv Link'); + end + NodoPreConvLink = [nome Leggo(:,1) depth Leggo(:,3)]; + textPCL = ['There are ',num2str(rPCL),' PreConv Link;']; +end +fprintf(fileID,fmt,textPCL); + +%% PreConv Link HR +% carico le informazioni relative al numero e alla lunghezza per TILT LINK +% HR H (ampolla orizzontale) +comando = ['select num, depth from nodes where tool_id = ''' idTool ''' and nodetype_id = 24 order by num']; +Leggo = fetch(conn,comando); +[rPCLHR,cL] = size(Leggo); +if rPCLHR <= 1 && cL <= 1 + textPCLHR = 'There are not PreConv Link HR; '; + NodoPreConvLinkHR = []; + nodoPCLHR = 0; % mi serve a riconoscere i PreConv Link HR 3D + rPCLHR = 0; +else + nodoPCLHR = 1; % mi serve a riconoscere i PreConv Link HR 3D + % la profondità in realtà indica la lunghezza in orizzontale + depth = Leggo(:,2); + nome = cell(rPCLHR,1); + for i=1:rPCLHR + nome(i,1) = cellstr('Pre Conv Link HR'); + end + NodoPreConvLinkHR = [nome Leggo(:,1) depth]; + textPCLHR = ['There are ',num2str(rPCLHR),' PreConv Link HR;']; +end +fprintf(fileID,fmt,textPCLHR); + +% confrontando le profondità (in realtà lunghezze in orizzontale) di PreConv Link +% e PreConv Link HR riconosco i PreConv Link HR 3D +if nodoPCL == 1 && nodoPCLHR == 1 + NodoPreConvLinkHR3Dwork = cell(rPCL,4); % creo matrice di zeri + p=1; + Control = 0; + for i=1:rPCL + for j=1:rPCLHR + if cell2mat(NodoPreConvLink(i,3)) == cell2mat(NodoPreConvLink(j,3)) + prof = NodoPreConvLink(i,3); + nome = cellstr('PreConv Link HR 3D'); + % il numero nodo del PreConv Link lo faccio diventare il + % numero nodo del PreConv Link HR 3D + num = NodoPreConvLink(i,2); + num2 = NodoPreConvLinkHR(i,2); + Leggo = [nome,num,num2,prof]; + NodoPreConvLinkHR3Dwork(p,:) = Leggo; + p = p+1; + Control = 1; + end + end + end + % elimino gli zeri in più + q = 1; + r = 0; + while strcmp(NodoPreConvLinkHR3Dwork(q,1),'PreConv Link HR 3D') + q = q+1; + r = 1+r; % ultima riga con dati che non siano celle vuote + if q > rPCL || q > rPCLHR + break % esco dal ciclo while + end + end + if Control == 1 + NodoPreConvLinkHR3D = NodoPreConvLinkHR3Dwork(1:r,:); + elseif Control == 0 + NodoPreConvLinkHR3D = []; + end + textPCLHR3D = ['There are ',num2str(r),' PreConv Link HR 3D; ']; +else + textPCLHR3D = 'There are not PreConv Link HR 3D; '; + NodoPreConvLinkHR3D = []; + r = 0; +end +rPCLHR3D = r; +fprintf(fileID,fmt,textPCLHR3D); + +%% DistoMT Link +% carico le informazioni relative al numero e alla posizione (rispetto all'ancora +% considerando la circonferenza come una retta verticale) per Tunnel LINK +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 56 order by num']; +Leggo = fetch(conn,comando); +[rDM,cL] = size(Leggo); +if rDM <= 1 && cL <= 1 + textDM = 'There are not DistoMT Link;'; + NodoDistoMTLink = []; + rDM = 0; +else + % depth è la posizione del nodo (considerando una verticale progressiva) + depth = cell2mat(Leggo(:,2)); + depth = num2cell(depth); + nome = cell(rDM,1); + for i=1:rDM + nome(i,1) = cellstr('DistoMT Link'); + end + NodoDistoMTLink = [nome Leggo(:,1) depth Leggo(:,3)]; + textDM = ['There are ',num2str(rDM),' DistoMT Link;']; +end +fprintf(fileID,fmt,textDM); + +%% Pressure Link +% carico le informazioni relative al numero per Pressure LINK +comando = ['select num, depth, channels, measurment, therm from nodes where tool_id = ''' ... + idTool ''' and nodetype_id = 21 order by num']; +Leggo = fetch(conn,comando); +[rPrL,cL] = size(Leggo); +if rPrL <= 1 && cL <= 1 + textPrL = 'There are not Pressure Link; '; + NodoPressureLink = []; + rPrL = 0; +else + % cambio il segno della profondità (nel DB è positivo) + nome = cell(rPrL,1); + for i=1:rPrL + nome(i,1) = cellstr('Pressure Link'); + end + NodoPressureLink = [nome Leggo(:,1) Leggo(:,4) Leggo(:,3) Leggo(:,5)]; + textPrL = ['There are ',num2str(rPrL),' Pressure Link; ']; +end +fprintf(fileID,fmt,textPrL); + +%% Load Link +% carico le informazioni relative al numero per LOAD LINK +comando = ['select num, depth, channels, measurment, therm from nodes where tool_id = ''' ... + idTool ''' and nodetype_id = 15 order by num']; +Leggo = fetch(conn,comando); +[rLL,cL] = size(Leggo); +if rLL <= 1 && cL <= 1 + textLL = 'There are not Load Link; '; + NodoLoadLink = []; + rLL = 0; +else + nome = cell(r,1); + for i=1:rLL + nome(i,1) = cellstr('Load Link'); + end + NodoLoadLink = [nome Leggo(:,1) Leggo(:,4) Leggo(:,3) Leggo(:,5)]; + textLL = ['There are ',num2str(rLL),' Load Link; ']; +end +fprintf(fileID,fmt,textLL); + +%% Extensometer Link +% carico le informazioni relative al numero per EXTENSOMETER LINK +comando = ['select num, depth, channels, measurment, therm from nodes where tool_id = ''' ... + idTool ''' and nodetype_id = 16 order by num']; +Leggo = fetch(conn,comando); +[rEL,cL] = size(Leggo); +if rEL <= 1 && cL <= 1 + textEL = 'There are not Extensometer Link; '; + NodoExtensometerLink = []; + rEL = 0; +else + nome = cell(rEL,1); + for i=1:rEL + nome(i,1) = cellstr('Extensometer Link'); + end + NodoExtensometerLink = [nome Leggo(:,1) Leggo(:,4) Leggo(:,3) Leggo(:,5)]; + textEL = ['There are ',num2str(rEL),' Extensometer Link; ']; +end +fprintf(fileID,fmt,textEL); + +%% 3D Extensometer Link +% carico le informazioni relative al numero per 3D EXTENSOMETER LINK +comando = ['select num, depth, channels, measurment, therm, orientation from nodes where tool_id = ''' ... + idTool ''' and nodetype_id = 19 order by num']; +Leggo = fetch(conn,comando); +[r3DEL,cL] = size(Leggo); +if r3DEL <= 1 && cL <= 1 + text3DEL = 'There are not 3D Extensometer Link; '; + Nodo3DExtensometerLink = []; + r3DEL = 0; +else + nome = cell(r3DEL,1); + for i=1:r3DEL + nome(i,1) = cellstr('3D Extensometer Link'); + end + Nodo3DExtensometerLink = [nome Leggo(:,1) Leggo(:,4) Leggo(:,3) Leggo(:,5) Leggo(:,6)]; + text3DEL = ['There are ',num2str(r3DEL),' 3D Extensometer Link; ']; +end +fprintf(fileID,fmt,text3DEL); + +%% Wire Extensometer Link +% carico le informazioni relative al numero per Wire EXTENSOMETER LINK +comando = ['select num, depth, channels, measurment, therm from nodes where tool_id = ''' ... + idTool ''' and nodetype_id = 22 order by num']; +Leggo = fetch(conn,comando); +[rWEL,cL] = size(Leggo); +if rWEL <= 1 && cL <= 1 + textWEL = 'There are not Wire Extensometer Link; '; + NodoWireExtensometerLink = []; + rWEL = 0; +else + nome = cell(rWEL,1); + for i=1:rWEL + nome(i,1) = cellstr('Wire Extensometer Link'); + end + NodoWireExtensometerLink = [nome Leggo(:,1) Leggo(:,4) Leggo(:,3) Leggo(:,5)]; + textWEL = ['There are ',num2str(rWEL),' Wire Extensometer Link; ']; +end +fprintf(fileID,fmt,textWEL); + +%% Multi Point Borehole Rod Extensometer +% carico le informazioni relative al numero per Multi Point Borehole Rod Extensometer +comando = ['select num, depth, channels, measurment, therm from nodes where tool_id = ''' ... + idTool ''' and nodetype_id = 25 order by num']; +Leggo = fetch(conn,comando); +[rMPBEL,cL] = size(Leggo); +if rMPBEL <= 1 && cL <= 1 + textMPBEL = 'There are not Multi Point Borehole Rod Extensometer Link; '; + NodoMultiPointRodExtensometer = []; + rMPBEL = 0; +else + nome = cell(rMPBEL,1); + for i=1:rMPBEL + nome(i,1) = cellstr('Multi Point Borehole Rod Extensometer Link'); + end + NodoMultiPointRodExtensometer = [nome Leggo(:,1) Leggo(:,4) Leggo(:,3) Leggo(:,5)]; + textMPBEL = ['There are ',num2str(rMPBEL),' Multi Point Borehole Rod Extensometer Link; ']; +end +fprintf(fileID,fmt,textMPBEL); + +%% Crack Link +comando = ['select num, depth, channels, measurment, therm from nodes where tool_id = ''' ... + idTool ''' and nodetype_id = 36 order by num']; +Leggo = fetch(conn,comando); +[rCrL,cL] = size(Leggo); +if rCrL <= 1 && cL <= 1 + textCrL = 'There are not Crack Link; '; + NodoCrackLink = []; + rCrL = 0; +else + nome = cell(rCrL,1); + for i=1:rCrL + nome(i,1) = cellstr('Crack Link'); + end + NodoCrackLink = [nome Leggo(:,1) Leggo(:,4) Leggo(:,3) Leggo(:,5)]; + textCrL = ['There are ',num2str(rCrL),' Crack Link; ']; +end +fprintf(fileID,fmt,textCrL); + +%% 3D Crack Link +comando = ['select num, depth, channels, measurment, therm, orientation from nodes where tool_id = ''' ... + idTool ''' and nodetype_id = 37 order by num']; +Leggo = fetch(conn,comando); +[r3DCrL,cL] = size(Leggo); +if r3DCrL <= 1 && cL <= 1 + text3DCrL = 'There are not 3D Crack Link; '; + Nodo3DCrackLink = []; + r3DCrL = 0; +else + nome = cell(r3DCrL,1); + for i=1:r3DCrL + nome(i,1) = cellstr('3D Crack Link'); + end + Nodo3DCrackLink = [nome Leggo(:,1) Leggo(:,4) Leggo(:,3) Leggo(:,5) Leggo(:,6)]; + text3DCrL = ['There are ',num2str(r3DCrL),' 3D Crack Link; ']; +end +fprintf(fileID,fmt,text3DCrL); + +%% 2D Crack Link +comando = ['select num, depth, channels, measurment, therm, orientation from nodes where tool_id = ''' ... + idTool ''' and nodetype_id = 51 order by num']; +Leggo = fetch(conn,comando); +[r2DCrL,cL] = size(Leggo); +if r2DCrL <= 1 && cL <= 1 + text2DCrL = 'There are not 2D Crack Link; '; + Nodo2DCrackLink = []; + r2DCrL = 0; +else + nome = cell(r2DCrL,1); + for i=1:r2DCrL + nome(i,1) = cellstr('2D Crack Link'); + end + Nodo2DCrackLink = [nome Leggo(:,1) Leggo(:,4) Leggo(:,3) Leggo(:,5) Leggo(:,6)]; + text2DCrL = ['There are ',num2str(r3DCrL),' 2D Crack Link; ']; +end +fprintf(fileID,fmt,text2DCrL); + +%% Analog Link +% carico le informazioni relative al numero per Analog Link +comando = ['select num, depth, channels, measurment, therm from nodes where tool_id = ''' ... + idTool ''' and nodetype_id = 8 order by num']; +Leggo = fetch(conn,comando); +[rAL,cL] = size(Leggo); +if rAL <= 1 && cL <= 1 + textAL = 'There are not Analog Link; '; + NodoAnalogLink = []; + rAL = 0; +else + nome = cell(rAL,1); + for i=1:rAL + nome(i,1) = cellstr('Analog Link'); + end + NodoAnalogLink = [nome Leggo(:,1) Leggo(:,4) Leggo(:,3) Leggo(:,5)]; + textAL = ['There are ',num2str(rAL),' Analog Link;']; +end +fprintf(fileID,fmt,textAL); + +%% Stress Meter +comando = ['select num, depth, channels, measurment, therm from nodes where tool_id = ''' ... + idTool ''' and nodetype_id = 47 order by num']; +Leggo = fetch(conn,comando); +[rSM,cL] = size(Leggo); +if rSM <= 1 && cL <= 1 + textSM = 'There are not Stress Meter; '; + NodoStressMeter = []; + rSM = 0; +else + nome = cell(rSM,1); + for i=1:rSM + nome(i,1) = cellstr('Stress Meter'); + end + NodoStressMeter = [nome Leggo(:,1) Leggo(:,4) Leggo(:,3) Leggo(:,5)]; + textSM = ['There are ',num2str(r3DCrL),' Stress Meter; ']; +end +fprintf(fileID,fmt,textSM); + +text = 'tipologiaNodi function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/RSN/DB_date_time.m b/RSN/DB_date_time.m new file mode 100755 index 0000000..9537884 --- /dev/null +++ b/RSN/DB_date_time.m @@ -0,0 +1,25 @@ +function [idElabData] = DB_date_time(IDcentralina,DTcatena,NodeNum,ListaDate,ARRAYdate,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; +idElabData = zeros(l,1); % Contiene gli id delle date delle quali ho già dati +cc = 1; % contatore +for ii=1:l + dString = datestr(ARRAYdate(ii),'yyyy-mm-dd'); + tString = datestr(ARRAYdate(ii),'HH:MM:SS'); + + comando = ['select idElabData from ELABDATADISP where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' ... + nNodo ''' and EventDate = ''' dString ''' and EventTime = ''' tString ''' order by EventDate']; + curs = exec(conn,comando); + curs = fetch(curs); + idDate = curs.Data; + if strcmp(idDate,'No Data') + idElabData(cc,1) = 0; % 0 indica che il dato non è presente su DB + else + idElabData(cc,1) = cell2mat(idDate); + end + cc = cc+1; +end + +end \ No newline at end of file diff --git a/RSN/DBwriteLL.m b/RSN/DBwriteLL.m new file mode 100755 index 0000000..6fa2142 --- /dev/null +++ b/RSN/DBwriteLL.m @@ -0,0 +1,25 @@ +function DBwriteLL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime','load_value','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),DATAinsert(ii,4),... + DATAinsert(ii,5),DATAinsert(ii,6),DATAinsert(ii,7)]; + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + colnames = {'load_value','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7)]; + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena... + ''' and NodeNum = ''' nNodo ''' and EventDate = ''' cell2mat(DATAinsert(ii,4))... + ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end \ No newline at end of file diff --git a/RSN/DBwriteRSN.m b/RSN/DBwriteRSN.m new file mode 100755 index 0000000..5f706d8 --- /dev/null +++ b/RSN/DBwriteRSN.m @@ -0,0 +1,27 @@ +function DBwriteRSN(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'AlfaX','AlfaY','T_node','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9)]; + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + colnames = {'AlfaX','AlfaY','T_node','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9)]; + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' ... + nNodo ''' and EventDate = ''' cell2mat(DATAinsert(ii,4)) ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause); + end +end + + +end diff --git a/RSN/DBwriteRSNHR.m b/RSN/DBwriteRSNHR.m new file mode 100755 index 0000000..3dd185f --- /dev/null +++ b/RSN/DBwriteRSNHR.m @@ -0,0 +1,26 @@ +function DBwriteRSNHR(DATAinsert,idElabData,ListaDate,NodeNum,DTcatena,IDcentralina,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'AlfaX','AlfaY','T_node','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9)]; + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + colnames = {'AlfaX','AlfaY','T_node','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9)]; + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' ... + nNodo ''' and EventDate = ''' cell2mat(DATAinsert(ii,4)) ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause); + end +end + +end diff --git a/RSN/DBwriteSS.m b/RSN/DBwriteSS.m new file mode 100755 index 0000000..9148ca9 --- /dev/null +++ b/RSN/DBwriteSS.m @@ -0,0 +1,25 @@ +function DBwriteSS(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime','XShift','X','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),DATAinsert(ii,4),... + DATAinsert(ii,5),DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8)]; + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + colnames = {'XShift','X','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8)]; + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = ''' cell2mat(DATAinsert(ii,4))... + ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end \ No newline at end of file diff --git a/RSN/DBwriteTrL.m b/RSN/DBwriteTrL.m new file mode 100755 index 0000000..63c5714 --- /dev/null +++ b/RSN/DBwriteTrL.m @@ -0,0 +1,25 @@ +function DBwriteTrL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime','XShift','X','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),DATAinsert(ii,4),... + DATAinsert(ii,5),DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8)]; + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + colnames = {'XShift','X','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8)]; + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = ''' cell2mat(DATAinsert(ii,4))... + ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end \ No newline at end of file diff --git a/RSN/IDunit.m b/RSN/IDunit.m new file mode 100755 index 0000000..dbce29c --- /dev/null +++ b/RSN/IDunit.m @@ -0,0 +1,15 @@ +function unitID = IDunit(IDcentralina,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'IDunit function started'; +fprintf(fileID,fmt,text); + +comando = ['select id from units where name like ''' IDcentralina ''' ']; +unitID = fetch(conn,comando); + +text = 'Unit ID downloaded correctly and IDunit function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/RSN/LastElab.m b/RSN/LastElab.m new file mode 100755 index 0000000..638bcf2 --- /dev/null +++ b/RSN/LastElab.m @@ -0,0 +1,946 @@ +function [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) + +% Apro scrittura file +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'LastElab function started'; +fprintf(fileID,fmt,text); + +Data(1,1) = cellstr(date); +Data(1,2) = cellstr(time); + +%% RSN Link +if yesRSN == 1 % Importo ultimo dato elaborato dei RSN Link + NodeNumRSN = num2str(cell2mat(NodoRSNLink(1,2))); % scarico i dati del primo nodo RSN Link + NodeType = 'RSN Link'; + + % Dati Grezzi + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and Time >= ''' time ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumRSN ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 % Non ci sono dati per la data "date" + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumRSN ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumRSN ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiRSN = datestr(data1,'yyyy-mm-dd'); + tempoiniRSN = datestr(data1,'HH:MM:SS'); + NuovoZeroRSN = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; + + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + if cont < 3 + cont = 3; + end + [rDS,~] = size(Data_numero); + if rDS <= cont + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiRSN = datestr(data2,'yyyy-mm-dd'); + tempoiniRSN = datestr(data2,'HH:MM:SS'); + NuovoZeroRSN = 1; + else + datainiRSN = datestr(data1,'yyyy-mm-dd'); + tempoiniRSN = datestr(data1,'HH:MM:SS'); + NuovoZeroRSN = 0; + end + end + text = 'RSN Link executed during LastElab function'; + fprintf(fileID,fmt,text); +else + datainiRSN = []; + tempoiniRSN = []; + NuovoZeroRSN = 0; +end + +%% RSN Link HR +if yesRSNHR == 1 % Importo ultimo dato elaborato dei RSN Link HR + NodeNumRSNHR = num2str(cell2mat(NodoRSNLinkHR(1,2))); % scarico i dati del primo nodo RSN Link HR + NodeType = 'RSN Link HR'; + + % Dati Grezzi + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and Time >= ''' time ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumRSNHR ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 % Non ci sono dati per la data "date" + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumRSNHR ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumRSNHR ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + if rLE==1 && cLE==1 + datainiRSNHR = datestr(data1,'yyyy-mm-dd'); + tempoiniRSNHR = datestr(data1,'HH:MM:SS'); + NuovoZeroRSNHR = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; + + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + if cont < 3 + cont = 3; + end + [rDS,~] = size(Data_numero); + if rDS <= cont + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiRSNHR = datestr(data2,'yyyy-mm-dd'); + tempoiniRSNHR = datestr(data2,'HH:MM:SS'); + NuovoZeroRSNHR = 1; %1 + else + datainiRSNHR = datestr(data1,'yyyy-mm-dd'); + tempoiniRSNHR = datestr(data1,'HH:MM:SS'); + NuovoZeroRSNHR = 0; + end + end + text = 'RSN Link HR executed during LastElab function'; + fprintf(fileID,fmt,text); +else + datainiRSNHR = []; + tempoiniRSNHR = []; + NuovoZeroRSNHR = 0; +end + +%% Trigger Link +if yesTrL == 1 % Importo ultimo dato elaborato dei Trigger Link + NodeNumTrL = num2str(cell2mat(NodoTriggerLink(1,2))); % scarico i dati del primo nodo Trigger Link + NodeType = 'Trigger Link'; + + % Dati Grezzi + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and Time >= ''' time ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumTrL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 % Non ci sono dati per la data "date" + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumTrL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumTrL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiTrL = datestr(data1,'yyyy-mm-dd'); + tempoiniTrL = datestr(data1,'HH:MM:SS'); + NuovoZeroTrL = 0; + DatiElabTriggerLink = []; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; + + Data_scarico = Data_numero(end)-margine; + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiTrL = datestr(data2,'yyyy-mm-dd'); + tempoiniTrL = datestr(data2,'HH:MM:SS'); + NuovoZeroTrL = 1; + else + datainiTrL = datestr(data1,'yyyy-mm-dd'); + tempoiniTrL = datestr(data1,'HH:MM:SS'); + NuovoZeroTrL = 0; + end + end + + if NuovoZeroTrL == 1 % scarico gli ultimi dati elaborati + NAN = 0; + while NAN == 0 + if datenum(datainiTrL) < datenum(date) + datainiTrL = date; + end + NTriggerLink = cell2mat(NodoTriggerLink(:,2)); + ii = 1; % contatore + col = 3; % contatore colonne + Condition = 0; + while ii <= rTrL + ini_col = col-2; + nN = num2str(NTriggerLink(ii,1)); + % Scarico di dati giorno X + comando = ['select EventDate, EventTime, X from ElabDataView where EventDate = ''' ... + Data_scarico(1,1:10) ''' and EventTime >= ''' Data_scarico(1,12:end) ''' and '... + 'UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTrLd = curs.Data; + % Scarico di dati giorni successivi + comando = ['select EventDate, EventTime, X from ElabDataView where EventDate > ''' ... + Data_scarico(1,1:10) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTrL = curs.Data; + [~,c1] = size(DATnodoTrL); + [~,c2] = size(DATnodoTrLd); + if c1 == c2 + DATnodoTrL = [DATnodoTrLd; DATnodoTrL]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoTrL = DATnodoTrLd; + end + [rDAT,cDAT] = size(DATnodoTrL); + if rDAT==1 && cDAT==1 + clear DatiElabTriggerLink + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,conn,FileName); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + Condition = 1; + break + else + if ii > 1 % Nodo successivo al primo + [rDE,~] = size(DatiElabTriggerLink); + if rDE ~= rDAT + clear DatiElabTriggerLink + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,conn,FileName); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + Condition = 1; + break + end + end + DatiElabTriggerLink(:,ini_col:col) = DATnodoTrL(:,:); + end + ii = ii+1; + end + if Condition == 1 + datainiTrL = datenum(datainiTrL) - 1; + Data_scarico = datestr(datainiTrL,'yyyy-mm-dd HH:MM:SS'); + datainiTrL = Data_scarico; + fileID = fopen(FileName,'a'); + else + Check = isnan(cell2mat(DatiElabTriggerLink(1,3:16:end))); + for jj = 1:rTrL + if Check == 1 + datainiTrL = datenum(datainiTrL) - 1; + Data_scarico = datestr(datainiTrL,'yyyy-mm-dd HH:MM:SS'); + datainiTrL = Data_scarico; + break + else + NAN = 1; + end + end + end + end + text = 'Trigger Link executed during LastElab function'; + fprintf(fileID,fmt,text); + else + DatiElabTriggerLink = []; + end +else + datainiTrL = []; + tempoiniTrL = []; + DatiElabTriggerLink = []; + NuovoZeroTrL = 0; +end + +%% Shock Sensor +if yesSS == 1 % Importo ultimo dato elaborato + NodeNumSS = num2str(cell2mat(NodoSS(1,2))); % scarico i dati del primo nodo + NodeType = 'Shock Sensor'; + + % Dati Grezzi + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and Time >= ''' time ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumSS ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 % Non ci sono dati per la data "date" + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumSS ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumSS ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiSS = datestr(data1,'yyyy-mm-dd'); + tempoiniSS = datestr(data1,'HH:MM:SS'); + NuovoZeroSS = 0; + DatiElabShockSensor = []; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; + + Data_scarico = Data_numero(end)-margine; + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiSS = datestr(data2,'yyyy-mm-dd'); + tempoiniSS = datestr(data2,'HH:MM:SS'); + NuovoZeroSS = 1; + else + datainiSS = datestr(data1,'yyyy-mm-dd'); + tempoiniSS = datestr(data1,'HH:MM:SS'); + NuovoZeroSS = 0; + end + end + + if NuovoZeroSS == 1 % scarico gli ultimi dati elaborati + NAN = 0; + while NAN == 0 + if datenum(datainiSS) < datenum(date) + datainiSS = date; + end + NShockSensor = cell2mat(NodoSS(:,2)); + ii = 1; % contatore + col = 3; % contatore colonne + Condition = 0; + while ii <= rSS + ini_col = col-2; + nN = num2str(NShockSensor(ii,1)); + % Scarico di dati giorno X + comando = ['select EventDate, EventTime, X from ElabDataView where EventDate = ''' ... + Data_scarico(1,1:10) ''' and EventTime >= ''' Data_scarico(1,12:end) ''' and '... + 'UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoSSd = curs.Data; + % Scarico di dati giorni successivi + comando = ['select EventDate, EventTime, X from ElabDataView where EventDate > ''' ... + Data_scarico(1,1:10) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoSS = curs.Data; + [~,c1] = size(DATnodoSS); + [~,c2] = size(DATnodoSSd); + if c1 == c2 + DATnodoSS = [DATnodoSSd; DATnodoSS]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoSS = DATnodoSSd; + end + [rDAT,cDAT] = size(DATnodoSS); + if rDAT==1 && cDAT==1 + clear DatiElabShockSensor + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,conn,FileName); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + Condition = 1; + break + else + if ii > 1 % Nodo successivo al primo + [rDE,~] = size(DatiElabShockSensor); + if rDE ~= rDAT + clear DatiElabShockSensor + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,conn,FileName); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + Condition = 1; + break + end + end + DatiElabShockSensor(:,ini_col:col) = DATnodoSS(:,:); + end + ii = ii+1; + end + if Condition == 1 + datainiSS = datenum(datainiSS) - 1; + Data_scarico = datestr(datainiSS,'yyyy-mm-dd HH:MM:SS'); + datainiSS = Data_scarico; + fileID = fopen(FileName,'a'); + else + Check = isnan(cell2mat(DatiElabShockSensor(1,3:16:end))); + for jj = 1:rSS + if Check == 1 + datainiSS = datenum(datainiSS) - 1; + Data_scarico = datestr(datainiSS,'yyyy-mm-dd HH:MM:SS'); + datainiSS = Data_scarico; + break + else + NAN = 1; + end + end + end + end + text = 'Shock Sensor executed during LastElab function'; + fprintf(fileID,fmt,text); + else + DatiElabShockSensor = []; + end +else + datainiSS = []; + tempoiniSS = []; + DatiElabShockSensor = []; + NuovoZeroSS = 0; +end + +%% Load Link +if yesLL == 1 % Importo ultimo dato elaborato dei Load Link + NodeNumLL = num2str(cell2mat(NodoLoadLink(1,2))); % scarico i dati del primo nodo Load Link + NodeType = 'Load Link'; + + % Dati Grezzi + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and time >= ''' time ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumLL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 % Non ci sono dati per la data "date" + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumLL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumLL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiLL = datestr(data1,'yyyy-mm-dd'); + tempoiniLL = datestr(data1,'HH:MM:SS'); + NuovoZeroLL = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; + + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + if cont < 3 + cont = 3; + end + [rDS,~] = size(Data_numero); + if rDS <= cont + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiLL = datestr(data2,'yyyy-mm-dd'); + tempoiniLL = datestr(data2,'HH:MM:SS'); + NuovoZeroLL = 1; %1 + else + datainiLL = datestr(data1,'yyyy-mm-dd'); + tempoiniLL = datestr(data1,'HH:MM:SS'); + NuovoZeroLL = 0; + end + end + text = 'Load Link executed during LastElab function'; + fprintf(fileID,fmt,text); +else + datainiLL = []; + tempoiniLL = []; + NuovoZeroLL = 0; +end + +%% G-Flow Link +if yesGF == 1 % Importo ultimo dato elaborato G-Flow + + % Dati Grezzi + DATA = [date time]; + comando = ['select EventDateTime from ELABDATAGFLOW where EventDateTime >= ''' ... + DATA ''' and unit_name = ''' IDcentralina ''' and tool_name = '''... + DTcatena ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = D_num_ini; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rI==1 && cI==1 + datainiGF = datestr(data1,'yyyy-mm-dd'); + tempoiniGF = datestr(data1,'HH:MM:SS'); + else + % Modifico il formato di data e ora in DATini. + Data_numero = Data_num_ini(end); + margine = 15; + + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + if cont < 2 + cont = 2; + end + Data_scarico = Data_numero(end)-cont; + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiGF = datestr(data2,'yyyy-mm-dd'); + tempoiniGF = datestr(data2,'HH:MM:SS'); + else + datainiGF = datestr(data1,'yyyy-mm-dd'); + tempoiniGF = datestr(data1,'HH:MM:SS'); + end + end + text = 'G-Flow Link executed during LastElab function'; + fprintf(fileID,fmt,text); +else + datainiGF = []; + tempoiniGF = []; +end + +%% G-Shock Link +if yesGS == 1 % Importo ultimo dato elaborato dei RSN Link + + % Dati Grezzi + DATA = [date time]; + comando = ['select EventDateTime from ELABDATAGFLOW where EventDateTime >= ''' ... + DATA ''' and unit_name = ''' IDcentralina ''' and tool_name = '''... + DTcatena ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = D_num_ini; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rI==1 && cI==1 + datainiGS = datestr(data1,'yyyy-mm-dd'); + tempoiniGS = datestr(data1,'HH:MM:SS'); + else + % Modifico il formato di data e ora in DATini. + Data_numero = Data_num_ini(end); + margine = 15; + + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + if cont < 2 + cont = 2; + end + Data_scarico = Data_numero(end-cont); + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiGS = datestr(data2,'yyyy-mm-dd'); + tempoiniGS = datestr(data2,'HH:MM:SS'); + else + datainiGS = datestr(data1,'yyyy-mm-dd'); + tempoiniGS = datestr(data1,'HH:MM:SS'); + end + end + text = 'G-Shock Link executed during LastElab function'; + fprintf(fileID,fmt,text); +else + datainiGS = []; + tempoiniGS = []; +end + +%% Debris Link +if yesDL == 1 % Importo ultimo dato elaborato dei RSN Link + NodeNumDL = num2str(cell2mat(NodoDebrisLink(1,2))); % scarico i dati del primo nodo + NodeType = 'Debris Link'; + + % Dati Grezzi + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and Time >= ''' time ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumDL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 % Non ci sono dati per la data "date" + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' NodeNumDL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumDL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiDL = datestr(data1,'yyyy-mm-dd'); + tempoiniDL = datestr(data1,'HH:MM:SS'); + NuovoZeroDL = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; + + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + if cont < 3 + cont = 3; + end + [rDS,~] = size(Data_numero); + if rDS <= cont + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiDL = datestr(data2,'yyyy-mm-dd'); + tempoiniDL = datestr(data2,'HH:MM:SS'); + NuovoZeroDL = 1; + else + datainiDL = datestr(data1,'yyyy-mm-dd'); + tempoiniDL = datestr(data1,'HH:MM:SS'); + NuovoZeroDL = 0; + end + end + + if NuovoZeroDL == 1 % scarico gli ultimi dati elaborati + NAN = 0; + while NAN == 0 + if datenum(datainiDL) < datenum(date) + datainiDL = date; + end + NDebrisLink = cell2mat(NodoDebrisLink(:,2)); + ii = 1; % contatore + col = 11; % contatore colonne + Condition = 0; + while ii <= rDL + ini_col = col-10; + nN = num2str(NDebrisLink(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, T_node, AlfaX, AlfaY from ElabDataView where EventDate = ''' ... + Data_scarico(1,1:10) ''' and EventTime >= ''' Data_scarico(1,12:end) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoDLd = curs.Data; + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, T_node, AlfaX, AlfaY from ElabDataView where EventDate > ''' ... + Data_scarico(1,1:10) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoDL = curs.Data; + [~,c1] = size(DATnodoDL); + [~,c2] = size(DATnodoDLd); + if c1 == c2 + DATnodoDL = [DATnodoDLd; DATnodoDL]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoDL = DATnodoDLd; + end + [rDAT,cDAT] = size(DATnodoDL); + if rDAT==1 && cDAT==1 + clear DatiElabDebrisLink + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + Condition = 1; + break + else + if ii > 1 % Nodo successivo al primo + [rDE,~] = size(DatiElabDebrisLink); + if rDE ~= rDAT + clear DatiElabDebrisLink + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + Condition = 1; + break + end + end + DatiElabDebrisLink(:,ini_col:col) = DATnodoDL(:,:); + end + col = col+11; + ii = ii+1; + end + + if Condition == 1 + datainiDL = datenum(datainiDL) - 1; + Data_scarico = datestr(datainiDL,'yyyy-mm-dd HH:MM:SS'); + datainiDL = Data_scarico; + fileID = fopen(FileName,'a'); + else + Check = isnan(cell2mat(DatiElabDebrisLink(1,3:16:end))); + for jj = 1:rTuL + if Check == 1 + datainiDL = datenum(datainiDL) - 1; + Data_scarico = datestr(datainiDL,'yyyy-mm-dd HH:MM:SS'); + datainiDL = Data_scarico; + break + else + NAN = 1; + end + end + end + end + end + text = 'Debris Link executed during LastElab function'; + fprintf(fileID,fmt,text); +else + datainiDL = []; + tempoiniDL = []; + NuovoZeroDL = 0; + DatiElabDebrisLink = []; +end + +text = 'LastElab function worked correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/RSN/LastElab_bisDL.m b/RSN/LastElab_bisDL.m new file mode 100755 index 0000000..f9202d6 --- /dev/null +++ b/RSN/LastElab_bisDL.m @@ -0,0 +1,46 @@ +function DatiElabDebrisLink = LastElab_bisDL(conn,NodoDebrisLink,rDL,datainiDL,... + tempoiniDL,IDcentralina,DTcatena,FileName) + +text = 'LastElab_bisDL function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +NDebrisLink = cell2mat(NodoDebrisLink(:,2)); +NodeType = 'Debris Link'; +ii = 1; % contatore +col = 11; % contatore colonne +while ii <= rDL + ini_col = col-10; + nN = num2str(NDebrisLink(ii,1)); + % Scarico di dati di spostamenti - giorno X + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, T_node, AlfaX, AlfaY from ElabDataView where EventDate = ''' ... + datainiDL ''' and EventTime >= ''' tempoiniDL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoDLd = curs.Data; + % Scarico di dati di spostamenti - giorni successivi a X + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, T_node, AlfaX, AlfaY from ElabDataView where EventDate >= ''' ... + datainiDL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoDL = curs.Data; + [~,c1] = size(DATnodoDL); + [~,c2] = size(DATnodoDLd); + if c1 == c2 + DATnodoDL = [DATnodoDLd; DATnodoDL]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoDL = DATnodoDLd; + end + DatiElabDebrisLink(:,ini_col:col) = DATnodoDL(:,:); + col = col+11; + ii = ii+1; +end + +text = 'LastElab_bisDL function worked correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/RSN/LastElab_bisSS.m b/RSN/LastElab_bisSS.m new file mode 100755 index 0000000..13f2081 --- /dev/null +++ b/RSN/LastElab_bisSS.m @@ -0,0 +1,46 @@ +function DatiElabShockSensor = LastElab_bisSS(conn,NodoShockSensor,rSS,datainiSS,... + tempoiniSS,IDcentralina,DTcatena,FileName) + +text = 'LastElab_bisSS function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +NShockSensor = cell2mat(NodoShockSensor(:,2)); +NodeType = 'Shock Sensor'; +ii = 1; % contatore +col = 3; % contatore colonne +while ii <= rSS + ini_col = col-2; + nN = num2str(NShockSensor(ii,1)); + % Scarico di dati di spostamenti - giorno X + comando = ['select EventDate, EventTime, X from ElabDataView where EventDate = ''' ... + datainiSS ''' and EventTime >= ''' tempoiniSS ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoSSd = curs.Data; + % Scarico di dati di spostamenti - giorni successivi a X + comando = ['select EventDate, EventTime, X from ElabDataView where EventDate >= ''' ... + datainiSS ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoSS = curs.Data; + [~,c1] = size(DATnodoSS); + [~,c2] = size(DATnodoSSd); + if c1 == c2 + DATnodoSS = [DATnodoSSd; DATnodoSS]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoSS = DATnodoSSd; + end + DatiElabShockSensor(:,ini_col:col) = DATnodoSS(:,:); + col = col+3; + ii = ii+1; +end + +text = 'LastElab_bisSS function worked correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/RSN/LastElab_bisTrL.m b/RSN/LastElab_bisTrL.m new file mode 100755 index 0000000..bbdc302 --- /dev/null +++ b/RSN/LastElab_bisTrL.m @@ -0,0 +1,45 @@ +function DatiElabTriggerLink = LastElab_bisTrL(conn,NodoTriggerLink,rTrL,datainiTrL,tempoiniTrL,IDcentralina,DTcatena,FileName) + +text = 'LastElab_bisTrL function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +NTriggerLink = cell2mat(NodoTriggerLink(:,2)); +NodeType = 'Trigger Link'; +ii = 1; % contatore +col = 3; % contatore colonne +while ii <= rTrL + ini_col = col-2; + nN = num2str(NTriggerLink(ii,1)); + % Scarico di dati di spostamenti - giorno X + comando = ['select EventDate, EventTime, X from ElabDataView where EventDate = ''' ... + datainiTrL ''' and EventTime >= ''' tempoiniTrL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTrLd = curs.Data; + % Scarico di dati di spostamenti - giorni successivi a X + comando = ['select EventDate, EventTime, X from ElabDataView where EventDate >= ''' ... + datainiTrL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTrL = curs.Data; + [~,c1] = size(DATnodoTrL); + [~,c2] = size(DATnodoTrLd); + if c1 == c2 + DATnodoTrL = [DATnodoTrLd; DATnodoTrL]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoTrL = DATnodoTrLd; + end + DatiElabTriggerLink(:,ini_col:col) = DATnodoTrL(:,:); + col = col+3; + ii = ii+1; +end + +text = 'LastElab_bisTrL function worked correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/RSN/MediaDati_LL.m b/RSN/MediaDati_LL.m new file mode 100755 index 0000000..3e4c4d5 --- /dev/null +++ b/RSN/MediaDati_LL.m @@ -0,0 +1,29 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per la cella di carico +% LOADdef contiene le medie per l'intervallo definito dei valori di forza +% ARRAYdateLL contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [DatiLoad,ARRAYdateLL] = MediaDati_LL(DatiLoad,TimeLL,NdatiMedia,FileName) + +text = 'MediaDati_LL function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +%% Accelerazione +[r,~] = size(DatiLoad); +if NdatiMedia > r + NdatiMedia = r; +end +% NON si fa la media dell'ultimo dato +DatiLoad_M = smoothdata(DatiLoad(1:end-1,:),'gaussian',NdatiMedia); +DatiLoad = [DatiLoad_M; DatiLoad(end,:)]; + +ARRAYdateLL = TimeLL; + +text = 'Average mean of Load Link data executed correctly. MediaDati_LL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/RSN/MediaDati_RSN.m b/RSN/MediaDati_RSN.m new file mode 100755 index 0000000..9723ae1 --- /dev/null +++ b/RSN/MediaDati_RSN.m @@ -0,0 +1,32 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per i RSN Link +% ang_RSN contiene le medie per l'intervallo definito delle accelerazioni +% ARRAYdate contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [angRSN,ARRAYdateRSN,TempDef_RSN] = MediaDati_RSN(accRSN,TimeRSN,tempRSN,NdatiMedia,FileName) + +text = 'MediaDati_RSN function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +%% Accelerazione +[r,~] = size(accRSN); +if NdatiMedia > r + NdatiMedia = r; +end +% NON si fa la media dell'ultimo dato +accRSN_M = smoothdata(accRSN(1:end-1,:),'gaussian',NdatiMedia); +angRSN = [accRSN_M; accRSN(end,:)]; + +ARRAYdateRSN = TimeRSN; + +%% Temperatura +TempDef_RSN = tempRSN; % Non faccio la media, mi serve il dato come è per applicare i filtri + +text = 'Average mean of RSN Link data executed correctly. MediaDati_RSN ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/RSN/MediaDati_RSNHR.m b/RSN/MediaDati_RSNHR.m new file mode 100755 index 0000000..66a0e93 --- /dev/null +++ b/RSN/MediaDati_RSNHR.m @@ -0,0 +1,33 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per i RSN Link HR +% ACCdefRSNHR contiene le medie per l'intervallo definito delle accelerazioni +% ARRAYdateRSNHR contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [angRSNHR,ARRAYdateRSNHR,TempDef_RSNHR] = MediaDati_RSNHR(angRSNHR,... + TimeRSNHR,T_RSNHR,NdatiMedia,FileName) + +text = 'MediaDati_RSNHR function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +%% Angoli +[r,~] = size(angRSNHR); +if NdatiMedia > r + NdatiMedia = r; +end +% NON si fa la media dell'ultimo dato +angRSNHR_M = smoothdata(angRSNHR(1:end-1,:),'gaussian',NdatiMedia); +angRSNHR = [angRSNHR_M; angRSNHR(end,:)]; + +ARRAYdateRSNHR = TimeRSNHR; + +%% Temperature +TempDef_RSNHR = T_RSNHR; % Non faccio la media, mi serve il dato come è per applicare i filtri + +text = 'Average mean of RSN Link HR data executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/RSN/NuovaConversione.m b/RSN/NuovaConversione.m new file mode 100755 index 0000000..b6797b7 --- /dev/null +++ b/RSN/NuovaConversione.m @@ -0,0 +1,58 @@ +function [DCalRSNTot,DCalRSNHRTot,DCalLLTot,DCalDLTot] = NuovaConversione(DCalRSNTot,... + DCalRSNHRTot,DCalLLTot,DCalDLTot) + +% Conversione del formato dati che usiamo con il database Ase_New + +%% RSN Link +[r,c] = size(DCalRSNTot); +MATconv = zeros(r,c); +if r == 0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalRSNTot{ii,jj}; + end + end + DCalRSNTot = MATconv; +end + +%% RSN Link HR +[r,c] = size(DCalRSNHRTot); +MATconv = zeros(r,c); +if r == 0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalRSNHRTot{ii,jj}; + end + end + DCalRSNHRTot = MATconv; +end + +%% Load Link +[r,c] = size(DCalLLTot); +MATconv = zeros(r,c); +if r == 0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalLLTot{ii,jj}; + end + end + DCalLLTot = MATconv; +end + +%% Debris Link +[r,c] = size(DCalDLTot); +MATconv = zeros(r,c); +if r == 0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalDLTot{ii,jj}; + end + end + DCalDLTot = MATconv; +end + +end \ No newline at end of file diff --git a/RSN/Parametri_Installazione.m b/RSN/Parametri_Installazione.m new file mode 100755 index 0000000..dec574d --- /dev/null +++ b/RSN/Parametri_Installazione.m @@ -0,0 +1,52 @@ +%% Funzione che definisce i parametri specifici di elaborazione + +function [NdatiMedia,Ndatidespike,MEMS,tolleranzaAcc,pos_inst,Tmax,Tmin,SEL,... + MEL] = Parametri_Installazione(yesRSN,yesRSNHR,yesDL,idTool,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'Parametri_Installazione function started'; +fprintf(fileID,fmt,text); + +comando = ['select avg, despike from software where tool_id like ''' idTool ''' ']; +Dati = fetch(conn,comando); + +NdatiMedia = cell2mat(Dati(1)); +Ndatidespike = cell2mat(Dati(2)); + +if yesRSN == 1 || yesRSNHR == 1 || yesDL == 1 + %% Temperature + comando = ['select max_temp, min_temp from software where tool_id like ''' idTool ''' ']; + Dati = fetch(conn,comando); + Tmax = cell2mat(Dati(1)); + Tmin = cell2mat(Dati(2)); + %% MEMS + if yesRSN == 1 || yesDL == 1 + comando = ['select mems, toll_Acc, pos_inst, sel, mel from software where tool_id like ''' idTool ''' ']; + Dati = fetch(conn,comando); + MEMS = cell2mat(Dati(1)); + tolleranzaAcc = cell2mat(Dati(2)); + pos_inst = cell2mat(Dati(3)); + SEL = cell2mat(Dati(4)); + MEL = cell2mat(Dati(5)); + else + MEMS = []; + tolleranzaAcc = []; + pos_inst = []; + SEL = []; + MEL = []; + end +else + MEMS = []; + tolleranzaAcc = []; + Tmax = []; + Tmin = []; + pos_inst = []; + SEL = []; + MEL = []; +end + +text = 'Chain parameters defined correctly and Parametri_Installazione function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/RSN/RSN.m b/RSN/RSN.m new file mode 100755 index 0000000..5ca12f4 --- /dev/null +++ b/RSN/RSN.m @@ -0,0 +1,375 @@ +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 diff --git a/RSN/SWSearch.m b/RSN/SWSearch.m new file mode 100755 index 0000000..eab36c0 --- /dev/null +++ b/RSN/SWSearch.m @@ -0,0 +1,54 @@ +function yesMusa = SWSearch(idTool,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'SWSearch function started'; +fprintf(fileID,fmt,text); + +yesMusa = 0; + +%% Baro Musa Link +comando = ['select num, depth from nodes where tool_id = ''' idTool ''' and nodetype_id = 41 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesMusa = 1; + text = 'Baro Musa Links identified, Musa relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% Humidity link +comando = ['select num, depth from nodes where tool_id = ''' idTool ''' and nodetype_id = 35 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesMusa = 1; + text = 'Humidity Links identified, Musa relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% CO2 Link +comando = ['select num, depth from nodes where tool_id = ''' idTool ''' and nodetype_id = 33 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesMusa = 1; + text = 'CO2 Links identified, Musa relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% Lux Link +comando = ['select num, depth from nodes where tool_id = ''' idTool ''' and nodetype_id = 34 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesMusa = 1; + text = 'Lux Links identified, Musa relaunch activated'; + fprintf(fileID,fmt,text); +end + +text = 'SWScheme function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/RSN/Siren.m b/RSN/Siren.m new file mode 100755 index 0000000..3ef6b4d --- /dev/null +++ b/RSN/Siren.m @@ -0,0 +1,225 @@ +function Siren(alarms,datainiSS,datainiTrL,datainiRSN,datainiRSNHR,datainiLL,... + tempoiniSS,tempoiniTrL,tempoiniRSN,tempoiniRSNHR,tempoiniLL,ARRAYdateSS,ARRAYdateTrL,... + ARRAYdateRSN,ARRAYdateRSNHR,ARRAYdateLL,SirenON,conn,date,time,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; + +text = 'Siren function started'; +fprintf(fileID,fmt,text); + +[rA,cA] = size(alarms); + +sirena = 0; +if rA > 0 && cA > 1 + for aa = 1:rA + if cell2mat(alarms(aa,3)) == 1 + sirena = 1; + break + end + end +end + +if cA ~= 1 && sirena == 1 + % Attivazione della Sirena al superamento di una determinata soglia + if yesSS == 1 + dataini = datainiSS; + tempoini = tempoiniSS; + ARRAYdateAL = ARRAYdateSS; + elseif yesTrL == 1 + dataini = datainiTrL; + tempoini = tempoiniTrL; + ARRAYdateAL = ARRAYdateTrL; + elseif yesRSN == 1 + dataini = datainiRSN; + tempoini = tempoiniRSN; + ARRAYdateAL = ARRAYdateRSN; + elseif yesRSNHR == 1 + dataini = datainiRSNHR; + tempoini = tempoiniRSNHR; + ARRAYdateAL = ARRAYdateRSNHR; + elseif yesLL == 1 + dataini = datainiLL; + tempoini = tempoiniLL; + ARRAYdateAL = ARRAYdateLL; + end + [ListaDate,~] = size(ARRAYdateAL); + val_AL = zeros(ListaDate,rA); + StoricoAllarmi = zeros(ListaDate,rA); + + dateCheck = [date ' ' time]; + if dataini < datenum(dateCheck) + dataini = date; + tempoini = time; + else + dataini = datestr(dataini,'yyyy-mm-dd HH:MM:SS'); + end + + %% QUI ANDRA' INSERITO IL CRITERIO DI ATTIVAZIONE DELL'ALLARME + + % Criterio di attivazione dell'allarme + %------------------------------------- + if SirenON == 1 + val_AL(end,:) = 1; % Da mettere a posto! + % Criterio di attivazione dell'SMS + AL = 1; + DATAinsert = cell(1,5); + Data = datestr(ARRAYdateAL(end,1),'yyyy-mm-dd HH:MM:SS'); + for ii = 1:rA % numero di allarmi + if val_AL(end,ii) == 1 && ARRAYdateAL(end,1) > alarms(ii,end) + desc = strjoin(alarms(ii,5),alarms(ii,6),'ON'); + DATAinsert{AL,1} = 6; % Sirena e lampeggiante + DATAinsert{AL,2} = alarms(ii,2); % ID del CT + DATAinsert{AL,3} = Data; % Data & ora + DATAinsert{AL,4} = 1; % SMS + DATAinsert{AL,5} = desc; % Codice da inviare + allarme = 1; + AL = AL+1; + end + end + + if allarme == 1 + AL = AL-1; % Numero totale di allarmi + for a = 1:AL + % Cerco se il dato è già presente + Data = DATAinsert{a,3}; + type = num2str(DATAinsert{a,1}); % tipologia + IDtool = num2str(DATAinsert{a,2}); % ID del CT + desc = DATAinsert{a,5}; % Descrizione + comando = ['select id from alarms where tool_name = ''' IDtool ''' and date_time = ''' ... + Data ''' and type_id = ''' type ''' and description like ''' desc ''' order by date_time']; + curs = exec(conn,comando); + curs = fetch(curs); + idDate = curs.Data; + if cell2mat(idDate) == 0 + idElabData = 0; % 0 indica che il dato non è presente su DB + else + idElabData = cell2mat(idDate); + end + tablename = 'alarms'; + colnames = {'type_id','tool_name','date_time','send_sms','description'}; + data = [DATAinsert(a,1),DATAinsert(a,2),DATAinsert(a,3),DATAinsert(a,4),DATAinsert(a,5)]; + if idElabData == 0 % Scrivo + fastinsert(conn,tablename,colnames,data); + text = ['ALERT was written in the DB by Siren function for date: ''' Data ''' ']; + else % Aggiorno + whereclause = ['WHERE tool_name = ''' DATAinsert{a,2} ''' and date_time = ''' DATAinsert{a,3} ... + ''' and type_id = ''' type ''' and description like ''' desc ''' ']; + update(conn,tablename,colnames,data,whereclause) + text = ['ALERT was updated in the DB by Siren function for date: ''' Data ''' ']; + end + fprintf(fileID,fmt,text); + end + end + end + + Control = 1; + while Control == 1 + for nn = 1:rA + % Scarico i dati storici di attivazione dell'allarme + comando = ['select EventDate, EventTime, X from ELABDATACTRL where EventDate = ''' ... + dataini ''' and EventTime >= ''' tempoini ''' and CtrlToolName = '''... + char(alarms(nn,2)) ''' and NodeNum = 1 ']; + curs = exec(conn,comando); + curs = fetch(curs); + AlarmTot_1 = curs.Data; % numero cumulato di attivazioni prima della lettura in elaborazione + + comando = ['select EventDate, EventTime, X from ELABDATACTRL where EventDate > ''' ... + dataini ''' and CtrlToolName = ''' char(alarms(nn,2)) ''' and NodeNum = 1 ']; + curs = exec(conn,comando); + curs = fetch(curs); + AlarmTot_2 = curs.Data; % numero cumulato di attivazioni prima della lettura in elaborazione + + [r1,c1] = size(AlarmTot_1); + [r2,c2] = size(AlarmTot_2); + if r1 == 1 && c1 == 1 + if r2 == 1 && c2 == 1 + if dataini < datenum(dateCheck) + AlarmTot(1,1) = cellstr(date); + AlarmTot(1,2) = cellstr(time); + AlarmTot(1,3) = cell; + Control = 0; + else + dataini = dataini-1; + break + end + else + AlarmTot = AlarmTot_2; + Control = 0; + end + else + Control = 0; + if r2 == 1 && c2 == 1 + AlarmTot = AlarmTot_1; + else + AlarmTot = [AlarmTot_1; AlarmTot_2]; + end + end + [rA,~] = size(AlarmTot); + Data = [cell2mat(AlarmTot(:,1)) repmat(' ', [rA,1]) cell2mat(AlarmTot(:,2))]; + Data = datenum(Data); + Var = find(Data < datenum(ARRAYdateAL(1,1))); + if isempty(Var) == 1 + StoricoAllarmi(:,nn) = cumsum(val_AL); + else + StoricoAllarmi(:,nn) = cumsum(val_AL)+cell2mat(AlarmTot(Var(end),3)); + end + + DATAinsert = cell(ListaDate,6); + % Creo i dati da scrivere + for ii=1:ListaDate + DATAinsert{ii,1} = alarms(nn,2); + DATAinsert{ii,2} = datestr(ARRAYdateAL(ii),'yyyy-mm-dd'); + DATAinsert{ii,3} = datestr(ARRAYdateAL(ii),'HH:MM:SS'); + DATAinsert{ii,4} = val_AL(ii,nn); + DATAinsert{ii,5} = StoricoAllarmi(ii,nn); + DATAinsert{ii,6} = 1; + end + idElabData = zeros(ListaDate,1); % Contiene gli id delle date delle quali ho già dati + cc = 1; % contatore + % Cerco su DB se i dati sono da aggiornare o scrivere + for ii = 1:ListaDate + dString = datestr(ARRAYdateAL(ii),'yyyy-mm-dd'); + tString = datestr(ARRAYdateAL(ii),'HH:MM:SS'); + + comando = ['select idElabDataCtrl from ELABDATACTRL where CtrlToolName = '''... + char(alarms(nn,2)) ''' and NodeNum = 1 and EventDate = ''' ... + dString ''' and EventTime = ''' tString ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + idDate = curs.Data; + if strcmp(idDate,'No Data') + idElabData(cc,1) = 0; % 0 indica che il dato non è presente su DB + else + idElabData(cc,1) = cell2mat(idDate); + end + cc = cc+1; + % Scrivo o Aggiorno i dati + idData = idElabData(ii,1); + tablename = 'ELABDATACTRL'; + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + colnames = {'CtrlToolName','EventDate','EventTime','XShift','X','NodeNum',}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6)]; + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + colnames = {'XShift','X'}; + data = [DATAinsert(ii,4),DATAinsert(ii,5)]; + whereclause = ['WHERE CtrlToolName = ''' char(alarms(nn,2)) ... + ''' and NodeNum = 1 and EventDate = ''' cell2mat(DATAinsert(ii,2))... + ''' and EventTime = ''' cell2mat(DATAinsert(ii,3)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end + end + text = ['Data of Control Tools ' char(alarms(nn,2)) ' uploaded in the DB correctly']; + fprintf(fileID,fmt,text); + end + end +end + +text = 'Siren function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); +end + + \ No newline at end of file diff --git a/RSN/Site_Info.m b/RSN/Site_Info.m new file mode 100755 index 0000000..4a7ca82 --- /dev/null +++ b/RSN/Site_Info.m @@ -0,0 +1,60 @@ +function [unitID,chainID,Chain_Scheme,num_nodi,alarms] = Site_Info(siteID,conn,FileName) + +text = 'Site_Info function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +% Scarico tutte le centraline presenti in sito +comando = ['select id, name from units where site_id = ''' siteID ''' order by name']; % il rapporto centralina sito è di 1 a 1 +curs = exec(conn,comando); +curs = fetch(curs); +unitID = curs.Data; + +col = size(unitID); +chainID = cell(1,4); +ini = 1; +for c = 1:col(1,1) + % dalle centraline presenti, risalgo alle catene disponibili + comando = ['select id, name from tools where unit_id = ''' num2str(cell2mat(unitID(c,1))) ''' order by name']; + curs = exec(conn,comando); + curs = fetch(curs); + chainID_down = curs.Data; % id tool, nome tool + [fin,~] = size(chainID_down); + fin = fin+ini-1; + chainID(ini:fin,3:4) = chainID_down; + for j = ini:fin + chainID(j,1:2) = unitID(c,1:2); % Id centralina, nome centralina, id tool, nome tool + end + ini = fin+1; +end + +% Scarico gli schemi delle catene +[col,~] = size(chainID); % Numero di Array +Chain_Scheme = cell(1,3); +num_nodi = zeros(col,1); +ini = 1; +cont = 1; +for c = 1:col(1,1) + comando = ['select nodetype_id, depth, num from nodes where tool_id = ''' num2str(cell2mat(chainID(c,3))) ''' order by num']; + curs = exec(conn,comando); + curs = fetch(curs); + scheme_down = curs.Data; % id nodo, profondità, numero + [fin,~] = size(scheme_down); + num_nodi(cont) = fin; + Chain_Scheme(1:fin,ini:ini+2) = scheme_down; + ini = ini+3; + cont = cont+1; +end + +% Scarico l'allarme relativo al sito +comando = ['select id, name, ctrltype_id, alarm_phone, conn_usr, conn_pwd, duedate from ctrltools where site_id = ''' siteID ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +alarms = curs.Data; + +text = 'Site_Info function worked correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/RSN/Triggercheck.m b/RSN/Triggercheck.m new file mode 100755 index 0000000..829c486 --- /dev/null +++ b/RSN/Triggercheck.m @@ -0,0 +1,837 @@ +function [sogliaRSN,trigRSN,sogliaHR,trigHR,sogliaLL,trigLL,tipomail_MOD,... + codice_mail,codice_SMS,MATsoglie,DT_BPM] = Triggercheck... + (IDcentralina,DTcatena,conn,ARRAYdateTrL,TrigMod,i,j,date,FileName) + +%% Individuo i moduli associati al Trigger + +%scrivo nel logfile +text = 'Funzione Triggercheck per il controllo delle soglie di trend inizializzata'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +DT_BPM=TrigMod(:,j); %indice j --> numero trigger + +%% Scarico i dati del Trigger Link +data_rif = ARRAYdateTrL(i,1)-7; %7--> n° giorni su cui calcolare il trend +if data_rif > datenum(date) + data = datestr(data_rif,'yyyy-mm-dd'); +else + data = date; +end +NodeNum = num2str(j); +comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + data ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina ... + ''' and NodeNum = ''' NodeNum ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +Dati = curs.Data; +% Modifico il formato di data e ora in DATini. +[rD,~] = size(Dati); +T = [cell2mat(Dati(:,1)) repmat(' ', [rD,1]) cell2mat(Dati(:,2))]; +DateTrigger = datenum(T); +dataindex = find(DateTrigger(:,1) == ARRAYdateTrL(i,1)); +DataRifTRIGGER = DateTrigger(dataindex-1); % ultima data PRIMA dell'attivazione del trigger +% Scarico i dati di attivazione del Trigger +comando = ['select Xshift from ElabDataView where EventDate >= ''' ... + data ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina ... + ''' and NodeNum = ''' NodeNum ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +DatiTrigger = cell2mat(curs.Data); + +%% scarico dati per calcolo trend e confronto soglie +%inizializzo variabili + +[rBPM,~]=size(DT_BPM); + +sogliaRSN = zeros(rBPM,1); %soglie disattivate +sogliaHR = zeros(rBPM,1); +sogliaLL = zeros(rBPM,1); + +tipomail_MOD = zeros(rBPM,1); %tipo di mail da inviare + +tipomail_RSN = zeros(rBPM,1); %stato singoli sensori +tipomail_HR = zeros(rBPM,1); +tipomail_LL = zeros(rBPM,1); + +codice_SMS = 0; %livello di allerta SMS + +trigRSN(1:rBPM,1) = 99999; %valore "neutro" di incremento +trigHR(1:rBPM,1) = 99999; +trigLL(1:rBPM,1) = 99999; + + +for n=1:rBPM + if isempty(DT_BPM{n}) == 0 % ho un modulo BPM da elaborare + DTmodulo = char(DT_BPM(n)); + + AlfaX_RSN = []; % matrici di dati (azzerate per evitare problemi di dimensioni tra array) + AlfaX_HR = []; + DatiCella = []; + + %scrivo nel logfile + text = ['Inizio confronto soglia di trend per modulo ' DTmodulo '']; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + + %% A partire dal nome della catena, risalgo all'identificativo con cui è + % definita nel Database (mi serve successivamente) + comando = ['select id from units where name = ''' IDcentralina ''' ']; + unitID = num2str(cell2mat(fetch(conn,comando))); + comando = ['select id from tools where name = ''' DTmodulo ''' and unit_id = ''' unitID ''' ']; + idTool = num2str(cell2mat(fetch(conn,comando))); % leggo e converto in stringa + + %% Determino sensori per ciascun modulo RSN + comando = ['select nodetype_id, num from nodes where tool_id = ''' idTool ''' order by num']; + modulo = fetch(conn,comando); + + usoRSN = find(cell2mat(modulo(:,1)) == 38); % controllo presenza di RSN Link + usoRSNHR = find(cell2mat(modulo(:,1)) == 39); % controllo presenza di RSNHR Link + usoLOAD = find(cell2mat(modulo(:,1)) == 15); % controllo presenza di Load Link + + % RSN Link + if isempty(usoRSN)== 0 + + data_rif = ARRAYdateTrL(i,1)-7; %7--> n° giorni su cui calcolare il trend + if data_rif > datenum(date) + data = datestr(data_rif,'yyyy-mm-dd'); + else + data = date; + end + NodeNum = num2str(cell2mat(modulo(usoRSN,2))); + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + data ''' and ToolNameID = ''' DTmodulo ''' and UnitName = ''' IDcentralina ... + ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Dati = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Dati); + T = [cell2mat(Dati(:,1)) repmat(' ', [rD,1]) cell2mat(Dati(:,2))]; + DateRSN = datenum(T); + indexRSN = find(DateRSN(:,1)<=DateTrigger(dataindex)); + LastDataRSN = DateRSN(indexRSN(end)); + % Scarico i dati X + comando = ['select AlfaX from ElabDataView where EventDate >= ''' ... + data ''' and ToolNameID = ''' DTmodulo ''' and UnitName = ''' IDcentralina ... + ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + AlfaX_RSN(:,1) = cell2mat(curs.Data); + % Scarico i dati calcerr + comando = ['select calcerr from ElabDataView where EventDate >= ''' ... + data ''' and ToolNameID = ''' DTmodulo ''' and UnitName = ''' IDcentralina ... + ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + AlfaX_RSN(:,2) = cell2mat(curs.Data); + + %scrivo nel logfile + text = 'Dati elaborati scaricati per RSN Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + end + + % RSNHR Link + if isempty(usoRSNHR)== 0 + + data_rif = ARRAYdateTrL(i,1)-7; %7--> n° giorni su cui calcolare il trend + if data_rif > datenum(date) + data = datestr(data_rif,'yyyy-mm-dd'); + else + data = date; + end + NodeNum = num2str(cell2mat(modulo(usoRSNHR,2))); + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + data ''' and ToolNameID = ''' DTmodulo ''' and UnitName = ''' IDcentralina ... + ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Dati = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Dati); + T = [cell2mat(Dati(:,1)) repmat(' ', [rD,1]) cell2mat(Dati(:,2))]; + DateHR = datenum(T); + indexHR = find(DateHR(:,1)<=DateTrigger(dataindex)); + LastDataHR = DateHR(indexHR(end)); + % Scarico i dati X + comando = ['select AlfaX from ElabDataView where EventDate >= ''' ... + data ''' and ToolNameID = ''' DTmodulo ''' and UnitName = ''' IDcentralina ... + ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + AlfaX_HR(:,1) = cell2mat(curs.Data); + % Scarico i dati calcerr + comando = ['select calcerr from ElabDataView where EventDate >= ''' ... + data ''' and ToolNameID = ''' DTmodulo ''' and UnitName = ''' IDcentralina ... + ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + AlfaX_HR(:,2) = cell2mat(curs.Data); + + %scrivo nel logfile + text = 'Dati elaborati scaricati per RSNHR Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + end + + % Load Link + if isempty(usoLOAD)== 0 + + data_rif = ARRAYdateTrL(i,1)-7; %7--> n° giorni su cui calcolare il trend + if data_rif > datenum(date) + data = datestr(data_rif,'yyyy-mm-dd'); + else + data = date; + end + NodeNum = num2str(cell2mat(modulo(usoLOAD,2))); + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + data ''' and ToolNameID = ''' DTmodulo ''' and UnitName = ''' IDcentralina ... + ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Dati = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Dati); + T = [cell2mat(Dati(:,1)) repmat(' ', [rD,1]) cell2mat(Dati(:,2))]; + DateLL = datenum(T); + indexLL = find(DateLL(:,1)<=DateTrigger(dataindex)); + LastDataLOAD = DateLL(indexLL(end)); + % Scarico i dati di carico + comando = ['select load_value from ElabDataView where EventDate >= ''' ... + data ''' and ToolNameID = ''' DTmodulo ''' and UnitName = ''' IDcentralina ... + ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DatiCella(:,1) = cell2mat(curs.Data); + % Scarico i dati calcerr + comando = ['select calcerr from ElabDataView where EventDate >= ''' ... + data ''' and ToolNameID = ''' DTmodulo ''' and UnitName = ''' IDcentralina ... + ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DatiCella(:,2) = cell2mat(curs.Data); + + %scrivo nel logfile + text = 'Dati elaborati scaricati per Load Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + end + + + %% Rimuovo le letture dei moduli eseguite all'attivazione di un Trigger, + % non necessarie per il calcolo del trend + + rT = dataindex; %contatore dati + + MatRSN = AlfaX_RSN; + MatRSNHR = AlfaX_HR; + MatLOAD = DatiCella; + + %creo nuovi indici da aggiornare per "seguire" la dimensione della + %matrice su cui calcolare il trend + indextrendRSN = indexRSN(end); + indextrendHR = indexHR(end); + indextrendLL = indexLL(end); + del = 0; + + for k=1:rT + + if DatiTrigger(k,1)>=1 + del = del + 1 ; + + if isempty(usoRSN)== 0 + indextrendRSN = indextrendRSN - 1; + precedRSN = find(DateRSN(:,1) <= DateTrigger(k,1)); + MatRSN(precedRSN(end),:) = []; + DateRSN(precedRSN(end),:) = []; + end + + if isempty(usoRSNHR)== 0 + indextrendHR = indextrendHR - 1; + precedRSNHR = find(DateHR(:,1) <= DateTrigger(k,1)); + MatRSNHR(precedRSNHR(end),:)=[]; + DateHR(precedRSNHR(end),:) = []; + end + + if isempty(usoLOAD)== 0 + indextrendLL = indextrendLL - 1; + precedLL = find(DateLL(:,1) <= DateTrigger(k,1)); + MatLOAD(precedLL(end),:)=[]; + DateLL(precedLL(end),:)=[]; + end + end + end + + %scrivo nel logfile + text = ['Creazione matrice di trend: Rimosse ' num2str(del) ' letture relative al modulo ' DTmodulo '']; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + + %% Calcolo il trend di ciascun sensore presente nel modulo + if isempty(usoRSN)== 0 + nRSN = indextrendRSN; + toterrRSN = sum(MatRSN(1:indextrendRSN,2)); + if toterrRSN/nRSN > 0.5 % dati insufficienti a calcolare un trend significativo + trendRSN=99999; + else + trendRSN = mean(diff(MatRSN(1:indextrendRSN,1))); + end + end + + if isempty(usoRSNHR)== 0 + nRSNHR = indextrendHR; + toterrRSNHR = sum(MatRSNHR(1:indextrendHR,2)); + if toterrRSNHR/nRSNHR > 0.5 % dati insufficienti a calcolare un trend significativo + trendHR=99999; + else + trendHR = mean(diff(MatRSNHR(1:indextrendHR,1))); + end + end + + if isempty(usoLOAD)== 0 + nLL = indextrendLL; + toterrLL = sum(MatLOAD(1:indextrendLL,2)); + if toterrLL/nLL > 0.5 % dati insufficienti a calcolare un trend significativo + trendLL=99999; + else + trendLL = mean(diff(MatLOAD(1:indextrendLL,1))); + end + end + + %scrivo nel logfile + text = ['Trend calcolati per il modulo ' DTmodulo '']; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + + %% Controllo che il modulo BPM sia già stato elaborato, altrimenti forzo + % la funzione RSN per quel modulo in modo da avere l'ultimo dato elaborato + + % RSN Link + + %scrivo nel logfile + text = 'Inizio controllo soglie di trend per RSN'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + + nuovidati = 0; + incRSN=1; + if isempty(usoRSN)== 0 + if LastDataRSN >= DataRifTRIGGER + if AlfaX_RSN(indexRSN(end),2)==0 %lettura valida, calcolo incremento + valRSN = AlfaX_RSN(indexRSN(end),1); + trigRSN(n,1) = valRSN - AlfaX_RSN(indexRSN(end-1),1); %incremento allo scatto del trigger + + %scrivo nel logfile + text = 'Confronto con soglia di trend RSN - nessun ricalcolo eseguito, incremento calcolato'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + + elseif AlfaX_RSN(indexRSN(end),2)==1 && AlfaX_RSN(indexRSN(end-1),2)==0 %la lettura precedente NON è in errore, allarme + sogliaRSN(n,1)=1; + incRSN=0; + tipomail_RSN(n,1)=0.33; + + %scrivo nel logfile + text = 'Confronto con soglia di trend RSN - nessun ricalcolo eseguito, incremento NON calcolato/allarme per lettura precedente NON errore'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + + + elseif AlfaX_RSN(indexRSN(end),2)==1 && AlfaX_RSN(indexRSN(end-1),2)==1 %letture in errore, trigger disattivato + sogliaRSN(n,1)=0; + incRSN=0; + + %scrivo nel logfile + text = 'Confronto con soglia di trend RSN - nessun ricalcolo eseguito, incremento NON calcolato/modulo in errore'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + + end + + else + rilancio = ['/usr/local/matlab_func/run_RSN_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 '... + IDcentralina ' ' DTmodulo '']; + status = system(rilancio); %forzo RSN + nuovidati = 1; %ultimi dati elaborati disponibili per tutti i sensori successivi + + %scrivo nel logfile + text = 'Confronto con soglia di trend RSN - il software e'''' stato rilanciato!'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + + data_rif = ARRAYdateTrL(i-1,1); + if data_rif > datenum(date) + data = datestr(data_rif,'yyyy-mm-dd'); + else + data = date; + end + NodeNum = num2str(cell2mat(modulo(usoRSN,2))); + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + data ''' and ToolNameID = ''' DTmodulo ''' and UnitName = ''' IDcentralina ... + ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Dati = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Dati); + T = [cell2mat(Dati(:,1)) repmat(' ', [rD,1]) cell2mat(Dati(:,2))]; + Date = datenum(T); + indexRSN = indexRSN +1; % la data del Trigger è quella aggiunta dalla rielaborazione + % Scarico i dati X + comando = ['select AlfaX from ElabDataView where EventDate >= ''' ... + data ''' and ToolNameID = ''' DTmodulo ''' and UnitName = ''' IDcentralina ... + ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + valRSN = cell2mat(curs.Data); %valore post attivazione Trigger + valRSN = valRSN(indexRSN(end)); + + % Scarico i dati calcerr + comando = ['select calcerr from ElabDataView where EventDate >= ''' ... + data ''' and ToolNameID = ''' DTmodulo ''' and UnitName = ''' IDcentralina ... + ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + erroreRSN = cell2mat(curs.Data); %lettura valida-0 o in errore-1 + erroreRSN = erroreRSN(indexRSN(end)); + + if erroreRSN ==0 %lettura valida, calcolo incremento + trigRSN(n,1) = valRSN - AlfaX_RSN(indexRSN(end),1); %incremento allo scatto del trigger + %scrivo nel logfile + text = 'Confronto con soglia di trend RSN - ricalcolo eseguito, incremento calcolato'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + + elseif erroreRSN==1 && AlfaX_RSN(indexRSN(end),2)==0 %la lettura precedente NON è in errore, allarme + sogliaRSN(n,1)=1; + incRSN=0; + tipomail_RSN(n,1)=0.33; + %scrivo nel logfile + text = 'Confronto con soglia di trend RSN - ricalcolo eseguito, incremento NON calcolato/allarme per lettura precedente NON errore'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + + elseif erroreRSN==1 && AlfaX_RSN(indexRSN(end),2)==1 %letture in errore, trigger disattivato + sogliaRSN(n,1)=0; + incRSN=0; + %scrivo nel logfile + text = 'Confronto con soglia di trend RSN - ricalcolo eseguito, incremento NON calcolato/modulo in errore'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + end + + end + + if incRSN==1 && trendRSN ~= 99999 %devo calcolare un incremento + if abs(trigRSN(n,1))/abs(trendRSN) >= 1.3 %SOGLIA DI TREND SUPERATA! + sogliaRSN(n,1) = 1; + tipomail_RSN(n,1)=1; + %scrivo nel logfile + text = 'Soglia di trend per RSN Link superata!'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + + else + sogliaRSN(n,1) = 0; + %scrivo nel logfile + text = 'Soglia di trend per RSN Link non superata!'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + + end + end + else + trigRSN(n,1)=99999; %manca il sensore RSN oppure dati insufficienti per calcolare trend + + %scrivo nel logfile + text = 'RSN assente o dati insufficienti: impossibile calcolare la soglia di trend per RSN'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + end + + % RSNHR Link + + %scrivo nel logfile + text = 'Inizio controllo soglie di trend per RSNHR'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + + incHR=1; + if isempty(usoRSNHR)== 0 + if LastDataHR >= DataRifTRIGGER + if AlfaX_HR(indexHR(end),2)==0 %lettura valida, calcolo incremento + valHR = AlfaX_HR(indexHR(end),1); + trigHR(n,1) = valHR - AlfaX_HR(indexHR(end-1),1); %incremento allo scatto del trigger + %scrivo nel logfile + text = 'Confronto con soglia di trend RSNHR - nessun ricalcolo eseguito, incremento calcolato'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + + elseif AlfaX_HR(indexHR(end),2)==1 && AlfaX_HR(indexHR(end-1),2)==0 %la lettura precedente NON è in errore, allarme + sogliaHR(n,1)=1; + incHR=0; + tipomail_HR(n,1)=0.33; + %scrivo nel logfile + text = 'Confronto con soglia di trend RSNHR - nessun ricalcolo eseguito, incremento NON calcolato/allarme per lettura precedente NON errore'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + + elseif AlfaX_HR(indexHR(end),2)==1 && AlfaX_HR(indexHR(end-1),2)==1 %letture in errore, trigger disattivato + sogliaHR(n,1)=0; + incHR=0; + %scrivo nel logfile + text = 'Confronto con soglia di trend RSNHR - nessun ricalcolo eseguito, incremento NON calcolato/modulo in errore'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + end + + else + if nuovidati == 0 %nessun sensore ha già forzato RSN + rilancio = ['/usr/local/matlab_func/run_RSN_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 '... + IDcentralina ' ' DTmodulo '']; + status = system(rilancio); %forzo RSN + nuovidati = 1; + %scrivo nel logfile + text = 'Confronto con soglia di trend RSN HR - il software e'''' stato rilanciato'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + end + + data_rif = ARRAYdateTrL(i-1,1); + if data_rif > datenum(date) + data = datestr(data_rif,'yyyy-mm-dd'); + else + data = date; + end + NodeNum = num2str(cell2mat(modulo(usoRSNHR,2))); + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + data ''' and ToolNameID = ''' DTmodulo ''' and UnitName = ''' IDcentralina ... + ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Dati = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Dati); + T = [cell2mat(Dati(:,1)) repmat(' ', [rD,1]) cell2mat(Dati(:,2))]; + Date = datenum(T); + indexHR = indexHR + 1; % la data del Trigger è quella aggiunta dalla rielaborazione + % Scarico i dati X + comando = ['select AlfaX from ElabDataView where EventDate >= ''' ... + data ''' and ToolNameID = ''' DTmodulo ''' and UnitName = ''' IDcentralina ... + ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + valHR = cell2mat(curs.Data); %valore post attivazione Trigger + valHR = valHR(indexHR(end)); + + % Scarico i dati calcerr + comando = ['select calcerr from ElabDataView where EventDate >= ''' ... + data ''' and ToolNameID = ''' DTmodulo ''' and UnitName = ''' IDcentralina ... + ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + erroreHR = cell2mat(curs.Data); + erroreHR = erroreHR(indexHR(end)); + + if erroreHR ==0 %lettura valida, calcolo incremento + trigHR(n,1) = valHR - AlfaX_HR(indexHR(end),1); %incremento allo scatto del trigger + %scrivo nel logfile + text = 'Confronto con soglia di trend RSNHR - ricalcolo eseguito, incremento calcolato'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + + elseif erroreHR==1 && AlfaX_HR(indexHR(end),2)==0 %la lettura precedente NON è in errore, allarme + sogliaHR(n,1)=1; + incHR=0; + tipomail_HR(n,1)=0.33; + %scrivo nel logfile + text = 'Confronto con soglia di trend RSNHR - ricalcolo eseguito, incremento NON calcolato/allarme per lettura precedente NON errore'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + + elseif erroreHR==1 && AlfaX_HR(indexHR(end),2)==1 %letture in errore, trigger disattivato + sogliaRSN(n,1)=0; + incHR=0; + %scrivo nel logfile + text = 'Confronto con soglia di trend RSNHR - ricalcolo eseguito, incremento NON calcolato/trigger in errore'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + end + + end + + if incHR==1 && trendHR ~= 99999 + if abs(trigHR(n,1))/abs(trendHR) >= 1.3 %SOGLIA DI TREND SUPERATA! + sogliaHR(n,1) = 1; + tipomail_HR(n,1)=1; + %scrivo nel logfile + text = 'Soglia di trend per RSNHR Link superata!'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + + else + sogliaHR(n,1) = 0; + %scrivo nel logfile + text = 'Soglia di trend per RSNHR Link non superata!'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + end + end + else + trigHR(n,1)=99999; %manca il sensore RSN HR oppure dati insufficienti per calcolare trend + %scrivo nel logfile + text = 'RSNHR assente, letture in errore o dati insufficienti: impossibile calcolare la soglia di trend per RSNHR'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + end + + % Load Link + + %scrivo nel logfile + text = 'Inizio controllo soglie di trend per LL'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + + incLL=1; + if isempty(usoLOAD)== 0 + if LastDataLOAD >= DataRifTRIGGER + if DatiCella(indexLL(end),2)==0 %lettura valida, calcolo incremento + valLL = DatiCella(indexLL(end),1); + trigLL(n,1) = valLL - DatiCella(indexLL(end-1),1); %incremento allo scatto del trigger + %scrivo nel logfile + text = 'Confronto con soglia di trend LL - nessun ricalcolo eseguito, incremento calcolato'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + + elseif DatiCella(indexLL(end),2)==1 && DatiCella(indexLL(end-1),2)==0 %la lettura precedente NON è in errore, allarme + sogliaLL(n,1)=1; + incLL=0; + tipomail_LL(n,1)=0.33; + %scrivo nel logfile + text = 'Confronto con soglia di trend LL - nessun ricalcolo eseguito, incremento NON calcolato/allarme per lettura precedente NON errore'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + + elseif DatiCella(indexLL(end),2)==1 && DatiCella(indexLL(end-1),2)==1 %la misura precedente è in errore, trigger disattivato + sogliaLL(n,1)=0; + incLL=0; + %scrivo nel logfile + text = 'Confronto con soglia di trend LL - nessun ricalcolo eseguito, incremento NON calcolato/trigger in errore'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + end + + else + if nuovidati == 0 %nessun sensore ha già forzato RSN + rilancio = ['/usr/local/matlab_func/run_RSN_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 '... + IDcentralina ' ' DTmodulo '']; + status = system(rilancio); %forzo RSN + nuovidati = 1; + %scrivo nel logfile + text = 'Confronto con soglia di trend LL - il software e'''' stato rilanciato'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + end + + data_rif = ARRAYdateTrL(i-1,1); + if data_rif > datenum(date) + data = datestr(data_rif,'yyyy-mm-dd'); + else + data = date; + end + NodeNum = num2str(cell2mat(modulo(usoLOAD,2))); + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + data ''' and ToolNameID = ''' DTmodulo ''' and UnitName = ''' IDcentralina ... + ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Dati = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Dati); + T = [cell2mat(Dati(:,1)) repmat(' ', [rD,1]) cell2mat(Dati(:,2))]; + Date = datenum(T); + indexLL = indexLL + 1; % la lettura del Trigger è quella aggiunta dalla rielaborazione + comando = ['select load_value from ElabDataView where EventDate >= ''' ... + data ''' and ToolNameID = ''' DTmodulo ''' and UnitName = ''' IDcentralina ... + ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + valLL = cell2mat(curs.Data); %valore post attivazione Trigger + valLL = valLL(indexLL(end)); + + % Scarico i dati calcerr + comando = ['select calcerr from ElabDataView where EventDate >= ''' ... + data ''' and ToolNameID = ''' DTmodulo ''' and UnitName = ''' IDcentralina ... + ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + erroreLL = cell2mat(curs.Data); + erroreLL = erroreLL(indexLL(end)); + + if erroreLL==0 %lettura valida, calcolo incremento + trigLL(n,1) = valLL - DatiCella(indexLL(end),1); %incremento allo scatto del trigger + %scrivo nel logfile + text = 'Confronto con soglia di trend LL - ricalcolo eseguito, incremento calcolato'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + + elseif erroreLL==1 && DatiCella(indexLL(end),2)==0 %la lettura precedente NON è in errore, allarme + sogliaLL(n,1)=1; + incLL=0; + tipomail_LL(n,1)=0.33; + %scrivo nel logfile + text = 'Confronto con soglia di trend LL - ricalcolo eseguito, incremento NON calcolato/allarme per lettura precedente NON errore'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + + elseif erroreLL==1 && DatiCella(indexLL(end),2)==1 %la misura precedente è in errore, trigger disattivato + sogliaLL(n,1)=0; + incLL=0; + %scrivo nel logfile + text = 'Confronto con soglia di trend LL - ricalcolo eseguito, incremento NON calcolato/trigger in errore'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + + end + + end + + if incLL==1 && trendLL ~= 99999 + if abs(trigLL(n,1))/abs(trendLL) >= 1.3 %SOGLIA DI TREND SUPERATA! + sogliaLL(n,1) = 1; + tipomail_LL(n,1)=1; + %scrivo nel logfile + text = 'Soglia di trend per Load Link superata!'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + + else + sogliaLL(n,1) = 0; + %scrivo nel logfile + text = 'Soglia di trend per Load Link non superata!'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + end + end + else + trigLL(n,1)=99999; %manca il sensore LL oppure dati insufficienti per calcolare trend + + %scrivo nel logfile + text = 'LL assente, letture in errore o dati insufficienti: impossibile calcolare la soglia di trend per LL'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + end + + soglie_modulo = [tipomail_RSN(n,1) tipomail_HR(n,1) tipomail_LL(n,1)]; + MATsoglie = []; + + if sum(soglie_modulo) == 0 || sum(soglie_modulo) == 1 + tipomail_MOD(n,1) = 0; + + elseif sum(soglie_modulo) > 0 && sum(soglie_modulo) < 2 + tipomail_MOD(n,1) = 0.5; + + elseif sum(soglie_modulo) >= 2 + tipomail_MOD(n,1) = 1; + end + + %scrivo nel logfile + text = ['Codice di invio mail definito per modulo ' DTmodulo '']; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + + end +end + +codice_mail = max(tipomail_MOD); %LIVELLO DI ALLERTAMENTO PER L'INVIO MAIL + +%scrivo nel logfile +text = 'Funzione Triggercheck per il controllo delle soglie di trend eseguita correttamente'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + diff --git a/RSN/Users_Def.m b/RSN/Users_Def.m new file mode 100755 index 0000000..11e5191 --- /dev/null +++ b/RSN/Users_Def.m @@ -0,0 +1,308 @@ +function [Mail,Users_Alert,Users_SMS,Users_Report,activeIT,activeEN,... + sms,siteID,NomeSito,ini_CoV] = Users_Def(IDcentralina,conn,FileName) + +text = 'Users function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +% A partire dalla centralina, risalgo al site ID +comando = ['select site_id from units where name like ''' IDcentralina ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +siteID = num2str(cell2mat(curs.Data)); + +% --- Cerco gli utenti --- + +% - Definisco gli Users +% A partire dal site ID, risalgo al company ID +comando = ['select company_id, name, lat, lon, alarm_email from sites where id like ''' siteID ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +Site = curs.Data; +Company_id = num2str(cell2mat(Site(1,1))); +Email_Alarm_Site = Site(1,5); +NomeSito = Site(1,2); + +% A partire dal company ID, mi scarico le info relative a Send Email Alarm +comando = ['select send_alarm from companies where id like ''' Company_id ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +Mail = cell2mat(curs.Data); + +if Mail == 1 % Significa che invio Mail alla Company del Sito + % La Mail la mando SOLO alla mail indicata nel campo del Sito (per quanto riguarda la company cliente) + if isempty(cell2mat(Email_Alarm_Site)) == 0 + if strcmp(char(Email_Alarm_Site),'null') == 0 + US = Email_Alarm_Site; + check = cell2mat(strfind(US,',')); + if isempty(check)==1 + % A partire dal company ID, risalgo agli utenti e alla loro mail di + % quella company che sono admin + comando = ['select fname, lname, language_id, info, phone, sms_alarm, report, report_cov, '... + 'allertamento from users where email like '''... + char(US) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Info = curs.Data; % Cerco la lingua dell'unico destinatario + [~,cC] = size(Info); + if cC > 1 + Users = Info(1:2); + Users(3) = US; + Users(4:5) = Info(3:4); + Users(6) = Info(5); + Users(7:10) = Info(6:9); + else + Users = []; + end + else + [~,cC] = size(check); + Users = cell(cC+1,6); + u = 1; + ini = 1; + for i=1:cC+1 + utente = char(US); + % A partire dal company ID, risalgo agli utenti e alla loro mail di + % quella company che sono admin + if i == cC+1 + comando = ['select fname, lname, language_id, info, phone, sms_alarm, report, report_cov, '... + 'allertamento, email from users where email like ''' utente(ini:end) ''' ']; + else + comando = ['select fname, lname, language_id, info, phone, sms_alarm, report, report_cov, '... + 'allertamento, email from users where email like ''' utente(ini:check(i)-1) ''' ']; + end + curs = exec(conn,comando); + curs = fetch(curs); + Info = curs.Data; % Cerco la lingua dell'unico destinatario + [~,cI] = size(Info); + if cI ~= 1 + Users(u,1:2) = Info(1:2); + Users(u,3) = Info(10); + Users(u,4:5) = Info(3:4); + Users(u,6) = Info(5); + Users(u,7:10) = Info(6:9); + u = u+1; + end + if i ~= cC+1 + ini = check(i)+1; + end + end + Users = Users(1:u-1,:); + end + else + % Company Manager + Role = ' 2 '; + % A partire dal company ID, risalgo agli utenti e alla loro mail di + % quella company che sono admin + comando = ['select fname, lname, email, language_id, info, phone, sms_alarm, report, report_cov, '... + 'allertamento from users where company_id like ''' Company_id ''' and role_id = ''' Role ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Users = curs.Data; + end + else + % Company Manager + Role = ' 2 '; + % A partire dal company ID, risalgo agli utenti e alla loro mail di + % quella company che sono admin + comando = ['select fname, lname, email, language_id, info, phone, sms_alarm, report, report_cov, '... + 'allertamento from users where company_id like ''' Company_id ''' and role_id = ''' Role ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Users = curs.Data; + end +else + Users = []; +end + +% Elimino gli utenti che non possono essere allertati +[rU,cU] = size(Users); +al = 1; +sms = 1; +rpt = 1; +Users_Alert = cell(1,1); +Users_SMS = cell(1,1); +Users_Report = cell(1,1); +if cU > 1 + for u = 1:rU + if cell2mat(Users(u,10)) == 1 + [rUA,cUA] = size(Users_Alert); + if rUA == 1 && cUA == 1 + clear Users_Alert + end + Users_Alert(al,:) = Users(u,:); + al = al+1; + if cell2mat(Users(u,7)) == 1 + [rUA,cUA] = size(Users_SMS); + if rUA == 1 && cUA == 1 + clear Users_SMS + end + Users_SMS(sms,:) = Users(u,:); + sms = sms+1; + end + end + if cell2mat(Users(u,8)) == 1 + [rUA,cUA] = size(Users_Report); + if rUA == 1 && cUA == 1 + clear Users_Report + end + Users_Report(rpt,:) = Users(u,:); + rpt = rpt+1; + end + end +end +ini_CoV = al; + +% Cerco se allertare o meno i Cone of Visions +comando = ['select conn_path from units where name like ''' IDcentralina ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +Auth = curs.Data; % Se pari a 1 autorizzo i Cone of Visions, altrimenti no + +if strcmp(char(Auth),'Yes') + Mail = 1; + % Cone of vision + % A partire dal site ID, risalgo al USER ID degli utenti nel + % cone-of-vision per quel sito + comando = ['select user_id from coneofvisions where site_id like ''' siteID ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + CoV = cell2mat(curs.Data); + + % A partire dal USER ID, risalgo agli utenti e alla loro email se sono company manager + [rC, ~] = size(CoV); + if strcmp(char(CoV(1,:)),'No Data') % almeno un utente da cercare nel database + Users_CoV = []; + else + ii = 1; + for i=1:rC + Utente = num2str(CoV(i,1)); + Role = ' 2 '; + comando = ['select fname, lname, email, language_id, info, phone, sms_alarm, report, report_cov, '... + 'allertamento from users where id = ''' Utente ''' and role_id = ''' Role ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + UC = curs.Data; + [~,cUC] = size(UC); + if cUC ~= 1 + Users_CoV(ii,:) = UC; + ii = ii+1; + end + end + end + [rUC,cUC] = size(Users_CoV); + [rUA,cUA] = size(Users_Alert); + if cUC > 1 + for u = 1:rUC + if cell2mat(Users_CoV(u,10)) == 1 && cell2mat(Users_CoV(u,9)) == 1 + salta = 0; + for cov = 1:rUA + if cUA > 1 + A = strfind(char(Users_CoV(u,3)),char(Users_Alert(cov,3))); + if A == 1 + salta = 1; + break + end + end + end + if salta == 0 + if cUA > 1 + Users_Alert(al,:) = Users_CoV(u,:); + else + Users_Alert = Users_CoV(u,:); + end + al = al+1; + if cell2mat(Users_CoV(u,7)) == 1 + Users_SMS(sms,:) = Users_CoV(u,:); + sms = sms+1; + end + end + end + if cell2mat(Users_CoV(u,9)) == 1 + salta = 0; + for cov = 1:rUA + if cUA > 1 + A = strfind(char(Users_CoV(u,3)),char(Users_Alert(cov,3))); + if A == 1 + salta = 1; + break + end + end + end + if salta == 0 + [rUA,cUA] = size(Users_Report); + if rUA == 1 && cUA == 1 + clear Users_Report + end + Users_Report(rpt,:) = Users_CoV(u,:); + rpt = rpt+1; + end + end + end + end +else + Users_CoV = []; +end + +[rU,cU] = size(Users); +[rC,cC] = size(Users_CoV); +if cC > 1 && rC > 0 && cU > 1 % comando ha trovato informazioni e le ha scritte in Users + Users(rU+1:rU+rC,1:10) = Users_CoV; +elseif cC > 1 && rC > 0 && cU == 0 + Users = Users_CoV; +end + +[rU,~] = size(Users); +if rU == 0 + Mail = 0; +end +% Controllo che la centralina non sia scaduta +comando = ['select duedate from units where name = ''' IDcentralina ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +Date = curs.Data; +Check = cell2mat(Date); +if strcmp(Check,'null') || strcmp(Check,'No Data') + % La data di scadenza centralina non è impostata + sms = 1; +else + if datenum(Date) < now % Centralina scaduta + sms = 0; + Users_Alert = []; + Users_SMS = []; + Users_Report = []; + else + sms = 1; + end +end + +% A chi mando la mail +activeIT = 0; +activeEN = 0; +[~,c1] = size(Users_Alert); +[~,c2] = size(Users_Report); +if c1 == 1 && c2 == 1 + Users_Lang = []; +elseif c1 == 1 + Users_Lang = Users_Report; +elseif c2 == 1 + Users_Lang = Users_Alert; +else + Users_Lang = [Users_Alert; Users_Report]; +end +[rU,cU] = size(Users_Lang); +if cU >1 % sono presenti utenti a cui inviare la mail + for i = 1:rU + if Users_Lang{i,4} == 2 + activeIT = 1; + else + activeEN = 1; + end + end +end + +text = 'Users function worked correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/RSN/YesNo.m b/RSN/YesNo.m new file mode 100755 index 0000000..152d85a --- /dev/null +++ b/RSN/YesNo.m @@ -0,0 +1,82 @@ +%% funzione che attiva/disattiva l'elaborazione per una determinata tipologia di nodo +% Ad esempio se la matrice RSN Link è vuota i RSN Link non sono presenti +% e si scrive yesRSN = 0, altrimenti se ci sono dei dati, yesRSN = 1 e ne +% viene attivata l'elaborazione nelle fasi successive + +function [yesRSN,yesRSNHR,yesSS,yesLL,yesTrL,yesGF,yesGS,yesDL,rRSN,rRSNHR,... + rLL,rTrL,rSS,rDL] = YesNo(NodoRSNLink,NodoRSNLinkHR,NodoSS,NodoLoadLink,... + NodoTriggerLink,NodoGflowLink,NodoGshockLink,NodoDebrisLink,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'YesNo function started'; +fprintf(fileID,fmt,text); + +%% RSN Link +[rRSN,cRSN] = size(NodoRSNLink); +if rRSN == 0 && cRSN == 0 + yesRSN = 0; % Non elaboro i RSN Link +else + yesRSN = 1; % attiva l'elaborazione dei RSN Link +end + +%% RSN Link HR +[rRSNHR,cRSNHR] = size(NodoRSNLinkHR); +if rRSNHR == 0 && cRSNHR == 0 + yesRSNHR = 0; % Non elaboro i RSN Link HR +else + yesRSNHR = 1; % attiva l'elaborazione dei RSN Link HR +end + +%% Load Link +[rLL,cLL] = size(NodoLoadLink); +if rLL == 0 && cLL == 0 + yesLL = 0; % Non elaboro i Load Link +else + yesLL = 1; % attiva l'elaborazione dei Load Link +end + +%% Trigger Link +[rTrL,cTrL] = size(NodoTriggerLink); +if rTrL == 0 && cTrL == 0 + yesTrL = 0; % Non elaboro i Trigger Link +else + yesTrL = 1; % attiva l'elaborazione dei Trigger Link +end + +%% Shock Sensor +[rSS,cSS] = size(NodoSS); +if rSS==0 && cSS==0 + yesSS = 0; % Non elaboro +else + yesSS = 1; % attiva l'elaborazione +end + +%% G-Flow Link +[rGF,cGF] = size(NodoGflowLink); +if rGF == 0 && cGF == 0 + yesGF = 0; % Non elaboro +else + yesGF = 1; % attiva l'elaborazione +end + +%% G-Shock Link +[rGS,cGS] = size(NodoGshockLink); +if rGS == 0 && cGS == 0 + yesGS = 0; % Non elaboro +else + yesGS = 1; % attiva l'elaborazione +end + +%% Debris Link +[rDL,cDL] = size(NodoDebrisLink); +if rDL == 0 && cDL == 0 + yesDL = 0; % Non elaboro +else + yesDL = 1; % attiva l'elaborazione +end + +text = 'Activation parameters for the elaboration defined correctly, YesNo function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/RSN/alert_Levels.m b/RSN/alert_Levels.m new file mode 100755 index 0000000..c164b14 --- /dev/null +++ b/RSN/alert_Levels.m @@ -0,0 +1,2176 @@ +function 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) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'alert_Levels function started'; +fprintf(fileID,fmt,text); +fclose(fileID); + +% Scarico ID centralina +comando = ['select id from units where name = ''' IDcentralina ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +unitID = num2str(cell2mat(curs.Data)); + +SirenON = 0; + +% Creazione file di testo con data di riferimento per l'attivazione +FileNameALA = ['' IDcentralina '-' DTcatena '-Alarm.txt']; +if isfile(FileNameALA) == 1 + A = importdata(FileNameALA); + [rA,~] = size(A); + if rA == 0 + DataRifALE = 0; + DataRifALA = 0; + elseif rA == 1 + DataRifALE = A(1,1); + DataRifALA = 0; + else + DataRifALE = A(1,1); + DataRifALA = A(2,1); + end +else + DataRifALE = 0; + DataRifALA = 0; +end +DATA_rif = max(DataRifALA,DataRifALE); % Data della mail + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; + +%% Allertamento +% --- Trigger --- +Tr = 0; +[rT,cT] = size(val_TrL); +if yesTrL == 1 + nTr = 0; + numTr1 = 1; + numTr2 = 1; + for t = 1:rT + if val_TrL(t,1) == 1 + dataTrig(numTr1,1) = cellstr(datestr(ARRAYdateTrL(t),'yyyy/mm/dd HH:MM:SS')); + if strcmp(DTcatena,'LOC0060') == 1 % Vobarno + Tr = 1; % Vobarno + nTr = 1; % Trigger 1 + text = 'Trigger detected at Vobarno'; + fprintf(fileID,fmt,text); + fclose(fileID); + % Rielaboro i Moduli RSN di riferimento di default + % --- Modulo 1 --- + DTmodulo1 = 'DT0001'; + rilancio = ['/usr/local/matlab_func/run_RSN_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 '... + IDcentralina ' ' DTmodulo1 '']; + status = system(rilancio); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'DT0001 BPM module re-elaborated correctly'; + fprintf(fileID,fmt,text); + fprintf(fileID,fmt,status); + fclose(fileID); + % --- Modulo 2 --- + DTmodulo2 = 'DT0002'; + rilancio = ['/usr/local/matlab_func/run_RSN_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 '... + IDcentralina ' ' DTmodulo2 '']; + status = system(rilancio); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'DT0002 BPM module re-elaborated correctly'; + fprintf(fileID,fmt,text); + fprintf(fileID,fmt,status); + fclose(fileID); + % --- Modulo 3 --- + DTmodulo3 = 'DT0003'; + rilancio = ['/usr/local/matlab_func/run_RSN_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 '... + IDcentralina ' ' DTmodulo3 '']; + status = system(rilancio); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'DT0003 BPM module re-elaborated correctly'; + fprintf(fileID,fmt,text); + fprintf(fileID,fmt,status); + elseif strcmp(DTcatena,'LOC0102') == 1 || strcmp(DTcatena,'LOC0103') == 1 + Tr = 2; % A27 - Trigger + text = 'Trigger detected'; + elseif strcmp(IDcentralina,'ID0153') == 1 + Tr = 3; % A27 - Fadalto + text = 'Trigger Nesa detected'; + end + numTr1 = numTr1+1; + end + if cT > 1 && val_TrL(t,2) == 1 + dataTrig(numTr2,1) = cellstr(datestr(ARRAYdateTrL(t),'yyyy/mm/dd HH:MM:SS')); + if nTr == 1 + nTr = 3; % Trigger 1 e 2 contemporaneamente + else + nTr = 2; % Trigger 2 + end + if strcmp(DTcatena,'LOC0060') == 1 % Vobarno + text = 'Trigger detected at Vobarno'; + fprintf(fileID,fmt,text); + fclose(fileID); + % Rielaboro i Moduli RSN di riferimento di default + % --- Modulo 1 --- + DTmodulo4 = 'DT0004'; + rilancio = ['/usr/local/matlab_func/run_RSN_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 '... + IDcentralina ' ' DTmodulo4 '']; + status = system(rilancio); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'DT0004 BPM module re-elaborated correctly'; + fprintf(fileID,fmt,text); + fprintf(fileID,fmt,status); + fclose(fileID); + % --- Modulo 2 --- + DTmodulo5 = 'DT0005'; + rilancio = ['/usr/local/matlab_func/run_RSN_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 '... + IDcentralina ' ' DTmodulo5 '']; + status = system(rilancio); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'DT0005 BPM module re-elaborated correctly'; + fprintf(fileID,fmt,text); + fprintf(fileID,fmt,status); + end + end + end + if Tr ~= 0 + fprintf(fileID,fmt,text); + end +end +% --- Shock Sensor --- +SS = 0; % Non è scattato nessuno Shock Sensor +if yesSS == 1 + DataSS = []; + [rS,~] = size(val_SS); + ss = 1; + for s = 1:rS + if val_SS(s,1) == 1 + SS = 1; + DataSS(ss,1) = ARRAYdateSS(s,1); + ss = ss+1; + end + end +end +% --- RSN Link --- +if yesRSN == 1 + if Tr == 1 + DataScarico = datestr(ARRAYdateTrL(end)-30,'yyyy/mm/dd'); % scarico a partire da un mese prima + elseif SS == 1 + DataScarico = datestr(DataSS(end,1)-30,'yyyy/mm/dd'); % scarico a partire da un mese prima + else + DataScarico = datestr(ARRAYdateRSN(end)-30,'yyyy/mm/dd'); + end + NodeType = 'RSN Link'; + if strcmp(IDcentralina,'ID0060') == 1 % Vobarno + if nTr == 1 || nTr == 3 + % --- DT0001 --- + DTcatena1 = 'DT0001'; + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate >= ''' ... + DataScarico ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena1 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSN = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATnodoRSN); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATnodoRSN(:,1)) repmat(' ', [rD,1]) cell2mat(DATnodoRSN(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DataRSN_Rif1 = T; + end + AlfaX_Rif1 = cell2mat(DATnodoRSN(:,3)); + ErrRSNLink_Rif1 = cell2mat(DATnodoRSN(:,4)); + % Primo valore elaborato + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate = ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena1 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSN_0 = curs.Data; + [rD,cD] = size(DATnodoRSN_0); + if rD == 1 && cD == 1 + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena1 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSN_0 = curs.Data; + AlfaX_1 = cell2mat(DATnodoRSN_0(1,3)); + else + AlfaX_1 = cell2mat(DATnodoRSN_0(1,3)); + end + + % --- DT0002 --- + DTcatena2 = 'DT0002'; + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate >= ''' ... + DataScarico ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena2 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSN = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATnodoRSN); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATnodoRSN(:,1)) repmat(' ', [rD,1]) cell2mat(DATnodoRSN(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DataRSN_Rif2 = T; + end + AlfaX_Rif2 = cell2mat(DATnodoRSN(:,3)); + ErrRSNLink_Rif2 = cell2mat(DATnodoRSN(:,4)); + % Primo valore elaborato + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate = ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena2 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSN_0 = curs.Data; + [rD,cD] = size(DATnodoRSN_0); + if rD == 1 && cD == 1 + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena2 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSN_0 = curs.Data; + AlfaX_2 = cell2mat(DATnodoRSN_0(1,3)); + else + AlfaX_2 = cell2mat(DATnodoRSN_0(1,3)); + end + + % --- DT0003 --- + DTcatena3 = 'DT0003'; + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate >= ''' ... + DataScarico ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena3 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSN = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATnodoRSN); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATnodoRSN(:,1)) repmat(' ', [rD,1]) cell2mat(DATnodoRSN(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DataRSN_Rif3 = T; + end + AlfaX_Rif3 = cell2mat(DATnodoRSN(:,3)); + ErrRSNLink_Rif3 = cell2mat(DATnodoRSN(:,4)); + % Primo valore elaborato + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate = ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena3 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSN_0 = curs.Data; + [rD,cD] = size(DATnodoRSN_0); + if rD == 1 && cD == 1 + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena3 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSN_0 = curs.Data; + AlfaX_3 = cell2mat(DATnodoRSN_0(1,3)); + else + AlfaX_3 = cell2mat(DATnodoRSN_0(1,3)); + end + end + + if nTr == 2 || nTr == 3 + % --- DT0004 --- + DTcatena4 = 'DT0004'; + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate >= ''' ... + DataScarico ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena4 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSN = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATnodoRSN); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATnodoRSN(:,1)) repmat(' ', [rD,1]) cell2mat(DATnodoRSN(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DataRSN_Rif4 = T; + end + AlfaX_Rif4 = cell2mat(DATnodoRSN(:,3)); + ErrRSNLink_Rif4 = cell2mat(DATnodoRSN(:,4)); + % Primo valore elaborato + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate = ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena4 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSN_0 = curs.Data; + [rD,cD] = size(DATnodoRSN_0); + if rD == 1 && cD == 1 + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena4 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSN_0 = curs.Data; + AlfaX_4 = cell2mat(DATnodoRSN_0(1,3)); + else + AlfaX_4 = cell2mat(DATnodoRSN_0(1,3)); + end + + % --- DT0005 --- + DTcatena5 = 'DT0005'; + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate >= ''' ... + DataScarico ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena5 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSN = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATnodoRSN); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATnodoRSN(:,1)) repmat(' ', [rD,1]) cell2mat(DATnodoRSN(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DataRSN_Rif5 = T; + end + AlfaX_Rif5 = cell2mat(DATnodoRSN(:,3)); + ErrRSNLink_Rif5 = cell2mat(DATnodoRSN(:,4)); + % Primo valore elaborato + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate = ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena5 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSN_0 = curs.Data; + [rD,cD] = size(DATnodoRSN_0); + if rD == 1 && cD == 1 + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena5 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSN_0 = curs.Data; + AlfaX_5 = cell2mat(DATnodoRSN_0(1,3)); + else + AlfaX_5 = cell2mat(DATnodoRSN_0(1,3)); + end + end + text = 'Last month data of RSN Link sensors recovered for Vobarno site'; + fprintf(fileID,fmt,text); + else + comando = ['select EventDate, EventTime, AlfaX, AlfaY, calcerr from ElabDataView where EventDate >= ''' ... + DataScarico ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSN = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATnodoRSN); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATnodoRSN(:,1)) repmat(' ', [rD,1]) cell2mat(DATnodoRSN(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DataRSN_Rif = T; + end + AlfaX_Rif = cell2mat(DATnodoRSN(:,3)); + AlfaY_Rif = cell2mat(DATnodoRSN(:,4)); + ErrRSNLink_Rif = cell2mat(DATnodoRSN(:,5)); + % Primo valore elaborato + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate = ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSN_0 = curs.Data; + [rD,cD] = size(DATnodoRSN_0); + if rD == 1 && cD == 1 + comando = ['select EventDate, EventTime, AlfaX calcerr from ElabDataView where EventDate > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSN_0 = curs.Data; + AlfaX_0 = cell2mat(DATnodoRSN_0(1,3)); + else + AlfaX_0 = cell2mat(DATnodoRSN_0(1,3)); + end + text = 'Last month data of RSN Link sensors recovered'; + fprintf(fileID,fmt,text); + end +end + +% --- RSN Link HR --- +if Tr == 1 + DataScarico = datestr(ARRAYdateTrL(end)-30,'yyyy/mm/dd'); % scarico a partire da un mese prima + NodeType = 'RSN Link HR'; + if strcmp(IDcentralina,'ID0060') == 1 % Vobarno + if nTr == 1 || nTr == 3 + % --- DT0001 --- + DTcatena1 = 'DT0001'; + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate >= ''' ... + DataScarico ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena1 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSNHR = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATnodoRSNHR); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATnodoRSNHR(:,1)) repmat(' ', [rD,1]) cell2mat(DATnodoRSNHR(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DataRSNHR_Rif1 = T; + end + AlfaX_HR_Rif1 = cell2mat(DATnodoRSNHR(:,3)); + ErrRSNLink_HR_Rif1 = cell2mat(DATnodoRSNHR(:,4)); + % Primo valore elaborato + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate = ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena1 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSNHR_0 = curs.Data; + [rD,cD] = size(DATnodoRSNHR_0); + if rD == 1 && cD == 1 + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena1 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSNHR_0 = curs.Data; + AlfaX_HR_1 = cell2mat(DATnodoRSNHR_0(1,3)); + else + AlfaX_HR_1 = cell2mat(DATnodoRSNHR_0(1,3)); + end + + % --- DT0002 --- + DTcatena2 = 'DT0002'; + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate >= ''' ... + DataScarico ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena2 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSNHR = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATnodoRSNHR); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATnodoRSNHR(:,1)) repmat(' ', [rD,1]) cell2mat(DATnodoRSNHR(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DataRSNHR_Rif2 = T; + end + AlfaX_HR_Rif2 = cell2mat(DATnodoRSNHR(:,3)); + ErrRSNLink_HR_Rif2 = cell2mat(DATnodoRSNHR(:,4)); + % Primo valore elaborato + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate = ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena2 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSNHR_0 = curs.Data; + [rD,cD] = size(DATnodoRSNHR_0); + if rD == 1 && cD == 1 + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena2 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSNHR_0 = curs.Data; + AlfaX_HR_2 = cell2mat(DATnodoRSNHR_0(1,3)); + else + AlfaX_HR_2 = cell2mat(DATnodoRSNHR_0(1,3)); + end + + % --- DT0003 --- + DTcatena3 = 'DT0003'; + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate >= ''' ... + DataScarico ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena3 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSNHR = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATnodoRSNHR); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATnodoRSNHR(:,1)) repmat(' ', [rD,1]) cell2mat(DATnodoRSNHR(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DataRSNHR_Rif3 = T; + end + AlfaX_HR_Rif3 = cell2mat(DATnodoRSNHR(:,3)); + ErrRSNLink_HR_Rif3 = cell2mat(DATnodoRSNHR(:,4)); + % Primo valore elaborato + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate = ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena3 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSNHR_0 = curs.Data; + [rD,cD] = size(DATnodoRSNHR_0); + if rD == 1 && cD == 1 + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena3 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSNHR_0 = curs.Data; + AlfaX_HR_3 = cell2mat(DATnodoRSNHR_0(1,3)); + else + AlfaX_HR_3 = cell2mat(DATnodoRSNHR_0(1,3)); + end + end + + if nTr == 2 || nTr == 3 + % --- DT0004 --- + DTcatena4 = 'DT0004'; + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate >= ''' ... + DataScarico ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena4 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSNHR = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATnodoRSNHR); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATnodoRSNHR(:,1)) repmat(' ', [rD,1]) cell2mat(DATnodoRSNHR(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DataRSNHR_Rif4 = T; + end + AlfaX_HR_Rif4 = cell2mat(DATnodoRSNHR(:,3)); + ErrRSNLink_HR_Rif4 = cell2mat(DATnodoRSNHR(:,4)); + % Primo valore elaborato + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate = ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena4 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSNHR_0 = curs.Data; + [rD,cD] = size(DATnodoRSNHR_0); + if rD == 1 && cD == 1 + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena4 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSNHR_0 = curs.Data; + AlfaX_HR_4 = cell2mat(DATnodoRSNHR_0(1,3)); + else + AlfaX_HR_4 = cell2mat(DATnodoRSNHR_0(1,3)); + end + + % --- DT0005 --- + DTcatena5 = 'DT0005'; + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate >= ''' ... + DataScarico ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena5 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSNHR = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATnodoRSNHR); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATnodoRSNHR(:,1)) repmat(' ', [rD,1]) cell2mat(DATnodoRSNHR(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DataRSNHR_Rif5 = T; + end + AlfaX_HR_Rif5 = cell2mat(DATnodoRSNHR(:,3)); + ErrRSNLink_HR_Rif5 = cell2mat(DATnodoRSNHR(:,4)); + % Primo valore elaborato + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate = ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena5 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSNHR_0 = curs.Data; + [rD,cD] = size(DATnodoRSNHR_0); + if rD == 1 && cD == 1 + comando = ['select EventDate, EventTime, AlfaX, calcerr from ElabDataView where EventDate > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena5 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSNHR_0 = curs.Data; + AlfaX_HR_5 = cell2mat(DATnodoRSNHR_0(1,3)); + else + AlfaX_HR_5 = cell2mat(DATnodoRSNHR_0(1,3)); + end + end + text = 'Last month data of RSN HR Link sensors recovered for Vobarno site'; + fprintf(fileID,fmt,text); + end +end + +% --- Load Link --- +if Tr == 1 + DataScarico = datestr(ARRAYdateTrL(end)-30,'yyyy/mm/dd'); % scarico a partire da un mese prima + NodeType = 'Load Link'; + if strcmp(IDcentralina,'ID0060') == 1 % Vobarno + if nTr == 1 || nTr == 3 + % --- DT0001 --- + DTcatena1 = 'DT0001'; + comando = ['select EventDate, EventTime, load_value, calcerr from ElabDataView where EventDate >= ''' ... + DataScarico ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena1 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoLL = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATnodoLL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATnodoLL(:,1)) repmat(' ', [rD,1]) cell2mat(DATnodoLL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DataLL_Rif1 = T; + end + Load_Rif1 = cell2mat(DATnodoLL(:,3)); + ErrLoadLink_Rif1 = cell2mat(DATnodoLL(:,4)); + % Primo valore elaborato + comando = ['select EventDate, EventTime, load_value, calcerr from ElabDataView where EventDate = ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena1 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoLL_0 = curs.Data; + [rD,cD] = size(DATnodoLL_0); + if rD == 1 && cD == 1 + comando = ['select EventDate, EventTime, load_value, calcerr from ElabDataView where EventDate > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena1 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoLL_0 = curs.Data; + Load_1 = cell2mat(DATnodoLL_0(1,3)); + else + Load_1 = cell2mat(DATnodoLL_0(1,3)); + end + + % --- DT0002 --- + DTcatena2 = 'DT0002'; + comando = ['select EventDate, EventTime, load_value, calcerr from ElabDataView where EventDate >= ''' ... + DataScarico ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena2 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoLL = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATnodoLL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATnodoLL(:,1)) repmat(' ', [rD,1]) cell2mat(DATnodoLL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DataLL_Rif2 = T; + end + Load_Rif2 = cell2mat(DATnodoLL(:,3)); + ErrLoadLink_Rif2 = cell2mat(DATnodoLL(:,4)); + % Primo valore elaborato + comando = ['select EventDate, EventTime, load_value, calcerr from ElabDataView where EventDate = ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena2 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoLL_0 = curs.Data; + [rD,cD] = size(DATnodoLL_0); + if rD == 1 && cD == 1 + comando = ['select EventDate, EventTime, load_value, calcerr from ElabDataView where EventDate > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena2 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoLL_0 = curs.Data; + Load_2 = cell2mat(DATnodoLL_0(1,3)); + else + Load_2 = cell2mat(DATnodoLL_0(1,3)); + end + + % --- DT0003 --- + DTcatena3 = 'DT0003'; + comando = ['select EventDate, EventTime, load_value, calcerr from ElabDataView where EventDate >= ''' ... + DataScarico ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena3 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoLL = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATnodoLL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATnodoLL(:,1)) repmat(' ', [rD,1]) cell2mat(DATnodoLL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DataLL_Rif3 = T; + end + Load_Rif3 = cell2mat(DATnodoLL(:,3)); + ErrLoadLink_Rif3 = cell2mat(DATnodoLL(:,4)); + % Primo valore elaborato + comando = ['select EventDate, EventTime, load_value, calcerr from ElabDataView where EventDate = ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena3 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoLL_0 = curs.Data; + [rD,cD] = size(DATnodoLL_0); + if rD == 1 && cD == 1 + comando = ['select EventDate, EventTime, load_value, calcerr from ElabDataView where EventDate > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena3 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoLL_0 = curs.Data; + Load_3 = cell2mat(DATnodoLL_0(1,3)); + else + Load_3 = cell2mat(DATnodoLL_0(1,3)); + end + end + + if nTr == 2 || nTr == 3 + % --- DT0004 --- + DTcatena4 = 'DT0004'; + comando = ['select EventDate, EventTime, load_value, calcerr from ElabDataView where EventDate >= ''' ... + DataScarico ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena4 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoLL = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATnodoLL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATnodoLL(:,1)) repmat(' ', [rD,1]) cell2mat(DATnodoLL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DataLL_Rif4 = T; + end + Load_Rif4 = cell2mat(DATnodoLL(:,3)); + ErrLoadLink_Rif4 = cell2mat(DATnodoLL(:,4)); + % Primo valore elaborato + comando = ['select EventDate, EventTime, load_value, calcerr from ElabDataView where EventDate = ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena4 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoLL_0 = curs.Data; + [rD,cD] = size(DATnodoLL_0); + if rD == 1 && cD == 1 + comando = ['select EventDate, EventTime, load_value, calcerr from ElabDataView where EventDate > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena4 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoLL_0 = curs.Data; + Load_4 = cell2mat(DATnodoLL_0(1,3)); + else + Load_4 = cell2mat(DATnodoLL_0(1,3)); + end + + % --- DT0005 --- + DTcatena5 = 'DT0005'; + comando = ['select EventDate, EventTime, load_value, calcerr from ElabDataView where EventDate >= ''' ... + DataScarico ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena5 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoLL = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATnodoLL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATnodoLL(:,1)) repmat(' ', [rD,1]) cell2mat(DATnodoLL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DataLL_Rif5 = T; + end + Load_Rif5 = cell2mat(DATnodoLL(:,3)); + ErrLoadLink_Rif5 = cell2mat(DATnodoLL(:,4)); + % Primo valore elaborato + comando = ['select EventDate, EventTime, load_value, calcerr from ElabDataView where EventDate = ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena5 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoLL_0 = curs.Data; + [rD,cD] = size(DATnodoLL_0); + if rD == 1 && cD == 1 + comando = ['select EventDate, EventTime, load_value, calcerr from ElabDataView where EventDate > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena5 ... + ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoLL_0 = curs.Data; + Load_5 = cell2mat(DATnodoLL_0(1,3)); + else + Load_5 = cell2mat(DATnodoLL_0(1,3)); + end + end + text = 'Last month data of Load Link sensors recovered for Vobarno site'; + fprintf(fileID,fmt,text); + end +end + +%% ---SOGLIE--- +% Allerta +alarm = 0; +alert = 0; +AL = 1; +% --- Trigger --- +if yesTrL == 1 + if Tr == 1 % Vobarno + if ARRAYdateTrL(end) > DATA_rif + DataRifALE = datestr(ARRAYdateTrL(end),'yyyy/mm/dd HH:MM:SS'); % data attivazione allerta + % Codice + if nTr == 1 || nTr == 3 + text = 'Inizio confronto soglie relative per il sito di Vobarno'; + fprintf(fileID,fmt,text); + % --- CALCOLO SOGLIE RELATIVE --- + % --- Modulo RSN 1 --- + % MEMS + indexRSN_1 = find(DataRSN_Rif1(:,1)<=datenum(dataTrig)); % Dati precedenti al trigger + TrigRSN_1 = AlfaX_Rif1(indexRSN_1(end),1)-AlfaX_Rif1(indexRSN_1(end)-1,1); + TrendRSN_1 = AlfaX_Rif1(indexRSN_1(1:end-1),1); + if abs(TrigRSN_1) > 3*std(abs(diff(TrendRSN_1))) + RSN_1 = 1; + elseif ErrRSNLink_Rif1(indexRSN_1(end),1) == 1 && ErrRSNLink_Rif1(indexRSN_1(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + RSN_1 = 0.5; + else + RSN_1 = 0; + end + % Ampolla + indexRSNHR_1 = find(DataRSNHR_Rif1(:,1)<=datenum(dataTrig)); % Dati precedenti al trigger + TrigRSNHR_1 = AlfaX_HR_Rif1(indexRSNHR_1(end),1)-AlfaX_HR_Rif1(indexRSNHR_1(end)-1,1); + TrendRSNHR_1 = AlfaX_HR_Rif1(indexRSNHR_1(1:end-1),1); + if abs(TrigRSNHR_1) > 3*std(abs(diff(TrendRSNHR_1))) + RSNHR_1 = 1; + elseif ErrRSNLink_HR_Rif1(indexRSNHR_1(end),1) == 1 && ErrRSNLink_HR_Rif1(indexRSNHR_1(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + RSNHR_1 = 0.5; + else + RSNHR_1 = 0; + end + % Cella di carico + indexLL_1 = find(DataLL_Rif1(:,1)<=datenum(dataTrig)); % Dati precedenti al trigger + TrigLL_1 = Load_Rif1(indexLL_1(end),1)-Load_Rif1(indexLL_1(end)-1,1); + TrendLL_1 = Load_Rif1(indexLL_1(1:end-1),1); + if abs(TrigLL_1) > 3*std(abs(diff(TrendLL_1))) + LL_1 = 1; + elseif ErrLoadLink_Rif1(indexLL_1(end),1) == 1 && ErrLoadLink_Rif1(indexLL_1(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + LL_1 = 0.5; + else + LL_1 = 0; + end + Somma_1 = RSN_1+RSNHR_1+LL_1; + if Somma_1 >= 2 + Level_1 = 2; + else + Level_1 = 1; + end + + % --- Modulo RSN 2 --- + % MEMS + indexRSN_2 = find(DataRSN_Rif2(:,1)<=datenum(dataTrig)); % Dati precedenti al trigger + TrigRSN_2 = AlfaX_Rif2(indexRSN_2(end),1)-AlfaX_Rif2(indexRSN_2(end)-1,1); + TrendRSN_2 = AlfaX_Rif2(indexRSN_2(1:end-1),1); + if abs(TrigRSN_2) > 3*std(abs(diff(TrendRSN_2))) + RSN_2 = 1; + elseif ErrRSNLink_Rif2(indexRSN_2(end),1) == 1 && ErrRSNLink_Rif2(indexRSN_2(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + RSN_2 = 0.5; + else + RSN_2 = 0; + end + % Ampolla + indexRSNHR_2 = find(DataRSNHR_Rif2(:,1)<=datenum(dataTrig)); % Dati precedenti al trigger + TrigRSNHR_2 = AlfaX_HR_Rif2(indexRSNHR_2(end),1)-AlfaX_HR_Rif2(indexRSNHR_2(end)-1,1); + TrendRSNHR_2 = AlfaX_HR_Rif2(indexRSNHR_2(1:end-1),1); + if abs(TrigRSNHR_2) > 3*std(abs(diff(TrendRSNHR_2))) + RSNHR_2 = 1; + elseif ErrRSNLink_HR_Rif2(indexRSNHR_2(end),1) == 1 && ErrRSNLink_HR_Rif2(indexRSNHR_2(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + RSNHR_2 = 0.5; + else + RSNHR_2 = 0; + end + % Cella di carico + indexLL_2 = find(DataLL_Rif2(:,1)<=datenum(dataTrig)); % Dati precedenti al trigger + TrigLL_2 = Load_Rif2(indexLL_2(end),1)-Load_Rif2(indexLL_2(end)-1,1); + TrendLL_2 = Load_Rif2(indexLL_2(1:end-1),1); + if abs(TrigLL_2) > 3*std(abs(diff(TrendLL_2))) + LL_2 = 1; + elseif ErrLoadLink_Rif2(indexLL_2(end),1) == 1 && ErrLoadLink_Rif2(indexLL_2(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + LL_2 = 0.5; + else + LL_2 = 0; + end + Somma_2 = RSN_2+RSNHR_2+LL_2; + if Somma_2 >= 2 + Level_2 = 2; + else + Level_2 = 1; + end + + % --- Modulo RSN 3 --- + % MEMS + indexRSN_3 = find(DataRSN_Rif3(:,1)<=datenum(dataTrig)); % Dati precedenti al trigger + TrigRSN_3 = AlfaX_Rif3(indexRSN_3(end),1)-AlfaX_Rif3(indexRSN_3(end)-1,1); + TrendRSN_3 = AlfaX_Rif3(indexRSN_3(1:end-1),1); + if abs(TrigRSN_3) > 3*std(abs(diff(TrendRSN_3))) + RSN_3 = 1; + elseif ErrRSNLink_Rif3(indexRSN_3(end),1) == 1 && ErrRSNLink_Rif3(indexRSN_3(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + RSN_3 = 0.5; + else + RSN_3 = 0; + end + % Ampolla + indexRSNHR_3 = find(DataRSNHR_Rif3(:,1)<=datenum(dataTrig)); % Dati precedenti al trigger + TrigRSNHR_3 = AlfaX_HR_Rif3(indexRSNHR_3(end),1)-AlfaX_HR_Rif3(indexRSNHR_3(end)-1,1); + TrendRSNHR_3 = AlfaX_HR_Rif3(indexRSNHR_3(1:end-1),1); + if abs(TrigRSNHR_3) > 3*std(abs(diff(TrendRSNHR_3))) + RSNHR_3 = 1; + elseif ErrRSNLink_HR_Rif3(indexRSNHR_3(end),1) == 1 && ErrRSNLink_HR_Rif3(indexRSNHR_3(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + RSNHR_3 = 0.5; + else + RSNHR_3 = 0; + end + % Cella di carico + indexLL_3 = find(DataLL_Rif3(:,1)<=datenum(dataTrig)); % Dati precedenti al trigger + TrigLL_3 = Load_Rif3(indexLL_3(end),1)-Load_Rif3(indexLL_3(end)-1,1); + TrendLL_3 = Load_Rif3(indexLL_3(1:end-1),1); + if abs(TrigLL_3) > 3*std(abs(diff(TrendLL_3))) + LL_3 = 1; + elseif ErrLoadLink_Rif3(indexLL_3(end),1) == 1 && ErrLoadLink_Rif3(indexLL_3(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + LL_3 = 0.5; + else + LL_3 = 0; + end + Somma_3 = RSN_3+RSNHR_3+LL_3; + if Somma_3 >= 2 + Level_3 = 2; + else + Level_3 = 1; + end + + % --- CALCOLO SOGLIE ASSOLUTE --- + text = 'Inizio confronto soglie assolute per il sito di Vobarno'; + fprintf(fileID,fmt,text); + % --- Modulo RSN 1 --- + if Level_1 == 2 + % MEMS + if AlfaX_Rif1(indexRSN_1(end),1)-AlfaX_1 > 5 % Gradi + RSN_1 = 1; + elseif ErrRSNLink_Rif1(indexRSN_1(end),1) == 1 && ErrRSNLink_Rif1(indexRSN_1(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + RSN_1 = 0.5; + else + RSN_1 = 0; + end + % Ampolla + if AlfaX_HR_Rif1(indexRSNHR_1(end),1)-AlfaX_HR_1 > 5 % Gradi + RSNHR_1 = 1; + elseif ErrRSNLink_HR_Rif1(indexRSNHR_1(end),1) == 1 && ErrRSNLink_HR_Rif1(indexRSNHR_1(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + RSNHR_1 = 0.5; + else + RSNHR_1 = 0; + end + % Cella di carico + if Load_Rif1(indexLL_1(end),1)-Load_1 > 65 % kN + LL_1 = 1; + elseif ErrLoadLink_Rif1(indexLL_1(end),1) == 1 && ErrLoadLink_Rif1(indexLL_1(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + LL_1 = 0.5; + else + LL_1 = 0; + end + Somma_1_A = RSN_1+RSNHR_1+LL_1; + if Somma_1_A >= 2 + Level_1 = 3; + end + end + + % --- Modulo RSN 2 --- + if Level_2 == 2 + % MEMS + if AlfaX_Rif2(indexRSN_2(end),1)-AlfaX_2 > 5 % Gradi + RSN_2 = 1; + elseif ErrRSNLink_Rif2(indexRSN_2(end),1) == 1 && ErrRSNLink_Rif2(indexRSN_2(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + RSN_2 = 0.5; + else + RSN_2 = 0; + end + % Ampolla + if AlfaX_HR_Rif2(indexRSNHR_2(end),1)-AlfaX_HR_2 > 5 % Gradi + RSNHR_2 = 1; + elseif ErrRSNLink_HR_Rif2(indexRSNHR_2(end),1) == 1 && ErrRSNLink_HR_Rif2(indexRSNHR_2(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + RSNHR_2 = 0.5; + else + RSNHR_2 = 0; + end + % Cella di carico + if Load_Rif2(indexLL_2(end),1)-Load_2 > 65 % kN + LL_2 = 1; + elseif ErrLoadLink_Rif2(indexLL_2(end),1) == 1 && ErrLoadLink_Rif2(indexLL_2(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + LL_2 = 0.5; + else + LL_2 = 0; + end + Somma_2_A = RSN_2+RSNHR_2+LL_2; + if Somma_2_A >= 2 + Level_2 = 3; + end + end + + % --- Modulo RSN 3 --- + if Level_3 == 2 + % MEMS + if AlfaX_Rif3(indexRSN_3(end),1)-AlfaX_3 > 5 % Gradi + RSN_3 = 1; + elseif ErrRSNLink_Rif3(indexRSN_3(end),1) == 1 && ErrRSNLink_Rif3(indexRSN_3(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + RSN_3 = 0.5; + else + RSN_3 = 0; + end + % Ampolla + if AlfaX_HR_Rif3(indexRSNHR_3(end),1)-AlfaX_HR_3 > 5 % Gradi + RSNHR_3 = 1; + elseif ErrRSNLink_HR_Rif3(indexRSNHR_3(end),1) == 1 && ErrRSNLink_HR_Rif3(indexRSNHR_3(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + RSNHR_3 = 0.5; + else + RSNHR_3 = 0; + end + % Cella di carico + if Load_Rif3(indexLL_3(end),1)-Load_3 > 65 % kN + LL_3 = 1; + elseif ErrLoadLink_Rif3(indexLL_3(end),1) == 1 && ErrLoadLink_Rif3(indexLL_3(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + LL_3 = 0.5; + else + LL_3 = 0; + end + Somma_3_A = RSN_3+RSNHR_3+LL_3; + if Somma_3_A >= 2 + Level_3 = 3; + end + end + end + + if nTr == 2 || nTr == 3 + text = 'Inizio confronto soglie relative per il sito di Vobarno'; + fprintf(fileID,fmt,text); + % --- CALCOLO SOGLIE RELATIVE --- + % --- Modulo RSN 4 --- + % MEMS + indexRSN_4 = find(DataRSN_Rif4(:,1)<=datenum(dataTrig)); % Dati precedenti al trigger + TrigRSN_4 = AlfaX_Rif4(indexRSN_4(end),1)-AlfaX_Rif4(indexRSN_4(end)-1,1); + TrendRSN_4 = AlfaX_Rif4(indexRSN_4(1:end-1),1); + if abs(TrigRSN_4) > 3*std(abs(diff(TrendRSN_4))) + RSN_4 = 1; + elseif ErrRSNLink_Rif4(indexRSN_4(end),1) == 1 && ErrRSNLink_Rif4(indexRSN_4(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + RSN_4 = 0.5; + else + RSN_4 = 0; + end + % Ampolla + indexRSNHR_4 = find(DataRSNHR_Rif4(:,1)<=datenum(dataTrig)); % Dati precedenti al trigger + TrigRSNHR_4 = AlfaX_HR_Rif4(indexRSNHR_4(end),1)-AlfaX_HR_Rif4(indexRSNHR_4(end)-1,1); + TrendRSNHR_4 = AlfaX_HR_Rif4(indexRSNHR_4(1:end-1),1); + if abs(TrigRSNHR_4) > 3*std(abs(diff(TrendRSNHR_4))) + RSNHR_4 = 1; + elseif ErrRSNLink_HR_Rif4(indexRSNHR_4(end),1) == 1 && ErrRSNLink_HR_Rif4(indexRSNHR_4(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + RSNHR_4 = 0.5; + else + RSNHR_4 = 0; + end + % Cella di carico + indexLL_4 = find(DataLL_Rif4(:,1)<=datenum(dataTrig)); % Dati precedenti al trigger + TrigLL_4 = Load_Rif4(indexLL_4(end),1)-Load_Rif4(indexLL_4(end)-1,1); + TrendLL_4 = Load_Rif4(indexLL_4(1:end-1),1); + if abs(TrigLL_4) > 3*std(abs(diff(TrendLL_4))) + LL_4 = 1; + elseif ErrLoadLink_Rif4(indexLL_4(end),1) == 1 && ErrLoadLink_Rif4(indexLL_4(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + LL_4 = 0.5; + else + LL_4 = 0; + end + Somma_4 = RSN_4+RSNHR_4+LL_4; + if Somma_4 >= 2 + Level_4 = 2; + else + Level_4 = 1; + end + + % --- Modulo RSN 5 --- + % MEMS + indexRSN_5 = find(DataRSN_Rif5(:,1)<=datenum(dataTrig)); % Dati precedenti al trigger + TrigRSN_5 = AlfaX_Rif5(indexRSN_5(end),1)-AlfaX_Rif5(indexRSN_5(end)-1,1); + TrendRSN_5 = AlfaX_Rif5(indexRSN_5(1:end-1),1); + if abs(TrigRSN_5) > 3*std(abs(diff(TrendRSN_5))) + RSN_5 = 1; + elseif ErrRSNLink_Rif5(indexRSN_5(end),1) == 1 && ErrRSNLink_Rif5(indexRSN_5(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + RSN_5 = 0.5; + else + RSN_5 = 0; + end + % Ampolla + indexRSNHR_5 = find(DataRSNHR_Rif5(:,1)<=datenum(dataTrig)); % Dati precedenti al trigger + TrigRSNHR_5 = AlfaX_HR_Rif5(indexRSNHR_5(end),1)-AlfaX_HR_Rif5(indexRSNHR_5(end)-1,1); + TrendRSNHR_5 = AlfaX_HR_Rif5(indexRSNHR_5(1:end-1),1); + if abs(TrigRSNHR_5) > 3*std(abs(diff(TrendRSNHR_5))) + RSNHR_5 = 1; + elseif ErrRSNLink_HR_Rif5(indexRSNHR_5(end),1) == 1 && ErrRSNLink_HR_Rif5(indexRSNHR_5(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + RSNHR_5 = 0.5; + else + RSNHR_5 = 0; + end + % Cella di carico + indexLL_5 = find(DataLL_Rif5(:,1)<=datenum(dataTrig)); % Dati precedenti al trigger + TrigLL_5 = Load_Rif5(indexLL_5(end),1)-Load_Rif5(indexLL_5(end)-1,1); + TrendLL_5 = Load_Rif5(indexLL_5(1:end-1),1); + if abs(TrigLL_5) > 3*std(abs(diff(TrendLL_5))) + LL_5 = 1; + elseif ErrLoadLink_Rif5(indexLL_5(end),1) == 1 && ErrLoadLink_Rif5(indexLL_5(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + LL_5 = 0.5; + else + LL_5 = 0; + end + Somma_5 = RSN_5+RSNHR_5+LL_5; + if Somma_5 >= 2 + Level_5 = 2; + else + Level_5 = 1; + end + + % --- CALCOLO SOGLIE ASSOLUTE --- + text = 'Inizio confronto soglie assolute per il sito di Vobarno'; + fprintf(fileID,fmt,text); + % --- Modulo RSN 4 --- + if Level_4 == 2 + % MEMS + if AlfaX_Rif4(indexRSN_4(end),1)-AlfaX_4 > 5 % Gradi + RSN_4 = 1; + elseif ErrRSNLink_Rif4(indexRSN_4(end),1) == 1 && ErrRSNLink_Rif4(indexRSN_4(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + RSN_4 = 0.5; + else + RSN_4 = 0; + end + % Ampolla + if AlfaX_HR_Rif4(indexRSNHR_4(end),1)-AlfaX_HR_4 > 5 % Gradi + RSNHR_4 = 1; + elseif ErrRSNLink_HR_Rif4(indexRSNHR_4(end),1) == 1 && ErrRSNLink_HR_Rif4(indexRSNHR_4(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + RSNHR_4 = 0.5; + else + RSNHR_4 = 0; + end + % Cella di carico + if Load_Rif4(indexLL_4(end),1)-Load_4 > 65 % kN + LL_4 = 1; + elseif ErrLoadLink_Rif4(indexLL_4(end),1) == 1 && ErrLoadLink_Rif4(indexLL_4(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + LL_4 = 0.5; + else + LL_4 = 0; + end + Somma_4_A = RSN_4+RSNHR_4+LL_4; + if Somma_4_A >= 2 + Level_4 = 3; + end + end + + % --- Modulo RSN 5 --- + if Level_5 == 2 + % MEMS + if AlfaX_Rif5(indexRSN_5(end),1)-AlfaX_5 > 5 % Gradi + RSN_5 = 1; + elseif ErrRSNLink_Rif5(indexRSN_5(end),1) == 1 && ErrRSNLink_Rif5(indexRSN_5(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + RSN_5 = 0.5; + else + RSN_5 = 0; + end + % Ampolla + if AlfaX_HR_Rif5(indexRSNHR_5(end),1)-AlfaX_HR_5 > 5 % Gradi + RSNHR_5 = 1; + elseif ErrRSNLink_HR_Rif5(indexRSNHR_5(end),1) == 1 && ErrRSNLink_HR_Rif5(indexRSNHR_5(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + RSNHR_5 = 0.5; + else + RSNHR_5 = 0; + end + % Cella di carico + if Load_Rif5(indexLL_5(end),1)-Load_5 > 65 % kN + LL_5 = 1; + elseif ErrLoadLink_Rif5(indexLL_5(end),1) == 1 && ErrLoadLink_Rif5(indexLL_5(end-1),1) == 0 % In errore dopo il trigger, NON in errore prima + LL_5 = 0.5; + else + LL_5 = 0; + end + Somma_5_A = RSN_5+RSNHR_5+LL_5; + if Somma_5_A >= 2 + Level_5 = 3; + end + end + end + AL = 1; + % --- Solo Trigger --- + if nTr == 1 && Level_1 == 1 && Level_2 == 1 && Level_3 == 1 + sms = 0; + Level = 1; + NodeNum = 1; + Data = dataTrig; + Somma = max([Somma_1,Somma_2,Somma_3]); + desc = ['Punteggio ' num2str(Somma)]; + DATAinsert{AL,1} = 3; % Allarme tipologia Soglie tradizionali + DATAinsert{AL,2} = IDcentralina; + DATAinsert{AL,3} = DTcatena; + DATAinsert{AL,4} = NodeNum; + DATAinsert{AL,5} = Data; + DATAinsert{AL,6} = Level; + DATAinsert{AL,7} = sms; + DATAinsert{AL,8} = desc; + AL = AL+1; + alert = 1; + end + if nTr == 2 && Level_4 == 1 && Level_5 == 1 + sms = 0; + Level = 1; + NodeNum = 2; + Data = dataTrig; + Somma = max([Somma_4,Somma_5]); + desc = ['Punteggio ' num2str(Somma)]; + DATAinsert{AL,1} = 3; % Allarme tipologia Soglie tradizionali + DATAinsert{AL,2} = IDcentralina; + DATAinsert{AL,3} = DTcatena; + DATAinsert{AL,4} = NodeNum; + DATAinsert{AL,5} = Data; + DATAinsert{AL,6} = Level; + DATAinsert{AL,7} = sms; + DATAinsert{AL,8} = desc; + AL = AL+1; + alert = 1; + end + if nTr == 3 && Level_1 == 1 && Level_2 == 1 && Level_3 == 1 + sms = 0; + Level = 1; + NodeNum = 1; + Data = dataTrig; + Somma = max([Somma_1,Somma_2,Somma_3]); + desc = ['Punteggio ' num2str(Somma)]; + DATAinsert{AL,1} = 3; % Allarme tipologia Soglie tradizionali + DATAinsert{AL,2} = IDcentralina; + DATAinsert{AL,3} = DTcatena; + DATAinsert{AL,4} = NodeNum; + DATAinsert{AL,5} = Data; + DATAinsert{AL,6} = Level; + DATAinsert{AL,7} = sms; + DATAinsert{AL,8} = desc; + AL = AL+1; + alert = 1; + end + if nTr == 3 && Level_4 == 1 && Level_5 == 1 + sms = 0; + Level = 1; + NodeNum = 2; + Data = dataTrig; + Somma = max([Somma_4,Somma_5]); + desc = ['Punteggio ' num2str(Somma)]; + DATAinsert{AL,1} = 3; % Allarme tipologia Soglie tradizionali + DATAinsert{AL,2} = IDcentralina; + DATAinsert{AL,3} = DTcatena; + DATAinsert{AL,4} = NodeNum; + DATAinsert{AL,5} = Data; + DATAinsert{AL,6} = Level; + DATAinsert{AL,7} = sms; + DATAinsert{AL,8} = desc; + AL = AL+1; + alert = 1; + end + % --- Modulo 1 --- + if Level_1 >= 2 + if Level_1 == 3 + sms = 1; + alarm = 1; + SirenON = 1; + DataRifALA = datenum(dataTrig); + else + sms = 0; + alert = 1; + DataRifALE = datenum(dataTrig); + end + Level = Level_1; + Data = dataTrig; + NodeNum = 1; + desc = ['Punteggio Livello 2: ' num2str(Somma_1) ', Punteggio Livello 3: ' num2str(Somma_1_A) ]; + DATAinsert{AL,1} = 3; % Allarme tipologia Soglie tradizionali + DATAinsert{AL,2} = IDcentralina; + DATAinsert{AL,3} = 'DT0001'; + DATAinsert{AL,4} = NodeNum; + DATAinsert{AL,5} = Data; + DATAinsert{AL,6} = Level; + DATAinsert{AL,7} = sms; + DATAinsert{AL,8} = desc; + AL = AL+1; + end + % --- Modulo 2 --- + if Level_2 >= 2 + if Level_2 == 3 + sms = 1; + alarm = 1; + SirenON = 1; + DataRifALA = datenum(dataTrig); + else + sms = 0; + alert = 1; + DataRifALE = datenum(dataTrig); + end + Level = Level_2; + Data = dataTrig; + NodeNum = 1; + desc = ['Punteggio Livello 2: ' num2str(Somma_2) ', Punteggio Livello 3: ' num2str(Somma_2_A) ]; + DATAinsert{AL,1} = 3; % Allarme tipologia Soglie tradizionali + DATAinsert{AL,2} = IDcentralina; + DATAinsert{AL,3} = 'DT0002'; + DATAinsert{AL,4} = NodeNum; + DATAinsert{AL,5} = Data; + DATAinsert{AL,6} = Level; + DATAinsert{AL,7} = sms; + DATAinsert{AL,8} = desc; + AL = AL+1; + end + % --- Modulo 3 --- + if Level_3 >= 2 + if Level_3 == 3 + sms = 1; + alarm = 1; + SirenON = 1; + DataRifALA = datenum(dataTrig); + else + sms = 0; + alert = 1; + DataRifALE = datenum(dataTrig); + end + Level = Level_3; + Data = dataTrig; + NodeNum = 1; + desc = ['Punteggio Livello 2: ' num2str(Somma_3) ', Punteggio Livello 3: ' num2str(Somma_3_A) ]; + DATAinsert{AL,1} = 3; % Allarme tipologia Soglie tradizionali + DATAinsert{AL,2} = IDcentralina; + DATAinsert{AL,3} = 'DT0003'; + DATAinsert{AL,4} = NodeNum; + DATAinsert{AL,5} = Data; + DATAinsert{AL,6} = Level; + DATAinsert{AL,7} = sms; + DATAinsert{AL,8} = desc; + AL = AL+1; + end + % --- Modulo 4 --- + if Level_4 >= 2 + if Level_4 == 3 + sms = 1; + alarm = 1; + SirenON = 1; + DataRifALA = datenum(dataTrig); + else + sms = 0; + alert = 1; + DataRifALE = datenum(dataTrig); + end + Level = Level_4; + Data = dataTrig; + NodeNum = 1; + desc = ['Punteggio Livello 2: ' num2str(Somma_4) ', Punteggio Livello 3: ' num2str(Somma_4_A) ]; + DATAinsert{AL,1} = 3; % Allarme tipologia Soglie tradizionali + DATAinsert{AL,2} = IDcentralina; + DATAinsert{AL,3} = 'DT0004'; + DATAinsert{AL,4} = NodeNum; + DATAinsert{AL,5} = Data; + DATAinsert{AL,6} = Level; + DATAinsert{AL,7} = sms; + DATAinsert{AL,8} = desc; + AL = AL+1; + end + % --- Modulo 5 --- + if Level_5 >= 2 + if Level_5 == 3 + sms = 1; + alarm = 1; + SirenON = 1; + DataRifALA = datenum(dataTrig); + else + sms = 0; + alert = 1; + DataRifALE = datenum(dataTrig); + end + Level = Level_5; + Data = dataTrig; + NodeNum = 1; + desc = ['Punteggio Livello 2: ' num2str(Somma_5) ', Punteggio Livello 3: ' num2str(Somma_5_A) ]; + DATAinsert{AL,1} = 3; % Allarme tipologia Soglie tradizionali + DATAinsert{AL,2} = IDcentralina; + DATAinsert{AL,3} = 'DT0005'; + DATAinsert{AL,4} = NodeNum; + DATAinsert{AL,5} = Data; + DATAinsert{AL,6} = Level; + DATAinsert{AL,7} = sms; + DATAinsert{AL,8} = desc; + AL = AL+1; + end + end + elseif Tr == 2 % A27 - Trigger + if datenum(dataTrig) > DataRifALE + DataRifALE = datenum(dataTrig); + sms = 1; + NodeNum = 1; + Level = 1; + Data = dataTrig; + desc = 'sensore finecorsa'; + DATAinsert{AL,1} = 3; % Allarme tipologia Soglie tradizionali + DATAinsert{AL,2} = IDcentralina; + DATAinsert{AL,3} = DTcatena; + DATAinsert{AL,4} = NodeNum; + DATAinsert{AL,5} = Data; + DATAinsert{AL,6} = Level; + DATAinsert{AL,7} = sms; + DATAinsert{AL,8} = desc; + AL = AL+1; + alarm = 1; + end + elseif Tr == 3 % A27 - Fadalto + if datenum(dataTrig) > DataRifALE + DataRifALE = datenum(dataTrig); + sms = 0; + NodeNum = 1; + Level = 1; + Data = dataTrig; + comando = ['select `desc` from tools where unit_id = ''' ... + unitID ''' and name = ''' DTcatena ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + desc = char(curs.Data); + DATAinsert{AL,1} = 3; % Allarme tipologia Soglie tradizionali + DATAinsert{AL,2} = IDcentralina; + DATAinsert{AL,3} = DTcatena; + DATAinsert{AL,4} = NodeNum; + DATAinsert{AL,5} = Data; + DATAinsert{AL,6} = Level; + DATAinsert{AL,7} = sms; + DATAinsert{AL,8} = desc; + AL = AL+1; + alarm = 1; + end + end +end + +NoValue = 1; +% --- Shock Sensor --- +if yesSS == 1 + if SS == 1 % Ne è scattato almeno uno + [rSS,~] = size(DataSS); + if rSS > 0 + s = 1; + while s <= rSS + if DataSS(s) > DATA_rif % Cerco per ogni Impatto e mi ricordo che esistono 3 letture per impatto + Level = 1; + if yesRSN == 1 + % Livello 2 -> Controllo se la prima lettura ha + % provocato una rotazione del montante verso valle + text = 'Inizio confronto soglie moduli D-Fence'; + fprintf(fileID,fmt,text); + % --- CALCOLO SOGLIE RELATIVE 1° LETTURA --- + indexRSN = find(DataRSN_Rif(:,1)= ''' DataScarico ''' and type_id = ''' type ... + ''' order by date_time']; + curs = exec(conn,comando); + curs = fetch(curs); + StoricoAllarmi = curs.Data; + [rSA,cSA] = size(StoricoAllarmi); + index = []; + if cSA > 1 + I = 1; + for ii = 1:rSA + check = find(datenum(StoricoAllarmi(ii,2))==DataRSN_Rif); + if isempty(check) == 0 + index(I) = check; + I = I+1; + end + end + I = I-1; % Numero di indici da eliminare + else + I = 0; + end + + AttX = 0; + AttY = 0; + NUM = 0; + if I > 0 + for i = 1:I + dim = size(TrendRSN_X); + if index(i)-NUM <= dim(1) + TrendRSN_X(index(i)-NUM)=[]; + TrendRSN_Y(index(i)-NUM)=[]; + NUM = NUM+1; + end + end + end + SogliaX = 10*std(abs(diff(TrendRSN_X)))+mean(abs(diff(TrendRSN_X))); % Soglia di 10 dev.st. + SogliaY = 10*std(abs(diff(TrendRSN_Y)))+mean(abs(diff(TrendRSN_X))); % Soglia di 10 dev.st. + + if abs(TrigRSN_X) > SogliaX || abs(TrigRSN_Y) > SogliaY + RSN = 1; + if abs(TrigRSN_X) > SogliaX && abs(TrigRSN_Y) > SogliaY + AttX = 1; + AttY = 1; + elseif abs(TrigRSN_X) > SogliaX + AttX = 1; + elseif abs(TrigRSN_Y) > SogliaY + AttY = 1; + end + elseif ErrRSNLink_Rif(indexRSN(end)+1,1) == 1 && ErrRSNLink_Rif(indexRSN(end),1) == 0 % In errore dopo il trigger, NON in errore prima + RSN = 0.5; + else + RSN = 0; + end + Somma = RSN; + if Somma >= 1 + Level = 2; + Value_X = abs(TrigRSN_X); + Value_Y = abs(TrigRSN_Y); + end + % --- CALCOLO SOGLIE RELATIVE 3° LETTURA--- + % Livello 3 + TrigRSN_X = AlfaX_Rif(indexRSN(end)+1,1)-AlfaX_Rif(indexRSN(end),1); + TrigRSN_Y = AlfaY_Rif(indexRSN(end)+1,1)-AlfaY_Rif(indexRSN(end),1); + if abs(TrigRSN_X) > SogliaX || abs(TrigRSN_Y) > SogliaY + RSN = 1; + if abs(TrigRSN_X) > SogliaX && abs(TrigRSN_Y) > SogliaY + AttX = 1; + AttY = 1; + elseif abs(TrigRSN_X) > SogliaX + AttX = 1; + AttY = 0; + elseif abs(TrigRSN_Y) > SogliaY + AttX = 0; + AttY = 1; + end + elseif ErrRSNLink_Rif(indexRSN(end)+1,1) == 1 && ErrRSNLink_Rif(indexRSN(end),1) == 0 % In errore dopo il trigger, NON in errore prima + RSN = 0.5; + else + RSN = 0; + end + Somma = RSN; + if Somma >= 1 + Level = 3; + Value_X = abs(TrigRSN_X); + Value_Y = abs(TrigRSN_Y); + end + % --- CALCOLO SOGLIE ASSOLUTE --- + % Livello 4 -> Soglie SEL + if Level == 3 || Level == 2 + % MEMS + if abs(AlfaX_Rif(indexRSN(end)+1,1)-AlfaX_0) > SEL % Gradi + RSN = 1; + else + RSN = 0; + end + Somma_S = RSN; + if Somma_S >= 1 + Level = 4; + Value_X = abs(TrigRSN_X); + end + end + % Livello 5 -> Soglie MEL + if Level == 4 + % MEMS + if abs(AlfaX_Rif(indexRSN(end)+1,1)-AlfaX_0) > MEL % Gradi + RSN = 1; + else + RSN = 0; + end + Somma_M = RSN; + if Somma_M >= 1 + Level = 5; + Value_X = abs(TrigRSN_X); + end + end + % Scrivo + if Level == 1 % Shock + DataRifALE = DataSS(s); + if strcmp(NomeSito,'Sede ASE S.r.l.') == 1 + sms = 0; + else + sms = 1; + end + alert = 1; + NodeNum = 2; + elseif Level == 2 % Soglie relative Prima lettura + DataRifALE = DataSS(s); + if strcmp(NomeSito,'Sede ASE S.r.l.') == 1 + sms = 0; + else + sms = 1; + end + alert = 1; + NodeNum = 1; + elseif Level == 3 % Soglie relative terza lettura + DataRifALE = DataSS(s); + if strcmp(NomeSito,'Sede ASE S.r.l.') == 1 + sms = 0; + else + sms = 1; + end + alert = 1; + NodeNum = 1; + elseif Level == 4 % Soglia SEL + DataRifALA = DataSS(s); + if strcmp(NomeSito,'Sede ASE S.r.l.') == 1 + sms = 0; + else + sms = 1; + end + alarm = 1; + NodeNum = 1; + elseif Level == 5 % Soglia MEL + DataRifALA = DataSS(s); + if strcmp(NomeSito,'Sede ASE S.r.l.') == 1 + sms = 0; + else + sms = 1; + end + alarm = 1; + NodeNum = 1; + end + Data = datestr(DataSS(s),'yyyy/mm/dd HH:MM:SS'); + comando = ['select `desc` from tools where unit_id = ''' ... + unitID ''' and name = ''' DTcatena ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + desc = char(curs.Data); + DATAinsert{AL,1} = 3; % Allarme tipologia Soglie tradizionali + DATAinsert{AL,2} = IDcentralina; + DATAinsert{AL,3} = DTcatena; + DATAinsert{AL,4} = NodeNum; + DATAinsert{AL,5} = Data; + DATAinsert{AL,6} = Level; + DATAinsert{AL,7} = sms; + DATAinsert{AL,8} = desc; + if Level ~= 1 + if Level > 3 + DATAinsert{AL,9} = Value_X; + else + if AttX == 1 + DATAinsert{AL,9} = Value_X; + elseif AttY == 1 + DATAinsert{AL,9} = Value_Y; + end + end + NoValue = 0; + end + AL = AL+1; + else + DataRifALE = Data(ss); + if strcmp(NomeSito,'Sede ASE S.r.l.') == 1 + sms = 0; + else + sms = 1; + end + NodeNum = cell2mat(NodoSS(2)); + Level = 1; + Data = datestr(Data(ss),'yyyy/mm/dd HH:MM:SS'); + comando = ['select `desc` from tools where unit_id = ''' ... + unitID ''' and name = ''' DTcatena ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + desc = char(curs.Data); + DATAinsert{AL,1} = 3; % Allarme tipologia Soglie tradizionali + DATAinsert{AL,2} = IDcentralina; + DATAinsert{AL,3} = DTcatena; + DATAinsert{AL,4} = NodeNum; + DATAinsert{AL,5} = Data; + DATAinsert{AL,6} = Level; + DATAinsert{AL,7} = sms; + DATAinsert{AL,8} = desc; + AL = AL+1; + alert = 1; + end + end + s = s+1; + end + end + else + if yesRSN == 1 + % Anche se non è scattato lo Shock Sensor, controllo se + % l'ultima lettura si discosta molto dalle precedenti + text = 'Inizio confronto soglie moduli D-Fence'; + fprintf(fileID,fmt,text); + % --- CALCOLO SOGLIE RELATIVE --- + index_RSN = find(DataRSN_Rif>=datenum(datainiRSN)); % cerco i dati nuovi + [rI,~] = size(index_RSN); + RSN_X = zeros(rI,1); + RSN_Y = zeros(rI,1); + for jj = 1:rI + if index_RSN(jj) ~= 1 + RSN_X(jj,1) = AlfaX_Rif(index_RSN(jj),1)-AlfaX_Rif(index_RSN(jj)-1,1); + RSN_Y(jj,1) = AlfaY_Rif(index_RSN(jj),1)-AlfaY_Rif(index_RSN(jj)-1,1); + end + end + % Scarico eventuali alert già attivati + nNodo = num2str(1); + type = num2str(3); % tipologia soglie tradizionali + comando = ['select type_id, date_time from alarms where unit_name = ''' ... + IDcentralina ''' and tool_name = ''' DTcatena ''' and node_num = ''' ... + nNodo ''' and date_time >= ''' DataScarico ''' and type_id = ''' type ... + ''' order by date_time']; + curs = exec(conn,comando); + curs = fetch(curs); + StoricoAllarmi = curs.Data; + [rSA,cSA] = size(StoricoAllarmi); + index = []; + if cSA > 1 + I = 1; + for ii = 1:rSA + check = find(datenum(StoricoAllarmi(ii,2))==DataRSN_Rif); + if isempty(check) == 0 + index(I) = check; + I = I+1; + end + end + I = I-1; % Numero di indici da eliminare + else + I = 0; + end + for aa = 1:rI + TrendRSN_X = AlfaX_Rif(1:index_RSN(aa),1); + TrendRSN_Y = AlfaY_Rif(1:index_RSN(aa),1); + NUM = 0; + if I > 0 + for i = 1:I + dim = size(TrendRSN_X); + if index(i)-NUM <= dim(1) + TrendRSN_X(index(i)-NUM)=[]; + TrendRSN_Y(index(i)-NUM)=[]; + NUM = NUM+1; + end + end + end + SogliaX = 10*std(abs(diff(TrendRSN_X)))+mean(abs(diff(TrendRSN_X))); % Soglia di 10 dev.st. + SogliaY = 10*std(abs(diff(TrendRSN_Y)))+mean(abs(diff(TrendRSN_Y))); % Soglia di 10 dev.st. + AttX = 0; + AttY = 0; + Level = 0; + % --- Livello 0.1 --- + if abs(RSN_X(aa)) > SogliaX || abs(RSN_Y(aa)) > SogliaY % L'ultima lettura è fuori trend + RSN = 1; + if abs(RSN_X(aa)) > SogliaX || abs(RSN_Y(aa)) > SogliaY + AttX = 1; + AttY = 1; + elseif abs(RSN_X(aa)) > SogliaX + AttX = 1; + elseif abs(RSN_Y(aa)) > SogliaY + AttY = 1; + end + elseif ErrRSNLink_Rif(index_RSN(aa),1) == 1 && ErrRSNLink_Rif(index_RSN(aa)-1,1) == 0 % In errore all'ultima lettura ma non in quella prima + RSN = 0.5; + else + RSN = 0; + end + Somma = RSN; + if Somma >= 1 + Level = 0.1; + Value_X = abs(RSN_X(aa)); + Value_Y = abs(RSN_Y(aa)); + end + % --- CALCOLO SOGLIE ASSOLUTE --- + % Livello 0.2 -> Soglie SEL + if Level == 0.1 + % MEMS + if abs(AlfaX_Rif(index_RSN(aa),1)) > SEL % Gradi + Level = 0.2; + Value_X = abs(RSN_X(aa)); + end + end + % Livello 0.3 -> Soglie MEL + if Level == 0.1 || Level == 0.2 + % MEMS + if abs(AlfaX_Rif(index_RSN(aa),1)) > MEL % Gradi + Level = 0.3; + Value_X = abs(RSN_X(aa)); + end + end + % Scrivo + if DataRSN_Rif(aa) > DATA_rif + if Level == 0.1 % Lettura fuori trend + DataRifALE = DataRSN_Rif(aa); + sms = 0; + alert = 1; + NodeNum = 1; + elseif Level == 0.2 % Soglia SEL + DataRifALA = DataRSN_Rif(aa); + if strcmp(NomeSito,'Sede ASE S.r.l.') == 1 + sms = 0; + else + sms = 1; + end + alarm = 1; + NodeNum = 1; + elseif Level == 0.3 % Soglia MEL + DataRifALA = DataRSN_Rif(aa); + if strcmp(NomeSito,'Sede ASE S.r.l.') == 1 + sms = 0; + else + sms = 1; + end + alarm = 1; + NodeNum = 1; + end + end + if Level > 0 + Data = datestr(DataRSN_Rif(aa),'yyyy/mm/dd HH:MM:SS'); + comando = ['select `desc` from tools where unit_id = ''' ... + unitID ''' and name = ''' DTcatena ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + desc = char(curs.Data); + DATAinsert{AL,1} = 3; % Allarme tipologia Soglie tradizionali + DATAinsert{AL,2} = IDcentralina; + DATAinsert{AL,3} = DTcatena; + DATAinsert{AL,4} = NodeNum; + DATAinsert{AL,5} = Data; + DATAinsert{AL,6} = Level; + DATAinsert{AL,7} = sms; + DATAinsert{AL,8} = desc; + if Level > 0.1 + DATAinsert{AL,9} = Value_X; + NoValue = 0; + else + if AttX == 1 + DATAinsert{AL,9} = Value_X; + NoValue = 0; + elseif AttY == 1 + DATAinsert{AL,9} = Value_Y; + NoValue = 0; + end + end + AL = AL+1; + end + end + else + DataRifALE = Data(ss); + sms = 0; + NodeNum = 2; + Level = 1; + Data = datestr(Data(ss),'yyyy/mm/dd HH:MM:SS'); + comando = ['select `desc` from tools where unit_id = ''' ... + unitID ''' and name = ''' DTcatena ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + desc = char(curs.Data); + DATAinsert{AL,1} = 3; % Allarme tipologia Soglie tradizionali + DATAinsert{AL,2} = IDcentralina; + DATAinsert{AL,3} = DTcatena; + DATAinsert{AL,4} = NodeNum; + DATAinsert{AL,5} = Data; + DATAinsert{AL,6} = Level; + DATAinsert{AL,7} = sms; + DATAinsert{AL,8} = desc; + AL = AL+1; + alert = 1; + end + end +elseif yesRSN == 1 && yesTrL == 0 + % Anche se non è scattato il trigger, controllo se + % l'ultima lettura si discosta molto dalle precedenti + text = 'Inizio confronto soglie moduli D-Fence'; + fprintf(fileID,fmt,text); + % --- CALCOLO SOGLIE RELATIVE --- + index_RSN = find(DataRSN_Rif>=datenum(datainiRSN)); % cerco i dati nuovi + [rI,~] = size(index_RSN); + RSN_X = zeros(rI,1); + RSN_Y = zeros(rI,1); + for jj = 1:rI + if index_RSN(jj) ~= 1 + RSN_X(jj,1) = AlfaX_Rif(index_RSN(jj),1)-AlfaX_Rif(index_RSN(jj)-1,1); + RSN_Y(jj,1) = AlfaY_Rif(index_RSN(jj),1)-AlfaY_Rif(index_RSN(jj)-1,1); + end + end + % Scarico eventuali alert già attivati + nNodo = num2str(1); + type = num2str(3); % tipologia soglie tradizionali + comando = ['select type_id, date_time from alarms where unit_name = ''' ... + IDcentralina ''' and tool_name = ''' DTcatena ''' and node_num = ''' ... + nNodo ''' and date_time >= ''' DataScarico ''' and type_id = ''' type ... + ''' order by date_time']; + curs = exec(conn,comando); + curs = fetch(curs); + StoricoAllarmi = curs.Data; + [rSA,cSA] = size(StoricoAllarmi); + index = []; + if cSA > 1 + I = 1; + for ii = 1:rSA + check = find(datenum(StoricoAllarmi(ii,2))==DataRSN_Rif); + if isempty(check) == 0 + index(I) = check; + I = I+1; + end + end + I = I-1; % Numero di indici da eliminare + else + I = 0; + end + for aa = 1:rI + TrendRSN_X = AlfaX_Rif(1:index_RSN(aa),1); + TrendRSN_Y = AlfaY_Rif(1:index_RSN(aa),1); + NUM = 0; + if I > 0 + for i = 1:I + dim = size(TrendRSN_X); + if index(i)-NUM <= dim(1) + TrendRSN_X(index(i)-NUM)=[]; + TrendRSN_Y(index(i)-NUM)=[]; + NUM = NUM+1; + end + end + end + SogliaX = 10*std(abs(diff(TrendRSN_X)))+mean(abs(diff(TrendRSN_X))); % Soglia di 10 dev.st. + SogliaY = 10*std(abs(diff(TrendRSN_Y)))+mean(abs(diff(TrendRSN_Y))); % Soglia di 10 dev.st. + AttX = 0; + AttY = 0; + Level = 0; + % --- Livello 0.1 --- + if abs(RSN_X(aa)) > SogliaX || abs(RSN_Y(aa)) > SogliaY % L'ultima lettura è fuori trend + RSN = 1; + if abs(RSN_X(aa)) > SogliaX || abs(RSN_Y(aa)) > SogliaY + AttX = 1; + AttY = 1; + elseif abs(RSN_X(aa)) > SogliaX + AttX = 1; + elseif abs(RSN_Y(aa)) > SogliaY + AttY = 1; + end + elseif ErrRSNLink_Rif(index_RSN(aa),1) == 1 && ErrRSNLink_Rif(index_RSN(aa)-1,1) == 0 % In errore all'ultima lettura ma non in quella prima + RSN = 0.5; + else + RSN = 0; + end + Somma = RSN; + if Somma >= 1 + Level = 0.1; + Value_X = abs(RSN_X(aa)); + Value_Y = abs(RSN_Y(aa)); + end + % --- CALCOLO SOGLIE ASSOLUTE --- + % Livello 0.2 -> Soglie SEL + if Level == 0.1 + % MEMS + if abs(AlfaX_Rif(index_RSN(aa),1)) > SEL % Gradi + Level = 0.2; + Value_X = abs(RSN_X(aa)); + end + end + % Livello 0.3 -> Soglie MEL + if Level == 0.1 || Level == 0.2 + % MEMS + if abs(AlfaX_Rif(end,1)) > MEL % Gradi + Level = 0.3; + Value_X = abs(RSN_X(aa)); + end + end + % Scrivo + if DataRSN_Rif(aa) > DATA_rif + if Level == 0.1 % Lettura fuori trend + DataRifALE = DataRSN_Rif(aa); + sms = 0; + alert = 1; + NodeNum = 1; + elseif Level == 0.2 % Soglia SEL + DataRifALA = DataRSN_Rif(aa); + if strcmp(NomeSito,'Sede ASE S.r.l.') == 1 + sms = 0; + else + sms = 1; + end + alarm = 1; + NodeNum = 1; + elseif Level == 0.3 % Soglia MEL + DataRifALA = DataRSN_Rif(aa); + if strcmp(NomeSito,'Sede ASE S.r.l.') == 1 + sms = 0; + else + sms = 1; + end + alarm = 1; + NodeNum = 1; + end + end + if Level > 0 + Data = datestr(DataRSN_Rif(aa),'yyyy/mm/dd HH:MM:SS'); + comando = ['select `desc` from tools where unit_id = ''' ... + unitID ''' and name = ''' DTcatena ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + desc = char(curs.Data); + DATAinsert{AL,1} = 3; % Allarme tipologia Soglie tradizionali + DATAinsert{AL,2} = IDcentralina; + DATAinsert{AL,3} = DTcatena; + DATAinsert{AL,4} = NodeNum; + DATAinsert{AL,5} = Data; + DATAinsert{AL,6} = Level; + DATAinsert{AL,7} = sms; + DATAinsert{AL,8} = desc; + if Level > 0.1 + DATAinsert{AL,9} = Value_X; + NoValue = 0; + else + if AttX == 1 + DATAinsert{AL,9} = Value_X; + NoValue = 0; + elseif AttY == 1 + DATAinsert{AL,9} = Value_Y; + NoValue = 0; + end + end + AL = AL+1; + end + end +end + +% --- G-Flow --- +if yesGF == 1 + % Cerco il trend di date del G-Flow + Freq = diff(ARRAYdateGF); + [rF,~] = size(Freq); + indexALA = []; + indexALE = []; + vALA = 1; + vALE = 1; + nALE = 1; + nALA = 1; + for f = 1:rF + if Freq(1,1) == 0 + if DatiGFLink(f,4) > 1.3 && ARRAYdateGF(f,1) > DATA_rif + indexALA(nALA,1) = f; + ValueALA(vALA,1) = DatiGFLink(f,4); + alarm = 1; + nALA = nALA+1; + vALA = vALA+1; + elseif ARRAYdateGF(f,1) > DATA_rif + indexALE(nALE,1) = f; + ValueAle(vALE,1) = DatiGFLink(f,4); + alert = 1; + nALE = nALE+1; + vALE = vALE+1; + end + elseif Freq(f,1) == 0 && Freq(f-1,1) ~= 0 + if DatiGFLink(f,4) > 1.3 && ARRAYdateGF(f,1) > DATA_rif + indexALA(nALA,1) = f; + ValueALA(vALA,1) = DatiGFLink(f,4); + alarm = 1; + nALA = nALA+1; + vALA = vALA+1; + elseif ARRAYdateGF(f,1) > DATA_rif + indexALE(nALE,1) = f; + Valueale(vALE,1) = DatiGFLink(f,4); + alert = 1; + nALE = nALE+1; + vALE = vALE+1; + end + end + end + nTot = nALE-1+nALA-1; + if nALE-1 > 0 && nALA-1 > 0 + indexG = [indexALA;indexALE]; + Value = [ValueALA;Valueale]; + DataRifALA = ARRAYdateGF(indexALA(end)); + DataRifALE = ARRAYdateGF(indexALE(end)); + elseif nALA-1 > 0 + indexG = indexALA; + Value = ValueALA; + DataRifALA = ARRAYdateGF(indexALA(end)); + elseif indexALE-1 > 0 + indexG = indexALE; + Value = Valueale; + DataRifALE = ARRAYdateGF(indexALE(end)); + end + if alarm == 1 || alert == 1 + for t = 1:nTot + sms = 0; + NodeNum = 1; + Data = datestr(ARRAYdateGF(t),'yyyy/mm/dd HH:MM:SS'); + if t <= nALA-1 + Level = 2; + NoValue = 0; + else + Level = 1; + end + DATAinsert{AL,1} = 3; % Allarme tipologia Soglie tradizionali + DATAinsert{AL,2} = IDcentralina; + DATAinsert{AL,3} = DTcatena; + DATAinsert{AL,4} = NodeNum; + DATAinsert{AL,5} = Data; + DATAinsert{AL,6} = Level; + DATAinsert{AL,7} = sms; + DATAinsert{AL,8} = ''; + DATAinsert{AL,9} = Value(AL); + AL = AL+1; + end + end +end + +% --- G-Shock --- +if yesGS == 1 + % Verificare che il GShock sia scattato e poi verificare la relativa + % accelerazione !!!!!!!!!!!!! +end + +if alarm == 1 || alert == 1 + AL = AL-1; % Numero totale di allarmi + for a = 1:AL + % Cerco se il dato è già presente + Data = DATAinsert{a,5}; + nNodo = num2str(DATAinsert{a,4}); % Numero nodo + type = num2str(DATAinsert{a,1}); % tipologia + level = num2str(DATAinsert{a,6}); % livello allarme + comando = ['select id, type_id, date_time from alarms where unit_name = ''' ... + IDcentralina ''' and tool_name = ''' DTcatena ''' and node_num = ''' ... + nNodo ''' and date_time = ''' Data ''' and type_id = ''' type ... + ''' and alarm_level = ''' level ''' order by date_time']; + curs = exec(conn,comando); + curs = fetch(curs); + idDate = curs.Data; + [~,cI] = size(idDate); + if cI == 1 + idElabData = 0; % 0 indica che il dato non è presente su DB + else + idElabData = cell2mat(idDate(:,1)); + end + tablename = 'alarms'; + if NoValue == 0 + colnames = {'type_id','unit_name','tool_name','node_num','date_time',... + 'alarm_level','send_sms','description','registered_value'}; + data = [DATAinsert(a,1),DATAinsert(a,2),DATAinsert(a,3),DATAinsert(a,4),... + DATAinsert(a,5),DATAinsert(a,6),DATAinsert(a,7),DATAinsert(a,8),DATAinsert(a,9)]; + else + colnames = {'type_id','unit_name','tool_name','node_num','date_time',... + 'alarm_level','send_sms','description'}; + data = [DATAinsert(a,1),DATAinsert(a,2),DATAinsert(a,3),DATAinsert(a,4),... + DATAinsert(a,5),DATAinsert(a,6),DATAinsert(a,7),DATAinsert(a,8)]; + end + if idElabData == 0 % Scrivo + fastinsert(conn,tablename,colnames,data); + end + end +end + +fileID = fopen(FileNameALA,'a'); +outdat = fopen(FileNameALA,'wt+'); +fmt = '%.10f \r'; +fprintf(fileID,fmt,DataRifALE); +fmt = '%.10f \r'; +fprintf(fileID,fmt,DataRifALA); +fclose(fileID); + +text = ('alert_Levels function worked correctly'); +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/RSN/approx.m b/RSN/approx.m new file mode 100755 index 0000000..c3c9818 --- /dev/null +++ b/RSN/approx.m @@ -0,0 +1,27 @@ +% Funzione che approssima il dato alla terza cifra decimale (millesimi di +% grado) +function [AlfaX,AlfaY,TempDef] = approx(AlfaX,AlfaY,TempDef,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'approx function started'; +fprintf(fileID,fmt,text); + +conv = AlfaX*1000; +conv = round(conv); +AlfaX = conv/1000; + +conv = AlfaY*1000; +conv = round(conv); +AlfaY = conv/1000; + + +conv = TempDef*10; +conv = round(conv); +TempDef = conv/10; + +text = 'approx function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/RSN/approx_RSNHR.m b/RSN/approx_RSNHR.m new file mode 100755 index 0000000..ce401e2 --- /dev/null +++ b/RSN/approx_RSNHR.m @@ -0,0 +1,27 @@ +% Funzione che approssima il dato alla quarta cifra decimale (decimo di +% millesimo di grado) +function [AlfaX_HR,AlfaY_HR,TempDef_RSNHR] = approx_RSNHR(AlfaX_HR,AlfaY_HR,... + TempDef_RSNHR,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'approx_RSNHR function started'; +fprintf(fileID,fmt,text); + +conv = AlfaX_HR*10000; +conv = round(conv); +AlfaX_HR = conv/10000; + +conv = AlfaY_HR*10000; +conv = round(conv); +AlfaY_HR = conv/10000; + +conv = TempDef_RSNHR*10; +conv = round(conv); +TempDef_RSNHR = conv/10; + +text = 'approx_RSNHR function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/RSN/azzeramenti.m b/RSN/azzeramenti.m new file mode 100755 index 0000000..3274078 --- /dev/null +++ b/RSN/azzeramenti.m @@ -0,0 +1,61 @@ +%% Funzione che corregge gli angoli di alcuni nodi specifici +function angRSN = azzeramenti(conn,IDcentralina,DTcatena,angRSN,NodoRSNLink,ARRAYdateRSN,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'azzeramenti function started'; +fprintf(fileID,fmt,text); + +NomeFile = strcat(IDcentralina,'-',DTcatena,'-','Azzeramenti.txt'); +if isfile(NomeFile) == 1 + Dati = importdata(NomeFile); + if Dati(1,1) == 99999 + else + [c,~] = size(Dati); + i = 1; + while i <= c + if Dati(i,1) == 99999 + break + else + NodeType ='RSN Link'; + indice = Dati(i); + + NodeNumRSN = num2str(cell2mat(NodoRSNLink(indice,2))); + dataRIF = num2str(ARRAYdateRSN(end)-7); + comando = ['select AlfaX, AlfaY from ElabDataView where EventDate >= ''' ... + dataRIF ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType ... + ''' and NodeNum =' NodeNumRSN ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Riferimento = curs.Data; + + angRSN(:,2*indice-1:2*indice) = Riferimento(end,1:2); + text = ['Node RSN Link number ' NodeNumRSN ' has been corrected by azzeramenti function']; + fprintf(fileID,fmt,text); + i=i+1; + end + end + end +else + fclose(fileID); + Parametro1 = 99999; + Parametro2 = 999999999; + outdat = fopen(NomeFile,'wt+'); + fopen(NomeFile,'wt'); + fmt = '%d \r'; + fileA = fopen(NomeFile,'a'); + fprintf(fileA,fmt,Parametro1); + fprintf(fileA,fmt,Parametro2); + fclose(fileA); + + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'azzeramenti function created the reference file correctly'; + fprintf(fileID,fmt,text); +end + +text = 'azzeramenti function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); +end diff --git a/RSN/azzeramenti_RSNHR.m b/RSN/azzeramenti_RSNHR.m new file mode 100755 index 0000000..dfd125c --- /dev/null +++ b/RSN/azzeramenti_RSNHR.m @@ -0,0 +1,68 @@ +%% Funzione che mette a zero gli spostamenti di alcuni nodi specifici +function angRSNHR = azzeramenti_RSNHR(conn,IDcentralina,DTcatena,angRSNHR,... + NodoRSNLinkHR,ARRAYdateRSNHR,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'azzeramenti_RSNHR function started'; +fprintf(fileID,fmt,text); + +NomeFile = strcat(IDcentralina,'-',DTcatena,'-','Azzeramenti.txt'); +if isfile(NomeFile) == 1 + Dati = importdata(NomeFile); + i = 1; + while Dati(i,1) ~= 99999 + i = i+1; % cerco il dato corrispondente al MEMS, il successivo è + % quello dell'ampolla corrispondente + end + i = i+1; + + if Dati(i,1) == 999999999 + else + [c,~] = size(Dati); + while i <= c + if Dati(i,1) == 999999999 + break + else + NodeType ='RSN Link HR'; + indice = Dati(i); + + NodeNumRSNHR = num2str(cell2mat(NodoRSNLinkHR(indice,2))); + dataRIF = num2str(ARRAYdateRSNHR(end)-7); + comando = ['select AlfaX, AlfaY from ElabDataView where EventDate >= ''' ... + dataRIF ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType ... + ''' and NodeNum =' NodeNumRSNHR ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Riferimento = curs.Data; + + angRSNHR(:,2*indice-1:2*indice) = Riferimento(end,1:2); + text = ['Node RSN Link HR number ' NodeNumRSNHR ' has been corrected by azzeramenti function']; + fprintf(fileID,fmt,text); + i=i+1; + end + end + end +else + fclose(fileID); + Parametro1 = 99999; + Parametro2 = 999999999; + outdat = fopen(NomeFile,'wt+'); + fopen(NomeFile,'wt'); + fmt = '%d \r'; + fileA = fopen(NomeFile,'a'); + fprintf(fileA,fmt,Parametro1); + fprintf(fileA,fmt,Parametro2); + fclose(fileA); + + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'azzeramenti function created the reference file correctly'; + fprintf(fileID,fmt,text); +end + +text = 'azzeramenti_RSNHR function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/RSN/cancellaDB.m b/RSN/cancellaDB.m new file mode 100755 index 0000000..935189e --- /dev/null +++ b/RSN/cancellaDB.m @@ -0,0 +1,21 @@ +function cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'cancellaDB function started'; +fprintf(fileID,fmt,text); + +comando = ['delete from ELABDATADISP where UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and EventDate >= ''' Data_scarico ''' ']; + +curs = exec(conn,comando); + +text = strcat('Elaborated Data of Unit ', IDcentralina, ' Chain ',... + DTcatena,' deleted starting from date ',Data_scarico,' during the execution of LastElab function.'); +fprintf(fileID,fmt,text); + +text = 'cancellaDB function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/RSN/cellMakerLL.m b/RSN/cellMakerLL.m new file mode 100755 index 0000000..50bf706 --- /dev/null +++ b/RSN/cellMakerLL.m @@ -0,0 +1,16 @@ +function DATAinsert = cellMakerLL(IDcentralina,DTcatena,NodeNum,cLL,ListaDate,ARRAYdateLL,LoadDef,ErrLoadLink) + +l = ListaDate; +DATAinsert = cell(l,7); + +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdateLL(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdateLL(ii),'HH:MM:SS'); + DATAinsert{ii,6} = LoadDef(ii,cLL); + DATAinsert{ii,7} = ErrLoadLink(ii,cLL); +end + +end \ No newline at end of file diff --git a/RSN/cellMakerRSN.m b/RSN/cellMakerRSN.m new file mode 100755 index 0000000..4d7c77f --- /dev/null +++ b/RSN/cellMakerRSN.m @@ -0,0 +1,21 @@ +function DATAinsert = cellMakerRSN(IDcentralina,DTcatena,NodeNum,cRSN,ListaDate,... + ErrRSNLink,ARRAYdateRSN,AlfaX,AlfaY,TempDef_RSN) +AlfaX=AlfaX'; +AlfaY=AlfaY'; +TempDef_RSN = TempDef_RSN'; +l = ListaDate; +DATAinsert = cell(l,9); + +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdateRSN(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdateRSN(ii),'HH:MM:SS'); + DATAinsert{ii,6} = AlfaX(cRSN,ii); + DATAinsert{ii,7} = AlfaY(cRSN,ii); + DATAinsert{ii,8} = TempDef_RSN(cRSN,ii); + DATAinsert{ii,9} = ErrRSNLink(cRSN,ii); +end + +end \ No newline at end of file diff --git a/RSN/cellMakerRSNHR.m b/RSN/cellMakerRSNHR.m new file mode 100755 index 0000000..2041ce9 --- /dev/null +++ b/RSN/cellMakerRSNHR.m @@ -0,0 +1,22 @@ +function DATAinsert = cellMakerRSNHR(IDcentralina,DTcatena,NodeNum,cRSNHR,ListaDate,... + ErrRSNLinkHR,ARRAYdateRSNHR,AlfaX_HR,AlfaY_HR,TempDef_RSNHR) + +AlfaX_HR=AlfaX_HR'; +AlfaY_HR=AlfaY_HR'; +TempDef_RSNHR = TempDef_RSNHR'; +l = ListaDate; +DATAinsert = cell(l,9); + +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdateRSNHR(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdateRSNHR(ii),'HH:MM:SS'); + DATAinsert{ii,6} = AlfaX_HR(cRSNHR,ii); + DATAinsert{ii,7} = AlfaY_HR(cRSNHR,ii); + DATAinsert{ii,8} = TempDef_RSNHR(cRSNHR,ii); + DATAinsert{ii,9} = ErrRSNLinkHR(cRSNHR,ii); +end + +end \ No newline at end of file diff --git a/RSN/cellMakerSS.m b/RSN/cellMakerSS.m new file mode 100755 index 0000000..f5ce17e --- /dev/null +++ b/RSN/cellMakerSS.m @@ -0,0 +1,18 @@ +function DATAinsert = cellMakerSS(DTcatena,IDcentralina,NodeNum,ListaDate,... + ARRAYdateSS,val_SS,StoricoShock,cSS,ErrShockSensor) + +l = ListaDate; +DATAinsert = cell(l,8); + +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdateSS(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdateSS(ii),'HH:MM:SS'); + DATAinsert{ii,6} = val_SS(ii,cSS); + DATAinsert{ii,7} = StoricoShock(ii,cSS); + DATAinsert{ii,8} = ErrShockSensor(ii,cSS); +end + +end \ No newline at end of file diff --git a/RSN/cellMakerTrL.m b/RSN/cellMakerTrL.m new file mode 100755 index 0000000..6b6feee --- /dev/null +++ b/RSN/cellMakerTrL.m @@ -0,0 +1,18 @@ +function DATAinsert = cellMakerTrL(DTcatena,IDcentralina,NodeNum,ListaDate,... + ARRAYdateTrL,val_TrL,StoricoTrigger,cTrL,ErrTriggerLink) + +l = ListaDate; +DATAinsert = cell(l,8); + +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdateTrL(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdateTrL(ii),'HH:MM:SS'); + DATAinsert{ii,6} = val_TrL(ii,cTrL); + DATAinsert{ii,7} = StoricoTrigger(ii,cTrL); + DATAinsert{ii,8} = ErrTriggerLink(ii,cTrL); +end + +end \ No newline at end of file diff --git a/RSN/centralina.m b/RSN/centralina.m new file mode 100755 index 0000000..d6ab34a --- /dev/null +++ b/RSN/centralina.m @@ -0,0 +1,40 @@ +function Unit = centralina(IDcentralina,conn,FileName) + +text = 'centralina function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +comando = ['select type_id from units where name = ''' IDcentralina ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +Type = cell2mat(curs.Data); +if Type == 1 + Unit = 'G801'; +elseif Type == 2 + Unit = 'G802'; +elseif Type == 3 + Unit = 'G201'; +elseif Type == 4 + Unit = 'G301'; +elseif Type == 5 + Unit = 'D2W'; +elseif Type == 6 + Unit = 'GFLOW'; +elseif Type == 7 + Unit = 'Nesa'; +elseif Type == 8 + Unit = 'MUSA'; +elseif Type == 9 + Unit = 'Nesa evolution'; +elseif Type == 10 + Unit = 'CRX1000'; +elseif Type == 11 + Unit = 'LoRa 12 V'; +elseif Type == 12 + Unit = 'LoRa 6 V'; +end + +text = 'centralina function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); \ No newline at end of file diff --git a/RSN/checkBattery.m b/RSN/checkBattery.m new file mode 100755 index 0000000..39e0058 --- /dev/null +++ b/RSN/checkBattery.m @@ -0,0 +1,138 @@ +function checkBattery(Batteria,Batteria_LoRa,IDcentralina,Unit,Mail,conn,FileName) + +text = 'checkBattery function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +if strcmp(Unit,'G801') == 1 || strcmp(Unit,'G802') == 1 || strcmp(Unit,'G201') == 1 ... + || strcmp(Unit,'G301') == 1 % G801, G802, G201, G301 + Batt = 12; + Threshold = 11; + Dato = cellstr('12 V'); +elseif strcmp(Unit,'D2W') == 1 + Batt = 6; + Threshold = 5.6; + Dato = cellstr('6 V'); +elseif strcmp(Unit,'Nesa') == 1 + Batt = 3.4; + Threshold = 3; + Dato = cellstr('3.4 V'); +elseif strcmp(Unit,'Nesa evolution') == 1 + Batt = 12.2; + Threshold = 11.8; + Dato = cellstr('12.2 V'); +elseif strcmp(Unit,'CRX1000') == 1 + Batt = 12; + Threshold = 10; + Dato = cellstr('12 V'); +end + +FileNameBattery = strcat(IDcentralina,'-Batteria.txt'); +if isfile(FileNameBattery) == 0 % NON Esiste + outdat = fopen(FileNameBattery,'wt+'); + fileID_site = fopen(FileNameBattery,'a'); + fmt = '%f \r'; + fprintf(fileID_site,fmt,Batt); + fmt = '%.10f \r'; + text = now; + fprintf(fileID_site,fmt,text); + fclose(fileID_site); +end + +% Scarico dati di riferimento +FileNameBattery = ['' IDcentralina '-Batteria.txt']; +Dati = importdata(FileNameBattery); +[rA,~] = size(Dati); +if rA == 0 + Livello_Rif = 0; + Data_Rif = 0; +elseif rA == 1 + Livello_Rif = Dati(1,1); + Data_Rif = 0; +else + Livello_Rif = Dati(1,1); + Data_Rif = Dati(2,1); +end + +if strcmp(Unit,'Nesa evolution') == 1 + Level = str2double(cell2mat(Batteria(end,2))); +else + Level = cell2mat(Batteria(end,3)); +end +activate = 0; + +if Level < Threshold + if now-Data_Rif > 1 || Level < Livello_Rif + Data_Rif = now; + activate = 1; + end +end + +if activate == 0 + Mail = 0; +end + +if Mail == 1 + + DATAinsert = cell(1,6); + sms = 0; + desc = Dato; + if strcmp(Unit,'Nesa evolution') == 1 + Data = datestr(datenum(Batteria(end,1)),'yyyy-mm-dd HH:MM:SS'); + else + Data = datestr(strjoin([Batteria(end,1) Batteria(end,2)]),'yyyy-mm-dd HH:MM:SS'); + end + Livello = cell2mat(Batteria(end,3)); + DATAinsert{1,1} = 2; % Allarme tipologia batteria + DATAinsert{1,2} = IDcentralina; + DATAinsert{1,3} = Data; + DATAinsert{1,4} = Livello; + DATAinsert{1,5} = sms; + DATAinsert{1,6} = desc; + + % Cerco se il dato è già presente + comando = ['select id, type_id, date_time from alarms where unit_name = ''' ... + IDcentralina ''' and date_time = ''' Data ''' and type_id = ''' DATAinsert{1,1} ... + ''' and registered_value = ''' Livello ''' and description like ''' desc ''' order by date_time']; + curs = exec(conn,comando); + curs = fetch(curs); + idDate = curs.Data; + [~,cI] = size(idDate); + if cI == 1 + idElabData = 0; % 0 indica che il dato non è presente su DB + else + idElabData = cell2mat(idDate(:,1)); + end + tablename = 'alarms'; + colnames = {'type_id','unit_name','date_time','battery_level','send_sms','description'}; + data = [DATAinsert(1,1),DATAinsert(1,2),DATAinsert(1,3),DATAinsert(1,4),... + DATAinsert(1,5),DATAinsert(1,6)]; + if idElabData == 0 % Scrivo + fastinsert(conn,tablename,colnames,data); + text = ['ALERT was written in the DB by checkBattery function for date: ''' Data ''' ']; + end + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); +end + +outdat = fopen(FileNameBattery,'wt+'); +fileID_site = fopen(FileNameBattery,'a'); +text_B = cell2mat(Batteria(end,3)); +fmt = '%f \r'; +fprintf(fileID_site,fmt,text_B); +fmt = '%.10f \r'; +text = Data_Rif; +fprintf(fileID_site,fmt,text); +fclose(fileID_site); + +text = 'checkBattery function worked correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/RSN/checkGIS.m b/RSN/checkGIS.m new file mode 100755 index 0000000..91ed94e --- /dev/null +++ b/RSN/checkGIS.m @@ -0,0 +1,117 @@ +function checkGIS(siteID,NomeSito,conn,FileName) + +text = 'checkGIS function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +comando = ['select gis_enable, gis_duedate from sites where id like ''' siteID ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +GIS = curs.Data; +if cell2mat(GIS(1)) == 1 % GIS attivato + if strcmp(char(GIS(2)),'null') == 0 + FileNameGIS = ['GIS' siteID '-Deadline.txt']; + if isfile(FileNameGIS) == 0 % NON Esiste + outdat = fopen(FileNameGIS,'wt+'); + fileID_site = fopen(FileNameGIS,'a'); + text = now; + fmt = '%f \r'; + fprintf(fileID_site,fmt,text); + fclose(fileID_site); + end + + % Scarico dati di riferimento + Data_Rif = importdata(FileNameGIS); + [rA,~] = size(Data_Rif); + if rA == 0 + Data_Rif = 0; + end + + % Controllo la data di scadenza del GIS + G = cell2mat(GIS(2)); + [lS] = length(G); + date = G(1:10); + time = G(12:lS); + Date = [date ' ' time]; + + Info = 0; + if now <= datenum(Date) && datenum(Date) < now+30 % fra 1 giorno e 1 Mese + if datenum(Data_Rif) > datenum(Date)-30 + mail = 0; % la mail è già stata inviata + else + mail = 1; + end + elseif now > datenum(Date) && datenum(Data_Rif) < datenum(Date) % GIS scaduto + mail = 1; + Info = 1; + desc = 'Scaduto'; + else + mail = 0; + end + + if mail == 1 + DATAinsert = cell(1,5); + sms = 0; + Data = datestr(now,'yyyy-mm-dd HH:MM:SS'); + DATAinsert{1,1} = 8; % Allarme scadenza GIS + DATAinsert{1,2} = cellstr(['GIS|' char(NomeSito)]); + DATAinsert{1,3} = Data; + DATAinsert{1,4} = sms; + if Info == 1 + DATAinsert{1,5} = desc; + end + + % Cerco se il dato è già presente + if Info == 1 + comando = ['select id, type_id, date_time from alarms where tool_name = ''' ... + NomeSito ''' and date_time = ''' Data ''' and type_id = ''' DATAinsert{1,1} ... + ''' and description like ''' desc ''' order by date_time']; + else + comando = ['select id, type_id, date_time from alarms where tool_name = ''' ... + NomeSito ''' and date_time = ''' Data ''' and type_id = ''' DATAinsert{1,1} ... + ''' order by date_time']; + end + curs = exec(conn,comando); + curs = fetch(curs); + idDate = curs.Data; + [~,cI] = size(idDate); + if cI == 1 + idElabData = 0; % 0 indica che il dato non è presente su DB + else + idElabData = cell2mat(idDate(:,1)); + end + tablename = 'alarms'; + if Info == 1 + colnames = {'type_id','tool_name','date_time','send_sms','description'}; + data = [DATAinsert(1,1),DATAinsert(1,2),DATAinsert(1,3),DATAinsert(1,4),DATAinsert(1,5)]; + else + colnames = {'type_id','tool_name','date_time','send_sms'}; + data = [DATAinsert(1,1),DATAinsert(1,2),DATAinsert(1,3),DATAinsert(1,4)]; + end + if idElabData == 0 % Scrivo + fastinsert(conn,tablename,colnames,data); + text = ['ALERT was written in the DB by checkGIS function for date: ''' Data ''' ']; + end + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + end + outdat = fopen(FileNameGIS,'wt+'); + fileID_site = fopen(FileNameGIS,'a'); + text = now; + fmt = '%f \r'; + fprintf(fileID_site,fmt,text); + fclose(fileID_site); + end +end + +text = 'checkGIS function worked correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/RSN/checkSIM.m b/RSN/checkSIM.m new file mode 100755 index 0000000..f6b736f --- /dev/null +++ b/RSN/checkSIM.m @@ -0,0 +1,124 @@ +function checkSIM(IDcentralina,conn,FileName) + +text = 'checkSIM function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +comando = ['select sim_card_id from units where name = ''' IDcentralina ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +sim_ID = cell2mat(curs.Data); + +if isnan(sim_ID) == 0 + if sim_ID ~= 0 + comando = ['select name, duedate from sim_cards where id = ''' num2str(sim_ID) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + SIM = curs.Data; + Nome = char(SIM(1)); + + FileNameSIM = ['' Nome '-Deadline.txt']; + if isfile(FileNameSIM) == 0 % NON Esiste + outdat = fopen(FileNameSIM,'wt+'); + fileID_site = fopen(FileNameSIM,'a'); + text = now; + fmt = '%f \r'; + fprintf(fileID_site,fmt,text); + fclose(fileID_site); + end + + % Scarico dati di riferimento + FileNameSIM = ['' IDcentralina '-Deadline.txt']; + Data_Rif = importdata(FileNameSIM); + [rA,~] = size(Data_Rif); + if rA == 0 + Data_Rif = 0; + end + + % Controllo la data di scadenza della SIM + Date = SIM(2); + Check = cell2mat(Date); + Info = 0; + if strcmp(Check,'null') == 1|| strcmp(Check,'No Data') == 1 + else + if now <= datenum(Date) && datenum(Date) < now+30 % fra 1 giorno e 1 Mese + if datenum(Data_Rif) > datenum(Date)-30 + mail = 0; % la mail è già stata inviata + else + mail = 1; + end + elseif now > datenum(Date) && datenum(Data_Rif) < datenum(Date) % sim scaduta + mail = 1; + Info = 1; + desc = 'Scaduto'; + else + mail = 0; + end + + if mail == 1 + DATAinsert = cell(1,6); + sms = 0; + Data = datestr(now,'yyyy-mm-dd HH:MM:SS'); + DATAinsert{1,1} = 7; % Allarme scadenza SIM + DATAinsert{1,2} = Nome; + DATAinsert{1,3} = Data; + DATAinsert{1,4} = sms; + if Info == 1 + DATAinsert{1,5} = desc; + end + + % Cerco se il dato è già presente + if Info == 1 + comando = ['select id, type_id, date_time from alarms where tool_name = ''' ... + Nome ''' and date_time = ''' Data ''' and type_id = ''' DATAinsert{1,1} ... + ''' and description like ''' desc ''' order by date_time']; + else + comando = ['select id, type_id, date_time from alarms where tool_name = ''' ... + Nome ''' and date_time = ''' Data ''' and type_id = ''' DATAinsert{1,1} ... + ''' order by date_time']; + end + curs = exec(conn,comando); + curs = fetch(curs); + idDate = curs.Data; + [~,cI] = size(idDate); + if cI == 1 + idElabData = 0; % 0 indica che il dato non è presente su DB + else + idElabData = cell2mat(idDate(:,1)); + end + tablename = 'alarms'; + if Info == 1 + colnames = {'type_id','tool_name','date_time','send_sms','description'}; + data = [DATAinsert(1,1),DATAinsert(1,2),DATAinsert(1,3),DATAinsert(1,4),DATAinsert(1,5)]; + else + colnames = {'type_id','tool_name','date_time','send_sms'}; + data = [DATAinsert(1,1),DATAinsert(1,2),DATAinsert(1,3),DATAinsert(1,4)]; + end + if idElabData == 0 % Scrivo + fastinsert(conn,tablename,colnames,data); + text = ['ALERT was written in the DB by checkSIM function for date: ''' Data ''' ']; + end + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + end + outdat = fopen(FileNameSIM,'wt+'); + fileID_site = fopen(FileNameSIM,'a'); + text = now; + fmt = '%f \r'; + fprintf(fileID_site,fmt,text); + fclose(fileID_site); + end + end +end + +text = 'checkSIM function worked correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/RSN/checkUnit.m b/RSN/checkUnit.m new file mode 100755 index 0000000..760030a --- /dev/null +++ b/RSN/checkUnit.m @@ -0,0 +1,112 @@ +function checkUnit(IDcentralina,conn,FileName) + +text = 'checkUnit function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +FileNameUnit = ['' IDcentralina '-Deadline.txt']; +if isfile(FileNameUnit) == 0 % NON Esiste + outdat = fopen(FileNameUnit,'wt+'); + fileID_site = fopen(FileNameUnit,'a'); + text = now; + fmt = '%f \r'; + fprintf(fileID_site,fmt,text); + fclose(fileID_site); +end + +% Scarico dati di riferimento +FileNameUnit = ['' IDcentralina '-Deadline.txt']; +Data_Rif = importdata(FileNameUnit); +[rA,~] = size(Data_Rif); +if rA == 0 + Data_Rif = 0; +end + +% Cerco la data di scadenza della centralina +comando = ['select duedate from units where name = ''' IDcentralina ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +Date = curs.Data; +Check = cell2mat(Date); +Info = 0; +if strcmp(Check,'null') == 1|| strcmp(Check,'No Data') == 1 +else + if now <= datenum(Date) && datenum(Date) < now+30 % fra 1 giorno e 1 Mese + if datenum(Data_Rif) > datenum(Date)-30 + mail = 0; % la mail è già stata inviata + else + mail = 1; + end + elseif now > datenum(Date) && datenum(Data_Rif) < datenum(Date) % centralina scaduta + mail = 1; + Info = 1; + desc = 'Scaduto'; + else + mail = 0; + end + + if mail == 1 + DATAinsert = cell(1,6); + sms = 0; + Data = datestr(now,'yyyy-mm-dd HH:MM:SS'); + DATAinsert{1,1} = 5; % Allarme scadenza centralina + DATAinsert{1,2} = IDcentralina; + DATAinsert{1,3} = Data; + DATAinsert{1,4} = sms; + if Info == 1 + DATAinsert{1,5} = desc; + end + + if Info == 1 + comando = ['select id, type_id, date_time from alarms where unit_name = ''' ... + IDcentralina ''' and date_time = ''' Data ''' and type_id = ''' DATAinsert{1,1} ... + ''' and description like ''' desc ''' order by date_time']; + else + comando = ['select id, type_id, date_time from alarms where unit_name = ''' ... + IDcentralina ''' and date_time = ''' Data ''' and type_id = ''' DATAinsert{1,1} ... + ''' order by date_time']; + end + curs = exec(conn,comando); + curs = fetch(curs); + idDate = curs.Data; + [~,cI] = size(idDate); + if cI == 1 + idElabData = 0; % 0 indica che il dato non è presente su DB + else + idElabData = cell2mat(idDate(:,1)); + end + tablename = 'alarms'; + if Info == 1 + colnames = {'type_id','unit_name','date_time','send_sms','description'}; + data = [DATAinsert(1,1),DATAinsert(1,2),DATAinsert(1,3),DATAinsert(1,4),DATAinsert(1,5)]; + else + colnames = {'type_id','unit_name','date_time','send_sms'}; + data = [DATAinsert(1,1),DATAinsert(1,2),DATAinsert(1,3),DATAinsert(1,4)]; + end + if idElabData == 0 % Scrivo + fastinsert(conn,tablename,colnames,data); + text = ['ALERT was written in the DB by checkUnit function for date: ''' Data ''' ']; + end + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + end + + outdat = fopen(FileNameUnit,'wt+'); + fileID_site = fopen(FileNameUnit,'a'); + text = now; + fmt = '%f \r'; + fprintf(fileID_site,fmt,text); + fclose(fileID_site); +end + +text = 'checkUnit function worked correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/RSN/checkdata.m b/RSN/checkdata.m new file mode 100755 index 0000000..1c545cb --- /dev/null +++ b/RSN/checkdata.m @@ -0,0 +1,61 @@ +function [DatiElabTriggerLink,DatiElabShockSensor,DatiElabDebrisLink] = checkdata(... + yesTrL,yesSS,yesDL,DatiElabTriggerLink,DatiElabShockSensor,DatiElabDebrisLink,... + datainiTrL,datainiSS,datainiDL,rTrL,rSS,rDL,tempoiniTrL,tempoiniSS,tempoiniDL,... + NodoTriggerLink,NodoShockSensor,NodoDebrisLink,NuovoZeroTrL,NuovoZeroSS,NuovoZeroDL,... + IDcentralina,DTcatena,conn,FileName) + +text = 'checkdata function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +%% Trigger Link +if yesTrL == 1 % Trigger Link + if NuovoZeroTrL == 1 + data1 = datenum([char(DatiElabTriggerLink(1,1)) ' ' char(DatiElabTriggerLink(1,2))]); + data2 = datenum([datainiTrL(1,1:10) ' ' tempoiniTrL]); + if data1 ~= data2 % devo riscaricare l'ultimo dato elaborato a partire da dataini + datainiTrL = datestr(data2,'yyyy-mm-dd'); + tempoiniTrL = datestr(data2,'HH:MM:SS'); + DatiElabTriggerLink = LastElab_bisTrL(conn,NodoTriggerLink,rTrL,... + datainiTrL,tempoiniTrL,IDcentralina,DTcatena,FileName); + end + end +end + +%% Shock Sensor +if yesSS == 1 % + if NuovoZeroSS == 1 + data1 = datenum([char(DatiElabShockSensor(1,1)) ' ' char(DatiElabShockSensor(1,2))]); + data2 = datenum([datainiSS(1,1:10) ' ' tempoiniSS]); + if data1 ~= data2 % devo riscaricare l'ultimo dato elaborato a partire da dataini + datainiSS = datestr(data2,'yyyy-mm-dd'); + tempoiniSS = datestr(data2,'HH:MM:SS'); + DatiElabShockSensor = LastElab_bisSS(conn,NodoShockSensor,rSS,datainiSS,... + tempoiniSS,IDcentralina,DTcatena,FileName); + end + end +end + +%% Debris Link +if yesDL == 1 % Debris Link + if NuovoZeroDL == 1 + data1 = datenum([char(DatiElabDebrisLink(1,1)) ' ' char(DatiElabDebrisLink(1,2))]); + data2 = datenum([datainiDL(1,1:10) ' ' tempoiniDL]); + if data1 ~= data2 % devo riscaricare l'ultimo dato elaborato a partire da dataini + datainiDL = datestr(data2,'yyyy-mm-dd'); + tempoiniDL = datestr(data2,'HH:MM:SS'); + DatiElabDebrisLink = LastElab_bisDL(conn,NodoDebrisLink,rDL,... + datainiDL,tempoiniDL,IDcentralina,DTcatena,FileName); + end + end +end + +text = 'checkdata function worked correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/RSN/conv_grezziLL.m b/RSN/conv_grezziLL.m new file mode 100755 index 0000000..13fd083 --- /dev/null +++ b/RSN/conv_grezziLL.m @@ -0,0 +1,39 @@ +% Funzione che converte i dati ADC della cella di carico in dati di forza +% mediante i valori di calibrazione. +% Il risultato è la matrico DatiLoad + +function DatiLoad = conv_grezziLL(ADCLoad,DCalLLTot,NodoLoadLink,FileName) + +text = 'conv_grezziLL function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +if strcmp(NodoLoadLink(1,4),'mV/V') || strcmp(NodoLoadLink(1,4),'ADC') + caLoad = DCalLLTot(:,1); + intLoad = DCalLLTot(:,2); +elseif strcmp(NodoLoadLink(1,4),'4-20 mA') + a_Load = DCalLLTot(:,1); + b_Load = DCalLLTot(:,2); + c_Load = DCalLLTot(:,3); +end + +%% Conversione dei punti ADC in dati di carico +[rL,cL] = size(ADCLoad); +DatiLoad = zeros(rL,cL); + +for j=1:rL % date + for i=1:cL % nodi + if strcmp(NodoLoadLink(i,4),'mV/V') || strcmp(NodoLoadLink(i,4),'ADC') + DatiLoad(j,i) = caLoad(i,1)*ADCLoad(j,i) + intLoad(i,1); % conversione lineare + elseif strcmp(NodoLoadLink(i,4),'4-20 mA') + DatiLoad(j,i) = a_Load(i,1)*ADCLoad(j,i).^2 + b_Load(i,1)*ADCLoad(j,i) + c_Load(i,1); % conversione parabolica + end + end +end + +text = 'Raw Data of Load Link converted into physycal units correctly. conv_grezziLL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/RSN/conv_grezziRSN.m b/RSN/conv_grezziRSN.m new file mode 100755 index 0000000..87d6a3c --- /dev/null +++ b/RSN/conv_grezziRSN.m @@ -0,0 +1,168 @@ +% Funzione che converte i dati grezzi in dati di accelerazione usando i +% valori delle calibrazioni per i RSN Link +% accRSN raccoglie le accelerazioni + +function [accRSN,ris_acc,tempRSN] = conv_grezziRSN(rRSN,accRSN,... + tempRSN,DCalRSNTot,MEMS,FileName) + +text = 'conv_grezziRSN function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +if MEMS == 2 % RSN Link 1.0 + gainX = DCalRSNTot(:,1); + caX = DCalRSNTot(:,2); + intX = DCalRSNTot(:,3); + caASSX = DCalRSNTot(:,4); + intASSX = DCalRSNTot(:,5); + gainY = DCalRSNTot(:,6); + caY = DCalRSNTot(:,7); + intY = DCalRSNTot(:,8); + caASSY = DCalRSNTot(:,9); + intASSY = DCalRSNTot(:,10); + gainZ = DCalRSNTot(:,11); + caZ = DCalRSNTot(:,12); + intZ = DCalRSNTot(:,13); + % caASSZ = DCalRSNTot(:,14); --> non necessari + % intASSZ = DCalRSNTot(:,15); --> non necessari + caT = DCalRSNTot(:,16); + intT = DCalRSNTot(:,17); + + [righeREL,~] = size(accRSN); + angREL_RSN = zeros(righeREL,rRSN*2); + + %% Accelerometri + cont = 1; + cn = 1; + % Contatore dei nodi, corregge le accelerazioni con le calibrazioni + for ii=1:3*rRSN + if cont==1 + accRSN(:,ii) = accRSN(:,ii)*gainX(cn)+(tempRSN(:,cn)*caX(cn)+intX(cn)); + cont = cont+1; + elseif cont==2 + accRSN(:,ii) = accRSN(:,ii)*gainY(cn)+(tempRSN(:,cn)*caY(cn)+intY(cn)); + cont = cont+1; + else + accRSN(:,ii) = accRSN(:,ii)*gainZ(cn)+(tempRSN(:,cn)*caZ(cn)+intZ(cn)); + cont = 1; + cn = cn+1; + end + end + + % Calcolo e correggo angoli relativi in base al segno dell'asse Z + cont = 1; + contACC = 1; + for ii=1:3*rRSN + if cont==1 % X + angREL_RSN(:,contACC) = real(asind(accRSN(:,ii))); %calcolo angolo relativo + if angREL_RSN(:,contACC)>0 %check quando angolo relativo > 0 + if accRSN(:,ii+2)<0 % check quando asse z < 0 --> il montante si è capovolto! + angREL_RSN(:,contACC) = 180 - angREL_RSN(:,contACC); + end + elseif angREL_RSN(:,ii)<0 %check quando angolo relativo < 0 + if accRSN(:,ii+2)<0 % check quando asse z < 0 --> il montante si è capovolto! + angREL_RSN(:,contACC) = -180 - angREL_RSN(:,contACC); + end + end + cont = cont+1; + contACC = contACC+1; + elseif cont==2 % Y + angREL_RSN(:,contACC) = real(asind(accRSN(:,ii))); %calcolo angolo relativo + if angREL_RSN(:,contACC)>0 %check quando angolo relativo > 0 + if accRSN(:,ii+1)<0 % check quando asse z < 0 --> il montante si è capovolto! + angREL_RSN(:,contACC) = 180 - angREL_RSN(:,contACC); + end + elseif angREL_RSN(:,ii)<0 %check quando angolo relativo < 0 + if accRSN(:,ii+1)<0 % check quando asse z < 0 --> il montante si è capovolto! + angREL_RSN(:,contACC) = -180 - angREL_RSN(:,contACC); + end + end + cont = cont+1; + contACC = contACC+1; + else + cont = 1; + end + end + + % Calcolo angoli assoluti + cont = 1; + cn = 1; + for ii=1:2*rRSN + if cont==1 + accRSN(:,ii) = angREL_RSN(:,ii)*caASSX(cn)+intASSX(cn); + cont = cont+1; + elseif cont==2 + accRSN(:,ii) = angREL_RSN(:,ii)*caASSY(cn)+intASSY(cn); + cont = cont+1; + else + cont = 1; + cn = cn+1; + end + end + + %% Conversione delle temperature + [rT,~] = size(tempRSN); + T_RSN = zeros(rT,1); + + for t = 1:rRSN + T_RSN(:,t) = tempRSN(:,t)*caT(t,1) + intT(t,1); + end + + %% Risultanti + [rAcc,cAcc] = size(accRSN); + ris_acc = zeros(rAcc,cAcc/3); % matrice risultante accelerazioni + + clear i + clear ii + clear cont + clear cn + cont = 1; % contatore + cn = 0; + n = 1; + + %% Calcolo della risultante + for ii = 1:cAcc % colonne + if n == 4 + n = 1; + end + for i = 1:rAcc % righe + ris_acc(i,cont) = (accRSN(i,cn*3+1)^2+accRSN(i,cn*3+2)^2+accRSN(i,cn*3+3)^2)^0.5; + end + if n == 3 + cn = cn+1; + cont = cont+1; + end + n = n+1; + end +elseif MEMS == 3 % Murata + %% Risultanti + [rAcc,cAcc] = size(accRSN); + ris_acc = zeros(rAcc,cAcc/3); % matrice risultante accelerazioni + cont = 1; % contatore + cn = 0; + n = 1; + + %% Calcolo della risultante + for ii = 1:cAcc % colonne + if n == 4 + n = 1; + end + for i = 1:rAcc % righe + ris_acc(i,cont) = (sind(accRSN(i,cn*3+1))^2+sind(accRSN(i,cn*3+2))^2+sind(accRSN(i,cn*3+3))^2)^0.5; + end + if n == 3 + cn = cn+1; + cont = cont+1; + end + n = n+1; + end +else + ris_acc = []; +end + +text = 'Raw Data of RSN Link converted into physycal units correctly. conv_grezziRSN function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/RSN/conv_grezziRSNHR.m b/RSN/conv_grezziRSNHR.m new file mode 100755 index 0000000..e4613e1 --- /dev/null +++ b/RSN/conv_grezziRSNHR.m @@ -0,0 +1,47 @@ +% Funzione che converte i dati grezzi del RSN Link HR in dati di +% angoli (acc_RSNHR) + +function [angRSNHR,T_RSNHR] = conv_grezziRSNHR(angRSNHR,tempRSNHR,DCalRSNHRTot,rRSNHR,FileName) + +text = 'conv_grezziRSNHR function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +caX_RSNHR = DCalRSNHRTot(:,1); +intX_RSNHR = DCalRSNHRTot(:,2); +caY_RSNHR = DCalRSNHRTot(:,3); +intY_RSNHR = DCalRSNHRTot(:,4); +caT_RSNHR = DCalRSNHRTot(:,5); +intT_RSNHR = DCalRSNHRTot(:,6); + +cont = 1; +cn = 1; +% Contatore dei nodi, converte i punti ADC con le calibrazioni in valori +% angolari +for ii=1:2*rRSNHR + if cont==1 + angRSNHR(:,ii) = angRSNHR(:,ii)*caX_RSNHR(cn)+ intX_RSNHR(cn); + cont = cont+1; + elseif cont==2 + angRSNHR(:,ii) = angRSNHR(:,ii)*caY_RSNHR(cn)+ intY_RSNHR(cn); + cont = cont+1; + else + cont = 1; + cn = cn+1; + end +end + +%% Conversione delle temperature +[rT,~] = size(tempRSNHR); +T_RSNHR = zeros(rT,1); + +for t = 1:rRSNHR + T_RSNHR(:,t) = tempRSNHR(:,t)*caT_RSNHR(t,1) + intT_RSNHR(t,1); +end + +text = 'Raw Data of RSN Link HR converted into physycal units correctly. conv_grezziRSNHR function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/RSN/database_definition.m b/RSN/database_definition.m new file mode 100755 index 0000000..1963ac4 --- /dev/null +++ b/RSN/database_definition.m @@ -0,0 +1,27 @@ +function DB = database_definition(~,FileName) + +%% DB ASE + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'database_definition function started'; +fprintf(fileID,fmt,text); + +Dati = importdata('DB.txt'); +dbname = Dati{1,1}; +username = Dati{2,1}; +password = Dati{3,1}; +driver = Dati{4,1}; +dburl = Dati{5,1}; + +DB{1,1} = cellstr(dbname); +DB{2,1} = cellstr(username); +DB{3,1} = cellstr(password); +DB{4,1} = cellstr(driver); +DB{5,1} = cellstr(dburl); + +text = 'Database defined correctly and database_definition function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/RSN/database_write.m b/RSN/database_write.m new file mode 100755 index 0000000..6a71b1d --- /dev/null +++ b/RSN/database_write.m @@ -0,0 +1,150 @@ +function 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) + +%% Attivo/disattivo la scrittura +[scrivoRSN,scrivoRSN_HR,scrivoLL,scrivoTrL,scrivoSS] = scrivo(AlfaX,... + AlfaX_HR,LoadDef,val_TrL,val_SS); + +text = 'database_write function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +%% Contatori nodi +cRSN = 1; % RSN Link +cRSNHR = 1; % RSN Link HR +cLL = 1; % Load Link +cTrL = 1; % Trigger Link +cSS = 1; % Shock Sensor + +% conto i dati +[~,colRSN] = size(AlfaX'); % controllo quanti dati ho +[~,colRSNHR] = size(AlfaX_HR'); % controllo quanti dati ho +[~,colLL] = size(LoadDef'); % controllo quanti dati ho +[~,colTrL] = size(val_TrL'); % controllo quanti dati ho +[~,colSS] = size(val_SS'); % controllo quanti dati ho +[rC,~] = size(catena); +idNodo = cell2mat(catena(:,1)); + +text = 'Upload of the results in the DB started'; +fprintf(fileID,fmt,text); + +%% Scrittura risultati su DB +for a = 1:rC + NodeNum = cell2mat(catena(a,3)); + + %% RSN Link + if idNodo(a,1) == 38 + if scrivoRSN == 1 % se ho correttamente tutti i dati + ListaDate = colRSN; + + DATAinsert = cellMakerRSN(IDcentralina,DTcatena,NodeNum,cRSN,ListaDate,... + ErrRSNLink,ARRAYdateRSN,AlfaX,AlfaY,TempDef_RSN); + + idElabData = DB_date_time(IDcentralina,DTcatena,NodeNum,ListaDate,ARRAYdateRSN,conn); + + DBwriteRSN(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn); + + cRSN = cRSN+1; + clear DATAinsert + % Logfile + text = ['RSN Link node no. ' num2str(NodeNum) ' of ' ... + num2str(rC) ' of unit ' IDcentralina ' and chain ' DTcatena ' written in the DB!']; + fprintf(fileID,fmt,text); + end + + + %% RSN Link HR + elseif idNodo(a,1) == 39 + if scrivoRSN_HR == 1 % se ho correttamente tutti i dati + ListaDate = colRSNHR; + + DATAinsert = cellMakerRSNHR(IDcentralina,DTcatena,NodeNum,cRSNHR,ListaDate,... + ErrRSNLinkHR,ARRAYdateRSNHR,AlfaX_HR,AlfaY_HR,TempDef_RSNHR); + + idElabData = DB_date_time(IDcentralina,DTcatena,NodeNum,ListaDate,ARRAYdateRSNHR,conn); + + DBwriteRSNHR(DATAinsert,idElabData,ListaDate,NodeNum,DTcatena,IDcentralina,conn); + + cRSNHR = cRSNHR+1; + clear DATAinsert + % Logfile + text = ['RSN Link HR node no. ' num2str(NodeNum) ' of ' ... + num2str(rC) ' of unit ' IDcentralina ' and chain ' DTcatena ' written in the DB!']; + fprintf(fileID,fmt,text); + end + + + %% Load Link + elseif idNodo(a,1) == 15 % Load Link + if scrivoLL == 1 + ListaDate = colLL; + + DATAinsert = cellMakerLL(IDcentralina,DTcatena,NodeNum,cLL,... + ListaDate,ARRAYdateLL,LoadDef,ErrLoadLink); + + idElabData = DB_date_time(IDcentralina,DTcatena,NodeNum,ListaDate,ARRAYdateLL,conn); + + DBwriteLL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn); + + cLL = cLL+1; + clear DATAinsert + % Logfile + text = ['Load Link node no. ' num2str(NodeNum) ' of ' ... + num2str(rC) ' of unit ' IDcentralina ' and chain ' DTcatena ' written in the DB!']; + fprintf(fileID,fmt,text); + end + + + %% Trigger Link + elseif idNodo(a,1) == 40 % Trigger Link + if scrivoTrL == 1 + ListaDate = colTrL; + + DATAinsert = cellMakerTrL(DTcatena,IDcentralina,NodeNum,ListaDate,... + ARRAYdateTrL,val_TrL,StoricoTrigger,cTrL,ErrTriggerLink); + + idElabData = DB_date_time(IDcentralina,DTcatena,NodeNum,ListaDate,ARRAYdateTrL,conn); + + DBwriteTrL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn); + + cTrL = cTrL+1; + clear DATAinsert + % Logfile + text = ['Trigger Link node no. ' num2str(NodeNum) ' of ' ... + num2str(rC) ' of unit ' IDcentralina ' and chain ' DTcatena ' written in the DB!']; + fprintf(fileID,fmt,text); + end + + %% Shock Sensor + elseif idNodo(a,1) == 54 % Shock Sensor + if scrivoSS == 1 + ListaDate = colSS; + + DATAinsert = cellMakerSS(DTcatena,IDcentralina,NodeNum,ListaDate,... + ARRAYdateSS,val_SS,StoricoShock,cSS,ErrShockSensor); + + idElabData = DB_date_time(IDcentralina,DTcatena,NodeNum,ListaDate,ARRAYdateSS,conn); + + DBwriteSS(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn); + + cTrL = cTrL+1; + clear DATAinsert + % Logfile + text = ['Trigger Link node no. ' num2str(NodeNum) ' of ' ... + num2str(rC) ' of unit ' IDcentralina ' and chain ' DTcatena ' written in the DB!']; + fprintf(fileID,fmt,text); + end + + end + +end + +text = 'DB upload completed. database_write function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/RSN/datainiziale.m b/RSN/datainiziale.m new file mode 100755 index 0000000..c2ca676 --- /dev/null +++ b/RSN/datainiziale.m @@ -0,0 +1,21 @@ +% Funzione che scarica la data iniziale per quell'installazione +function [date,time,unitID] = datainiziale(DTcatena,unitID,conn,FileName) + +text = 'datainiziale function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +unitID = num2str(cell2mat(unitID)); +comando = ['select prod_date from tools where unit_ID like ''' unitID ''' and name like ''' DTcatena ''' ']; +data_ini = fetch(conn,comando); +stringa = cell2mat(data_ini); +[lS] = length(stringa); +date = stringa(1,1:10); +time = stringa(1,12:lS); + +text = ['Starting date for the download of data: ' date ' ' time '. datainiziale function closed.']; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/RSN/defDatiLL.m b/RSN/defDatiLL.m new file mode 100755 index 0000000..ef81c2a --- /dev/null +++ b/RSN/defDatiLL.m @@ -0,0 +1,40 @@ +% funzione che definisce i dati per la cella di carico, in particolare +% tempo (TimeLL), batteria (BattLL) e ADC (ADCLoad) + +function [TimeLL,ADCLoad,ErrLoadLink] = defDatiLL(DatiLoadLink,ErrLoadLink,... + rLL,Ndatidespike,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiLL function started'; +fprintf(fileID,fmt,text); + +[r,c]=size(DatiLoadLink); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 1:c + check = isnan(DatiLoadLink(a,b)); + if check == 1 + DatiLoadLink(a,b) = DatiLoadLink(a-1,b); + ErrLoadLink(a,b) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = ['' num2str(Ncorr) ' NaN of Load Link corrected by defDatiLL function']; +fprintf(fileID,fmt,text); + +TimeLL = DatiLoadLink(:,1); % data +ADCLoad = DatiLoadLink(:,2:end); % dati ADC Analog Link +for s = 1:rLL + % despiking + ADCLoad(1:end-1,s) = filloutliers(ADCLoad(1:end-1,s),'linear','movmedian',Ndatidespike); +end + +text = 'Data of Load Link defined correctly. defDatiLL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/RSN/defDatiRSN.m b/RSN/defDatiRSN.m new file mode 100755 index 0000000..85d83df --- /dev/null +++ b/RSN/defDatiRSN.m @@ -0,0 +1,71 @@ +% Funzione che definisce accelerazioni (accRSN) e temperature (tempRSN) +% per i nodi di tipo RSN Link + +function [TimeRSN,accRSN,tempRSN,ErrRSNLink] = defDatiRSN(MEMS,DatiRSNLink,... + ErrRSNLink,rRSN,Ndatidespike,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiRSN function started'; +fprintf(fileID,fmt,text); + +[r,c] = size(DatiRSNLink); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 1:c + check = isnan(DatiRSNLink(a,b)); + if check == 1 + DatiRSNLink(a,b) = DatiRSNLink(a-1,b); + ErrRSNLink(a,b) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = ['' num2str(Ncorr) ' NaN of RSN Link corrected by defDatiRSN function']; +fprintf(fileID,fmt,text); + +% Definisco Data (gg:mm:aaaa hh:mm), Batteria, i 3 dati di accelerometro +% e la Temperatura per la calibrazione +TimeRSN = DatiRSNLink(:,1); % data +accRSN = zeros(r,rRSN*3); % dati accelerometro +tempRSN = zeros(r,rRSN); % temperatura del nodo +p = 4; % passo nella definizione dei dati +s = 1; + +for i = 1:rRSN + accRSN(:,s) = DatiRSNLink(:,2+(i-1)*p); + accRSN(:,s+1) = DatiRSNLink(:,3+(i-1)*p); + accRSN(:,s+2) = DatiRSNLink(:,4+(i-1)*p); + s = s+3; + tempRSN(:,i) = DatiRSNLink(:,5+(i-1)*p); + if MEMS == 2 + [rT,~] = size(tempRSN); + for j = 1:rT + if tempRSN(j,i) > 200 + tempRSN(j,i) = tempRSN(j,i) - 256; % Correzione della temperatura dei nuovi MEMS + end + end + end +end + +% il despike NON viene mai eseguito sull'ultimo dato disponibile +Num_Dati = Ndatidespike; % numero di dati per il despike +if Num_Dati > r + Num_Dati = r; +end +s = 1; +for i = 1:rRSN + % despiking accelerometri + accRSN(1:end-1,s) = filloutliers(accRSN(1:end-1,s),'linear','movmedian',Num_Dati); + accRSN(1:end-1,s+1) = filloutliers(accRSN(1:end-1,s+1),'linear','movmedian',Num_Dati); + accRSN(1:end-1,s+2) = filloutliers(accRSN(1:end-1,s+2),'linear','movmedian',Num_Dati); + s = s+3; +end + +text = 'Data of RSN Link defined correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/RSN/defDatiRSNHR.m b/RSN/defDatiRSNHR.m new file mode 100755 index 0000000..8731cd8 --- /dev/null +++ b/RSN/defDatiRSNHR.m @@ -0,0 +1,124 @@ +function [TimeRSNHR,angRSNHR,tempRSNHR,ErrRSNLinkHR] = defDatiRSNHR(DatiRSNLinkHR,... + ErrRSNLinkHR,rRSNHR,IDcentralina,DTcatena,Ndatidespike,NuovoZeroRSNHR,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiRSNHR function started'; +fprintf(fileID,fmt,text); + +[r,c] = size(DatiRSNLinkHR); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 1:c + check = isnan(DatiRSNLinkHR(a,b)); + if check == 1 + DatiRSNLinkHR(a,b) = DatiRSNLinkHR(a-1,b); + ErrRSNLinkHR(a,b) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = ['' num2str(Ncorr) ' NaN of RSN Link HR corrected by defDatiRSNHR function']; +fprintf(fileID,fmt,text); + +TimeRSNHR = DatiRSNLinkHR(:,1); % data +angRSNHR = zeros(r,rRSNHR*2); % dati angolari +tempRSNHR = zeros(r,rRSNHR); % temperatura del nodo per la calibrazione +p = 2; % passo +s = 1; +for i = 1:rRSNHR + angRSNHR(:,s:s+1) = DatiRSNLinkHR(:,p:p+1); + s = s+2; + tempRSNHR(:,i) = DatiRSNLinkHR(:,p+2); + p = p+3; +end + +s = 1; +Num_Dati = Ndatidespike; % numero di dati per il despike +if Num_Dati > r + Num_Dati = r; +end +% il despike NON viene eseguito per l'ultimo dato disponibile +for i = 1:rRSNHR + % despiking accelerometri + angRSNHR(1:end-1,s) = filloutliers(angRSNHR(1:end-1,s),'linear','movmedian',Num_Dati); + angRSNHR(1:end-1,s+1) = filloutliers(angRSNHR(1:end-1,s+1),'linear','movmedian',Num_Dati); + s = s+2; +end + +%% !!! Controllo che le ampolle non siano fuori scala (32768) +AmpolleUpdate = ['' IDcentralina '-' DTcatena '-Ampolle.csv']; +[rC,cC] = size(angRSNHR); +if NuovoZeroRSNHR == 1 && isfile(AmpolleUpdate) == 1 + Dati = csvread(AmpolleUpdate); + [rD,~] = size(Dati); + num = 1; + cont = 1; + if rD ~= 0 + for j = 1:rC + for ii = 1:cC + segno1 = 0; + for a = 2:rD + if TimeRSNHR(j,1) == Dati(a,1) + segno1 = sign(Dati(a-1,ii+1)); % segno del valore alla data precedente + break + end + end + if segno1 == 0 + if j == 1 + else + segno1 = sign(angRSNHR(j-1,ii)); % segno del valore alla data precedente + end + end + segno2 = sign(angRSNHR(j,ii)); % segno del valore alla data successiva + if segno2 ~= segno1 % se i due segni sono diversi + if abs(angRSNHR(j,ii)) > 15000 + if segno1 == 1 + angRSNHR(j,ii) = 32768 + (32768 + angRSNHR(j,ii)); % Fondo scala positivo + elseif segno1 == -1 + angRSNHR(j,ii) = -32768 + (-32768 + angRSNHR(j,ii)); % Fondo scala negativo + end + text = ['RSN Link HR was out of range on node ' mat2str(cell2mat(NodoRSNLinkHR(num,2))) '']; + fprintf(fileID,fmt,text); + end + end + cont = cont+1; + if cont == 3 + cont = 1; + num = num+1; + end + end + cont = 1; + num = 1; + end + indice = 1; + for j=1:rC + if Dati(end,1) == TimeRSNHR(j,1) + indice = j+1; + break + end + end + else + indice = []; + end +else + indice = 1; +end + +if isempty(indice) == 0 + datiHR = [TimeRSNHR(indice:end,1) angRSNHR(indice:end,:)]; + dat=isempty(datiHR); + if dat==0 + if NuovoZeroRSNHR == 1 && isfile(AmpolleUpdate) == 1 + delete(AmpolleUpdate); + end + csvwrite(AmpolleUpdate,datiHR); + end +end + +text = 'Data of RSN Link HR defined correctly. defDatiRSNHR function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end diff --git a/RSN/defDatiSS.m b/RSN/defDatiSS.m new file mode 100755 index 0000000..fac9d5f --- /dev/null +++ b/RSN/defDatiSS.m @@ -0,0 +1,54 @@ +% Funzione che definisce le attivazioni di fine corsa per i nodi di tipo Trigger Link +function [ARRAYdateSS,val_SS,ErrShockSensor] = defDatiSS(DatiShockSensor,... + ErrShockSensor,rSS,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiSS function started'; +fprintf(fileID,fmt,text); + +[r,c]=size(DatiShockSensor); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 1:c + check = isnan(DatiShockSensor(a,b)); + if check == 1 + DatiShockSensor(a,b) = DatiShockSensor(a-1,b); + ErrShockSensor(a,b) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = ['' num2str(Ncorr) ' NaN of Shock Sensor corrected by defDatiSS function']; +fprintf(fileID,fmt,text); + +[r,~] = size(DatiShockSensor); +TimeSS = DatiShockSensor(:,1); % data +val_SS = zeros(r,rSS); % dati shock sensor +i = 1; +while i <= rSS + for j = 1:r + if DatiShockSensor(j,1+i) == 1 || DatiShockSensor(j,1+i) == 2 || DatiShockSensor(j,1+i) == 3 + if DatiShockSensor(j,1+i) == 1 + val_SS(j,i) = 1; + elseif j > 1 && DatiShockSensor(j,1+i) == 2 && DatiShockSensor(j-1,1+i) ~= 1 + val_SS(j,i) = 1; + elseif j > 1 && DatiShockSensor(j,1+i) == 3 && DatiShockSensor(j-1,1+i) ~= 1 && DatiShockSensor(j-1,1+i) ~= 2 + val_SS(j,i) = 1; + end + else + val_SS(j,i) = 0; + end + end + i = i+1; +end + +ARRAYdateSS = TimeSS; + +text = 'Data of Shock Sensor defined correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/RSN/defDatiTrL.m b/RSN/defDatiTrL.m new file mode 100755 index 0000000..3f66092 --- /dev/null +++ b/RSN/defDatiTrL.m @@ -0,0 +1,70 @@ +% Funzione che definisce le attivazioni di fine corsa per i nodi di tipo Trigger Link +function [ARRAYdateTrL,val_TrL,ErrTriggerLink] = defDatiTrL(DatiTriggerLink,... + Type,ErrTriggerLink,rTrL,NuovoZeroTrL,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiTrL function started'; +fprintf(fileID,fmt,text); + +[r,c]=size(DatiTriggerLink); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 1:c + check = isnan(DatiTriggerLink(a,b)); + if check == 1 + DatiTriggerLink(a,b) = DatiTriggerLink(a-1,b); + ErrTriggerLink(a,b) = 1; + Ncorr = Ncorr+1; + end + end +end + +if NuovoZeroTrL == 1 + DatiTriggerLink = DatiTriggerLink(2:end,:); + ErrTriggerLink = ErrTriggerLink(2:end,:); +end + +text = ['' num2str(Ncorr) ' NaN of Trigger Link corrected by defDatiTrL function']; +fprintf(fileID,fmt,text); + +[r,~] = size(DatiTriggerLink); +TimeTrL = DatiTriggerLink(:,1); % data +val_TrL = zeros(r,rTrL); % dati fine corsa +if Type == 7 + code = 16; +else + code = 1; +end + +i = 1; +while i <= rTrL + for j = 1:r + if DatiTriggerLink(j,1+i) == code % Se la prima colonna ha il codice associato al Trigger + if j > 1 && Type == 7 + check = DatiTriggerLink(j,1+i)-DatiTriggerLink(j-1,1+i); + else + check = 1; + end + if check > 0 + val_TrL(j,i) = 1; + end + else + val_TrL(j,i) = 0; + end + end + if Type == 7 + i = i+2; + else + i = i+1; + end +end + +ARRAYdateTrL = TimeTrL; + +text = 'Data of Trigger Link defined correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/RSN/elaborazione_RSN.m b/RSN/elaborazione_RSN.m new file mode 100755 index 0000000..aef447d --- /dev/null +++ b/RSN/elaborazione_RSN.m @@ -0,0 +1,304 @@ +%% Funzione che calcola gli spostamenti in modalità triassiale per i Tilt Link +function [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) + +% Inizio del ciclo di elaborazione +text = 'elaborazione_RSN function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +if NuovoZeroRSN == 1 + if NdatiMedia > Ndatidespike + Ndati = NdatiMedia; + else + Ndati = Ndatidespike; + end + ini = round(Ndati/2)+1; + if rem(Ndati,2) == 0 + ini = ini+1; + end + clear NDati + angRSN = angRSN(ini:end,:); + ris_acc = ris_acc(ini:end,:); + TempDef_RSN = TempDef_RSN(ini:end,:); + ARRAYdateRSN = ARRAYdateRSN(ini:end,1); + ErrRSNLink = ErrRSNLink(ini:end,:); +end + +Nnodi = rRSN; + +% Inizio del ciclo di elaborazione +text = 'Elaboration of RSN Link started'; +fprintf(fileID,fmt,text); + +TempDef_RSN = TempDef_RSN'; +[rr,cc] = size(angRSN); +if MEMS == 2 + cc = cc/2; +else + cc = cc/3; +end + +%% Controllo delle risultanti di accelerazione +if MEMS == 2 % Il controllo lo eseguo solo per i MEMS FreeScale + ris_acc = ris_acc'; % Nodi in riga, date in colonna + [r,c] = size(ris_acc); + + % controllo che le matrici con le risultanti delle accelerazioni e + % le matrici con i dati di angolo di inclinazione assoluto + % abbiano le stesse dimensioni (r con cc e c con rr perchè matrice + % ris_acc è trasposta!) + if r~=cc + text = ['Warning! Number of row of absolute angle data do not correspond '... + 'to the number of acceleration cosine vector!']; + fprintf(fileID,fmt,text); + end + if c~=rr + text = ['Warning! Number of column of absolute angle data do not correspond '... + 'to the number of acceleration cosine vector!']; + fprintf(fileID,fmt,text); + end + cont = 1; % contatore + cont2 = 1; % contatore + + angRSN = angRSN'; + textA = 'There are not correction of RSN Link based on acceleration vectors filter'; + textA2 = 'There are not correction of RSN Link based on uncalibrated acceleration vectors'; + + for j = 2:c % Data + nodo = 1; + for i = 1:r % Nodo + % se il valore assoluto della differenza è maggiore della + % tolleranza, pongo l'angolo pari al valore precendete + if abs(ris_acc(i,j)-ris_acc(i,j-1)) > tolleranzaAcc + angRSN(nodo:nodo+1,j) = angRSN(nodo:nodo+1,j-1); + textA = ['' num2str(cont) ' correction executed for RSN Link - Acceleration vector filter!']; + cont = cont+1; + end + if ris_acc(i,j) < 0.8 || ris_acc(i,j) > 1.3 % Il nodo è fuori taratura! + if j == 1 + nn = 2; + while nn <= c + if ris_acc(i,nn) < 0.8 || ris_acc(i,nn) > 1.2 + angRSN(nodo:nodo+1,j) = angRSN(nodo:nodo+1,nn); + break + end + end + else + angRSN(nodo:nodo+1,j) = angRSN(nodo:nodo+1,j-1); + TempDef_RSN(i,j) = TempDef_RSN(i,j-1); + end + textA2 = ['' num2str(cont2) ' correction executed for RSN Link - uncalibrated Acceleration vector!']; + cont2 = cont2+1; + end + nodo = nodo+2; + end + end + fprintf(fileID,fmt,textA); + fprintf(fileID,fmt,textA2); +else + [c,r] = size(ris_acc); + angRSN = angRSN'; +end + +%% Temperatura +cont3 = 0; % contatore +FileTemperature = ['' IDcentralina '-' DTcatena '-RSN-Therm.csv']; +if isfile(FileTemperature) == 1 + DatiRaw = csvread(FileTemperature); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; +else + rDR = 1; + cDR = 1; +end +textT = 'There are not correction of RSN Link based on temperature filter'; +for b = 1:c % Data + nodo = 1; + for a = 1:r % Nodo + % NON considero i dati al di sopra dei 80 °C o al di sotto dei -30 °C! + if TempDef_RSN(a,b) > Tmax || TempDef_RSN(a,b) < Tmin + cont3 = cont3+1; + if b == 1 + if isfile(FileTemperature) == 1 + RawDate = find(DatiRaw(:,1)<=datenum(datainiRSN)); + if isempty(RawDate) == 1 + cc = 2; + while cc <= c + if TempDef_RSN(a,cc) > Tmax || TempDef_RSN(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_RSN(a,b) = TempDef_RSN(a,cc); + angRSN(nodo:nodo+1,b) = angRSN(nodo:nodo+1,cc); + else + if isnan(DatiRaw(RawDate(end),a+1)) == 0 + TempDef_RSN(a,b) = cellstr(num2str(DatiRaw(b+1,RawDate(end)))); + angRSN(nodo:nodo+1,b) = cellstr(num2str(DatiRaw(1+a*2:2+a*2,RawDate(end)))); + if ErrRSNLink(b,jj) == 0 + ErrRSNLink(b,jj) = 0.5; + end + wardat = 'Temperature data of RSN Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + else + cc = 2; + while cc <= c + if TempDef_RSN(a,cc) > Tmax || TempDef_RSN(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_RSN(a,b) = TempDef_RSN(a,cc); + angRSN(nodo:nodo+1,b) = angRSN(nodo:nodo+1,cc); + end + end + else + cc = 2; + while cc <= c + if TempDef_RSN(a,cc) > Tmax || TempDef_RSN(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_RSN(a,b) = TempDef_RSN(a,cc); + end + else + TempDef_RSN(a,b) = TempDef_RSN(a,b-1); + angRSN(nodo:nodo+1,j) = angRSN(nodo:nodo+1,j-1); + if ErrRSNLink(b,jj) == 0 + ErrRSNLink(b,jj) = 0.5; + end + end + textT = ['' num2str(cont3) ' correction executed for RSN Link - Temperature filter!']; + end + nodo = nodo+2; + end +end + +if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=ARRAYdateRSN(1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(ARRAYdateRSN(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(ARRAYdateRSN(:,1)>DatiRaw(RawDate1(end)+1,1)); + end +else + RawDate1 = []; + RawDate2 = 1; +end +if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:); ARRAYdateRSN(RawDate2(1):end) TempDef_RSN(:,RawDate2(1):end)' angRSN(:,RawDate2(1):end)']; +elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = [ARRAYdateRSN TempDef_RSN' angRSN']; +else + Dati = DatiRaw; +end +% Elimino appoggio più vecchio di un mese +RawDate3 = find(Dati(:,1) Ndatidespike + Ndati = NdatiMedia; + else + Ndati = Ndatidespike; + end + ini = round(Ndati/2)+1; + if rem(Ndati,2) == 0 + ini = ini+1; + end + clear NDati + angRSNHR = angRSNHR(ini:end,:); + TempDef_RSNHR = TempDef_RSNHR(ini:end,:); + ARRAYdateRSNHR = ARRAYdateRSNHR(ini:end,1); + ErrRSNLinkHR = ErrRSNLinkHR(ini:end,:); +end + +%% Temperatura +cont3 = 0; % contatore +FileTemperature = ['' IDcentralina '-' DTcatena '-RSNHR-Therm.csv']; +if isfile(FileTemperature) == 1 + DatiRaw = csvread(FileTemperature); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; +else + rDR = 1; + cDR = 1; +end +[Ndate,~] = size(ARRAYdateRSNHR); +Nnodi = rRSNHR; +TempDef_RSNHR = TempDef_RSNHR'; +angRSNHR = angRSNHR'; +textT = 'No correction needed for RSN Link HR - Temperature filter'; +for b = 1:Ndate % Data + nodo = 1; + for a = 1:Nnodi % Nodo + % NON considero i dati al di sopra dei 80 °C o al di sotto dei -30 °C! + if TempDef_RSNHR(a,b) > Tmax || TempDef_RSNHR(a,b) < Tmin + cont3 = cont3+1; + if b == 1 + if isfile(FileTemperature) == 1 + RawDate = find(DatiRaw(:,1)<=datenum(datainiRSNHR)); + if isempty(RawDate) == 1 + cc = 2; + while cc <= c + if TempDef_RSNHR(a,cc) > Tmax || TempDef_RSNHR(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_RSNHR(a,b) = TempDef_RSNHR(a,cc); + angRSNHR(nodo:nodo+1,b) = angRSNHR(nodo:nodo+1,cc); + else + if isnan(DatiRaw(RawDate(end),a+1)) == 0 + TempDef_RSNHR(a,b) = cellstr(num2str(DatiRaw(b+1,RawDate(end)))); + angRSNHR(nodo:nodo+1,b) = cellstr(num2str(DatiRaw(1+a*2:2+a*2,RawDate(end)))); + if ErrRSNLinkHR(b,a) == 0 + ErrRSNLinkHR(b,a) = 0.5; + end + wardat = 'Temperature data of RSN Link HR nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + else + cc = 2; + while cc <= c + if TempDef_RSNHR(a,cc) > Tmax || TempDef_RSNHR(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_RSNHR(a,b) = TempDef_RSNHR(a,cc); + angRSNHR(nodo:nodo+1,b) = angRSNHR(nodo:nodo+1,cc); + end + end + else + cc = 2; + while cc <= c + if TempDef_RSNHR(a,cc) > Tmax || TempDef_RSNHR(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_RSNHR(a,b) = TempDef_RSNHR(a,cc); + end + else + TempDef_RSNHR(a,b) = TempDef_RSNHR(a,b-1); + angRSNHR(nodo:nodo+1,b) = angRSNHR(nodo:nodo+1,b-1); + if ErrRSNLinkHR(b,a) == 0 + ErrRSNLinkHR(b,a) = 0.5; + end + end + textT = ['' num2str(cont3) ' correction executed for RSN Link HR - Temperature filter!']; + end + nodo = nodo+2; + end +end + +if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=ARRAYdateRSNHR(1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(ARRAYdateRSNHR(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(ARRAYdateRSNHR(:,1)>DatiRaw(RawDate1(end)+1,1)); + end +else + RawDate1 = []; + RawDate2 = 1; +end +if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:); ARRAYdateRSNHR(RawDate2(1):end) TempDef_RSNHR(:,RawDate2(1):end)' angRSNHR(:,RawDate2(1):end)']; +elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = [ARRAYdateRSNHR TempDef_RSNHR' angRSNHR']; +else + Dati = DatiRaw; +end +% Elimino appoggio più vecchio di un mese +RawDate3 = find(Dati(:,1)= ''' tempoini ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum = ''' NodeNum ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +BatTempo = curs.Data; +comando = ['select Date, Time, BatLevel from RawDataView where Date > ''' ... + dataini ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum = ''' NodeNum ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +BatData = curs.Data; +if strcmp(char(BatData(1)),'No Data') + Batteria = BatTempo; +elseif strcmp(char(BatTempo(1)),'No Data') + Batteria = BatData; +else + Batteria = [BatTempo;BatData]; +end + +% Batteria LoRa +NodeNum = '2'; +comando = ['select Date, Time, BatLevelModule from RawDataView where Date = ''' ... + dataini ''' and Time >= ''' tempoini ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum = ''' NodeNum ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +BatTempo = curs.Data; +comando = ['select Date, Time, BatLevelModule from RawDataView where Date > ''' ... + dataini ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum = ''' NodeNum ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +BatData = curs.Data; +if strcmp(char(BatData(1)),'No Data') + Batteria_LoRa = BatTempo; +elseif strcmp(char(BatTempo(1)),'No Data') + Batteria_LoRa = BatData; +else + Batteria_LoRa = [BatTempo;BatData]; +end + + +% Cerco la tipologia di centralina +comando = ['select type_id from units where name = ''' IDcentralina ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +Type = cell2mat(curs.Data); + +Data(1,1) = cellstr(date); +Data(1,2) = cellstr(time); + +%% RSN Link +if yesRSN == 0 % Non ci sono RSN Link + DatiRSNLink = []; + ErrRSNLink = []; + wardat = 'lettura function: there are not RSN Link' ; + fprintf(fileID,fmt,wardat); +else + RawDataFile = ['' IDcentralina '-' DTcatena '-RSN-RawData.csv']; + NAN = 0; + while NAN == 0 + if datenum(datainiRSN) == datenum(Data(1,1)) + tempoiniRSN = char(Data(1,2)); + end + NodeType = 'RSN Link'; + NodeNumRSN = num2str(cell2mat(NodoRSNLink(1,2))); % scarico i dati del primo nodo + % Scarico dei dati relativi alla centralina con informazioni di Data e ora, livello batteria e temperatura + % Step 1 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date = ''' ... + datainiRSN ''' and Time >= ''' tempoiniRSN ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumRSN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniRSN = curs.Data; + Ntempo = DATiniRSN; + [r,c] = size(DATiniRSN); + saltoRSN = 0; + if r==1 && c==1 + textdatRSN = 'Warning: error reading RSN Link (control unit data)!'; + fprintf(fileID,fmt,textdatRSN); + saltoRSN = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiRSN ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumRSN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2RSN = curs.Data; + Ndate = DAT2RSN; + if saltoRSN == 1 + DATiniRSN = DAT2RSN; + end + Check = size(DAT2RSN); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoRSN == 0 + DATiniRSN = [DATiniRSN; DAT2RSN]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniRSN); + if cD ~=1 + T = [cell2mat(DATiniRSN(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniRSN(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniRSN = T; + else + DATiniRSN = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoRSN == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiRSNLink = cell(rd+rt,4*rRSN); + else + DatiRSNLink = cell(rt,4*rRSN); + end + else + DatiRSNLink = cell(rd,4*rRSN); + end + + NRSNLink = cell2mat(NodoRSNLink(:,2)); + ii = 1; + col = 4; + w = 0; + while ii <= rRSN + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NRSNLink(ii,1); + nNodo = num2str(nN); + if MEMS == 2 % RSN Link 1.0 + comando = ['select Val0, Val1, Val2, Val6 from RawDataView where Date = ''' ... + datainiRSN ''' and Time >= ''' tempoiniRSN ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSN = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val6 from RawDataView where Date > ''' ... + datainiRSN ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSNd = curs.Data; + else % D-Fence + comando = ['select Val0, Val1, Val2, Val3 from RawDataView where Date = ''' ... + datainiRSN ''' and Time >= ''' tempoiniRSN ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSN = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val3 from RawDataView where Date > ''' ... + datainiRSN ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSNd = curs.Data; + end + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-3; + if saltoRSN == 0 + DatiRSNLink(1:rt,ini_col:col) = DATnodoRSN(:,:); + else + DatiRSNLink(1:rd,ini_col:col) = DATnodoRSNd(:,:); + end + + [rn,~] = size(DATnodoRSNd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoRSNd(i,:) = DATnodoRSNd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node RSN Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoRSN == 0 + DatiRSNLink(rt+1:rt+rd,ini_col:col) = DATnodoRSNd(:,:); + end + else + DatiRSNLink = DatiRSNLink(1:end,:); + end + okdatRSN = ['Data of RSN Link node number ' num2str(ii) ' of ' ... + num2str(rRSN) ' downloaded correctly']; + fprintf(fileID,fmt,okdatRSN); + ii = ii+1; + col = col+4; + end + if w == 0 + wardat = 'There are not warning for RSN Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiRSNLink); + ErrRSNLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroRSN == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiRSN)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiRSNLink(1,jj))); + idxND = find(strcmp('No Data',DatiRSNLink(1,jj))); + idxT = find(strcmp('---',DatiRSNLink(1,jj))); + idxT2 = find(strcmp('-',DatiRSNLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiRSNLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiRSNLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiRSNLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiRSNLink(1,jj))); + idxN = find(strcmp('null',DatiRSNLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of RSN Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroRSN == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiRSN)+1 < now + datainiRSN = datestr(datenum(datainiRSN)+1,'yyyy-mm-dd'); + break + else + yesRSN = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiRSN = datestr(datenum(datainiRSN)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiRSNLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrRSNLink(1,jj) = 1; + wardat = 'Data of RSN Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiRSN = datestr(datenum(datainiRSN)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c % nodi + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiRSNLink(:,jj))); + idxND = find(strcmp('No Data',DatiRSNLink(:,jj))); + idxT = find(strcmp('---',DatiRSNLink(:,jj))); + idxT2 = find(strcmp('-',DatiRSNLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiRSNLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiRSNLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiRSNLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiRSNLink(:,jj))); + idxN = find(strcmp('null',DatiRSNLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + wardat = 'Warning on the correction of RSN Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + NAN = 0; + ESCI = 1; + datainiRSN = datestr(datenum(datainiRSN)-1,'yyyy-mm-dd'); + break + end + DatiRSNLink(indice,jj) = DatiRSNLink(indice-1,jj); + ErrRSNLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r % nodi + check = isnan(cell2mat(DatiRSNLink(nnn,jj))); + if check == 1 + DatiRSNLink(nnn,jj) = DatiRSNLink(nnn-1,jj); + ErrRSNLink(nnn,jj) = 1; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of RSN Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiRSNLink = [DATiniRSN str2double(DatiRSNLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiRSNLink(a,1) == DatiRSNLink(a-1,1) + DatiRSNLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + if NuovoZeroRSN == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiRSNLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiRSNLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiRSNLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiRSNLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiRSNLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniSS ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumSS ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniSS = curs.Data; + Ntempo = DATiniSS; + [r,c] = size(DATiniSS); + saltoSS = 0; + if r==1 && c==1 + textdatTrL = 'Warning: error reading Shock Sensor (control unit data)!'; + fprintf(fileID,fmt,textdatTrL); + saltoSS = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiSS ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumSS ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2SS = curs.Data; + Ndate = DAT2SS; + if saltoSS == 1 + DATiniSS = DAT2SS; + end + Check = size(DAT2SS); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoSS == 0 + DATiniSS = [DATiniSS; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniSS); + if cD ~=1 + T = [cell2mat(DATiniSS(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniSS(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniSS = T; + else + DATiniSS = []; + end + + % Scarico dati relativi ai singoli nodi + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoSS == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiShockSensor = cell(rd+rt,1*rSS); + else + DatiShockSensor = cell(rt,1*rSS); + end + else + DatiShockSensor = cell(rd,1*rSS); + end + NShockSensor = cell2mat(NodoSS(:,2)); + col = 1; + w = 0; + + while ii <= rSS + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NShockSensor(ii,1); + nNodo = num2str(nN); + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiSS ''' and Time >= ''' tempoiniSS ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoSS = curs.Data; + + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiSS ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoSSd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoSS == 0 + DatiShockSensor(1:rt,col) = DATnodoSS(:,:); + else + DatiShockSensor(1:rd,col) = DATnodoSSd(:,:); + end + + [rn,~] = size(DATnodoSSd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoSSd(i,:) = DATnodoSSd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Shock Sensor ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoSS == 0 + DatiShockSensor(rt+1:rt+rd,col) = DATnodoSSd(:,:); + end + else + DatiShockSensor = DatiShockSensor(1:end,:); + end + okdatSS = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rSS) ' Shock Sensor nodes downloaded correctly']; + fprintf(fileID,fmt,okdatSS); + ii = ii+1; + col = col+1; + end + if w == 0 + wardat = 'There are not warning for Shock Sensor!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con uno zero (no info sull'attivazione del + % Trigger) + [r,c] = size(DatiShockSensor); + ErrShockSensor = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroSS == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiSS)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiShockSensor(1,jj))); + idxT = find(strcmp('---',DatiShockSensor(1,jj))); + idxT2 = find(strcmp('-',DatiShockSensor(1,jj))); + idxE2 = find(strcmp('Err2',DatiShockSensor(1,jj))); + idxE255 = find(strcmp('Err255',DatiShockSensor(1,jj))); + idxD = find(strcmp('DMUXe',DatiShockSensor(1,jj))); + idxE1F = find(strcmp('Err1File',DatiShockSensor(1,jj))); + idxN = find(strcmp('null',DatiShockSensor(1,jj))); + idxRX = find(strcmp('No RX',DatiShockSensor(1,jj))); + idxI = find(strcmp('id Error',DatiShockSensor(1,jj))); + idxM = find(strcmp('MUX id Error',DatiShockSensor(1,jj))); + idxC = find(strcmp('CH n. Error',DatiShockSensor(1,jj))); + idxU = find(strcmp('Unknown Error',DatiShockSensor(1,jj))); + idxDis = find(strcmp('Dis.',DatiShockSensor(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiShockSensor(1,jj))); + idxNS = find(strcmp('NotSupp',DatiShockSensor(1,jj))); + idxU2 = find(strcmp('Unknown',DatiShockSensor(1,jj))); + idxNA = find(strcmp('NotAv',DatiShockSensor(1,jj))); + idxND = find(strcmp('No Data',DatiShockSensor(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiShockSensor(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + idx = union(idx,idxDis); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Shock Sensor nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroSS == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiSS)+1 < now + datainiSS = datestr(datenum(datainiSS)+1,'yyyy-mm-dd'); + break + else + yesSS = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiSS = datestr(datenum(datainiSS)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiShockSensor(1,jj) = 0; + ErrShockSensor(1,jj) = 1; + wardat = 'Data of Shock Sensor nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiSS = datestr(datenum(datainiSS)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + idxE = find(strcmp('Err1',DatiShockSensor(:,jj))); + idxT = find(strcmp('---',DatiShockSensor(:,jj))); + idxT2 = find(strcmp('-',DatiShockSensor(:,jj))); + idxE2 = find(strcmp('Err2',DatiShockSensor(:,jj))); + idxE255 = find(strcmp('Err255',DatiShockSensor(:,jj))); + idxD = find(strcmp('DMUXe',DatiShockSensor(:,jj))); + idxE1F = find(strcmp('Err1File',DatiShockSensor(:,jj))); + idxN = find(strcmp('null',DatiShockSensor(:,jj))); + idxRX = find(strcmp('No RX',DatiShockSensor(:,jj))); + idxI = find(strcmp('id Error',DatiShockSensor(:,jj))); + idxM = find(strcmp('MUX id Error',DatiShockSensor(:,jj))); + idxC = find(strcmp('CH n. Error',DatiShockSensor(:,jj))); + idxU = find(strcmp('Unknown Error',DatiShockSensor(:,jj))); + idxDis = find(strcmp('Dis.',DatiShockSensor(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiShockSensor(:,jj))); + idxNS = find(strcmp('NotSupp',DatiShockSensor(:,jj))); + idxU2 = find(strcmp('Unknown',DatiShockSensor(:,jj))); + idxNA = find(strcmp('NotAv',DatiShockSensor(:,jj))); + idxND = find(strcmp('No Data',DatiShockSensor(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiShockSensor(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + idx = union(idx,idxDis); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + wardat = 'Warning on the correction of Shock Sensor nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + NAN = 0; + ESCI = 1; + datainiSS = datestr(datenum(datainiSS)-1,'yyyy-mm-dd'); + break + else + DatiShockSensor(indice,jj) = 0; + ErrShockSensor(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiShockSensor(nnn,jj))); + if check == 1 + DatiShockSensor(nnn,jj) = 0; + ErrShockSensor(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Shock Sensor data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiShockSensor = [DATiniSS str2double(DatiShockSensor)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiShockSensor(a,1) == DatiShockSensor(a-1,1) + DatiShockSensor(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end +end + +%% RSN Link HR +if yesRSNHR == 0 % Non ci sono RSN Link HR + DatiRSNLinkHR = []; + ErrRSNLinkHR = []; + wardat = 'lettura function: there are not RSN Link HR'; + fprintf(fileID,fmt,wardat); +else + NAN = 0; + RawDataFile = ['' IDcentralina '-' DTcatena '-RSNHR-RawData.csv']; + NodeType = 'RSN Link HR'; + while NAN == 0 + if datenum(datainiRSNHR) == datenum(Data(1,1)) + tempoiniRSNHR = char(Data(1,2)); + end + NodeNumRSNHR = num2str(cell2mat(NodoRSNLinkHR(1,2))); % scarico i dati del primo nodo + % Scarico dei dati relativi alla centralina con informazioni di Data e ora, livello batteria e temperatura + % Step 1 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date = ''' ... + datainiRSNHR ''' and Time >= ''' tempoiniRSNHR ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumRSNHR ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniRSNHR = curs.Data; + Ntempo = DATiniRSNHR; + [r,c] = size(DATiniRSNHR); + saltoRSNHR = 0; + if r==1 && c==1 + textdatRSNHR = 'Warning: error reading RSN Link HR (control unit data)!'; + fprintf(fileID,fmt,textdatRSNHR); + saltoRSNHR = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiRSNHR ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumRSNHR ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2RSNHR = curs.Data; + Ndate = DAT2RSNHR; + if saltoRSNHR == 1 + DATiniRSNHR = DAT2RSNHR; + end + Check = size(DAT2RSNHR); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoRSNHR == 0 + DATiniRSNHR = [DATiniRSNHR; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniRSNHR); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniRSNHR(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniRSNHR(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniRSNHR = T; + else + DATiniRSNHR = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoRSNHR == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiRSNLinkHR = cell(rd+rt,3*rRSNHR); + else + DatiRSNLinkHR = cell(rt,3*rRSNHR); + end + else + DatiRSNLinkHR = cell(rd,3*rRSNHR); + end + NRSNLinkHR = cell2mat(NodoRSNLinkHR(:,2)); + col = 3; + ii = 1; + w = 0; + while ii <= rRSNHR + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NRSNLinkHR(ii,1); + nNodo = num2str(nN); + comando = ['select Val0, Val1, Val6 from RawDataView where Date = ''' ... + datainiRSNHR ''' and Time >= ''' tempoiniRSNHR ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSNHR = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val6 from RawDataView where Date > ''' ... + datainiRSNHR ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRSNHRd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-2; + if saltoRSNHR == 0 + DatiRSNLinkHR(1:rt,ini_col:col) = DATnodoRSNHR(:,:); + else + DatiRSNLinkHR(1:rd,ini_col:col) = DATnodoRSNHRd(:,:); + end + + [rn,~] = size(DATnodoRSNHRd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoRSNHRd(i,:) = DATnodoRSNHRd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node RSN Link HR ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoRSNHR == 0 + DatiRSNLinkHR(rt+1:rt+rd,ini_col:col) = DATnodoRSNHRd(:,:); + end + else + DatiRSNLinkHR = DatiRSNLinkHR(1:end,:); + end + okdatRSNHR = ['Data of RSN Link HR node number ' num2str(ii) ' of ' ... + num2str(rRSNHR) ' downloaded correctly']; + fprintf(fileID,fmt,okdatRSNHR); + ii = ii+1; + col = col+3; + end + if w == 0 + wardat = 'There are not warning for RSN Link HR!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiRSNLinkHR); + ErrRSNLinkHR = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroRSNHR == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiRSNHR)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiRSNLinkHR(1,jj))); + idxND = find(strcmp('No Data',DatiRSNLinkHR(1,jj))); + idxT = find(strcmp('---',DatiRSNLinkHR(1,jj))); + idxT2 = find(strcmp('-',DatiRSNLinkHR(1,jj))); + idxE2 = find(strcmp('Err2',DatiRSNLinkHR(1,jj))); + idxE255 = find(strcmp('Err255',DatiRSNLinkHR(1,jj))); + idxD = find(strcmp('DMUXe',DatiRSNLinkHR(1,jj))); + idxE1F = find(strcmp('Err1File',DatiRSNLinkHR(1,jj))); + idxN = find(strcmp('null',DatiRSNLinkHR(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of RSN Link HR nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroRSNHR == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiRSNHR)+1 < now + datainiRSNHR = datestr(datenum(datainiRSNHR)+1,'yyyy-mm-dd'); + break + else + yesRSNHR = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiRSNHR = datestr(datenum(datainiRSNHR)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiRSNLinkHR(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrRSNLinkHR(1,jj) = 1; + wardat = 'Data of RSN Link HR nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiRSNHR = datestr(datenum(datainiRSNHR)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c % nodi + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiRSNLinkHR(:,jj))); + idxND = find(strcmp('No Data',DatiRSNLinkHR(:,jj))); + idxT = find(strcmp('---',DatiRSNLinkHR(:,jj))); + idxT2 = find(strcmp('-',DatiRSNLinkHR(:,jj))); + idxE2 = find(strcmp('Err2',DatiRSNLinkHR(:,jj))); + idxE255 = find(strcmp('Err255',DatiRSNLinkHR(:,jj))); + idxD = find(strcmp('DMUXe',DatiRSNLinkHR(:,jj))); + idxE1F = find(strcmp('Err1File',DatiRSNLinkHR(:,jj))); + idxN = find(strcmp('null',DatiRSNLinkHR(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiRSNHR = datestr(datenum(datainiRSNHR)-1,'yyyy-mm-dd'); + break + end + DatiRSNLinkHR(indice,jj) = DatiRSNLinkHR(indice-1,jj); + ErrRSNLinkHR(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r % date + check = isnan(cell2mat(DatiRSNLinkHR(nnn,jj))); + if check == 1 + DatiRSNLinkHR(nnn,jj) = DatiRSNLinkHR(nnn-1,jj); + ErrRSNLinkHR(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of RSN Link HR data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiRSNLinkHR = [DATiniRSNHR str2double(DatiRSNLinkHR)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiRSNLinkHR(a,1) == DatiRSNLinkHR(a-1,1) + DatiRSNLinkHR(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + if NuovoZeroRSNHR == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiRSNLinkHR(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiRSNLinkHR(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiRSNLinkHR(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiRSNLinkHR(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiRSNLinkHR; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniLL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumLL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniLL = curs.Data; + Ntempo = DATiniLL; + [r,c] = size(DATiniLL); + saltoLL = 0; + if r==1 && c==1 + textdatLL = 'Warning: error reading Load Link (control unit data)!'; + fprintf(fileID,fmt,textdatLL); + saltoLL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiLL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumLL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2LL = curs.Data; + Ndate = DAT2LL; + if saltoLL == 1 + DATiniLL = DAT2LL; + end + Check = size(DAT2LL); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoLL == 0 + DATiniLL = [DATiniLL; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniLL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniLL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniLL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniLL = T; + else + DATiniLL = []; + end + + % Scarico dati relativi ai singoli nodi + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoLL == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiLoadLink = cell(rd+rt,1*rLL); + else + DatiLoadLink = cell(rt,1*rLL); + end + else + DatiLoadLink = cell(rd,1*rLL); + end + NLoadLink = cell2mat(NodoLoadLink(:,2)); + col = 1; + w = 0; + while ii <= rLL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NLoadLink(ii,1); + nNodo = num2str(nN); + if strcmp(NodoLoadLink(1,4),'mV/V') + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiLL ''' and Time >= ''' tempoiniLL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + elseif strcmp(NodoLoadLink(1,4),'4-20 mA') + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiLL ''' and Time >= ''' tempoiniLL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + elseif strcmp(NodoLoadLink(1,4),'ADC') + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiLL ''' and Time >= ''' tempoiniLL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + end + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoLL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + if strcmp(NodoLoadLink(1,4),'mV/V') + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiLL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + elseif strcmp(NodoLoadLink(1,4),'4-20 mA') + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiLL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + elseif strcmp(NodoLoadLink(1,4),'ADC') + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiLL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + end + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoLLd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoLL == 0 + DatiLoadLink(1:rt,col) = DATnodoLL(:,:); + else + DatiLoadLink(1:rd,col) = DATnodoLLd(:,:); + end + + [rn,~] = size(DATnodoLLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoLLd(i,:) = DATnodoLLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Load Link node ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoLL == 0 + DatiLoadLink(rt+1:rt+rd,col) = DATnodoLLd(:,:); + end + else + DatiLoadLink = DatiLoadLink(1:end,:); + end + okdatLL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rLL) ' Load Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatLL); + ii = ii+1; + col = col+1; + end + if w == 0 + wardat = 'There are not warning for Load Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiLoadLink); + ErrLoadLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroLL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiLL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + for jj=1:c + % Se il nodo è Dis., devo aumentare di uno la data (il nodo non + % è ancora stato installato!) + if strcmp('Dis.',DatiLoadLink(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',DatiLoadLink(dis,jj)) == 0 + DatiLoadLink = DatiLoadLink(dis:end,:); + DATiniLL = DATiniLL(dis:end,:); + [r,c] = size(DatiLoadLink); + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiLL)+1 < now + datainiLL = datestr(datenum(datainiLL)+1,'yyyy-mm-dd'); + break + else + yesLL = 0; + end + end + end + end + end + if DIS ~= 1 && yesLL == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiLoadLink(1,jj))); + idxT = find(strcmp('---',DatiLoadLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiLoadLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiLoadLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiLoadLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiLoadLink(1,jj))); + idxN = find(strcmp('null',DatiLoadLink(1,jj))); + idxRX = find(strcmp('No RX',DatiLoadLink(1,jj))); + idxI = find(strcmp('id Error',DatiLoadLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiLoadLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiLoadLink(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiLoadLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiLoadLink(1,jj))); + idxDis = find(strcmp('Dis.',DatiLoadLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiLoadLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiLoadLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiLoadLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiLoadLink(1,jj))); + idxND = find(strcmp('No Data',DatiLoadLink(1,jj))); + idxPP = find(strcmp('[]',DatiLoadLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxE2); + idx = union(idx,idxCE); + idx = union(idx,idxND); + idx = union(idx,idxPP); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxCE); + idx = union(idx,idxU); + idx = union(idx,idxDis); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Load Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroLL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiLL)+1 < now + datainiLL = datestr(datenum(datainiLL)+1,'yyyy-mm-dd'); + break + else + yesLL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiLL = datestr(datenum(datainiLL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiLoadLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrLoadLink(1,jj) = 1; + wardat = 'Data of Load Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiLL = datestr(datenum(datainiLL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + idxE = find(strcmp('Err1',DatiLoadLink(:,jj))); + idxT = find(strcmp('---',DatiLoadLink(:,jj))); + idxT2 = find(strcmp('-',DatiLoadLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiLoadLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiLoadLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiLoadLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiLoadLink(:,jj))); + idxN = find(strcmp('null',DatiLoadLink(:,jj))); + idxRX = find(strcmp('No RX',DatiLoadLink(:,jj))); + idxI = find(strcmp('id Error',DatiLoadLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiLoadLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiLoadLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiLoadLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiLoadLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiLoadLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiLoadLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiLoadLink(:,jj))); + idxND = find(strcmp('No Data',DatiLoadLink(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiLoadLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiLL = datestr(datenum(datainiLL)+1,'yyyy-mm-dd'); + break + else + DatiLoadLink(indice,jj) = DatiLoadLink(indice-1,jj); + ErrLoadLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiLoadLink(nnn,jj))); + if check == 1 + DatiLoadLink(nnn,jj) = DatiLoadLink(nnn-1,jj); + ErrLoadLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Load Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiLoadLink = [DATiniLL str2double(DatiLoadLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiLoadLink(a,1) == DatiLoadLink(a-1,1) + DatiLoadLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + end + if NuovoZeroLL == 1 && yesLL == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiLoadLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiLoadLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiLoadLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiLoadLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiLoadLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniTrL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumTrL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniTrL = curs.Data; + Ntempo = DATiniTrL; + [r,c] = size(DATiniTrL); + saltoTrL = 0; + if r==1 && c==1 + textdatTrL = 'Warning: error reading Trigger Link (control unit data)!'; + fprintf(fileID,fmt,textdatTrL); + saltoTrL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiTrL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumTrL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2TrL = curs.Data; + Ndate = DAT2TrL; + if saltoTrL == 1 + DATiniTrL = DAT2TrL; + end + Check = size(DAT2TrL); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoTrL == 0 + DATiniTrL = [DATiniTrL; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniTrL); + if cD ~=1 + T = [cell2mat(DATiniTrL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniTrL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniTrL = T; + else + DATiniTrL = []; + end + + % Scarico dati relativi ai singoli nodi + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoTrL == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiTriggerLink = cell(rd+rt,1*rTrL); + else + DatiTriggerLink = cell(rt,1*rTrL); + end + else + DatiTriggerLink = cell(rd,1*rTrL); + end + NTriggerLink = cell2mat(NodoTriggerLink(:,2)); + col = 1; + w = 0; + + while ii <= rTrL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NTriggerLink(ii,1); + nNodo = num2str(nN); + if Type == 7 + comando = ['select Val1, Val0 from RawDataView where Date = ''' ... + datainiTrL ''' and Time >= ''' tempoiniTrL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + else + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiTrL ''' and Time >= ''' tempoiniTrL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + end + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTrL = curs.Data; + + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + if Type == 7 + comando = ['select Val1, Val0 from RawDataView where Date > ''' ... + datainiTrL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + else + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiTrL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + end + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTrLd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoTrL == 0 + if Type == 7 + DatiTriggerLink(1:rt,col:col+1) = DATnodoTrL(:,:); + else + DatiTriggerLink(1:rt,col) = DATnodoTrL(:,:); + end + else + if Type == 7 + DatiTriggerLink(1:rd,col:col+1) = DATnodoTrLd(:,:); + else + DatiTriggerLink(1:rd,col) = DATnodoTrLd(:,:); + end + end + + [rn,~] = size(DATnodoTrLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoTrLd(i,:) = DATnodoTrLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Trigger Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoTrL == 0 + if Type == 7 + DatiTriggerLink(rt+1:rt+rd,col:col+1) = DATnodoTrLd(:,:); + else + DatiTriggerLink(rt+1:rt+rd,col) = DATnodoTrLd(:,:); + end + end + else + DatiTriggerLink = DatiTriggerLink(1:end,:); + end + okdatTrL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rTrL) ' Trigger Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatTrL); + ii = ii+1; + if Type == 7 + col = col+2; + else + col = col+1; + end + end + if w == 0 + wardat = 'There are not warning for Trigger Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con uno zero (no info sull'attivazione del + % Trigger) + [r,c] = size(DatiTriggerLink); + ErrTriggerLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroTrL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiTrL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTriggerLink(1,jj))); + idxT = find(strcmp('---',DatiTriggerLink(1,jj))); + idxT2 = find(strcmp('-',DatiTriggerLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiTriggerLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiTriggerLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiTriggerLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiTriggerLink(1,jj))); + idxN = find(strcmp('null',DatiTriggerLink(1,jj))); + idxRX = find(strcmp('No RX',DatiTriggerLink(1,jj))); + idxI = find(strcmp('id Error',DatiTriggerLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiTriggerLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiTriggerLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiTriggerLink(1,jj))); + idxDis = find(strcmp('Dis.',DatiTriggerLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiTriggerLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiTriggerLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiTriggerLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiTriggerLink(1,jj))); + idxND = find(strcmp('No Data',DatiTriggerLink(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiTriggerLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + idx = union(idx,idxDis); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Trigger Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroTrL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiTrL)+1 < now + datainiTrL = datestr(datenum(datainiTrL)+1,'yyyy-mm-dd'); + break + else + yesTrL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiTrL = datestr(datenum(datainiTrL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiTriggerLink(1,jj) = 0; + ErrTriggerLink(1,jj) = 1; + wardat = 'Data of Trigger Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiTrL = datestr(datenum(datainiTrL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + idxE = find(strcmp('Err1',DatiTriggerLink(:,jj))); + idxT = find(strcmp('---',DatiTriggerLink(:,jj))); + idxT2 = find(strcmp('-',DatiTriggerLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiTriggerLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiTriggerLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiTriggerLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiTriggerLink(:,jj))); + idxN = find(strcmp('null',DatiTriggerLink(:,jj))); + idxRX = find(strcmp('No RX',DatiTriggerLink(:,jj))); + idxI = find(strcmp('id Error',DatiTriggerLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiTriggerLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiTriggerLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiTriggerLink(:,jj))); + idxDis = find(strcmp('Dis.',DatiTriggerLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiTriggerLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiTriggerLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiTriggerLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiTriggerLink(:,jj))); + idxND = find(strcmp('No Data',DatiTriggerLink(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiTriggerLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + idx = union(idx,idxDis); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + wardat = 'Warning on the correction of Trigger Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + NAN = 0; + ESCI = 1; + datainiTrL = datestr(datenum(datainiTrL)-1,'yyyy-mm-dd'); + break + else + DatiTriggerLink(indice,jj) = 0; + ErrTriggerLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiTriggerLink(nnn,jj))); + if check == 1 + DatiTriggerLink(nnn,jj) = 0; + ErrTriggerLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Trigger Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiTriggerLink = [DATiniTrL str2double(DatiTriggerLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiTriggerLink(a,1) == DatiTriggerLink(a-1,1) + DatiTriggerLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end +end + +%% Debris Link +if yesDL == 0 % Non ci sono Debris Link + DatiDebrisLink = []; + ErrDebrisLink = []; + wardat = 'lettura function: there are not Debris Link' ; + fprintf(fileID,fmt,wardat); +else + RawDataFile = ['' IDcentralina '-' DTcatena '-DL-RawData.csv']; + NAN = 0; + while NAN == 0 + if datenum(datainiDL) == datenum(Data(1,1)) + tempoiniDL = char(Data(1,2)); + end + NodeType = 'Debris Link'; + NodeNumDL = num2str(cell2mat(NodoDebrisLink(1,2))); % scarico i dati del primo nodo + % Scarico dei dati relativi alla centralina con informazioni di Data e ora, livello batteria e temperatura + % Step 1 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date = ''' ... + datainiDL ''' and Time >= ''' tempoiniDL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumDL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniDL = curs.Data; + Ntempo = DATiniDL; + [r,c] = size(DATiniDL); + saltoDL = 0; + if r==1 && c==1 + textdatDL = 'Warning: error reading Debris Link (control unit data)!'; + fprintf(fileID,fmt,textdatDL); + saltoDL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiDL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumDL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2DL = curs.Data; + Ndate = DAT2DL; + if saltoDL == 1 + DATiniDL = DAT2DL; + end + Check = size(DAT2DL); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoDL == 0 + DATiniDL = [DATiniDL; DAT2DL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniDL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATiniDL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniDL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniDL = T; + else + DATiniDL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoDL == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiDebrisLink = cell(rd+rt,4*rDL); + else + DatiDebrisLink = cell(rt,4*rDL); + end + else + DatiDebrisLink = cell(rd,4*rDL); + end + + NDebrisLink = cell2mat(NodoDebrisLink(:,2)); + ii = 1; + col = 4; + w = 0; + while ii <= rDL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NDebrisLink(ii,1); + nNodo = num2str(nN); + comando = ['select Val0, Val1, Val2, Val6 from RawDataView where Date = ''' ... + datainiDL ''' and Time >= ''' tempoiniDL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoDL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val6 from RawDataView where Date > ''' ... + datainiDL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoDLd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-3; + if saltoDL == 0 + DatiDebrisLink(1:rt,ini_col:col) = DATnodoDL(:,:); + else + DatiDebrisLink(1:rd,ini_col:col) = DATnodoDLd(:,:); + end + + [rn,~] = size(DATnodoDLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoDLd(i,:) = DATnodoDLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Debris Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoDL == 0 + DatiDebrisLink(rt+1:rt+rd,ini_col:col) = DATnodoDLd(:,:); + end + else + DatiDebrisLink = DatiDebrisLink(1:end,:); + end + okdatDL = ['Data of Debris Link node number ' num2str(ii) ' of ' ... + num2str(rDL) ' downloaded correctly']; + fprintf(fileID,fmt,okdatDL); + ii = ii+1; + col = col+4; + end + if w == 0 + wardat = 'There are not warning for Debris Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiDebrisLink); + ErrDebrisLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroDL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiDL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiDebrisLink(1,jj))); + idxND = find(strcmp('No Data',DatiDebrisLink(1,jj))); + idxT = find(strcmp('---',DatiDebrisLink(1,jj))); + idxT2 = find(strcmp('-',DatiDebrisLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiDebrisLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiDebrisLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiDebrisLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiDebrisLink(1,jj))); + idxN = find(strcmp('null',DatiDebrisLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Debris Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroDL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiDL)+1 < now + datainiDL = datestr(datenum(datainiDL)+1,'yyyy-mm-dd'); + break + else + yesDL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiDL = datestr(datenum(datainiDL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiDebrisLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrDebrisLink(1,jj) = 1; + wardat = 'Data of Debris Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiDL = datestr(datenum(datainiDL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c % nodi + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiDebrisLink(:,jj))); + idxND = find(strcmp('No Data',DatiDebrisLink(:,jj))); + idxT = find(strcmp('---',DatiDebrisLink(:,jj))); + idxT2 = find(strcmp('-',DatiDebrisLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiDebrisLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiDebrisLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiDebrisLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiDebrisLink(:,jj))); + idxN = find(strcmp('null',DatiDebrisLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + wardat = 'Warning on the correction of Debris Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + NAN = 0; + ESCI = 1; + datainiDL = datestr(datenum(datainiDL)-1,'yyyy-mm-dd'); + break + end + DatiDebrisLink(indice,jj) = DatiDebrisLink(indice-1,jj); + ErrDebrisLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r % nodi + check = isnan(cell2mat(DatiDebrisLink(nnn,jj))); + if check == 1 + DatiDebrisLink(nnn,jj) = DatiDebrisLink(nnn-1,jj); + ErrDebrisLink(nnn,jj) = 1; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Debris Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiDebrisLink = [DATiniDL str2double(DatiDebrisLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiDebrisLink(a,1) == DatiDebrisLink(a-1,1) + DatiDebrisLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + if NuovoZeroDL == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiDebrisLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiDebrisLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiDebrisLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiDebrisLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiDebrisLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' ... + DataGF ''' and tool_name = ''' DTcatena... + ''' and unit_name = ''' IDcentralina ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniGF = curs.Data; + Batteria = DATiniGF(:,2); + + % Modifico il formato di data e ora in DATini. + [rD,~] = size(DATiniGF); + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + comando = ['select xacc, yacc, zacc, cacc from ELABDATAGFLOW where EventDateTime >= ''' ... + DataGF ''' and tool_name = ''' DTcatena ''' and unit_name = ''' IDcentralina ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoGF = curs.Data; + + [rDa,cDa] = size(DATnodoGF); + if rDa == 1 && cDa == 1 + okdatGF = 'G-Flow Link does NOT work'; + fprintf(fileID,fmt,okdatGF); + else + DatiGFLink = [DATiniGF(:,1) DATnodoGF(:,:)]; + okdatGF = 'Data of G-Flow Link downloaded correctly'; + fprintf(fileID,fmt,okdatGF); + end + + ErrGFLink = zeros(rD,1); + for g = 1:rD + if cell2mat(DATnodoGF(g,1))>3 && cell2mat(DATnodoGF(g,2))>3 && cell2mat(DATnodoGF(g,3))>3 + ErrGFLink(g,1) = 1; + end + end + NAN = 1; + end +end + +%% G-Shock Link +if yesGS == 0 % Non ci sono G-Shock + DatiGSLink = []; + ErrGSLink = []; + wardat = 'lettura function: there are not G-Shock Link' ; + fprintf(fileID,fmt,wardat); +else + NAN = 0; + while NAN == 0 + if datenum(datainiGS) == datenum(Data(1,1)) + tempoiniGS = char(Data(1,2)); + end + DataGS = [datainiGF tempoiniGS]; + % Scarico dei dati relativi alla centralina con informazioni di Data e ora, livello batteria e temperatura + % Step 1 (vedi commento più avanti) + comando = ['select EventDateTime, battery_level from ELABDATAGFLOW where EventDateTime >= ''' ... + DataGS ''' and tool_name = ''' DTcatena... + ''' and unit_name = ''' IDcentralina ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniGS = curs.Data; + Batteria = DATiniGS(:,2); + + % Modifico il formato di data e ora in DATini. + [rD,~] = size(DATiniGS); + DatiGSLink = cell(rD,1); + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + comando = ['select xacc, yacc, zacc, cacc from ELABDATAGFLOW where EventDateTime >= ''' ... + DataGS ''' and tool_name = ''' DTcatena ''' and unit_name = ''' IDcentralina ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoGS = curs.Data; + + [rDa,cDa] = size(DATnodoGS); + if rDa == 1 && cDa == 1 + okdatGS = 'G-Shock Link does NOT work'; + fprintf(fileID,fmt,okdatGS); + else + DatiGSLink = [DATiniGS DATnodoGS(:,:)]; + okdatGS = 'Data of G-Shock Link downloaded correctly'; + fprintf(fileID,fmt,okdatGS); + end + + ErrGSLink = zeros(rD,1); + for g = 1:rD + if DATnodoGS(g,1)>3 && DATnodoGS(g,2)>3 && DATnodoGS(g,3)>3 + ErrGSLink(g,1) = 1; + end + end + NAN = 1; + end +end + +text = 'lettura function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/RSN/letturaCal.m b/RSN/letturaCal.m new file mode 100755 index 0000000..7ab0b03 --- /dev/null +++ b/RSN/letturaCal.m @@ -0,0 +1,168 @@ +% Funzione che legge i valori di calibrazione per i vari sensori + +function [DCalRSNTot,DCalRSNHRTot,DCalLLTot,DCalDLTot,yesRSN,yesRSNHR,yesLL,yesDL]... + = letturaCal(MEMS,IDcentralina,DTcatena,catena,yesRSN,yesRSNHR,yesLL,yesDL,rRSN,... + rRSNHR,rLL,rDL,NodoRSNLink,NodoLoadLink,NodoDebrisLink,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'letturaCal function started'; +fprintf(fileID,fmt,text); + +% Inizializzo le matrici +[rC,~] = size(catena); +idNodo = cell2mat(catena(:,1)); + +% RSN +if isempty(NodoRSNLink) == 1 + DCalRSNTot = []; +else + if strcmp(NodoRSNLink(1,4),'ADC') || strcmp(NodoRSNLink(1,4),'null') || isempty(NodoRSNLink(1,4)) == 1 + DCalRSNTot = cell(rRSN,17); % matrice che concatena i dati di calibrazione relativi a ciascun nodo RSN Link + elseif strcmp(NodoRSNLink(1,4),'Gradi') + DCalRSNTot = []; + end +end + +% RSN HR +DCalRSNHRTot = cell(rRSNHR,6); % matrice che concatena i dati relativi a ciascun nodo RSN Link HR + +% Load Link +if isempty(NodoLoadLink) == 1 + DCalLLTot = []; +else + if strcmp(NodoLoadLink(1,4),'4-20 mA') + DCalLLTot = cell(rLL,3); % matrice che concatena i dati relativi a ciascun nodo Load Link [4-20mA] + elseif strcmp(NodoLoadLink(1,4),'mV/V') || strcmp(NodoLoadLink(1,4),'ADC') + DCalLLTot = cell(rLL,2); % matrice che concatena i dati relativi a ciascun nodo Load Link [mV/V] + end +end + +% Debris LInk +if isempty(NodoDebrisLink) == 1 + DCalDLTot = []; +else + if strcmp(NodoDebrisLink(1,4),'ADC') || strcmp(NodoDebrisLink(1,4),'null') || isempty(NodoDebrisLink(1,4)) == 1 + DCalDLTot = cell(rDL,11); % matrice che concatena i dati di calibrazione relativi a ciascun nodo RSN Link + elseif strcmp(NodoRSNLink(1,4),'Gradi') + DCalDLTot = []; + end +end + +% Matrice con testi di conferma lettura o warning di lettura per le varie tipologie di nodi +RSNL = 1; +RSNLHR = 1; +LL = 1; +DL = 1; + +for a = 1:rC + nNodo = mat2str(cell2mat(catena(a,3))); + if idNodo(a,1) == 38 % RSN Link + if MEMS == 2 + %% Importazione dei dati di calibrazione per RSN Link + comando = ['select Cal0, Cal1, Cal2, Cal3, Cal4, Cal5, Cal6, Cal7, Cal8, '... + 'CalA, CalB, CalC, CalD, CalE, CalF, CalG, CalH from CalibrationView where UnitName = '''... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo '''']; + curs = exec(conn,comando); + curs = fetch(curs); + DCalRSN = curs.Data; % matrice che raccoglie i dati del nodo numero 'a' di tipo RSN Link + [rr,cc] = size(DCalRSN); + if rr==1 && cc==1 + w = ['Warning: there was an error reading calibration values of RSN Link node number ' nNodo '']; + fprintf(fileID,fmt,w); + yesRSN = 0; + else + DCalRSNTot(RSNL,:) = DCalRSN(:,:); + RSNL = RSNL+1; + ok = ['Calibration parameters of RSN Link node number ' nNodo ' downloaded correctly']; + fprintf(fileID,fmt,ok); + end + else + ok = ['Calibration parameters of RSN Link node number ' nNodo ' NOT downloaded because the node is RSN Link 2.0 - Murata MEMS']; + fprintf(fileID,fmt,ok); + end + + elseif idNodo(a,1) == 39 % RSN Link HR + %% Importazione dei dati di calibrazione per RSN Link HR + comando = ['select Cal0, Cal1, Cal2, Cal3, Cal4, Cal5 from CalibrationView where UnitName = '''... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo '''']; + curs = exec(conn,comando); + curs = fetch(curs); + DCalRSNHR = curs.Data; % matrice che raccoglie i dati del nodo numero 'a' di tipo RSN Link HR + [rr,cc] = size(DCalRSNHR); + if rr==1 && cc==1 + w = ['Warning: there was an error reading calibration values of RSN Link HR node number ' nNodo '']; + fprintf(fileID,fmt,w); + yesRSNHR = 0; + else + DCalRSNHRTot(RSNLHR,:) = DCalRSNHR(:,:); + RSNLHR = RSNLHR+1; + ok = ['Calibration parameters of RSN Link HR node number ' nNodo ' downloaded correctly']; + fprintf(fileID,fmt,ok); + end + + elseif idNodo(a,1) == 15 % Load Link + %% Importazione dei dati di calibrazione per Load Link + if strcmp(NodoLoadLink(1,4),'4-20 mA') + comando = ['select Cal0, Cal1, Cal2 from CalibrationView where UnitName = '''... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo ''' ']; + elseif strcmp(NodoLoadLink(1,4),'mV/V') + comando = ['select Cal1, Cal2 from CalibrationView where UnitName = '''... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo ''' ']; + elseif strcmp(NodoLoadLink(1,4),'ADC') + comando = ['select Cal0, Cal1 from CalibrationView where UnitName = '''... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo ''' ']; + end + curs = exec(conn,comando); + curs = fetch(curs); + DCalLL = curs.Data; % matrice che raccoglie i dati del nodo numero 'a' di tipo Load Link + [rr,cc] = size(DCalLL); + if rr==1 && cc==1 + w = ['Warning: there was an error reading calibration values of node Load Link number ' nNodo '']; + fprintf(fileID,fmt,w); + yesLL = 0; + else + DCalLLTot(LL,:) = DCalLL(:,:); + LL = LL+1; + ok = ['Calibration of node Load Link number ' nNodo ' downloaded correctly']; + fprintf(fileID,fmt,ok); + end + + elseif idNodo(a,1) == 49 % Debris Link + if MEMS == 2 + comando = ['select Cal0, Cal1, Cal2, Cal3, Cal4, Cal5, Cal6, Cal7, Cal8, CalA, CalB from CalibrationView where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo '''']; + curs = exec(conn,comando); + curs = fetch(curs); + DCalDL = curs.Data; % matrice che raccoglie i dati del nodo numero 'a' di tipo Tunnel Link + [rr,cc] = size(DCalDL); + if rr==1 && cc==1 + text = ['Warning: there was an error reading Debris Link node number ' nNodo '']; + fprintf(fileID,fmt,text); + yesDL = 0; + else + DCalDLTot(DL,:) = DCalDL(:,:); + DL = DL+1; + text = ['Calibration of Debris Link node number ' nNodo ' downloaded correctly']; + fprintf(fileID,fmt,text); + end + else + ok = ['Calibration parameters of Debris Link node number ' nNodo ' NOT downloaded because the node is Murata MEMS']; + fprintf(fileID,fmt,ok); + end + + end +end + +text = 'NuovaConversione function started'; +fprintf(fileID,fmt,text); + +% Nuova conversione da fare per il nuovo database +[DCalRSNTot,DCalRSNHRTot,DCalLLTot,DCalDLTot] = NuovaConversione(DCalRSNTot,... + DCalRSNHRTot,DCalLLTot,DCalDLTot); + +text = 'NuovaConversione & letturaCal functions ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/RSN/loadcell.m b/RSN/loadcell.m new file mode 100755 index 0000000..0a33488 --- /dev/null +++ b/RSN/loadcell.m @@ -0,0 +1,93 @@ +%% Funzione che elabora i Load Link + +function [LoadDef,ErrLoadLink,ARRAYdateLL] = loadcell(LoadDef,ErrLoadLink,... + ARRAYdateLL,NuovoZeroLL,NdatiMedia,Ndatidespike,yesRSN,IDcentralina,DTcatena,FileName) + +% Inizio del ciclo di elaborazione +text = 'loadcell function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +if NuovoZeroLL == 1 + if NdatiMedia > Ndatidespike + Ndati = NdatiMedia; + else + Ndati = Ndatidespike; + end + ini = round(Ndati/2)+1; + if rem(Ndati,2) == 0 + ini = ini+1; + end + clear NDati + LoadDef = LoadDef(ini:end,:); + ARRAYdateLL = ARRAYdateLL(ini:end,1); + ErrLoadLink = ErrLoadLink(ini:end,:); +end + +if yesRSN == 1 % filtro SOLO le celle connesse a un modulo BPM + newdata = 0; % n° dati filtrati + [rLL,cLL]=size(LoadDef); + CelleUpdate = ['' IDcentralina '-' DTcatena '-LoadCell.csv']; + if isfile(CelleUpdate) == 1 + ValoriCelle = csvread(CelleUpdate); + ValoriCelle(:,1) = ValoriCelle(:,1) + 730000; + for n = 1:cLL % celle + for d = 1:rLL %date + if LoadDef(d,n) < -50 % kN + if d == 1 + [~,cC] = size(ValoriCelle); + if cC ~= 1 + LastData = find(ValoriCelle(:,1) s + a = 0; + else + if strcmp(cell2mat(NodoRSNLinkHR3Dwork(q,1)),'RSN Link HR 3D') + rL = 1+rL; % ultima riga con dati che non siano celle vuote + end + end + q = q+1; + end + if Control == 1 + NodoRSNLinkHR3D = NodoRSNLinkHR3Dwork(1:rL,:); + elseif Control == 0 + NodoRSNLinkHR3D = []; + end + textRSNHR3D = ['There are ',num2str(rL),' RSN Link HR 3D nodes; ']; +else + textRSNHR3D = 'There are no RSN Link HR 3D; '; + NodoRSNLinkHR3D = []; +end +fprintf(fileID,fmt,textRSNHR3D); + +%% Load Link +% carico le informazioni relative al numero e alla profondità per LOAD LINK +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 15 order by num']; +curs = exec(conn,comando); +curs = fetch(curs); +Leggo = curs.Data; +[rL,cL] = size(Leggo); +if rL == 1 && cL == 1 + textLL = 'There are not Load Link; '; + NodoLoadLink = []; +else + depth = cell2mat(Leggo(:,2)); + depth = num2cell(depth); + nome = cell(rL,1); + for i=1:rL + nome(i,1) = cellstr('Load Link'); + end + NodoLoadLink = [nome Leggo(:,1) depth Leggo(:,3)]; + % inverto la matrice Nodi (il primo nodo è il più profondo) + textLL = ['There are ',num2str(rL),' Load Link nodes; ']; +end +fprintf(fileID,fmt,textLL); + +%% Trigger Link +% carico le informazioni relative al numero e alla profondità per TRIGGER LINK +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 40 order by num']; +curs = exec(conn,comando); +curs = fetch(curs); +Leggo = curs.Data; +[rL,cL] = size(Leggo); +if rL == 1 && cL == 1 + textTrL = 'There are not Trigger Link; '; + NodoTriggerLink = []; +else + depth = cell2mat(Leggo(:,2)); + depth = num2cell(depth); + nome = cell(rL,1); + for i=1:rL + nome(i,1) = cellstr('Trigger Link'); + end + NodoTriggerLink = [nome Leggo(:,1) depth Leggo(:,3)]; + % inverto la matrice Nodi (il primo nodo è il più profondo) + textTrL = ['There are ',num2str(rL),' Trigger Link nodes; ']; +end +fprintf(fileID,fmt,textTrL); + +%% G-Flow Link +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 48 order by num']; +curs = exec(conn,comando); +curs = fetch(curs); +Leggo = curs.Data; +[rL,cL] = size(Leggo); +if rL == 1 && cL == 1 + textGFL = 'There are not G-Flow Link; '; + NodoGflowLink = []; +else + depth = cell2mat(Leggo(:,2)); + depth = num2cell(depth); + nome = cell(rL,1); + for i=1:rL + nome(i,1) = cellstr('G-Flow Link'); + end + NodoGflowLink = [nome Leggo(:,1) depth Leggo(:,3)]; + % inverto la matrice Nodi (il primo nodo è il più profondo) + textGFL = ['There are ',num2str(rL),' G-Flow Link nodes; ']; +end +fprintf(fileID,fmt,textGFL); + +%% G-Shock Link +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 50 order by num']; +curs = exec(conn,comando); +curs = fetch(curs); +Leggo = curs.Data; +[rL,cL] = size(Leggo); +if rL == 1 && cL == 1 + textGS = 'There are not G-Shock Link; '; + NodoGshockLink = []; +else + depth = cell2mat(Leggo(:,2)); + depth = num2cell(depth); + nome = cell(rL,1); + for i=1:rL + nome(i,1) = cellstr('G-Shock Link'); + end + NodoGshockLink = [nome Leggo(:,1) depth Leggo(:,3)]; + % inverto la matrice Nodi (il primo nodo è il più profondo) + textGS = ['There are ',num2str(rL),' G-Shock Link nodes; ']; +end +fprintf(fileID,fmt,textGS); + +%% Debris Link +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 49 order by num']; +curs = exec(conn,comando); +curs = fetch(curs); +Leggo = curs.Data; +[rL,cL] = size(Leggo); +if rL == 1 && cL == 1 + textDL = 'There are not Debris Link; '; + NodoDebrisLink = []; +else + depth = cell2mat(Leggo(:,2)); + depth = num2cell(depth); + nome = cell(rL,1); + for i=1:rL + nome(i,1) = cellstr('Debris Link'); + end + NodoDebrisLink = [nome Leggo(:,1) depth Leggo(:,3)]; + % inverto la matrice Nodi (il primo nodo è il più profondo) + textDL = ['There are ',num2str(rL),' Debris Link nodes; ']; +end +fprintf(fileID,fmt,textDL); + +text = 'Nodes defined correctly and tipologiaNodi function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/ASSEa.m b/Tilt/ASSEa.m new file mode 100755 index 0000000..c05aa64 --- /dev/null +++ b/Tilt/ASSEa.m @@ -0,0 +1,18 @@ +function [Na,Ea,Za]=ASSEa(ax,angle,SpeTL,i,j) + +angle = angle*2*pi/360; + +if ax(i,j)>=0 + Na = SpeTL(i)*ax(i,j)*cos(angle); + Ea = -SpeTL(i)*ax(i,j)*sin(angle); +else + Na = -SpeTL(i)*ax(i,j)*cos(angle); + Ea = SpeTL(i)*ax(i,j)*sin(angle); +end + +% calcolo il coseno dell'angolo di inclinazione +cosBeta = (1 - ax(i,j)^2)^0.5; +Z = SpeTL(i)*cosBeta; +Za = SpeTL(i) - Z; % L'abbassamento è POSITIVO + +end \ No newline at end of file diff --git a/Tilt/ASSEa_HR.m b/Tilt/ASSEa_HR.m new file mode 100755 index 0000000..4d78c20 --- /dev/null +++ b/Tilt/ASSEa_HR.m @@ -0,0 +1,19 @@ +function [Na,Ea,Za]=ASSEa_HR(xAngTLHR,angle,SpeTLHR) + +angle = angle*2*pi/360; +ax = sin(xAngTLHR); + +if ax >=0 + Na = SpeTLHR*ax*cos(angle); + Ea = -SpeTLHR*ax*sin(angle); +else + Na = -SpeTLHR*ax*cos(angle); + Ea = SpeTLHR*ax*sin(angle); +end + +% calcolo il coseno dell'angolo di inclinazione +cosBeta = (1 - ax^2)^0.5; +Z = SpeTLHR*cosBeta; +Za = SpeTLHR - Z; % L'abbassamento è POSITIVO + +end \ No newline at end of file diff --git a/Tilt/ASSEb.m b/Tilt/ASSEb.m new file mode 100755 index 0000000..6509ba2 --- /dev/null +++ b/Tilt/ASSEb.m @@ -0,0 +1,17 @@ +function [Nb,Eb,Zb]=ASSEb(ay,angle,SpeTL,i,j) + +angle = angle*2*pi/360; + +if ay(i,j)>=0 + Nb = SpeTL(i)*ay(i,j)*sin(angle); + Eb = SpeTL(i)*ay(i,j)*cos(angle); +else + Nb = -SpeTL(i)*ay(i,j)*sin(angle); + Eb = -SpeTL(i)*ay(i,j)*cos(angle); +end + +% calcolo il coseno dell'angolo di inclinazione +cosBeta = (1 - ay(i,j)^2)^0.5; +Z = SpeTL(i)*cosBeta; +Zb = SpeTL(i) - Z; % L'abbassamento è POSITIVO +end \ No newline at end of file diff --git a/Tilt/ASSEb_HR.m b/Tilt/ASSEb_HR.m new file mode 100755 index 0000000..498b557 --- /dev/null +++ b/Tilt/ASSEb_HR.m @@ -0,0 +1,19 @@ +function [Nb,Eb,Zb]=ASSEb_HR(yAngTLHR,angle,SpeTLHR) + +angle = angle*2*pi/360; +ay = sin(yAngTLHR); + +if ay >=0 + Nb = SpeTLHR*ay*cos(angle); + Eb = SpeTLHR*ay*sin(angle); +else + Nb = -SpeTLHR*ay*cos(angle); + Eb = -SpeTLHR*ay*sin(angle); +end + +% calcolo il coseno dell'angolo di inclinazione +cosBeta = (1 - ay^2)^0.5; +Z = SpeTLHR*cosBeta; +Zb = SpeTLHR - Z; % L'abbassamento è POSITIVO + +end \ No newline at end of file diff --git a/Tilt/ASSEb_HR_OLD.m b/Tilt/ASSEb_HR_OLD.m new file mode 100755 index 0000000..02b4f2b --- /dev/null +++ b/Tilt/ASSEb_HR_OLD.m @@ -0,0 +1,19 @@ +function [Nb,Eb,Zb]=ASSEb_HR_OLD(yAngTLHR,angle,SpeTLHR) + +angle = angle*2*pi/360; +ay = sin(yAngTLHR); + +if ay >=0 + Nb = SpeTLHR*ay*cos(angle); + Eb = -SpeTLHR*ay*sin(angle); +else + Nb = -SpeTLHR*ay*cos(angle); + Eb = SpeTLHR*ay*sin(angle); +end + +% calcolo il coseno dell'angolo di inclinazione +cosBeta = (1 - ay^2)^0.5; +Z = SpeTLHR*cosBeta; +Zb = SpeTLHR - Z; % L'abbassamento è POSITIVO + +end \ No newline at end of file diff --git a/Tilt/AlertReport.m b/Tilt/AlertReport.m new file mode 100755 index 0000000..fb6df1b --- /dev/null +++ b/Tilt/AlertReport.m @@ -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) 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 \ No newline at end of file diff --git a/Tilt/Baro.m b/Tilt/Baro.m new file mode 100755 index 0000000..8bf3286 --- /dev/null +++ b/Tilt/Baro.m @@ -0,0 +1,52 @@ +function [BaroDef,BaroDefT,ARRAYdateBL,ErrBaroLink] = Baro(BaroDef,BaroDefT,... + ARRAYdateBL,NuovoZeroBL,NdatiMediaP,Ndatidespike,ErrBaroLink,rBL,marginePiezo,FileName) + +text = 'Baro function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +if NuovoZeroBL == 1 + if NdatiMediaP > Ndatidespike + Ndati = NdatiMediaP; + else + Ndati = Ndatidespike; + end + ini = round(Ndati/2)+1; + if rem(Ndati,2) == 0 + ini = ini+1; + end + clear NDati + ini = ini + marginePiezo; + if ini < 6 + ini = 6; + end + ErrBaroLink = ErrBaroLink(ini:end,:); + BaroDef = BaroDef(ini:end,:); + BaroDefT = BaroDefT(ini:end,:); + ARRAYdateBL = ARRAYdateBL(ini:end,1); +end + +[r,~] = size(ErrBaroLink); +Matrice_err = zeros(r,rBL); +for i = 1:r % date + d = 1; + for n = 1:rBL % nodi + j = 1; + err = ErrBaroLink(i,d:d+1); + while j <= 2 + if err(1,j) == 1 + Matrice_err(i,n) = 1; + end + j = j+1; + end + d = d+2; + end +end +ErrBaroLink = Matrice_err'; + +text = 'Baro Link elaborated correctly. Baro function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/CANCELLA.m b/Tilt/CANCELLA.m new file mode 100755 index 0000000..a89aefe --- /dev/null +++ b/Tilt/CANCELLA.m @@ -0,0 +1,152 @@ +DTcatena = input('Digitare il nome della catena: ','s'); + +dbname = 'ase_lar'; +username = 'matlab'; +password = 'Ase@2014'; +driver = 'com.mysql.jdbc.Driver'; +dburl = ['jdbc:mysql://160.78.21.55:3306/' dbname]; +tablename = 'ELABDATADISP'; +colnames = {'ToolNameID','NodeNum','EventDate','EventTime','XShift','YShift'}; +% javaclasspath('C:\Program Files\MATLAB\R2008a\java\mysql-connector-java-3.1.14-bin.jar'); +conn = database(dbname, username, password, driver, dburl); + +comando = ['delete from ELABDATADISP where ToolNameID = ''' DTcatena '''']; +curs = exec(conn,comando); +close(conn) + +%% +% dbname = 'ase_lar'; +% username = 'matlab'; +% password = 'Ase@2014'; +% driver = 'com.mysql.jdbc.Driver'; +% dburl = ['jdbc:mysql://160.78.21.55:3306/' dbname]; +% +% conn = database(dbname, username, password, driver, dburl); +% +% DTcatena = 'DT0094'; +% date = '2019-07-02'; +% comando = ['delete from ELABDATADISP where ToolNameID = ''' DTcatena ''' and EventDate >= ''' date '''']; +% +% curs = exec(conn,comando); +% close(conn) +% disp('Fatto') + +%% 1 Cancello dati prima della data X di un determinato nodo +dbname = 'ase_lar'; +username = 'matlab'; +password = 'Ase@2014'; +driver = 'com.mysql.jdbc.Driver'; +dburl = ['jdbc:mysql://212.237.30.90:3306/' dbname]; + +conn = database(dbname, username, password, driver, dburl); + +IDcentralina = 'ID0243'; +DTcatena = 'DT0252'; +date = '2023-07-24'; +NodeNum = '10'; + +comando = ['delete from ELABDATADISP where UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena... + ''' and EventDate <= ''' date ''' and NodeNum = ''' NodeNum '''']; + +curs = exec(conn,comando); +close(conn) + +disp('Fine!') + +%% 2 Cancello dati alla data X prima dell'ora Y di un determinato nodo +dbname = 'ase_lar'; +username = 'matlab'; +password = 'Ase@2014'; +driver = 'com.mysql.jdbc.Driver'; +dburl = ['jdbc:mysql://212.237.30.90:3306/' dbname]; + +conn = database(dbname, username, password, driver, dburl); + +IDcentralina = 'ID0239'; +DTcatena = 'DT0003'; +date = '2023-07-24'; +time = '11:40:00'; +NodeNum = '4'; + +comando = ['delete from ELABDATADISP where UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena... + ''' and EventDate = ''' date ''' and EventTime <= ''' time ''' and NodeNum = ''' NodeNum '''']; + +curs = exec(conn,comando); +close(conn) + +disp('Fine!') + +%% Tempo +dbname = 'ase_lar'; +username = 'matlab'; +password = 'Ase@2014'; +driver = 'com.mysql.jdbc.Driver'; +dburl = ['jdbc:mysql://212.237.30.90:3306/' dbname]; + +conn = database(dbname, username, password, driver, dburl); + +IDcentralina = 'ID0226'; +DTcatena = 'DT0244'; +date = '2023-07-25'; +time = '12:00:00'; + +comando = ['delete from ELABDATADISP where UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and EventDate = ''' date ''' and EventTime >= ''' time '''']; + +curs = exec(conn,comando); +close(conn) + +disp('Fine!') + +%% 2 Cancello tutti i dati +dbname = 'ase_lar'; +username = 'matlab'; +password = 'Ase@2014'; +driver = 'com.mysql.jdbc.Driver'; +dburl = ['jdbc:mysql://212.237.30.90:3306/' dbname]; + +conn = database(dbname, username, password, driver, dburl); + +DTcatena = '13489-S07'; +IDcentralina = 'TEPBA'; +comando = ['delete from ELABDATADISP where ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina ''' ']; + +curs = exec(conn,comando); +close(conn) + +disp('Fine!') + +% TEPBA-13489-S07 + + +%% 3 Cancello dati di un intervallo temporale +dbname = 'ase_lar'; +username = 'matlab'; +password = 'Ase@2014'; +driver = 'com.mysql.jdbc.Driver'; +dburl = ['jdbc:mysql://212.237.30.90:3306/' dbname]; + +conn = database(dbname, username, password, driver, dburl); + +IDcentralina = 'ID0236'; +DTcatena = 'DT0177'; +date1 = '2023-07-31'; +date2 = '2023-08-27'; +comando = ['delete from ELABDATADISP where ToolNameID = ''' DTcatena ''' and Unitname = '''... + IDcentralina ''' and EventDate >= ''' date1 ''' and EventDate <= ''' date2 ''' ']; + +curs = exec(conn,comando); +close(conn) + +disp('Fine!') + +%% 4 +INI = 1; +for i = INI:INI+6 + DatiInPlaceLink(1,i) = cellstr(num2str(DatiRaw(end,i+1))); +end + +INI = 1; +for i = INI:INI+5 + DatiInPlaceLinkHR(1,i) = cellstr(num2str(DatiRaw(end,i+1))); +end \ No newline at end of file diff --git a/Tilt/CalcoloBiax_TLH.m b/Tilt/CalcoloBiax_TLH.m new file mode 100755 index 0000000..d03d3cd --- /dev/null +++ b/Tilt/CalcoloBiax_TLH.m @@ -0,0 +1,31 @@ +function [Y_TLH,Z_TLH,asseX_TLH,asseY_TLH,asseZ_TLH,AlfaX_TLH,AlfaY_TLH] = CalcoloBiax_TLH(... + SpeTLH,PsTLH,ii,jj,ax,ay,asseX_TLH,asseY_TLH,asseZ_TLH,Y_TLH,Z_TLH,AlfaX_TLH,... + AlfaY_TLH,Traversine) + +% Spostamento lungo l'asse X registrato dal nodo i +Xi = Traversine * ay(ii,jj); +% Spostamento lungo l'asse Y registrato dal nodo i +Yi = -1*(SpeTLH(ii,1) - SpeTLH(ii,1) * (1 - ax(ii,jj).^2).^0.5); % SP*cos(alfa) +% Spostamento lungo l'asse Z registrato dal nodo i; uso -1 per adattarlo al sistema di riferimento scelto +% Zi = -1*SpeTLH(ii,1) * ax(ii,jj); % SP*sin(alfa) % fino a 11/06/2021 +Zi = SpeTLH(ii,1) * ax(ii,jj); % SP*sin(alfa) % dopo 11/06/2021 + +% Rollio +AlfaX_TLH(ii,jj) = asind(ay(ii,jj)); +% Inclinazione +AlfaY_TLH(ii,jj) = asind(ax(ii,jj)); + +% Matrici singoli spostamenti +asseX_TLH(ii,jj) = Xi; +asseY_TLH(ii,jj) = Yi; +asseZ_TLH(ii,jj) = Zi; + +if ii==1 + Y_TLH (ii,jj) = PsTLH(ii,1) + asseY_TLH(ii,jj); + Z_TLH (ii,jj) = asseZ_TLH(ii,jj); +else + Y_TLH(ii,jj) = PsTLH(ii,1) + asseY_TLH(ii,jj) + Y_TLH(ii-1,jj) - PsTLH(ii-1,1); + Z_TLH(ii,jj) = Z_TLH(ii-1,jj) + asseZ_TLH(ii,jj); +end + +end \ No newline at end of file diff --git a/Tilt/CalcoloBiax_TLHRH.m b/Tilt/CalcoloBiax_TLHRH.m new file mode 100755 index 0000000..52a0811 --- /dev/null +++ b/Tilt/CalcoloBiax_TLHRH.m @@ -0,0 +1,27 @@ +function [Y_TLHRH,Z_TLHRH,asseY_TLHRH,asseZ_TLHRH,AlfaX_TLHRH,AlfaY_TLHRH]... + = CalcoloBiax_TLHRH(SpeTLHRH,PsTLHRH,ii,jj,ax,ay,asseY_TLHRH,asseZ_TLHRH,... + Y_TLHRH,Z_TLHRH,AlfaX_TLHRH,AlfaY_TLHRH) + +% Spostamento lungo l'asse Y registrato dal nodo i +Yi = -1*(SpeTLHRH(ii,1) - SpeTLHRH(ii,1) * cos(ax(ii,jj))); % SP*cos(alfa) +% Spostamento lungo l'asse Z registrato dal nodo i; +Zi = SpeTLHRH(ii,1) * sin(ax(ii,jj)); % SP*sin(alfa) + +% Rollio +AlfaX_TLHRH(ii,jj) = ay(ii,jj)/0.01745329251994329576923690768489; % Torno in gradi +% Inclinazione +AlfaY_TLHRH(ii,jj) = ax(ii,jj)/0.01745329251994329576923690768489; + +% Matrici singoli spostamenti +asseY_TLHRH(ii,jj) = Yi; +asseZ_TLHRH(ii,jj) = Zi; + +if ii==1 + Y_TLHRH (ii,jj) = PsTLHRH(ii) + asseY_TLHRH(ii,jj); + Z_TLHRH (ii,jj) = asseZ_TLHRH(ii,jj); +else + Y_TLHRH(ii,jj) = PsTLHRH(ii,1) + asseY_TLHRH(ii,jj) + Y_TLHRH(ii-1,jj) - PsTLHRH(ii-1,1); + Z_TLHRH(ii,jj) = Z_TLHRH(ii-1,jj) + asseZ_TLHRH(ii,jj); +end + +end \ No newline at end of file diff --git a/Tilt/CalcoloRain.m b/Tilt/CalcoloRain.m new file mode 100755 index 0000000..6c1f8bd --- /dev/null +++ b/Tilt/CalcoloRain.m @@ -0,0 +1,98 @@ +function [Rain,RainCum,ARRAYdateRL,ErrRainLink] = CalcoloRain(Dati_RL,ARRAYdateRL,... + DatiElabRainLink,NuovoZeroRL,NdatiMedia,ErrRainLink,rRL,margine,Unit,... + IDcentralina,conn,FileName) + +text = 'CalcoloRain function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +if NuovoZeroRL == 1 + if NdatiMedia == 1 + ini = 2; + Rain_Rif = Dati_RL(2,:) - Dati_RL(1,:); + else + ini = round(NdatiMedia/2); + if rem(NdatiMedia,2) == 0 + ini = ini+1; + end + ini = ini + margine; + if ini < 6 + ini = 6; + end + Rain_Rif = Dati_RL(ini,:) - Dati_RL(ini-1,:); + end + ErrRainLink = ErrRainLink(ini:end,:)'; + Dati_RL = Dati_RL(ini:end,:); + DatiElabRainLink = DatiElabRainLink(ini:end,:); + ARRAYdateRL = ARRAYdateRL(ini:end,1); +else + ErrRainLink = ErrRainLink'; + [rR]=size(Dati_RL); + if rR > 1 + Rain_Rif = Dati_RL(2,:) - Dati_RL(1,:); + else + Rain_Rif = Dati_RL(1,:); + end +end + +[r,c] = size(Dati_RL); +Rain = zeros(r,c); + +comando = ['select type_id from units where name = ''' IDcentralina ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +Type = cell2mat(curs.Data); +if Type == 7 % NESA + Rain = Dati_RL; +else + if strcmp(Unit,'SwissMetNet') + Rain = Dati_RL; + else + var = diff(Dati_RL',1,2); + varT = var'; + [a,b] = size(varT); + for ii = 1:a + for jj = 1:b + if varT(ii,jj) <0 + varT(ii,jj) = 0; % in questo modo tengo conto degli eventuali azzeramenti del contatore + end + if ii == 1 && Rain_Rif(1,b) < 0 + Rain_Rif(1,b) = 0; + end + end + end + Rain(1,:) = Rain_Rif; + for ii = 2:r + Rain(ii,:) = varT(ii-1,:); + end + end +end + +if NuovoZeroRL == 0 + RainCum = cumsum(Rain); +else % se ho dati precedenti, devo sommarli a quelli + [~,cE] = size(DatiElabRainLink); + Rif_Rain = zeros(1,rRL); + cont = 4; + n = 1; + while cont<=cE + Rif_Rain(1,n) = cell2mat(DatiElabRainLink(1,cont)); % ultimo valore di cumulata definitivo su DB + cont=cont+4; + n = n+1; + end + RainCum_p = cumsum(Rain)-Rain(1,:); % cumulata dei nuovi dati + [row,col] = size(Rain); + RainCum = zeros(row,col); + for i = 1:row + for j = 1:col + RainCum(i,j) = RainCum_p(i,j) + Rif_Rain(1,j); + end + end +end + +text = 'Single and cumulated rain values calculated correctly. CalcoloRain function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/CalcoloSPP.m b/Tilt/CalcoloSPP.m new file mode 100755 index 0000000..41421f7 --- /dev/null +++ b/Tilt/CalcoloSPP.m @@ -0,0 +1,39 @@ +function [SPP,ARRAYdateSPP] = CalcoloSPP(DatiSPPLink,FileName) + +text = 'CalcoloSPP function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +[r,c]=size(DatiSPPLink); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 1:c + check = isnan(DatiSPPLink(a,b)); + if check == 1 + DatiSPPLink(a,b) = DatiSPPLink(a-1,b); + Ncorr = Ncorr+1; + end + end +end +text = [num2str(Ncorr) ' NaN of SPP Link corrected by CalcoloSPP function']; +fprintf(fileID,fmt,text); + +ARRAYdateSPP = DatiSPPLink(:,1); % data +val_SPP = DatiSPPLink(:,2:end); % dati presenza acqua +[r,c] = size(val_SPP ); +SPP = zeros(r,c); +for ii = 1:r + for jj = 1:c + if val_SPP(ii,jj) >2.1 % V + SPP(ii,jj) = 1; % Modificato 28/06/23 + end + end +end + +text = 'SPP sensor calculated correctly. CalcoloSPP function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/CalcoloSnow.m b/Tilt/CalcoloSnow.m new file mode 100755 index 0000000..91b49a9 --- /dev/null +++ b/Tilt/CalcoloSnow.m @@ -0,0 +1,101 @@ +function [Snow,SnowCum,ARRAYdateSL,ErrSnowLink] = CalcoloSnow(DatiSnowLink,... + DatiElabSnowLink,NuovoZeroSL,NdatiMedia,ErrSnowLink,rSL,margine,Unit,... + IDcentralina,conn,FileName) + +text = 'CalcoloSnow function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +ARRAYdateSL = DatiSnowLink(:,1); +Dati_SL = DatiSnowLink(:,2); + +if NuovoZeroSL == 1 + if NdatiMedia == 1 + ini = 2; + Snow_Rif = Dati_SL(2,:) - Dati_SL(1,:); + else + ini = round(NdatiMedia/2); + if rem(NdatiMedia,2) == 0 + ini = ini+1; + end + ini = ini + margine; + if ini < 6 + ini = 6; + end + Snow_Rif = Dati_SL(ini,:) - Dati_SL(ini-1,:); + end + ErrSnowLink = ErrSnowLink(ini:end,:)'; + Dati_SL = Dati_SL(ini:end,:); + DatiElabSnowLink = DatiElabSnowLink(ini:end,:); + ARRAYdateSL = ARRAYdateSL(ini:end,1); +else + ErrSnowLink = ErrSnowLink'; + [rR]=size(Dati_SL); + if rR > 1 + Snow_Rif = Dati_SL(2,:) - Dati_SL(1,:); + else + Snow_Rif = Dati_SL(1,:); + end +end + +[r,c] = size(Dati_SL); +Snow = zeros(r,c); + +comando = ['select type_id from units where name = ''' IDcentralina ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +Type = cell2mat(curs.Data); +if Type == 7 % NESA + Snow = Dati_SL; +else + if strcmp(Unit,'SwissMetNet') + Snow = Dati_SL; + else + var = diff(Dati_SL',1,2); + varT = var'; + [a,b] = size(varT); + for ii = 1:a + for jj = 1:b + if varT(ii,jj) <0 + varT(ii,jj) = 0; % in questo modo tengo conto degli eventuali azzeramenti del contatore + end + if ii == 1 && Snow_Rif(1,b) < 0 + Snow_Rif(1,b) = 0; + end + end + end + Snow(1,:) = Snow_Rif; + for ii = 2:r + Snow(ii,:) = varT(ii-1,:); + end + end +end + +if NuovoZeroSL == 0 + SnowCum = cumsum(Snow); +else % se ho dati precedenti, devo sommarli a quelli + [~,cE] = size(DatiElabSnowLink); + Rif_Rain = zeros(1,rSL); + cont = 4; + n = 1; + while cont<=cE + Rif_Rain(1,n) = cell2mat(DatiElabSnowLink(1,cont)); % ultimo valore di cumulata definitivo su DB + cont=cont+4; + n = n+1; + end + RainCum_p = cumsum(Snow)-Snow(1,:); % cumulata dei nuovi dati + [row,col] = size(Snow); + SnowCum = zeros(row,col); + for i = 1:row + for j = 1:col + SnowCum(i,j) = RainCum_p(i,j) + Rif_Rain(1,j); + end + end +end + +text = 'Single and cumulated snow values calculated correctly. CalcoloSnow function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/DB_date_time.m b/Tilt/DB_date_time.m new file mode 100755 index 0000000..e5c7acd --- /dev/null +++ b/Tilt/DB_date_time.m @@ -0,0 +1,25 @@ +function idElabData = DB_date_time(IDcentralina,DTcatena,NodeNum,ListaDate,ARRAYdate,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; +idElabData = zeros(l,1); % Contiene gli id delle date delle quali ho già dati +cc = 1; % contatore +for ii=1:l + dString = datestr(ARRAYdate(ii),'yyyy-mm-dd'); + tString = datestr(ARRAYdate(ii),'HH:MM:SS'); + + comando = ['select idElabData from ELABDATADISP where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' ... + nNodo ''' and EventDate = ''' dString ''' and EventTime = ''' tString ''' order by EventDate']; + curs = exec(conn,comando); + curs = fetch(curs); + idDate = curs.Data; + if strcmp(idDate,'No Data') + idElabData(cc,1) = 0; % 0 indica che il dato non è presente su DB + else + idElabData(cc,1) = cell2mat(idDate); + end + cc = cc+1; +end + +end \ No newline at end of file diff --git a/Tilt/DB_date_time_RIS.m b/Tilt/DB_date_time_RIS.m new file mode 100755 index 0000000..412f34f --- /dev/null +++ b/Tilt/DB_date_time_RIS.m @@ -0,0 +1,24 @@ +function idElabData_RIS = DB_date_time_RIS(IDcentralina,DTcatena,NodeNum,ListaDate,ARRAYdate,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; +idElabData_RIS = zeros(l,1); % Contiene gli id delle date delle quali ho già dati +cc = 1; % contatore +for ii=1:l + dString = datestr(ARRAYdate(ii),'yyyy-mm-dd HH:MM:SS'); + + comando = ['select id from ELABDATARISUL where UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' ... + nNodo ''' and EventTimestamp = ''' dString ''' order by EventTimestamp']; + curs = exec(conn,comando); + curs = fetch(curs); + idDate = curs.Data; + if strcmp(idDate,'No Data') + idElabData_RIS(cc,1) = 0; % 0 indica che il dato non è presente su DB + else + idElabData_RIS(cc,1) = cell2mat(idDate); + end + cc = cc+1; +end + +end \ No newline at end of file diff --git a/Tilt/DBwriteBL.m b/Tilt/DBwriteBL.m new file mode 100755 index 0000000..344a563 --- /dev/null +++ b/Tilt/DBwriteBL.m @@ -0,0 +1,39 @@ +function DBwriteBL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + check = isnan(cell2mat(DATAinsert(ii,7))); + if check == 0 + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime','pressure','T_node','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),DATAinsert(ii,4),... + DATAinsert(ii,5),DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8)]; + fastinsert(conn,tablename,colnames,data); + else + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime','pressure','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),DATAinsert(ii,4),... + DATAinsert(ii,5),DATAinsert(ii,6),DATAinsert(ii,8)]; + fastinsert(conn,tablename,colnames,data); + end + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + check = isnan(cell2mat(DATAinsert(ii,7))); + if check == 0 + colnames = {'pressure','T_node','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8)]; + else + colnames = {'pressure','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,8)]; + end + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = ''' cell2mat(DATAinsert(ii,4))... + ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end \ No newline at end of file diff --git a/Tilt/DBwriteHD.m b/Tilt/DBwriteHD.m new file mode 100755 index 0000000..24dfa82 --- /dev/null +++ b/Tilt/DBwriteHD.m @@ -0,0 +1,109 @@ +function DBwriteHD(DATAinsert,idElabData,idElabData_RIS,ListaDate,NodeNum,IDcentralina,DTcatena,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; +tablenameRIS = 'ELABDATARISUL'; +tablename = 'ELABDATADISP'; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + checkA = isnan(cell2mat(DATAinsert(ii,19))); + if checkA == 1 % il vettore accelerazione è NaN + checkV = isnan(cell2mat(DATAinsert(ii,17))); + if checkV == 1 % il vettore velocità è NaN + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,20),DATAinsert(ii,21),DATAinsert(ii,22)]; + else % velocità è un numero, accelerazione NaN + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','speed','speed_local','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17),DATAinsert(ii,20),... + DATAinsert(ii,21),DATAinsert(ii,22)]; + end + else % scrivo tutto + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','speed','speed_local','acceleration',... + 'acceleration_local','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17),DATAinsert(ii,18),... + DATAinsert(ii,19),DATAinsert(ii,20),DATAinsert(ii,21),DATAinsert(ii,22)]; + end + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + checkA = isnan(cell2mat(DATAinsert(ii,19))); + if checkA == 1 % il vettore accelerazione è NaN + checkV = isnan(cell2mat(DATAinsert(ii,17))); + if checkV == 1 % il vettore velocità è NaN + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,20),DATAinsert(ii,21),DATAinsert(ii,22)]; + else % velocità è un numero, accelerazione NaN + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','speed','speed_local','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17),DATAinsert(ii,20),... + DATAinsert(ii,21),DATAinsert(ii,22)]; + end + else % aggiorno tutto + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','speed','speed_local','acceleration',... + 'acceleration_local','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17),DATAinsert(ii,18),... + DATAinsert(ii,19),DATAinsert(ii,20),DATAinsert(ii,21),DATAinsert(ii,22)]; + end + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' ... + nNodo ''' and EventDate = ''' cell2mat(DATAinsert(ii,4)) ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end + idDataRIS = idElabData_RIS(ii,1); + if idDataRIS == 0 % Se la data non è su DB (=0), scrivo i dati + colnamesRIS = {'UnitName','ToolNameID','NodeNum','EventTimestamp',... + 'ris_acc','ris_mag'}; + dataRIS = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,25),DATAinsert(ii,23),DATAinsert(ii,24)]; + fastinsert(conn,tablenameRIS,colnamesRIS,dataRIS); + else + colnamesRIS = {'ris_acc','ris_mag'}; + dataRIS = [DATAinsert(ii,23),DATAinsert(ii,24)]; + whereclauseRIS = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' ... + nNodo ''' and EventTimestamp = ''' cell2mat(DATAinsert(ii,25)) ''' ']; + update(conn,tablenameRIS,colnamesRIS,dataRIS,whereclauseRIS) + end +end + +end diff --git a/Tilt/DBwriteHDVR.m b/Tilt/DBwriteHDVR.m new file mode 100755 index 0000000..e32a914 --- /dev/null +++ b/Tilt/DBwriteHDVR.m @@ -0,0 +1,109 @@ +function DBwriteHDVR(DATAinsert,idElabData,idElabData_RIS,ListaDate,NodeNum,IDcentralina,DTcatena,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; +tablenameRIS = 'ELABDATARISUL'; +tablename = 'ELABDATADISP'; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + checkA = isnan(cell2mat(DATAinsert(ii,19))); + if checkA == 1 % il vettore accelerazione è NaN + checkV = isnan(cell2mat(DATAinsert(ii,17))); + if checkV == 1 % il vettore velocità è NaN + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,20),DATAinsert(ii,21),DATAinsert(ii,22)]; + else % velocità è un numero, accelerazione NaN + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','speed','speed_local','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17),DATAinsert(ii,20),... + DATAinsert(ii,21),DATAinsert(ii,22)]; + end + else % scrivo tutto + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','speed','speed_local','acceleration',... + 'acceleration_local','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17),DATAinsert(ii,18),... + DATAinsert(ii,19),DATAinsert(ii,20),DATAinsert(ii,21),DATAinsert(ii,22)]; + end + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + checkA = isnan(cell2mat(DATAinsert(ii,19))); + if checkA == 1 % il vettore accelerazione è NaN + checkV = isnan(cell2mat(DATAinsert(ii,17))); + if checkV == 1 % il vettore velocità è NaN + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,20),DATAinsert(ii,21),DATAinsert(ii,22)]; + else % velocità è un numero, accelerazione NaN + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','speed','speed_local','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17),DATAinsert(ii,20),... + DATAinsert(ii,21),DATAinsert(ii,22)]; + end + else % aggiorno tutto + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','speed','speed_local','acceleration',... + 'acceleration_local','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17),DATAinsert(ii,18),... + DATAinsert(ii,19),DATAinsert(ii,20),DATAinsert(ii,21),DATAinsert(ii,22)]; + end + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' ... + nNodo ''' and EventDate = ''' cell2mat(DATAinsert(ii,4)) ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end + idDataRIS = idElabData_RIS(ii,1); + if idDataRIS == 0 % Se la data non è su DB (=0), scrivo i dati + colnamesRIS = {'UnitName','ToolNameID','NodeNum','EventTimestamp',... + 'ris_acc','ris_mag'}; + dataRIS = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,25),DATAinsert(ii,23),DATAinsert(ii,24)]; + fastinsert(conn,tablenameRIS,colnamesRIS,dataRIS); + else + colnamesRIS = {'ris_acc','ris_mag'}; + dataRIS = [DATAinsert(ii,23),DATAinsert(ii,24)]; + whereclauseRIS = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' ... + nNodo ''' and EventTimestamp = ''' cell2mat(DATAinsert(ii,25)) ''' ']; + update(conn,tablenameRIS,colnamesRIS,dataRIS,whereclauseRIS) + end +end + +end diff --git a/Tilt/DBwriteIPL.m b/Tilt/DBwriteIPL.m new file mode 100755 index 0000000..68d629d --- /dev/null +++ b/Tilt/DBwriteIPL.m @@ -0,0 +1,95 @@ +function DBwriteIPL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + checkA = isnan(cell2mat(DATAinsert(ii,19))); + if checkA == 1 % il vettore accelerazione è NaN + checkV = isnan(cell2mat(DATAinsert(ii,17))); + if checkV == 1 % il vettore velocità è NaN + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,20),DATAinsert(ii,21),DATAinsert(ii,22)]; + else % velocità è un numero, accelerazione NaN + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','speed','speed_local','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17),DATAinsert(ii,20),... + DATAinsert(ii,21),DATAinsert(ii,22)]; + end + else % scrivo tutto + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','speed','speed_local','acceleration',... + 'acceleration_local','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17),DATAinsert(ii,18),... + DATAinsert(ii,19),DATAinsert(ii,20),DATAinsert(ii,21),DATAinsert(ii,22)]; + end + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + checkA = isnan(cell2mat(DATAinsert(ii,19))); + if checkA == 1 % il vettore accelerazione è NaN + checkV = isnan(cell2mat(DATAinsert(ii,17))); + if checkV == 1 % il vettore velocità è NaN + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,20),DATAinsert(ii,21),DATAinsert(ii,22)]; + else % velocità è un numero, accelerazione NaN + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','speed','speed_local','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17),DATAinsert(ii,20),... + DATAinsert(ii,21),DATAinsert(ii,22)]; + end + else % scrivo tutto + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','speed','speed_local','acceleration',... + 'acceleration_local','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17),DATAinsert(ii,18),... + DATAinsert(ii,19),DATAinsert(ii,20),DATAinsert(ii,21),DATAinsert(ii,22)]; + end + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' ... + nNodo ''' and EventDate = ''' cell2mat(DATAinsert(ii,4)) ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end diff --git a/Tilt/DBwriteIPLHR.m b/Tilt/DBwriteIPLHR.m new file mode 100755 index 0000000..b6a0a98 --- /dev/null +++ b/Tilt/DBwriteIPLHR.m @@ -0,0 +1,96 @@ +function DBwriteIPLHR(DATAinsert,idElabData,ListaDate,NodeNum,DTcatena,IDcentralina,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + checkA = isnan(cell2mat(DATAinsert(ii,19))); + if checkA == 1 % il vettore accelerazione è NaN + checkV = isnan(cell2mat(DATAinsert(ii,17))); + if checkV == 1 % il vettore velocità è NaN + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,20),DATAinsert(ii,21),DATAinsert(ii,22)]; + else % velocità è un numero + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','speed','speed_local','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17),DATAinsert(ii,20),... + DATAinsert(ii,21),DATAinsert(ii,22)]; + end + else % scrivo tutto + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','speed','speed_local','acceleration',... + 'acceleration_local','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17),DATAinsert(ii,18),... + DATAinsert(ii,19),DATAinsert(ii,20),DATAinsert(ii,21),DATAinsert(ii,22)]; + end + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + checkA = isnan(cell2mat(DATAinsert(ii,19))); + if checkA == 1 % il vettore accelerazione è NaN + checkV = isnan(cell2mat(DATAinsert(ii,17))); + if checkV == 1 % il vettore velocità è NaN + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,20),DATAinsert(ii,21),DATAinsert(ii,22)]; + else % velocità è un numero + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','speed','speed_local','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17),DATAinsert(ii,20)... + ,DATAinsert(ii,21),DATAinsert(ii,22)]; + end + else % scrivo tutto + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','speed','speed_local','acceleration',... + 'acceleration_local','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17),DATAinsert(ii,18),... + DATAinsert(ii,19),DATAinsert(ii,20),DATAinsert(ii,21),DATAinsert(ii,22)]; + end + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = ''' cell2mat(DATAinsert(ii,4))... + ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end diff --git a/Tilt/DBwriteKL.m b/Tilt/DBwriteKL.m new file mode 100755 index 0000000..537a341 --- /dev/null +++ b/Tilt/DBwriteKL.m @@ -0,0 +1,74 @@ +function DBwriteKL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn,NodoKlinoLink) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + checkT = isnan(cell2mat(DATAinsert(ii,9))); + if checkT == 1 % il vettore Temperatura è NaN + if strcmp(NodoKlinoLink(1,4),'ADC') || strcmp(NodoKlinoLink{1,4} ,'null') ... + || isempty(NodoKlinoLink{1,4}) == 1 || strcmp(NodoKlinoLink{1,4} ,'g') + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'XShift','YShift','ZShift','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,10)]; + elseif strcmp(NodoKlinoLink{1,4} ,'Gradi') + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'XShift','YShift','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,10)]; + end + else + if strcmp(NodoKlinoLink(1,4),'ADC') || strcmp(NodoKlinoLink{1,4} ,'null') ... + || isempty(NodoKlinoLink{1,4}) == 1 || strcmp(NodoKlinoLink{1,4} ,'g') + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'XShift','YShift','ZShift','T_node','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),DATAinsert(ii,10)]; + elseif strcmp(NodoKlinoLink{1,4} ,'Gradi') + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'XShift','YShift','T_node','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,9),DATAinsert(ii,10)]; + end + end + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + checkT = isnan(cell2mat(DATAinsert(ii,9))); + if checkT == 1 % il vettore Temperatura è NaN + if strcmp(NodoKlinoLink(1,4),'ADC') || strcmp(NodoKlinoLink{1,4} ,'null') ... + || isempty(NodoKlinoLink{1,4}) == 1 || strcmp(NodoKlinoLink{1,4} ,'g') + colnames = {'XShift','YShift','ZShift','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8),... + DATAinsert(ii,10)]; + elseif strcmp(NodoKlinoLink{1,4} ,'Gradi') + colnames = {'XShift','YShift','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,10)]; + end + else + if strcmp(NodoKlinoLink(1,4),'ADC') || strcmp(NodoKlinoLink{1,4} ,'null') || ... + isempty(NodoKlinoLink{1,4}) == 1 || strcmp(NodoKlinoLink{1,4} ,'g') + colnames = {'XShift','YShift','ZShift','T_node','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8),... + DATAinsert(ii,9),DATAinsert(ii,10)]; + elseif strcmp(NodoKlinoLink{1,4} ,'Gradi') + colnames = {'XShift','YShift','T_node','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,9),DATAinsert(ii,10)]; + end + end + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = ''' cell2mat(DATAinsert(ii,4))... + ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end diff --git a/Tilt/DBwriteKLHR.m b/Tilt/DBwriteKLHR.m new file mode 100755 index 0000000..5cabcfa --- /dev/null +++ b/Tilt/DBwriteKLHR.m @@ -0,0 +1,43 @@ +function DBwriteKLHR(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + checkT = isnan(cell2mat(DATAinsert(ii,8))); + if checkT == 1 % il vettore Temperatura è NaN + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'XShift','YShift','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,9)]; + else + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'XShift','YShift','T_node','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9)]; + end + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + checkT = isnan(cell2mat(DATAinsert(ii,8))); + if checkT == 1 % il vettore Temperatura è NaN + colnames = {'XShift','YShift','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,9)]; + else + colnames = {'XShift','YShift','T_node','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8),... + DATAinsert(ii,9)]; + end + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = ''' cell2mat(DATAinsert(ii,4))... + ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end diff --git a/Tilt/DBwriteKL_future.m b/Tilt/DBwriteKL_future.m new file mode 100755 index 0000000..0a14c24 --- /dev/null +++ b/Tilt/DBwriteKL_future.m @@ -0,0 +1,42 @@ +function DBwriteKL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn,NodoKlinoLink) + +l = ListaDate; + +for ii=1:l + tablename = 'ELABDATADISP'; + checkT = isnan(cell2mat(DATAinsert(ii,9))); + if checkT == 1 % il vettore Temperatura è NaN + if strcmp(NodoKlinoLink(1,4),'ADC') || strcmp(NodoKlinoLink{1,4} ,'null') || isempty(NodoKlinoLink{1,4}) == 1 + comando = ['INSERT INTO ' tablename ' (UnitName,ToolNameID,NodeNum,EventDate,EventTime,XShift,YShift,ZShift,calcerr)' ... + ' VALUES( ' DATAinsert(ii,1) ',' DATAinsert(ii,2) ',' DATAinsert(ii,3) ',' DATAinsert(ii,4) ','... + DATAinsert(ii,5) ',' DATAinsert(ii,6) ',' DATAinsert(ii,7) ',' DATAinsert(ii,8) ',' DATAinsert(ii,10)... + '), ON DUPLICATE KEY UPDATE XShift=' DATAinsert(ii,6) ', YShift=' DATAinsert(ii,7) ', ZShift=' DATAinsert(ii,8)... + ', calcerr=' DATAinsert(ii,10)]; + elseif strcmp(NodoKlinoLink{1,4} ,'Gradi') + comando = ['INSERT INTO ' tablename ' (UnitName,ToolNameID,NodeNum,EventDate,EventTime,XShift,YShift,calcerr)' ... + ' VALUES( ' DATAinsert(ii,1) ',' DATAinsert(ii,2) ',' DATAinsert(ii,3) ',' DATAinsert(ii,4) ','... + DATAinsert(ii,5) ',' DATAinsert(ii,6) ',' DATAinsert(ii,7) ',' DATAinsert(ii,10)... + '), ON DUPLICATE KEY UPDATE XShift=' DATAinsert(ii,6) ', YShift=' DATAinsert(ii,7) ', calcerr=' DATAinsert(ii,10)]; + end + else + if strcmp(NodoKlinoLink(1,4),'ADC') || strcmp(NodoKlinoLink{1,4} ,'null') || isempty(NodoKlinoLink{1,4}) == 1 + comando = ['INSERT INTO ' tablename ' (UnitName,ToolNameID,NodeNum,EventDate,EventTime,XShift,YShift,ZShift,T_node,calcerr)' ... + ' VALUES( ' DATAinsert(ii,1) ',' DATAinsert(ii,2) ',' DATAinsert(ii,3) ',' DATAinsert(ii,4) ','... + DATAinsert(ii,5) ',' DATAinsert(ii,6) ',' DATAinsert(ii,7) ',' DATAinsert(ii,8) ',' DATAinsert(ii,9) ', ' DATAinsert(ii,10)... + '), ON DUPLICATE KEY UPDATE XShift=' DATAinsert(ii,6) ', YShift=' DATAinsert(ii,7) ', ZShift=' DATAinsert(ii,8)... + ', T_node = ' DATAinsert(ii,9) ', calcerr=' DATAinsert(ii,10)]; + elseif strcmp(NodoKlinoLink{1,4} ,'Gradi') + comando = ['INSERT INTO ' tablename ' (UnitName,ToolNameID,NodeNum,EventDate,EventTime,XShift,YShift,T_node,calcerr)' ... + ' VALUES( ''' string(DATAinsert(ii,1)) ''',''' string(DATAinsert(ii,2)) ''',''' string(DATAinsert(ii,3)) ''',''' string(DATAinsert(ii,4)) ''','''... + string(DATAinsert(ii,5)) ''',''' string(DATAinsert(ii,6)) ''',''' string(DATAinsert(ii,7)) ''',''' string(DATAinsert(ii,9)) ''', ''' string(DATAinsert(ii,10))... + ''') ON DUPLICATE KEY UPDATE XShift=''' string(DATAinsert(ii,6)) ''', YShift=''' string(DATAinsert(ii,7)) ... + ''', T_node=''' string(DATAinsert(ii,9)) ''', calcerr=''' string(DATAinsert(ii,10)) ''' ']; + end + end + comando = strjoin(comando); + curs = exec(conn,comando); + curs = fetch(curs); + disp(curs.Data) +end + +end diff --git a/Tilt/DBwriteLL.m b/Tilt/DBwriteLL.m new file mode 100755 index 0000000..44c282d --- /dev/null +++ b/Tilt/DBwriteLL.m @@ -0,0 +1,24 @@ +function DBwriteLL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime','load_value','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),DATAinsert(ii,4),... + DATAinsert(ii,5),DATAinsert(ii,6),DATAinsert(ii,7)]; + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + colnames = {'load_value','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7)]; + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena... + ''' and NodeNum = ''' nNodo ''' and EventDate = ''' cell2mat(DATAinsert(ii,4))... + ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end \ No newline at end of file diff --git a/Tilt/DBwritePE.m b/Tilt/DBwritePE.m new file mode 100755 index 0000000..57d5c76 --- /dev/null +++ b/Tilt/DBwritePE.m @@ -0,0 +1,25 @@ +function DBwritePE(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime','XShift','YShift','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),DATAinsert(ii,4),... + DATAinsert(ii,5),DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8)]; + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + colnames = {'XShift','YShift','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8)]; + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = ''' ... + cell2mat(DATAinsert(ii,4)) ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end \ No newline at end of file diff --git a/Tilt/DBwritePL.m b/Tilt/DBwritePL.m new file mode 100755 index 0000000..d2b3dc2 --- /dev/null +++ b/Tilt/DBwritePL.m @@ -0,0 +1,41 @@ +function DBwritePL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + check = isnan(cell2mat(DATAinsert(ii,8))); + if check == 0 + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime','water_level','pressure','T_node','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),DATAinsert(ii,4),... + DATAinsert(ii,5),DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9)]; + else + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime','water_level','pressure','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),DATAinsert(ii,4),... + DATAinsert(ii,5),DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,9)]; + end + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + check = isnan(cell2mat(DATAinsert(ii,8))); + if check == 0 + colnames = {'water_level','pressure','T_node','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9)]; + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = ''' cell2mat(DATAinsert(ii,4))... + ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + else + colnames = {'water_level','pressure','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,9)]; + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = ''' cell2mat(DATAinsert(ii,4))... + ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + end + update(conn,tablename,colnames,data,whereclause) + end +end + +end \ No newline at end of file diff --git a/Tilt/DBwritePT100.m b/Tilt/DBwritePT100.m new file mode 100755 index 0000000..c9ec582 --- /dev/null +++ b/Tilt/DBwritePT100.m @@ -0,0 +1,24 @@ +function DBwritePT100(DATAinsert,idElabData,ListaDate,NodeNum,DTcatena,IDcentralina,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime','T_node','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),DATAinsert(ii,7)]; + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + colnames = {'T_node','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7)]; + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = '''... + cell2mat(DATAinsert(ii,4)) ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end diff --git a/Tilt/DBwriteRL.m b/Tilt/DBwriteRL.m new file mode 100755 index 0000000..abf15c7 --- /dev/null +++ b/Tilt/DBwriteRL.m @@ -0,0 +1,25 @@ +function DBwriteRL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime','ZShift','Z','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),DATAinsert(ii,4),... + DATAinsert(ii,5),DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8)]; + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + colnames = {'ZShift','Z','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8)]; + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = ''' cell2mat(DATAinsert(ii,4))... + ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end \ No newline at end of file diff --git a/Tilt/DBwriteSL.m b/Tilt/DBwriteSL.m new file mode 100755 index 0000000..d3eb5e9 --- /dev/null +++ b/Tilt/DBwriteSL.m @@ -0,0 +1,25 @@ +function DBwriteSL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime','ZShift','Z','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),DATAinsert(ii,4),... + DATAinsert(ii,5),DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8)]; + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + colnames = {'ZShift','Z','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8)]; + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = ''' cell2mat(DATAinsert(ii,4))... + ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end \ No newline at end of file diff --git a/Tilt/DBwriteSPP.m b/Tilt/DBwriteSPP.m new file mode 100755 index 0000000..316ca36 --- /dev/null +++ b/Tilt/DBwriteSPP.m @@ -0,0 +1,25 @@ +function DBwriteSPP(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime','XShift'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),DATAinsert(ii,4),... + DATAinsert(ii,5),DATAinsert(ii,6)]; + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + colnames = 'XShift'; + data = DATAinsert(ii,6); + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = ''' cell2mat(DATAinsert(ii,4))... + ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end \ No newline at end of file diff --git a/Tilt/DBwriteTL.m b/Tilt/DBwriteTL.m new file mode 100755 index 0000000..359c652 --- /dev/null +++ b/Tilt/DBwriteTL.m @@ -0,0 +1,107 @@ +function DBwriteTL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + checkA = isnan(cell2mat(DATAinsert(ii,19))); + if checkA == 1 % il vettore accelerazione è NaN + checkV = isnan(cell2mat(DATAinsert(ii,17))); + if checkV == 1 % il vettore velocità è NaN + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,20),DATAinsert(ii,21),DATAinsert(ii,22)]; + else % velocità è un numero, accelerazione NaN + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','speed','speed_local','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17),DATAinsert(ii,20),... + DATAinsert(ii,21),DATAinsert(ii,22)]; + end + else % scrivo tutto + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','speed','speed_local','acceleration',... + 'acceleration_local','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17),DATAinsert(ii,18),... + DATAinsert(ii,19),DATAinsert(ii,20),DATAinsert(ii,21),DATAinsert(ii,22)]; + end + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + checkA = isnan(cell2mat(DATAinsert(ii,19))); + if strcmp(IDcentralina,'ID0003') && strcmp(DTcatena,'DT0002') + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,20),... + DATAinsert(ii,21),DATAinsert(ii,22)]; + else + if checkA == 1 % il vettore accelerazione è NaN + checkV = isnan(cell2mat(DATAinsert(ii,17))); + if checkV == 1 % il vettore velocità è NaN + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,20),DATAinsert(ii,21),DATAinsert(ii,22)]; + else % velocità è un numero, accelerazione NaN + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','speed','speed_local','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17),DATAinsert(ii,20),... + DATAinsert(ii,21),DATAinsert(ii,22)]; + end + else % scrivo tutto + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','speed','speed_local','acceleration',... + 'acceleration_local','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17),DATAinsert(ii,18),... + DATAinsert(ii,19),DATAinsert(ii,20),DATAinsert(ii,21),DATAinsert(ii,22)]; + end + end + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' ... + nNodo ''' and EventDate = ''' cell2mat(DATAinsert(ii,4)) ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end diff --git a/Tilt/DBwriteTLH.m b/Tilt/DBwriteTLH.m new file mode 100755 index 0000000..3153b5e --- /dev/null +++ b/Tilt/DBwriteTLH.m @@ -0,0 +1,91 @@ +function DBwriteTLH(DATAinsert,idElabData,ListaDate,NodeNum,DTcatena,IDcentralina,Traversine,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + checkA = isnan(cell2mat(DATAinsert(ii,13))); + if checkA == 1 % il vettore accelerazione è NaN + checkV = isnan(cell2mat(DATAinsert(ii,11))); + if checkV == 1 % NON scrivo velocità ed accelerazione + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'Y','Z','YShift','ZShift','T_node','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,15),DATAinsert(ii,16),DATAinsert(ii,17)]; + else % NON scrivo l'accelerazione + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'Y','Z','YShift','ZShift','T_node','speed','speed_local',... + 'calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,15),DATAinsert(ii,16),DATAinsert(ii,17)]; + end + else % Scrivo tutto + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'Y','Z','YShift','ZShift','T_node','speed','speed_local',... + 'acceleration','acceleration_local','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17)]; + end + if Traversine ~= 0 % Sghembo + [~,c] = size(colnames); + colnames(1,c+1) = {'XShift'}; + data(1,18) = DATAinsert(ii,18); + end + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + checkA = isnan(cell2mat(DATAinsert(ii,13))); + if checkA == 1 % il vettore accelerazione è NaN + checkV = isnan(cell2mat(DATAinsert(ii,11))); + if checkV == 1 % NON aggiorno velocità ed accelerazione + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'Y','Z','YShift','ZShift','T_node','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,15),DATAinsert(ii,16),DATAinsert(ii,17)]; + else % NON aggiorno l'accelerazione + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'Y','Z','YShift','ZShift','T_node','speed','speed_local',... + 'calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,15),DATAinsert(ii,16),DATAinsert(ii,17)]; + end + else % Aggiorno tutto + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'Y','Z','YShift','ZShift','T_node','speed','speed_local',... + 'acceleration','acceleration_local','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17)]; + end + if Traversine ~= 0 % Sghembo + [~,c] = size(colnames); + colnames(1,c+1) = {'XShift'}; + data(1,18) = DATAinsert(ii,18); + end + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = ''' ... + cell2mat(DATAinsert(ii,4)) ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end diff --git a/Tilt/DBwriteTLHR.m b/Tilt/DBwriteTLHR.m new file mode 100755 index 0000000..52877a0 --- /dev/null +++ b/Tilt/DBwriteTLHR.m @@ -0,0 +1,96 @@ +function DBwriteTLHR(DATAinsert,idElabData,ListaDate,NodeNum,DTcatena,IDcentralina,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + checkA = isnan(cell2mat(DATAinsert(ii,19))); + if checkA == 1 % il vettore accelerazione è NaN + checkV = isnan(cell2mat(DATAinsert(ii,17))); + if checkV == 1 % il vettore velocità è NaN + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,20),DATAinsert(ii,21),DATAinsert(ii,22)]; + else % velocità è un numero + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','speed','speed_local','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17),DATAinsert(ii,20),... + DATAinsert(ii,21),DATAinsert(ii,22)]; + end + else % scrivo tutto + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','speed','speed_local','acceleration',... + 'acceleration_local','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17),DATAinsert(ii,18),... + DATAinsert(ii,19),DATAinsert(ii,20),DATAinsert(ii,21),DATAinsert(ii,22)]; + end + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + checkA = isnan(cell2mat(DATAinsert(ii,19))); + if checkA == 1 % il vettore accelerazione è NaN + checkV = isnan(cell2mat(DATAinsert(ii,17))); + if checkV == 1 % il vettore velocità è NaN + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,20),DATAinsert(ii,21),DATAinsert(ii,22)]; + else % velocità è un numero + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','speed','speed_local','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17),DATAinsert(ii,20)... + ,DATAinsert(ii,21),DATAinsert(ii,22)]; + end + else % scrivo tutto + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'X','Y','Z','XShift','YShift','ZShift','HShift','HShift_local',... + 'HShiftDir','T_node','speed','speed_local','acceleration',... + 'acceleration_local','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17),DATAinsert(ii,18),... + DATAinsert(ii,19),DATAinsert(ii,20),DATAinsert(ii,21),DATAinsert(ii,22)]; + end + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = ''' cell2mat(DATAinsert(ii,4))... + ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end diff --git a/Tilt/DBwriteTLHRH.m b/Tilt/DBwriteTLHRH.m new file mode 100755 index 0000000..c9fe16e --- /dev/null +++ b/Tilt/DBwriteTLHRH.m @@ -0,0 +1,81 @@ +function DBwriteTLHRH(DATAinsert,idElabData,ListaDate,NodeNum,DTcatena,IDcentralina,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + checkA = isnan(cell2mat(DATAinsert(ii,13))); + if checkA == 1 % il vettore accelerazione è NaN + checkV = isnan(cell2mat(DATAinsert(ii,11))); + if checkV == 1 % NON scrivo velocità ed accelerazione + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'Y','Z','YShift','ZShift','T_node','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,15),DATAinsert(ii,16),DATAinsert(ii,17)]; + else % NON scrivo l'accelerazione + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'Y','Z','YShift','ZShift','T_node','speed','speed_local',... + 'calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,15),DATAinsert(ii,16),DATAinsert(ii,17)]; + end + else % Scrivo tutto + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'Y','Z','YShift','ZShift','T_node','speed','speed_local',... + 'acceleration','acceleration_local','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17)]; + end + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + checkA = isnan(cell2mat(DATAinsert(ii,13))); + if checkA == 1 % il vettore accelerazione è NaN + checkV = isnan(cell2mat(DATAinsert(ii,11))); + if checkV == 1 % NON aggiorno velocità ed accelerazione + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'Y','Z','YShift','ZShift','T_node','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,15),DATAinsert(ii,16),DATAinsert(ii,17)]; + else % NON aggiorno l'accelerazione + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'Y','Z','YShift','ZShift','T_node','speed','speed_local',... + 'calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,15),DATAinsert(ii,16),DATAinsert(ii,17)]; + end + else % Aggiorno tutto + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'Y','Z','YShift','ZShift','T_node','speed','speed_local',... + 'acceleration','acceleration_local','calcerr','AlfaX','AlfaY'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),... + DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9),... + DATAinsert(ii,10),DATAinsert(ii,11),DATAinsert(ii,12),... + DATAinsert(ii,13),DATAinsert(ii,14),DATAinsert(ii,15),... + DATAinsert(ii,16),DATAinsert(ii,17)]; + end + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = ''' ... + cell2mat(DATAinsert(ii,4)) ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end diff --git a/Tilt/DBwriteThL.m b/Tilt/DBwriteThL.m new file mode 100755 index 0000000..28ac8b5 --- /dev/null +++ b/Tilt/DBwriteThL.m @@ -0,0 +1,24 @@ +function DBwriteThL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime','T_node','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),DATAinsert(ii,7)]; + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + colnames = {'T_node','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7)]; + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = '''... + cell2mat(DATAinsert(ii,4)) ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end diff --git a/Tilt/DBwriteWL.m b/Tilt/DBwriteWL.m new file mode 100755 index 0000000..68746fb --- /dev/null +++ b/Tilt/DBwriteWL.m @@ -0,0 +1,37 @@ +function DBwriteWL(DATAinsert,idElabData,ListaDate,NodeNum,IDcentralina,DTcatena,cWL,Therm,conn) + +nNodo = num2str(NodeNum); +l = ListaDate; + +for ii=1:l + idData = idElabData(ii,1); + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + tablename = 'ELABDATADISP'; + if Therm(cWL) == 1 % scrivo la T + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime',... + 'XShift','water_level','T_node','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),DATAinsert(ii,4),DATAinsert(ii,5),... + DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9)]; + else % NON scrivo la T + colnames = {'UnitName','ToolNameID','NodeNum','EventDate','EventTime','XShift','water_level','calcerr'}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,9)]; + end + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + tablename = 'ELABDATADISP'; + if Therm(cWL) == 1 % scrivo la T + colnames = {'XShift','water_level','T_node','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,8),DATAinsert(ii,9)]; + else % NON scrivo la T + colnames = {'XShift','water_level','calcerr'}; + data = [DATAinsert(ii,6),DATAinsert(ii,7),DATAinsert(ii,9)]; + end + whereclause = ['WHERE UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = ''' nNodo ''' and EventDate = ''' ... + cell2mat(DATAinsert(ii,4)) ''' and EventTime = ''' cell2mat(DATAinsert(ii,5)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end +end + +end \ No newline at end of file diff --git a/Tilt/Fukuzono.m b/Tilt/Fukuzono.m new file mode 100755 index 0000000..97ef2b4 --- /dev/null +++ b/Tilt/Fukuzono.m @@ -0,0 +1,712 @@ +function [alert,alert_local,alarm,alarm_local,Date,RQ,RQ_Loc,DataFuK,... + DataFuK_local,Tr_mail,Tr_Loc_mail,Tr_Inf,Tr_Inf_Loc,Tr_Sup,Tr_Sup_Loc,... + Tr_Loc_HR,DataFuK_local_HR,Number,Number_Loc] = Fukuzono(IDcentralina,... + DTcatena,date,ARRAYdate,yes3D,rNL,NodoTilt,NodoTiltHR,NodoTiltHR3D,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; + +text = 'Fukuzono function started'; +fprintf(fileID,fmt,text); + +Tr_Loc_HR = []; +DataFuK_local_HR = []; + +%% Scarico i dati da DB +data_rif = ARRAYdate(end)-30; %30 +if data_rif > datenum(date) + data = datestr(data_rif,'yyyy-mm-dd'); +else + data = date; +end +for n = 1:rNL + NodeNum = num2str(cell2mat(NodoTilt(n,2))); + comando = ['select EventDate, EventTime, HShift_local, HShift from ElabDataView where EventDate >= ''' ... + data ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina ... + ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Dati = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Dati); + T = [cell2mat(Dati(:,1)) repmat(' ', [rD,1]) cell2mat(Dati(:,2))]; + Date = datenum(T); % Data + HShift_local(:,n) = cell2mat(Dati(:,3)); % Loc 2D + HShift(:,n) = cell2mat(Dati(:,4)); % Cum 2D +end + +%% Criterio della velocità positiva - Criterio 0 +[rS,cS] = size(HShift); +Criterio_0 = zeros(rS-1,cS); +Criterio_0_local = zeros(rS-1,cS); +Speed = zeros(rS-1,cS); +Speed_local = zeros(rS-1,cS); +for i = 1:cS % nodi + for j = 4:rS-1 % date + % Cumulati + Speed(j,i) = (HShift(j+1,i) - HShift(j,i))/(Date(j+1)-Date(j)); % m/g + if j == 4 + Speed(j-1,i) = (HShift(j,i) - HShift(j-1,i))/(Date(j)-Date(j-1)); % m/g + Speed(j-2,i) = (HShift(j-1,i) - HShift(j-2,i))/(Date(j-1)-Date(j-2)); % m/g + Speed(j-3,i) = (HShift(j-2,i) - HShift(j-3,i))/(Date(j-2)-Date(j-3)); % m/g + Speed_local(j-1,i) = (HShift_local(j,i) - HShift_local(j-1,i))/(Date(j)-Date(j-1)); % m/g + Speed_local(j-2,i) = (HShift_local(j-1,i) - HShift_local(j-2,i))/(Date(j-1)-Date(j-2)); % m/g + Speed_local(j-3,i) = (HShift_local(j-2,i) - HShift_local(j-3,i))/(Date(j-2)-Date(j-3)); % m/g + end + if Speed(j,i) > 0 && Speed(j-1,i) > 0 && Speed(j-2,i) > 0 && Speed(j-3,i) > 0 + Criterio_0(j,i) = 1; + end + % Locali + Speed_local(j,i) = (HShift_local(j+1,i) - HShift_local(j,i))/(Date(j+1)-Date(j)); % m/g + if Speed_local(j,i) > 0 && Speed_local(j-1,i) > 0 && Speed_local(j-2,i) > 0 && Speed_local(j-3,i) > 0 + Criterio_0_local(j,i) = 1; + end + + end +end +Date = Date(2:end); +text = 'Criterion 0 executed'; +fprintf(fileID,fmt,text); + +%% Faccio i calcoli +[r,c] = size(Speed_local); +Delta_Speed_local = zeros(r,c); +Delta_Speed = zeros(r,c); +diff_Cum = diff(Speed); +diff_Loc = diff(Speed_local); +Delta_Speed(2:end,:) = diff_Cum; +Delta_Speed_local(2:end,:) = diff_Loc; +act = zeros(r,c); +act_local = zeros(r,c); +for i = 1:c % nodi + for j = 2:r % date + if Delta_Speed(j,i) > 0 + act(j,i) = 1; + elseif Delta_Speed(j,i) < 0 + act(j,i) = -1; + end + if Delta_Speed_local(j,i) > 0 + act_local(j,i) = 1; + elseif Delta_Speed_local(j,i) < 0 + act_local(j,i) = -1; + end + end +end + +%% Criterio della Velocità Crescente - Criterio 1 +Criterio_1 = zeros(r,c); +Criterio_1_local = zeros(r,c); +alert = zeros(r,c); +alert_local = zeros(r,c); +if r > 10 + for i = 1:c % nodi + for j = 10:r % date + if act(j,i) == 1 && act(j-1,i) == 1 && act(j-2,i) == 1 && act(j-3,i) == 1 || ... + act(j,i) == 1 && act(j-1,i) == 1 && act(j-2,i) == 1 || ... + act(j,i) == 1 && act(j-1,i) == 1 && act(j-3,i) == 1 || ... + act(j,i) == 1 && act(j-2,i) == 1 && act(j-3,i) == 1 || ... + act(j-1,i) == 1 && act(j-2,i) == 1 && act(j-3,i) == 1 + if Criterio_0(j,i) == 1 + Criterio_1(j,i) = 1; + if act(j,i) == 1 && act(j-1,i) == 1 && act(j-2,i) == 1 && act(j-3,i) == 1 && act(j-4,i) == 1 + alert(j,i) = 1; + end + end + end + if act_local(j,i) == 1 && act_local(j-1,i) == 1 && act_local(j-2,i) == 1 && act_local(j-3,i) == 1 || ... + act_local(j,i) == 1 && act_local(j-1,i) == 1 && act_local(j-2,i) == 1 || ... + act_local(j,i) == 1 && act_local(j-1,i) == 1 && act_local(j-3,i) == 1 || ... + act_local(j,i) == 1 && act_local(j-2,i) == 1 && act_local(j-3,i) == 1 || ... + act_local(j-1,i) == 1 && act_local(j-2,i) == 1 && act_local(j-3,i) == 1 + if Criterio_0_local(j,i) == 1 + Criterio_1_local(j,i) = 1; + if act_local(j,i) == 1 && act_local(j-1,i) == 1 && act_local(j-2,i) == 1 && act_local(j-3,i) == 1 && act_local(j-4,i) == 1 + alert_local(j,i) = 1; + end + end + end + end + end + text = 'Criterion 1 executed'; + fprintf(fileID,fmt,text); + + %% Criterio delle parabole - Criterio 2 + a = zeros(r,c); + a_local = zeros(r,c); + Criterio_2 = zeros(r,c); + Criterio_2_local = zeros(r,c); + for i = 1:c % nodi + for j = 13:r % date + if Criterio_1(j,i) == 1 + % j-3 + x = Date(j-12:j-3); + y = Speed(j-12:j-3,i); + f = fit(x,y,'poly2'); + coeff = coeffvalues(f); + a(j-3,i) = coeff(1,1); + % j-2 + x = Date(j-11:j-2); + y = Speed(j-11:j-2,i); + f = fit(x,y,'poly2'); + coeff = coeffvalues(f); + a(j-2,i) = coeff(1,1); + % j-1 + x = Date(j-10:j-1); + y = Speed(j-10:j-1,i); + f = fit(x,y,'poly2'); + coeff = coeffvalues(f); + a(j-1,i) = coeff(1,1); + % j + x = Date(j-9:j); + y = Speed(j-9:j,i); + f = fit(x,y,'poly2'); + coeff = coeffvalues(f); + a(j,i) = coeff(1,1); + % Criterio 2 + if a(j,i) > 0 && a(j-1,i) > 0 && a(j-2,i) > 0 && a(j-3,i) > 0 ||... + a(j,i) > 0 && a(j-1,i) > 0 && a(j-2,i) > 0 ||... + a(j,i) > 0 && a(j-1,i) > 0 && a(j-3,i) > 0 ||... + a(j,i) > 0 && a(j-2,i) > 0 && a(j-3,i) > 0 ||... + a(j-1,i) > 0 && a(j-2,i) > 0 && a(j-3,i) > 0 + + Criterio_2(j,i) = 1; + end + end + if Criterio_1_local(j,i) == 1 + % j-3 + x = Date(j-12:j-3); + y = Speed_local(j-12:j-3,i); + f = fit(x,y,'poly2'); + coeff = coeffvalues(f); + a_local(j-3,i) = coeff(1,1); + % j-2 + x = Date(j-11:j-2); + y = Speed_local(j-11:j-2,i); + f = fit(x,y,'poly2'); + coeff = coeffvalues(f); + a_local(j-2,i) = coeff(1,1); + % j-1 + x = Date(j-10:j-1); + y = Speed_local(j-10:j-1,i); + f = fit(x,y,'poly2'); + coeff = coeffvalues(f); + a_local(j-1,i) = coeff(1,1); + % j + x = Date(j-9:j); + y = Speed_local(j-9:j,i); + f = fit(x,y,'poly2'); + coeff = coeffvalues(f); + a_local(j,i) = coeff(1,1); + if a_local(j,i) > 0 && a_local(j-1,i) > 0 && a_local(j-2,i) > 0 && a_local(j-3,i) > 0 || ... + a_local(j,i) > 0 && a_local(j-1,i) > 0 && a_local(j-2,i) > 0 || ... + a_local(j,i) > 0 && a_local(j-1,i) > 0 && a_local(j-3,i) > 0 || ... + a_local(j,i) > 0 && a_local(j-2,i) > 0 && a_local(j-3,i) > 0 || ... + a_local(j-1,i) > 0 && a_local(j-2,i) > 0 && a_local(j-3,i) > 0 + + Criterio_2_local(j,i) = 1; + end + end + end + end + text = 'Criterion 2 executed'; + fprintf(fileID,fmt,text); + + %% Criterio della concavità crescente - Criterio 3 + Delta_a = zeros(r,c); + Delta_a_local = zeros(r,c); + diff_a = diff(a); + diff_a_Loc = diff(a_local); + Delta_a(2:end,:) = diff_a; + Delta_a_local(2:end,:) = diff_a_Loc; + Criterio_3 = zeros(r,c); + Criterio_3_local = zeros(r,c); + for i = 1:c % nodi + for j = 13:r % date + if Criterio_2(j,i) == 1 + if Delta_a(j,i) > 0 && Delta_a(j-1,i) > 0 && Delta_a(j-2,i) > 0 && Delta_a(j-3,i) > 0 || ... + Delta_a(j,i) > 0 && Delta_a(j-1,i) > 0 && Delta_a(j-2,i) > 0 || ... + Delta_a(j,i) > 0 && Delta_a(j-1,i) > 0 && Delta_a(j-3,i) > 0 || ... + Delta_a(j,i) > 0 && Delta_a(j-2,i) > 0 && Delta_a(j-3,i) > 0 || ... + Delta_a(j-1,i) > 0 && Delta_a(j-2,i) > 0 && Delta_a(j-3,i) > 0 + + Criterio_3(j,i) = 1; + end + end + if Criterio_2_local(j,i) == 1 + if Delta_a_local(j,i) > 0 && Delta_a_local(j-1,i) > 0 && Delta_a_local(j-2,i) > 0 && Delta_a_local(j-3,i) > 0 ||... + Delta_a_local(j,i) > 0 && Delta_a_local(j-1,i) > 0 && Delta_a_local(j-2,i) > 0 ||... + Delta_a_local(j,i) > 0 && Delta_a_local(j-1,i) > 0 && Delta_a_local(j-3,i) > 0 ||... + Delta_a_local(j,i) > 0 && Delta_a_local(j-2,i) > 0 && Delta_a_local(j-3,i) > 0 ||... + Delta_a_local(j-1,i) > 0 && Delta_a_local(j-2,i) > 0 && Delta_a_local(j-3,i) > 0 + + Criterio_3_local(j,i) = 1; + end + end + end + end + text = 'Criterion 3 executed'; + fprintf(fileID,fmt,text); + + %% Criterio di Fukuzono + alarm = zeros(r,c); + alarm_local = zeros(r,c); + RQ = zeros(r,c); + Number = zeros(r,c); + RQ_Loc = zeros(r,c); + Number_Loc = zeros(r,c); + Tr = zeros(r,c) - 99; + Tr_Inf = zeros(r,c) - 99; + Tr_Sup = zeros(r,c) - 99; + Tr_mail = zeros(r,c) - 99; + Tr_Loc = zeros(r,c) - 99; + Tr_Inf_Loc = zeros(r,c) - 99; + Tr_Sup_Loc = zeros(r,c) - 99; + Tr_Loc_mail = zeros(r,c) - 99; + DataFuK = zeros(r,c); + DataFuK_local = zeros(r,c); + for i = 1:c % nodi + j = 13; + % -------------- Cumulati -------------------------- + while j <=(r-1) + hold off + GIGI = 0; + if Criterio_3(j,i) == 1 + Tempo = Date(j-3:j); % giorni + Vel = 1000*Speed(j-3:j,i); % mm/g + Vel(Vel==0) = 0.0000000001; + Inv_Vel = 1./Vel; + [f,rsquare] = fit(Tempo,Inv_Vel,'poly1'); + retta = coeffvalues(f); + m = retta(1,1); % m + q = retta(1,2); % q + % Time of failure + Tr(j,i) = -q/m - Date(j); + if Tr(j,i) > 0 && Tr(j,i) < 30 % giorni + % RQ + RQ(j,i) = rsquare.rsquare; + % Grafico Inv V - T + Data_Img = datestr(Date(j-3),'dd-mm-yyyy'); + Tempo_Img = datestr(Date(j-3),'HH-MM-SS'); + fig = plot(Tempo,Inv_Vel,'-o','LineStyle','none'); + hold on + legend(num2str(RQ(j,i))); + Y = m*Tempo + q; + plot(Tempo,Y); + title('Time of Failure prediction model'); + xlabel('Date [dd/mm/yyyy HH:MM]') + ylabel('Inverse of Velocity [d/mm]') + datetick('x','dd/mm/yyyy HH:MM') + ylim([0 max(Inv_Vel)+max(Inv_Vel)/10]) + % Grafico Vel - T + hold off + fig2 = plot(Tempo,Vel,'-o','LineStyle','none'); + title('Time of Failure prediction model'); + xlabel('Date [dd/mm/yyyy HH:MM]') + ylabel('Velocity [mm/d]') + datetick('x','dd/mm/yyyy HH:MM') + ylim([0 max(Vel)+max(Vel)/10]) + end + % dato successivo + for n = 1:(r-j) + if Criterio_3(n+j,i) == 1 || Criterio_3(n+j-1,i) == 1 + Tempo = Date(j-3:j+n); % giorni + Vel = 1000*Speed(j-3:j+n,i); % mm/g + Vel(Vel==0) = 0.0000000001; + Inv_Vel = 1./Vel; + [f,rsquare] = fit(Tempo,Inv_Vel,'poly1'); + RQ(j+n,i) = rsquare.rsquare; + retta = coeffvalues(f); + m = retta(1,1); + q = retta(1,2); + % Time of Failure + Tr(j+n,i) = -q/m - Date(j+n); + if Tr(j+n,i) > 0 && Tr(j+n,i) < 30 % giorni + if RQ(j+n,i) >= 0.85 + Tr_mail(j+n,i) = -q/m - Date(j+n);% attivo + Tr_mail(j+n-1,i) = -99; % disattivo + alarm(j+n-1,i) = 0; % disattivo + alarm(j+n,i) = 1; % attivo + DataFuK(j+n,i) = Date(j-3); + DataFuK(j,i) = 0; + Data_Img = datestr(Date(j-3),'dd-mm-yyyy'); + Tempo_Img = datestr(Date(j-3),'HH-MM-SS'); + % Grafico asintotico + hold off + fig2 = plot(Tempo,Vel,'-o','LineStyle','none'); + title('Time of Failure prediction model'); + xlabel('Date [dd/mm/yyyy HH:MM]') + ylabel('Velocity [mm/d]') + datetick('x','dd/mm/yyyy HH:MM') + ylim([0 max(Vel)+max(Vel)/10]) + Nodo = cell2mat(NodoTilt(i,2)); + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',num2str(Nodo),'-',Data_Img,'_',Tempo_Img,'_Vel.jpg'); + saveas(fig2,filename) + % Grafico inverso velocità + fig = plot(Tempo,Inv_Vel,'-o','LineStyle','none'); + hold on + legend(num2str(RQ(j+n,i))); + Y = m*Tempo + q; + Y = [Y; 0]; + Tempo_End = -q/m; + Tempo_G = [Tempo; Tempo_End]; + plot(Tempo_G,Y); + title('Time of Failure prediction model'); + xlabel('Date [dd/mm/yyyy HH:MM]') + ylabel('Inverse of Velocity [d/mm]') + datetick('x','dd/mm/yyyy HH:MM') + ylim([0 max(Inv_Vel)+max(Inv_Vel)/10]) + LIM = floor(fig.XData(1)); + Nodo = cell2mat(NodoTilt(i,2)); + % Variazione statistica dei dati di + % monitoraggio + % Limite Superiore + Inv_Vel_Sup = Inv_Vel + mean(Inv_Vel)*(1-RQ(j+n,i)); + [f,rsquare] = fit(Tempo,Inv_Vel_Sup,'poly1'); + retta = coeffvalues(f); + m_Sup = retta(1,1); + q_Sup = retta(1,2); + Tr_Sup(j+n,i) = -q_Sup/m_Sup; + Tr_Sup(j+n-1,i) = 99; + Y_Sup = m_Sup*Tempo + q_Sup; + Y_Sup = [Y_Sup; 0]; + Tempo_End = -q_Sup/m_Sup; + Tempo_G = [Tempo; Tempo_End]; + plot(Tempo_G,Y_Sup,'--'); + % Limite Inferiore + Inv_Vel_Inf = Inv_Vel - mean(Inv_Vel)*(1-RQ(j+n,i)); + [f,rsquare] = fit(Tempo,Inv_Vel_Inf,'poly1'); + retta = coeffvalues(f); + m_Inf = retta(1,1); + q_Inf = retta(1,2); + Tr_Inf(j+n,i) = -q_Inf/m_Inf; + Tr_Inf(j+n-1,i) = 99; + Y_Inf = m_Inf*Tempo + q_Inf; + Y_Inf = [Y_Inf; 0]; + Tempo_End = -q_Inf/m_Inf; + Tempo_G = [Tempo; Tempo_End]; + plot(Tempo_G,Y_Inf,'--'); + datetick('x','dd/mm/yyyy HH:MM') + GIGI = 1; + N = n; + Number(j+N,i) = N+4; + end + end + else + break + end + end + if GIGI == 1 + hold on + fig = plot(Date(j+N)+Tr(j+N,i),0,'-d','LineStyle','none','Color','r'); + plot(Tr_Sup(j+N,i),0,'-v','LineStyle','none','Color','k'); + LIM_S = ceil(Tr_Sup(j+N,i)); + plot(Tr_Inf(j+N,i),0,'-v','LineStyle','none','Color','k'); + legend(['RQ: ' num2str(RQ(j+N,i))]); + h = gca; % Get axis to modify + h.XAxis.MinorTick = 'on'; % Must turn on minor ticks if they are off + h.XAxis.MinorTickValues = LIM(1):1/24:LIM_S(end); % Minor ticks which don't line up with majors + datetick('x','dd/mm/yyyy HH:MM') + grid on + grid minor + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',num2str(Nodo),'-',Data_Img,'_',Tempo_Img,'.jpg'); + saveas(fig,filename) + end + j = j+n+1; + else + j = j+1; + end + end + % -------------- Locali -------------------------- + j = 13; + while j <=(r-1) + hold off + DIBBA = 0; + if Criterio_3_local(j,i) == 1 + Tempo = Date(j-3:j); % giorni + Vel = 1000*Speed_local(j-3:j,i); % mm/g + Vel(Vel==0) = 0.0000000001; + Inv_Vel = 1./Vel; + [f,rsquare] = fit(Tempo,Inv_Vel,'poly1'); + retta = coeffvalues(f); + m = retta(1,1); + q = retta(1,2); + % Time of Failure + Tr_Loc(j,i) = -q/m - Date(j); + if Tr_Loc(j,i) > 0 && Tr_Loc(j,i) < 30 + % RQ + RQ_Loc(j,i) = rsquare.rsquare; + % Grafico Inv V - T + Data_Img = datestr(Date(j-3),'dd-mm-yyyy'); + Tempo_Img = datestr(Date(j-3),'HH-MM-SS'); + % Grafico + fig = plot(Tempo,Inv_Vel,'-o','LineStyle','none'); + hold on + legend(num2str(RQ_Loc(j,i))); + Y = m*Tempo + q; + plot(Tempo,Y); + title('Time of Failure prediction model'); + xlabel('Date [dd/mm/yyyy HH:MM]') + ylabel('Inverse of Velocity [d/mm]') + datetick('x','dd/mm/yyyy HH:MM') + ylim([0 max(Inv_Vel)+max(Inv_Vel)/10]) + % Grafico Vel - T + hold off + fig2 = plot(Tempo,Vel,'-o','LineStyle','none'); + title('Time of Failure prediction model'); + xlabel('Date [dd/mm/yyyy HH:MM]') + ylabel('Velocity [mm/d]') + datetick('x','dd/mm/yyyy HH:MM') + ylim([0 max(Vel)+max(Vel)/10]) + end + % dato successivo + for n = 1:(r-j) + if Criterio_3_local(n+j,i) == 1 || Criterio_3_local(n+j-1,i) == 1 + Tempo = Date(j-3:j+n); % giorni + Vel = 1000*Speed_local(j-3:j+n,i); % mm/g + Vel(Vel==0) = 0.0000000001; + Inv_Vel = 1./Vel; + [f,rsquare] = fit(Tempo,Inv_Vel,'poly1'); + RQ_Loc(j+n,i) = rsquare.rsquare; + retta = coeffvalues(f); + m = retta(1,1); + q = retta(1,2); + % Time of Failure + Tr_Loc(j+n,i) = -q/m - Date(j+n); + if Tr_Loc(j+n,i) > 0 && Tr_Loc(j+n,i) < 30 % giorni + if RQ_Loc(j+n,i) >= 0.85 + Tr_Loc_mail(j+n,i) = -q/m - Date(j+n); + Tr_Loc_mail(j+n-1,i) = -99; % disattivo + alarm_local(j+n-1,i) = 0; % disattivo + alarm_local(j+n,i) = 1; % attivo + DataFuK_local(j+n,i) = Date(j-3); + DataFuK_local(j,i) = 0; + Data_Img = datestr(Date(j-3),'dd-mm-yyyy'); + Tempo_Img = datestr(Date(j-3),'HH-MM-SS'); + % Grafico Asintotico + hold off + fig2 = plot(Tempo,Vel,'-o','LineStyle','none'); + title('Time of Failure prediction model'); + xlabel('Date [dd/mm/yyyy HH:MM]') + ylabel('Velocity [mm/d]') + datetick('x','dd/mm/yyyy HH:MM') + ylim([0 max(Vel)+max(Vel)/10]) + Nodo = cell2mat(NodoTilt(i,2)); + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',num2str(Nodo),'-',Data_Img,'_',Tempo_Img,'-Local_Vel.jpg'); + saveas(fig2,filename) + % Grafico inverso velocità + fig = plot(Tempo,Inv_Vel,'-o','LineStyle','none'); + hold on + legend(num2str(RQ_Loc(j+n,i))); + Y = m*Tempo + q; + Y = [Y; 0]; + Tempo_End = -q/m; + Tempo_G = [Tempo; Tempo_End]; + plot(Tempo_G,Y); + title('Time of Failure prediction model'); + xlabel('Date [dd/mm/yyyy HH:MM]') + ylabel('Inverse of Velocity [d/mm]') + datetick('x','dd/mm/yyyy HH:MM') + ylim([0 max(Inv_Vel)+max(Inv_Vel)/10]) + LIM = floor(fig.XData(1)); + Nodo = cell2mat(NodoTilt(i,2)); + % Variazione statistica dei dati di + % monitoraggio + % Limite Superiore + Inv_Vel_Sup = Inv_Vel + mean(Inv_Vel)*(1-RQ_Loc(j+n,i)); + [f,rsquare] = fit(Tempo,Inv_Vel_Sup,'poly1'); + retta = coeffvalues(f); + m_Sup = retta(1,1); + q_Sup = retta(1,2); + Tr_Loc_Sup(j+n,i) = -q_Sup/m_Sup; + Tr_Loc_Sup(j+n-1,i) = 99; + Y_Sup = m_Sup*Tempo + q_Sup; + Y_Sup = [Y_Sup; 0]; + Tempo_End = -q_Sup/m_Sup; + Tempo_G = [Tempo; Tempo_End]; + plot(Tempo_G,Y_Sup,'--'); + % Limite Inferiore + Inv_Vel_Inf = Inv_Vel - mean(Inv_Vel)*(1-RQ_Loc(j+n,i)); + [f,rsquare] = fit(Tempo,Inv_Vel_Inf,'poly1'); + retta = coeffvalues(f); + m_Inf = retta(1,1); + q_Inf = retta(1,2); + Tr_Loc_Inf(j+n,i) = -q_Inf/m_Inf; + Tr_Loc_Inf(j+n-1,i) = 99; + Y_Inf = m_Inf*Tempo + q_Inf; + Y_Inf = [Y_Inf; 0]; + Tempo_End = -q_Inf/m_Inf; + Tempo_G = [Tempo; Tempo_End]; + plot(Tempo_G,Y_Inf,'--'); + datetick('x','dd/mm/yyyy HH:MM') + DIBBA = 1; + N = n; + Number_Loc(j+N,i) = N+4; + end + end + else + break + end + end + if DIBBA == 1 + hold on + fig = plot(Date(j+N)+Tr_Loc(j+N,i),0,'-d','LineStyle','none','Color','r'); + plot(Tr_Loc_Sup(j+N,i),0,'-v','LineStyle','none','Color','k'); + LIM_S = ceil(Tr_Sup(j+N,i)); + plot(Tr_Loc_Inf(j+N,i),0,'-v','LineStyle','none','Color','k'); + legend(['RQ: ' num2str(RQ_Loc(j+N,i))]); + h = gca; % Get axis to modify + h.XAxis.MinorTick = 'on'; % Must turn on minor ticks if they are off + h.XAxis.MinorTickValues = LIM(1):1/24:LIM_S(end); % Minor ticks which don't line up with majors + datetick('x','dd/mm/yyyy HH:MM') + grid on + grid minor + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',num2str(Nodo),'-',Data_Img,'_',Tempo_Img,'-Local.jpg'); + saveas(fig,filename) + if yes3D == 1 + HRindex = find(cell2mat(NodoTiltHR3D(:,2))==Nodo); + if isempty(HRindex) ~= 1 + NodeHR = NodoTiltHR3D(HRindex,3); + HRprog = find(cell2mat(NodoTiltHR(:,2))==cell2mat(NodeHR)); + [rT,~] = size(Tempo); + DateHR = zeros(rT+1,1); + HShift_local_HR = zeros(rT,1); + nHR = 1; + for tt = 1:rT+1 + if tt == 1 + Data_HR = datestr(Date(j-4),'yyyy-mm-dd'); + Tempo_HR = datestr(Date(j-4),'HH:MM:SS'); + else + Data_HR = datestr(Tempo(tt-1),'yyyy-mm-dd'); + Tempo_HR = datestr(Tempo(tt-1),'HH:MM:SS'); + end + NodeNum = num2str(cell2mat(NodeHR)); + comando = ['select EventDate, EventTime, HShift_local from ElabDataView where EventDate = ''' ... + Data_HR ''' and EventTime = ''' Tempo_HR ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Dati_HR = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Dati_HR); + T = [cell2mat(Dati_HR(:,1)) repmat(' ', [rD,1]) cell2mat(Dati_HR(:,2))]; + DateHR(nHR,1) = datenum(T); % Data + HShift_local_HR(nHR,1) = cell2mat(Dati_HR(:,3)); % Loc 2D + nHR = nHR+1; + end + [rS,~] = size(HShift_local_HR); + Speed_local_HR = zeros(rS-1,1); + DateGiornoHR = DateHR(2:end); + for jH = 4:rS-1 % date + % Locali + Speed_local_HR(jH,1) = (HShift_local(jH+1,1) - HShift_local(jH,1))/(DateHR(jH+1)-DateHR(jH)); % m/g + if jH == 4 + Speed_local_HR(jH-1,1) = (HShift_local_HR(jH,1) - HShift_local_HR(jH-1,1))/(DateHR(jH)-DateHR(jH-1)); % m/g + Speed_local_HR(jH-2,1) = (HShift_local_HR(jH-1,1) - HShift_local_HR(jH-2,1))/(DateHR(jH-1)-DateHR(jH-2)); % m/g + Speed_local_HR(jH-3,1) = (HShift_local_HR(jH-2,1) - HShift_local_HR(jH-3,1))/(DateHR(jH-2)-DateHR(jH-3)); % m/g + end + end + + % Velocità in metri/giorno + jH = find(DateHR == Date(j))-1; + + % ---Criterio della velocità positiva Criterio 0--- + if Speed_local_HR(jH,1) > 0 && ... + Speed_local_HR(jH-1,1) > 0 ... + && Speed_local_HR(jH-2,1) > 0 ... + && Speed_local_HR(jH-3,1) > 0 + + % --- Calcolo Fukuzono --- + TempoHR = DateGiornoHR(jH-3:jH+N); % giorni + Vel_HR = 1000*Speed_local_HR(jH-3:jH+N,1); % mm/g + Vel_HR(Vel_HR==0) = 0.0000000001; + Inv_Vel_HR = 1./Vel_HR; + [f,rsquare] = fit(TempoHR,Inv_Vel_HR,'poly1'); + RQ_Loc_HR(jH+N,HRprog) = rsquare.rsquare; + retta = coeffvalues(f); + m = retta(1,1); + q = retta(1,2); + % Time of Failure + Tr_Loc_HR(jH+N,HRprog) = -q/m - DateGiornoHR(jH+N); + if Tr_Loc_HR(jH+N,HRprog) > 0 && Tr_Loc_HR(jH+N,HRprog) < 30 % giorni + if RQ_Loc_HR(jH+N,i) >= 0.85 + DataFuK_local_HR(jH+N,HRprog) = DateGiornoHR(jH-3); + Data_Img_HR = datestr(DateGiornoHR(jH-3),'dd-mm-yyyy'); + Tempo_Img_HR = datestr(DateGiornoHR(jH-3),'HH-MM-SS'); + % Grafico Asintotico + fig2 = plot(TempoHR,Vel_HR,'-o','LineStyle','none'); + title('Time of Failure prediction model evaluated with Electrolytic Cell'); + xlabel('Date [dd/mm/yyyy HH:MM]') + ylabel('Velocity [mm/d]') + datetick('x','dd/mm/yyyy HH:MM') + ylim([0 max(Vel_HR)+max(Vel_HR)/10]) + Nodo = cell2mat(NodoTiltHR(HRprog,2)); + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',num2str(Nodo),'-',Data_Img_HR,'_',Tempo_Img_HR,'-Local_Vel.jpg'); + saveas(fig2,filename) + % Grafico inverso velocità + fig = plot(TempoHR,Inv_Vel_HR,'-o','LineStyle','none'); + hold on + legend(num2str(RQ_Loc_HR(jH+N,i))); + Y_HR = m*TempoHR + q; + plot(Tempo,Y_HR); + title('Time of Failure prediction model evaluated with Electrolytic Cell'); + xlabel('Date [dd/mm/yyyy HH:MM]') + ylabel('Inverse of Velocity [d/mm]') + datetick('x','dd/mm/yyyy HH:MM') + ylim([0 max(Inv_Vel_HR)+max(Inv_Vel_HR)/10]) + LIM = floor(fig.XData(1)); + fig = plot(DateGiornoHR(jH+N)+Tr_Loc_HR(jH+N,HRprog),0,'-d','LineStyle','none','Color','r'); + LIM_S = ceil(Tr_Loc_HR(jH+N,HRprog)+DateGiornoHR(jH+N)); + h = gca; % Get axis to modify + xlim([LIM LIM_S]) + h.XAxis.MinorTick = 'on'; % Must turn on minor ticks if they are off + h.XAxis.MinorTickValues = LIM:1/4:LIM_S; % Minor ticks which don't line up with majors + h.XAxis.TickValues = LIM:1:LIM_S; + datetick('x','dd/mm/yyyy') + grid on + grid minor + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',num2str(Nodo),'-',Data_Img_HR,'_',Tempo_Img_HR,'-Local.jpg'); + saveas(fig,filename) + else + Tr_Loc_HR(jH+N,HRprog) = 0; + end + else + Tr_Loc_HR(jH+N,HRprog) = 0; + end + else + Tr_Loc_HR(jH,HRprog) = 0; + end + end + end + end + j = j+n+1; + else + j = j+1; + end + end + end + text = 'Fukuzono Calculation executed'; + fprintf(fileID,fmt,text); +else + alert = zeros(r,c); + alert_local = zeros(r,c); + alarm = zeros(r,c); + alarm_local = zeros(r,c); + RQ = zeros(r,c); + Number = zeros(r,c); + RQ_Loc = zeros(r,c); + Number_Loc = zeros(r,c); + Tr_Inf = zeros(r,c) - 99; + Tr_Sup = zeros(r,c) - 99; + Tr_mail = zeros(r,c) - 99; + Tr_Inf_Loc = zeros(r,c) - 99; + Tr_Sup_Loc = zeros(r,c) - 99; + Tr_Loc_mail = zeros(r,c) - 99; + DataFuK = zeros(r,c); + DataFuK_local = zeros(r,c); +end + +text = 'Fukuzono Function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/Fukuzono_Giornaliero.m b/Tilt/Fukuzono_Giornaliero.m new file mode 100755 index 0000000..31517a2 --- /dev/null +++ b/Tilt/Fukuzono_Giornaliero.m @@ -0,0 +1,725 @@ +function [alarm_STORICO,alarm_local_STORICO,DateGiorno,Tr_Loc_Sup_S,Tr_Loc_Inf_S,... + Tr_Loc_S,Tr_Sup_S,Tr_Inf_S,Tr_S,Tr_Loc_HR_S,Tr_mail_S,Tr_Loc_mail_S,DataFuK_S,... + DataFuK_local_S,DataFuK_local_HR_S,Number_S,Number_Loc_S,RQ_S,RQ_Loc_S] = ... + Fukuzono_Giornaliero(IDcentralina,DTcatena,date,ARRAYdate,yes3D,rNL,NodoTilt,... + NodoTiltHR,NodoTiltHR3D,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; + +text = 'Fukuzono_Giornaliero function started'; +fprintf(fileID,fmt,text); + +data_rif = ARRAYdate(end)-45; % 45 +Tr_Loc_HR_S = []; +DataFuK_local_HR_S = []; + +%% Scarico i dati da DB +% Tilt Link V +if data_rif > datenum(date) + data = datestr(data_rif,'yyyy-mm-dd'); +else + data = date; +end +for n = 1:rNL + NodeNum = num2str(cell2mat(NodoTilt(n,2))); + comando = ['select EventDate, EventTime, HShift_local, HShift from ElabDataView where EventDate >= ''' ... + data ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina ... + ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Dati = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Dati); + T = [cell2mat(Dati(:,1)) repmat(' ', [rD,1]) cell2mat(Dati(:,2))]; + Date = datenum(T); % Data + HShift_local(:,n) = cell2mat(Dati(:,3)); % Loc 2D + HShift(:,n) = cell2mat(Dati(:,4)); % Cum 2D +end + +%% Calcolo una singola velocità media giornaliera +[rDate,~] = size(Date); +day = 0; +fine = rDate; +diffDate = 0; +n = 2; +period = 1; % calcolo giornaliero +Indici(1,1) = rDate; +while day <= rDate + while diffDate < period + day = day+1; + if day >= rDate + break + end + diffDate = Date(fine) - Date(rDate-day); + end + if day >= rDate + break + end + Indici(n,1) = rDate-day; + n = n+1; + diffDate = 0; + fine = rDate-day; +end + +Indici = flipud(Indici); +[rI,~] = size(Indici); +DateGiorno(1,1) = Date(1,1); +if rI < 2 + Speed = []; + Speed_local = []; + DateGiorno = []; +else + for s = 2:rI + Speed(s,:) = (HShift(Indici(s),:) - HShift(Indici(s-1),:))/(Date(Indici(s),1) - Date(Indici(s-1),:)); + Speed_local(s,:) = (HShift_local(Indici(s),:) - HShift_local(Indici(s-1),:))/(Date(Indici(s),1) - Date(Indici(s-1),:)); + DateGiorno(s,1) = Date(Indici(s),1); + end +end +% Velocità in metri/giorno + +%% Criterio della velocità positiva - Criterio 0 +[rS,cS] = size(Speed); +Criterio_0 = zeros(rS,cS); +Criterio_0_local = zeros(rS,cS); +for i = 1:cS % nodi + for j = 4:rS % date + if Speed(j,i) > 0 && Speed(j-1,i) > 0 && Speed(j-2,i) > 0 && Speed(j-3,i) > 0 + Criterio_0(j,i) = 1; + end + % Locali + if Speed_local(j,i) > 0 && Speed_local(j-1,i) > 0 && Speed_local(j-2,i) > 0 && Speed_local(j-3,i) > 0 + Criterio_0_local(j,i) = 1; + end + + end +end +text = 'Criterion 0 executed'; +fprintf(fileID,fmt,text); + +%% Faccio i calcoli +Delta_Speed_local = zeros(rS,cS); +Delta_Speed = zeros(rS,cS); +diff_Cum = diff(Speed); +diff_Loc = diff(Speed_local); +Delta_Speed(2:end,:) = diff_Cum; +Delta_Speed_local(2:end,:) = diff_Loc; +act = zeros(rS,cS); +act_local = zeros(rS,cS); +for i = 1:cS % nodi + for j = 2:rS % date + if Delta_Speed(j,i) > 0 + act(j,i) = 1; + elseif Delta_Speed(j,i) < 0 + act(j,i) = -1; + end + if Delta_Speed_local(j,i) > 0 + act_local(j,i) = 1; + elseif Delta_Speed_local(j,i) < 0 + act_local(j,i) = -1; + end + end +end + +%% Criterio della Velocità Crescente - Criterio 1 +Criterio_1 = zeros(rS,cS); +Criterio_1_local = zeros(rS,cS); +if rS > 10 + for i = 1:cS % nodi + for j = 10:rS % date + if act(j,i) == 1 && act(j-1,i) == 1 && act(j-2,i) == 1 && act(j-3,i) == 1 || ... + act(j,i) == 1 && act(j-1,i) == 1 && act(j-2,i) == 1 || ... + act(j,i) == 1 && act(j-1,i) == 1 && act(j-3,i) == 1 || ... + act(j,i) == 1 && act(j-2,i) == 1 && act(j-3,i) == 1 || ... + act(j-1,i) == 1 && act(j-2,i) == 1 && act(j-3,i) == 1 + if Criterio_0(j,i) == 1 + Criterio_1(j,i) = 1; + end + end + if act_local(j,i) == 1 && act_local(j-1,i) == 1 && act_local(j-2,i) == 1 && act_local(j-3,i) == 1 || ... + act_local(j,i) == 1 && act_local(j-1,i) == 1 && act_local(j-2,i) == 1 || ... + act_local(j,i) == 1 && act_local(j-1,i) == 1 && act_local(j-3,i) == 1 || ... + act_local(j,i) == 1 && act_local(j-2,i) == 1 && act_local(j-3,i) == 1 || ... + act_local(j-1,i) == 1 && act_local(j-2,i) == 1 && act_local(j-3,i) == 1 + if Criterio_0_local(j,i) == 1 + Criterio_1_local(j,i) = 1; + end + end + end + end + text = 'Criterion 1 executed'; + fprintf(fileID,fmt,text); + + %% Criterio delle parabole - Criterio 2 + a = zeros(rS,cS); + a_Loc = zeros(rS,cS); + Criterio_2 = zeros(rS,cS); + Criterio_2_local = zeros(rS,cS); + for i = 1:cS % nodi + for j = 13:rS % date + if Criterio_1(j,i) == 1 + % j-3 + x = DateGiorno(j-12:j-3); + y = Speed(j-12:j-3,i); + f = fit(x,y,'poly2'); + coeff = coeffvalues(f); + a(j-3,i) = coeff(1,1); + % j-2 + x = DateGiorno(j-11:j-2); + y = Speed(j-11:j-2,i); + f = fit(x,y,'poly2'); + coeff = coeffvalues(f); + a(j-2,i) = coeff(1,1); + % j-1 + x = DateGiorno(j-10:j-1); + y = Speed(j-10:j-1,i); + f = fit(x,y,'poly2'); + coeff = coeffvalues(f); + a(j-1,i) = coeff(1,1); + % j + x = DateGiorno(j-9:j); + y = Speed(j-9:j,i); + f = fit(x,y,'poly2'); + coeff = coeffvalues(f); + a(j,i) = coeff(1,1); + % Criterio 2 + if a(j,i) > 0 && a(j-1,i) > 0 && a(j-2,i) > 0 && a(j-3,i) > 0 ||... + a(j,i) > 0 && a(j-1,i) > 0 && a(j-2,i) > 0 ||... + a(j,i) > 0 && a(j-1,i) > 0 && a(j-3,i) > 0 ||... + a(j,i) > 0 && a(j-2,i) > 0 && a(j-3,i) > 0 ||... + a(j-1,i) > 0 && a(j-2,i) > 0 && a(j-3,i) > 0 + + Criterio_2(j,i) = 1; + end + end + if Criterio_1_local(j,i) == 1 + % j-3 + x = DateGiorno(j-12:j-3); + y = Speed_local(j-12:j-3,i); + f = fit(x,y,'poly2'); + coeff = coeffvalues(f); + a_Loc(j-3,i) = coeff(1,1); + % j-2 + x = DateGiorno(j-11:j-2); + y = Speed_local(j-11:j-2,i); + f = fit(x,y,'poly2'); + coeff = coeffvalues(f); + a_Loc(j-2,i) = coeff(1,1); + % j-1 + x = DateGiorno(j-10:j-1); + y = Speed_local(j-10:j-1,i); + f = fit(x,y,'poly2'); + coeff = coeffvalues(f); + a_Loc(j-1,i) = coeff(1,1); + % j + x = DateGiorno(j-9:j); + y = Speed_local(j-9:j,i); + f = fit(x,y,'poly2'); + coeff = coeffvalues(f); + a_Loc(j,i) = coeff(1,1); + if a_Loc(j,i) > 0 && a_Loc(j-1,i) > 0 && a_Loc(j-2,i) > 0 && a_Loc(j-3,i) > 0 || ... + a_Loc(j,i) > 0 && a_Loc(j-1,i) > 0 && a_Loc(j-2,i) > 0 || ... + a_Loc(j,i) > 0 && a_Loc(j-1,i) > 0 && a_Loc(j-3,i) > 0 || ... + a_Loc(j,i) > 0 && a_Loc(j-2,i) > 0 && a_Loc(j-3,i) > 0 || ... + a_Loc(j-1,i) > 0 && a_Loc(j-2,i) > 0 && a_Loc(j-3,i) > 0 + + Criterio_2_local(j,i) = 1; + end + end + end + end + text = 'Criterion 2 executed'; + fprintf(fileID,fmt,text); + + %% Criterio della concavità crescente - Criterio 3 + Delta_a = zeros(rS,cS); + Delta_a_local = zeros(rS,cS); + diff_a = diff(a); + diff_a_Loc = diff(a_Loc); + Delta_a(2:end,:) = diff_a; + Delta_a_local(2:end,:) = diff_a_Loc; + Criterio_3 = zeros(rS,cS); + Criterio_3_local = zeros(rS,cS); + for i = 1:cS % nodi + for j = 13:rS % date + if Criterio_2(j,i) == 1 + if Delta_a(j,i) > 0 && Delta_a(j-1,i) > 0 && Delta_a(j-2,i) > 0 && Delta_a(j-3,i) > 0 || ... + Delta_a(j,i) > 0 && Delta_a(j-1,i) > 0 && Delta_a(j-2,i) > 0 || ... + Delta_a(j,i) > 0 && Delta_a(j-1,i) > 0 && Delta_a(j-3,i) > 0 || ... + Delta_a(j,i) > 0 && Delta_a(j-2,i) > 0 && Delta_a(j-3,i) > 0 || ... + Delta_a(j-1,i) > 0 && Delta_a(j-2,i) > 0 && Delta_a(j-3,i) > 0 + + Criterio_3(j,i) = 1; + end + end + if Criterio_2_local(j,i) == 1 + if Delta_a_local(j,i) > 0 && Delta_a_local(j-1,i) > 0 && Delta_a_local(j-2,i) > 0 && Delta_a_local(j-3,i) > 0 ||... + Delta_a_local(j,i) > 0 && Delta_a_local(j-1,i) > 0 && Delta_a_local(j-2,i) > 0 ||... + Delta_a_local(j,i) > 0 && Delta_a_local(j-1,i) > 0 && Delta_a_local(j-3,i) > 0 ||... + Delta_a_local(j,i) > 0 && Delta_a_local(j-2,i) > 0 && Delta_a_local(j-3,i) > 0 ||... + Delta_a_local(j-1,i) > 0 && Delta_a_local(j-2,i) > 0 && Delta_a_local(j-3,i) > 0 + + Criterio_3_local(j,i) = 1; + end + end + end + end + text = 'Criterion 3 executed'; + fprintf(fileID,fmt,text); + + %% Criterio di Fukuzono + alarm_STORICO = zeros(rS,cS); + alarm_local_STORICO = zeros(rS,cS); + RQ_S = zeros(rS,cS); + RQ_Loc_S = zeros(rS,cS); + Number_S = zeros(rS,cS); + Number_Loc_S = zeros(rS,cS); + Tr_S = zeros(rS,cS) - 99; + Tr_Inf_S = zeros(rS,cS) - 99; + Tr_Sup_S = zeros(rS,cS) - 99; + Tr_mail_S = zeros(rS,cS) - 99; + Tr_Loc_S = zeros(rS,cS) - 99; + Tr_Loc_Inf_S = zeros(rS,cS) - 99; + Tr_Loc_Sup_S = zeros(rS,cS) - 99; + Tr_Loc_mail_S = zeros(rS,cS) - 99; + DataFuK_S = zeros(rS,cS); + DataFuK_local_S = zeros(rS,cS); + for i = 1:cS % nodi + j = 13; + % -------------- Cumulati -------------------------- + while j <=(rS-1) + hold off + DEPETRIS = 0; + if Criterio_3(j,i) == 1 + Tempo = DateGiorno(j-3:j); % giorni + Vel = 1000*Speed(j-3:j,i); % mm/g + Vel(Vel==0) = 0.0000000001; + Inv_Vel = 1./Vel; + [f,rsquare] = fit(Tempo,Inv_Vel,'poly1'); + retta = coeffvalues(f); + m = retta(1,1); % m + q = retta(1,2); % q + % Time of failure + Tr_S(j,i) = -q/m - DateGiorno(j); + if Tr_S(j,i) > 0 && Tr_S(j,i) < 30 % giorni + % RQ + RQ_S(j,i) = rsquare.rsquare; + % Grafico Inv V - T + Data_Img = datestr(DateGiorno(j-3),'dd-mm-yyyy'); + Tempo_Img = datestr(DateGiorno(j-3),'HH-MM-SS'); + fig = plot(Tempo,Inv_Vel,'-o','LineStyle','none'); + hold on + legend(num2str(RQ_S(j,i))); + Y = m*Tempo + q; + plot(Tempo,Y); + title('Time of Failure prediction model'); + xlabel('Date [dd/mm/yyyy]') + ylabel('Inverse of Velocity [d/mm]') + datetick('x','dd/mm/yyyy HH:MM') + ylim([0 max(Inv_Vel)+max(Inv_Vel)/10]) + % Grafico Vel - T + hold off + fig2 = plot(Tempo,Vel,'-o','LineStyle','none'); + title('Time of Failure prediction model'); + xlabel('Date [dd/mm/yyyy]') + ylabel('Velocity [mm/d]') + datetick('x','dd/mm/yyyy HH:MM') + ylim([0 max(Vel)+max(Vel)/10]) + end + % dato successivo + for n = 1:(rS-j) + if Criterio_3(n+j,i) == 1 || Criterio_3(n+j-1,i) == 1 + Tempo = DateGiorno(j-3:j+n); % giorni + Vel = 1000*Speed(j-3:j+n,i); % mm/g + Vel(Vel==0) = 0.0000000001; + Inv_Vel = 1./Vel; + [f,rsquare] = fit(Tempo,Inv_Vel,'poly1'); + RQ_S(j+n,i) = rsquare.rsquare; + retta = coeffvalues(f); + m = retta(1,1); + q = retta(1,2); + % Time of Failure + Tr_S(j+n,i) = -q/m - DateGiorno(j+n); + if Tr_S(j+n,i) > 0 && Tr_S(j+n,i) < 30 % giorni + if RQ_S(j+n,i) >= 0.85 + Tr_mail_S(j+n,i) = -q/m - DateGiorno(j+n);% attivo + Tr_mail_S(j+n-1,i) = -99; % disattivo + alarm_STORICO(j+n-1,i) = 0; % disattivo + alarm_STORICO(j+n,i) = 1; % attivo + DataFuK_S(j+n,i) = DateGiorno(j-3); + DataFuK_S(j,i) = 0; + Data_Img = datestr(DateGiorno(j-3),'dd-mm-yyyy'); + Tempo_Img = datestr(DateGiorno(j-3),'HH-MM-SS'); + % Grafico asintotico + hold off + fig2 = plot(Tempo,Vel,'-o','LineStyle','none'); + title('Time of Failure prediction model'); + xlabel('Date [dd/mm/yyyy]') + ylabel('Velocity [mm/d]') + datetick('x','dd/mm/yyyy HH:MM') + ylim([0 max(Vel)+max(Vel)/10]) + Nodo = cell2mat(NodoTilt(i,2)); + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',num2str(Nodo),'-',Data_Img,'_',Tempo_Img,'_Vel_Storico.jpg'); + saveas(fig2,filename) + % Grafico inverso velocità + fig = plot(Tempo,Inv_Vel,'-o','LineStyle','none'); + hold on + legend(num2str(RQ_S(j+n,i))); + Y = m*Tempo + q; + Y = [Y; 0]; + Tempo_End = -q/m; + Tempo_G = [Tempo; Tempo_End]; + plot(Tempo_G,Y); + title('Time of Failure prediction model'); + xlabel('Date [dd/mm/yyyy]') + ylabel('Inverse of Velocity [d/mm]') + datetick('x','dd/mm/yyyy HH:MM') + ylim([0 max(Inv_Vel)+max(Inv_Vel)/10]) + LIM = floor(fig.XData(1)); + % Variazione statistica dei dati di + % monitoraggio + % Limite Superiore + Inv_Vel_Sup = Inv_Vel + mean(Inv_Vel)*(1-RQ_S(j+n,i)); + [f,rsquare] = fit(Tempo,Inv_Vel_Sup,'poly1'); + retta = coeffvalues(f); + m_Sup = retta(1,1); + q_Sup = retta(1,2); + Tr_Sup_S(j+n,i) = -q_Sup/m_Sup; + Tr_Sup_S(j+n-1,i) = 99; + Y_Sup = m_Sup*Tempo + q_Sup; + Y_Sup = [Y_Sup; 0]; + Tempo_End = -q_Sup/m_Sup; + Tempo_G = [Tempo; Tempo_End]; + plot(Tempo_G,Y_Sup,'--'); + % Limite Inferiore + Inv_Vel_Inf = Inv_Vel - mean(Inv_Vel)*(1-RQ_S(j+n,i)); + [f,rsquare] = fit(Tempo,Inv_Vel_Inf,'poly1'); + retta = coeffvalues(f); + m_Inf = retta(1,1); + q_Inf = retta(1,2); + Tr_Inf_S(j+n,i) = -q_Inf/m_Inf; + Tr_Inf_S(j+n-1,i) = 99; + Y_Inf = m_Inf*Tempo + q_Inf; + Y_Inf = [Y_Inf; 0]; + Tempo_End = -q_Inf/m_Inf; + Tempo_G = [Tempo; Tempo_End]; + plot(Tempo_G,Y_Inf,'--'); + datetick('x','dd/mm/yyyy HH:MM') + DEPETRIS = 1; + N = n; + Number_S(j+N,i) = N+4; + end + end + else + break + end + end + if DEPETRIS == 1 + hold on + fig = plot(DateGiorno(j+N)+Tr_S(j+N,i),0,'-d','LineStyle','none','Color','r'); + plot(Tr_Sup_S(j+N,i),0,'-v','LineStyle','none','Color','k'); + LIM_S = ceil(Tr_Sup_S(j+N,i)); + plot(Tr_Inf_S(j+N,i),0,'-v','LineStyle','none','Color','k'); + legend(['RQ: ' num2str(RQ_S(j+N,i))]); + h = gca; % Get axis to modify + xlim([LIM(1) LIM_S(end)]) + h.XAxis.MinorTick = 'on'; % Must turn on minor ticks if they are off + h.XAxis.MinorTickValues = LIM(1):1/4:LIM_S(end); % Minor ticks which don't line up with majors + h.XAxis.TickValues = LIM(1):1:LIM_S(end); + datetick('x','dd/mm/yyyy') + grid on + grid minor + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',num2str(Nodo),'-',Data_Img,'_',Tempo_Img,'_Storico.jpg'); + saveas(fig,filename) + end + j = j+n+1; + else + j = j+1; + end + end + % -------------- Locali -------------------------- + j = 13; + while j <=(rS-1) + hold off + GIOLITTI = 0; + if Criterio_3_local(j,i) == 1 + Tempo = DateGiorno(j-3:j); % giorni + Vel = 1000*Speed_local(j-3:j,i); % mm/g + Vel(Vel==0) = 0.0000000001; + Inv_Vel = 1./Vel; + [f,rsquare] = fit(Tempo,Inv_Vel,'poly1'); + retta = coeffvalues(f); + m = retta(1,1); + q = retta(1,2); + % Time of Failure + Tr_Loc_S(j,i) = -q/m - DateGiorno(j); + if Tr_Loc_S(j,i) > 0 && Tr_Loc_S(j,i) < 30 + % RQ + RQ_Loc_S(j,i) = rsquare.rsquare; + % Grafico Inv V - T + Data_Img = datestr(DateGiorno(j-3),'dd-mm-yyyy'); + Tempo_Img = datestr(DateGiorno(j-3),'HH-MM-SS'); + % Grafico + fig = plot(Tempo,Inv_Vel,'-o','LineStyle','none'); + hold on + legend(num2str(RQ_Loc_S(j,i))); + Y = m*Tempo + q; + plot(Tempo,Y); + title('Time of Failure prediction model'); + xlabel('Date [dd/mm/yyyy]') + ylabel('Inverse of Velocity [d/mm]') + datetick('x','dd/mm/yyyy HH:MM') + ylim([0 max(Inv_Vel)+max(Inv_Vel)/10]) + % Grafico Vel - T + hold off + fig2 = plot(Tempo,Vel,'-o','LineStyle','none'); + title('Time of Failure prediction model'); + xlabel('Date [dd/mm/yyyy]') + ylabel('Velocity [mm/d]') + datetick('x','dd/mm/yyyy HH:MM') + ylim([0 max(Vel)+max(Vel)/10]) + end + % dato successivo + for n = 1:(rS-j) + if Criterio_3_local(n+j,i) == 1 || Criterio_3_local(n+j-1,i) == 1 + Tempo = DateGiorno(j-3:j+n); % giorni + Vel = 1000*Speed_local(j-3:j+n,i); % mm/g + Vel(Vel==0) = 0.0000000001; + Inv_Vel = 1./Vel; + [f,rsquare] = fit(Tempo,Inv_Vel,'poly1'); + RQ_Loc_S(j+n,i) = rsquare.rsquare; + retta = coeffvalues(f); + m = retta(1,1); + q = retta(1,2); + % Time of Failure + Tr_Loc_S(j+n,i) = -q/m - DateGiorno(j+n); + if Tr_Loc_S(j+n,i) > 0 && Tr_Loc_S(j+n,i) < 30 % giorni + if RQ_Loc_S(j+n,i) >= 0.85 + Tr_Loc_mail_S(j+n,i) = -q/m - DateGiorno(j+n); + Tr_Loc_mail_S(j+n-1,i) = -99; % disattivo + alarm_local_STORICO(j+n-1,i) = 0; % disattivo + alarm_local_STORICO(j+n,i) = 1; % attivo + DataFuK_local_S(j+n,i) = DateGiorno(j-3); + DataFuK_local_S(j,i) = 0; + Data_Img = datestr(DateGiorno(j-3),'dd-mm-yyyy'); + Tempo_Img = datestr(DateGiorno(j-3),'HH-MM-SS'); + % Grafico Asintotico + hold off + fig2 = plot(Tempo,Vel,'-o','LineStyle','none'); + title('Time of Failure prediction model'); + xlabel('Date [dd/mm/yyyy]') + ylabel('Velocity [mm/d]') + datetick('x','dd/mm/yyyy HH:MM') + ylim([0 max(Vel)+max(Vel)/10]) + Nodo = cell2mat(NodoTilt(i,2)); + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',num2str(Nodo),'-',Data_Img,'_',Tempo_Img,'-Local_Vel_Storico.jpg'); + saveas(fig2,filename) + % Grafico inverso velocità + fig = plot(Tempo,Inv_Vel,'-o','LineStyle','none'); + hold on + legend(num2str(RQ_Loc_S(j+n,i))); + Y = m*Tempo + q; + Y = [Y; 0]; + Tempo_End = -q/m; + Tempo_G = [Tempo; Tempo_End]; + plot(Tempo_G,Y); + title('Time of Failure prediction model'); + xlabel('Date [dd/mm/yyyy]') + ylabel('Inverse of Velocity [d/mm]') + datetick('x','dd/mm/yyyy HH:MM') + ylim([0 max(Inv_Vel)+max(Inv_Vel)/10]) + LIM = floor(fig.XData(1)); + % Variazione statistica dei dati di + % monitoraggio + % Limite Superiore + Inv_Vel_Sup = Inv_Vel + mean(Inv_Vel)*(1-RQ_Loc_S(j+n,i)); + [f,rsquare] = fit(Tempo,Inv_Vel_Sup,'poly1'); + retta = coeffvalues(f); + m_Sup = retta(1,1); + q_Sup = retta(1,2); + Tr_Loc_Sup_S(j+n,i) = -q_Sup/m_Sup; + Tr_Loc_Sup_S(j+n-1,i) = 99; + Y_Sup = m_Sup*Tempo + q_Sup; + Y_Sup = [Y_Sup; 0]; + Tempo_End = -q_Sup/m_Sup; + Tempo_G = [Tempo; Tempo_End]; + plot(Tempo_G,Y_Sup,'--'); + % Limite Inferiore + Inv_Vel_Inf = Inv_Vel - mean(Inv_Vel)*(1-RQ_Loc_S(j+n,i)); + [f,rsquare] = fit(Tempo,Inv_Vel_Inf,'poly1'); + retta = coeffvalues(f); + m_Inf = retta(1,1); + q_Inf = retta(1,2); + Tr_Loc_Inf_S(j+n,i) = -q_Inf/m_Inf; + Tr_Loc_Inf_S(j+n-1,i) = 99; + Y_Inf = m_Inf*Tempo + q_Inf; + Y_Inf = [Y_Inf; 0]; + Tempo_End = -q_Inf/m_Inf; + Tempo_G = [Tempo; Tempo_End]; + plot(Tempo_G,Y_Inf,'--'); + datetick('x','dd/mm/yyyy HH:MM') + GIOLITTI = 1; + N = n; + Number_Loc_S(j+N,i) = N+4; + end + end + else + break + end + end + if GIOLITTI == 1 + hold on + fig = plot(DateGiorno(j+N)+Tr_Loc_S(j+N,i),0,'-d','LineStyle','none','Color','r'); + plot(Tr_Loc_Sup_S(j+N,i),0,'-v','LineStyle','none','Color','k'); + LIM_S = ceil(Tr_Loc_Sup_S(j+N,i)); + plot(Tr_Loc_Inf_S(j+N,i),0,'-v','LineStyle','none','Color','k'); + legend(['RQ: ' num2str(RQ_Loc_S(j+N,i))]); + h = gca; % Get axis to modify + xlim([LIM(1) LIM_S(end)]) + h.XAxis.MinorTick = 'on'; % Must turn on minor ticks if they are off + h.XAxis.MinorTickValues = LIM(1):1/4:LIM_S(end); % Minor ticks which don't line up with majors + h.XAxis.TickValues = LIM(1):1:LIM_S(end); + datetick('x','dd/mm/yyyy') + grid on + grid minor + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',num2str(Nodo),'-',Data_Img,'_',Tempo_Img,'-Local_Storico.jpg'); + saveas(fig,filename) + if yes3D == 1 + HRindex = find(cell2mat(NodoTiltHR3D(:,2))==Nodo); + if isempty(HRindex) ~= 1 + NodeHR = NodoTiltHR3D(HRindex,3); + HRprog = find(cell2mat(NodoTiltHR(:,2))==cell2mat(NodeHR)); + [rT,~] = size(Tempo); + DateHR = zeros(rT,1); + HShift_local_HR = zeros(rT,1); + nHR = 1; + for tt = 1:rT+1 + if tt == 1 + Data_HR = datestr(DateGiorno(j-4),'yyyy-mm-dd'); + Tempo_HR = datestr(DateGiorno(j-4),'HH:MM:SS'); + else + Data_HR = datestr(Tempo(tt-1),'yyyy-mm-dd'); + Tempo_HR = datestr(Tempo(tt-1),'HH:MM:SS'); + end + NodeNum = num2str(cell2mat(NodeHR)); + comando1 = ['select EventDate, EventTime, HShift_local from ElabDataView where EventDate = ''' ... + Data_HR ''' and EventTime = ''' Tempo_HR ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando1); + curs = fetch(curs); + Dati_HR = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Dati_HR); + T = [cell2mat(Dati_HR(:,1)) repmat(' ', [rD,1]) cell2mat(Dati_HR(:,2))]; + DateHR(nHR,1) = datenum(T); % Data + HShift_local_HR(nHR,1) = cell2mat(Dati_HR(:,3)); % Loc 2D + nHR = nHR+1; + end + %% Calcolo una singola velocità media giornaliera + [rI,~] = size(DateHR); + DateGiornoHR = DateHR(2:end); + for s = 2:rI + Speed_local_HR(s-1,:) = (HShift_local_HR(s,:) - HShift_local_HR(s-1,:))/(DateHR(s,1) - DateHR(s-1,:)); + end + % Velocità in metri/giorno + jHR = find(DateGiornoHR == DateGiorno(j)); + + % ---Criterio della velocità positiva Criterio 0--- + if Speed_local_HR(jHR,1) > 0 && ... + Speed_local_HR(jHR-1,1) > 0 ... + && Speed_local_HR(jHR-2,1) > 0 ... + && Speed_local_HR(jHR-3,1) > 0 + + % --- Calcolo Fukuzono --- + TempoHR = DateGiornoHR(jHR-3:jHR+N); % giorni + Vel_HR = 1000*Speed_local_HR(jHR-3:jHR+N,1); % mm/g + Vel_HR(Vel_HR==0) = 0.0000000001; + Inv_Vel_HR = 1./Vel_HR; + [f,rsquare] = fit(TempoHR,Inv_Vel_HR,'poly1'); + RQ_Loc_HR_S(jHR+N,HRprog) = rsquare.rsquare; + retta = coeffvalues(f); + m = retta(1,1); + q = retta(1,2); + % Time of Failure + Tr_Loc_HR_S(jHR+N,HRprog) = -q/m - DateGiornoHR(jHR+N); + if Tr_Loc_HR_S(jHR+N,HRprog) > 0 && Tr_Loc_HR_S(jHR+N,HRprog) < 30 % giorni + if RQ_Loc_HR_S(jHR+N,i) >= 0.85 + DataFuK_local_HR_S(jHR+N,HRprog) = DateGiornoHR(jHR-3); + Data_Img_HR = datestr(DateGiornoHR(jHR-3),'dd-mm-yyyy'); + Tempo_Img_HR = datestr(DateGiornoHR(jHR-3),'HH-MM-SS'); + % Grafico Asintotico + fig2 = plot(TempoHR,Vel_HR,'-o','LineStyle','none'); + title('Time of Failure prediction model evaluated with Electrolytic Cell'); + xlabel('Date [dd/mm/yyyy]') + ylabel('Velocity [mm/d]') + datetick('x','dd/mm/yyyy HH:MM') + ylim([0 max(Vel_HR)+max(Vel_HR)/10]) + Nodo = cell2mat(NodoTiltHR(HRprog,2)); + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',num2str(Nodo),'-',Data_Img_HR,'_',Tempo_Img_HR,'-Local_Vel_Storico.jpg'); + saveas(fig2,filename) + % Grafico inverso velocità + fig = plot(TempoHR,Inv_Vel_HR,'-o','LineStyle','none'); + hold on + legend(num2str(RQ_Loc_HR_S(jHR+N,i))); + Y_HR = m*TempoHR + q; + plot(Tempo,Y_HR); + title('Time of Failure prediction model evaluated with Electrolytic Cell'); + xlabel('Date [dd/mm/yyyy]') + ylabel('Inverse of Velocity [d/mm]') + datetick('x','dd/mm/yyyy HH:MM') + ylim([0 max(Inv_Vel_HR)+max(Inv_Vel_HR)/10]) + LIM = floor(fig.XData(1)); + fig = plot(DateGiornoHR(jHR+N)+Tr_Loc_HR_S(jHR+N,HRprog),0,'-d','LineStyle','none','Color','r'); + LIM_S = ceil(Tr_Loc_HR_S(jHR+N,HRprog)+DateGiornoHR(jHR+N)); + h = gca; % Get axis to modify + xlim([LIM LIM_S]) + h.XAxis.MinorTick = 'on'; % Must turn on minor ticks if they are off + h.XAxis.MinorTickValues = LIM:1/4:LIM_S; % Minor ticks which don't line up with majors + h.XAxis.TickValues = LIM:1:LIM_S; + datetick('x','dd/mm/yyyy') + grid on + grid minor + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',num2str(Nodo),'-',Data_Img_HR,'_',Tempo_Img_HR,'-Local_Storico.jpg'); + saveas(fig,filename) + else + Tr_Loc_HR_S(jHR+N,HRprog) = 0; + end + else + Tr_Loc_HR_S(jHR+N,HRprog) = 0; + end + else + Tr_Loc_HR_S(jHR,HRprog) = 0; + end + end + end + end + j = j+n+1; + else + j = j+1; + end + end + end + text = 'Fukuzono_Giornaliero Calculation executed'; + fprintf(fileID,fmt,text); +else + alarm_STORICO = zeros(rS,cS); + alarm_local_STORICO = zeros(rS,cS); + Tr_Loc_Sup_S = []; + Tr_Loc_Inf_S = []; + Tr_Loc_S = []; + Tr_Sup_S = []; + Tr_Inf_S = []; + Tr_S = []; + Tr_mail_S = []; + Tr_Loc_mail_S = []; + DataFuK_local_S = []; + DataFuK_S = []; + Number_S = []; + Number_Loc_S = []; + RQ_S = []; + RQ_Loc_S = []; +end +text = 'Fukuzono_Giornaliero function executed'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/Tilt/IDunit.m b/Tilt/IDunit.m new file mode 100755 index 0000000..c919a90 --- /dev/null +++ b/Tilt/IDunit.m @@ -0,0 +1,15 @@ +function unitID = IDunit(IDcentralina,conn,FileName) + +text = 'IDunit function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +comando = ['select id from units where name like ''' IDcentralina ''' ']; +unitID = fetch(conn,comando); + +text = 'Unit ID downloaded correctly, IDunit function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/Klino.m b/Tilt/Klino.m new file mode 100755 index 0000000..77abbe0 --- /dev/null +++ b/Tilt/Klino.m @@ -0,0 +1,256 @@ +function [ANGdefKL,TdefKL,ErrKlinoLink,ARRAYdateKL] = Klino(ANGdefKL,TdefKL,... + ARRAYdateKL,ErrKlinoLink,NuovoZeroKL,NdatiMedia,Ndatidespike,ris_acc,tolleranzaAcc,... + Tmax,Tmin,datainiKL,rKL,IDcentralina,DTcatena,margine,NodoKlinoLink,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'Klino function started'; +fprintf(fileID,fmt,text); + +if NuovoZeroKL == 1 + if NdatiMedia > Ndatidespike + Ndati = NdatiMedia; + else + Ndati = Ndatidespike; + end + ini = round(Ndati/2)+1; + if rem(Ndati,2) == 0 + ini = ini+1; + end + clear NDati + ini = ini + margine; + if ini < 6 + ini = 6; + end + [letture,~]=size(ANGdefKL); + if ini > letture + ini = 1; + end + ErrKlinoLink = ErrKlinoLink(ini:end,:); + ANGdefKL = ANGdefKL(ini:end,:); + TdefKL = TdefKL(ini:end,:); + ARRAYdateKL = ARRAYdateKL(ini:end,1); + ris_acc = ris_acc(ini:end,:); +end + +if strcmp(NodoKlinoLink{1,4} ,'Gradi') + TempDef = TdefKL'; + Angolo = ANGdefKL'; +else + %% Controllo delle risultanti di accelerazione + clear r + clear rr + clear c + clear cc + [r,c] = size(ris_acc); + [rr,cc] = size(ANGdefKL); + % controllo che le matrici con le risultanti delle accelerazioni e + % le matrici con i dati di angolo di inclinazione + % abbiano le stesse dimensioni (r con cc e c con rr perchè matrice + % ris_acc è trasposta!) + + if c~=cc/3 + text = '--- Warning! Number of columns of angle data do not correspond to the number of acceleration cosine vector! ---'; + fprintf(fileID,fmt,text); + end + if r~=rr + text = '--- Warning! Number of rows of angle data do not correspond to the number of acceleration cosine vector! ---'; + fprintf(fileID,fmt,text); + end + clear i + clear j + cont = 1; % contatore + cont3 = 1; % contatore + ris_acc = ris_acc'; % Nodi in riga, date in colonna + TempDef = TdefKL'; + Angolo = ANGdefKL'; + textA = 'There are not correction of Klino Link based on acceleration vectors filter'; + textA2 = 'There are not correction of Klino Link based on uncalibrated acceleration vectors'; + textT = 'There are not correction of Klino Link based on temperature filter'; + for j = 2:r % Data + nodo = 1; + for i = 1:c % Nodo + % se il valore assoluto della differenza è maggiore della + % tolleranza, pongo l'angolo pari al valore precendete + if abs(ris_acc(i,j)-ris_acc(i,j-1)) > tolleranzaAcc + Angolo(nodo:nodo+2,j) = Angolo(nodo:nodo+2,j-1); + textA = ['' num2str(cont) ' correction executed for Klino Link - Acceleration vector filter!']; + cont = cont+1; + end + if ris_acc(i,j) < 0.9 || ris_acc(i,j) > 1.1 % Il nodo è fuori taratura! + Angolo(nodo:nodo+2,j) = Angolo(nodo:nodo+2,j-1); + TempDef(i,j) = TempDef(i,j-1); + textA2 = ['' num2str(cont) ' correction executed for Klino Link - uncalibrated Acceleration vector!']; + cont3 = cont3+1; + end + nodo = nodo+3; + end + end + fprintf(fileID,fmt,textA); + fprintf(fileID,fmt,textA2); +end + +%% Controllo della temperatura +FileTemperature = ['' IDcentralina '-' DTcatena '-KL-Therm.csv']; +if isfile(FileTemperature) == 1 + DatiRaw = csvread(FileTemperature); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; +else + rDR = 1; + cDR = 1; +end +[~,cEr] = size(ErrKlinoLink); +[rr,c] = size(TdefKL); +col = cEr/rKL; +cont2 = 1; +for j = 1:rr % Data + jj = col; + nodo = 1; + for i = 1:c % Nodo + % NON considero i dati al di sopra di Tmax o al di sotto di Tmin + if TempDef(i,j) > Tmax || TempDef(i,j) < Tmin + cont2 = cont2+1; + if j == 1 + if isfile(FileTemperature) == 1 + RawDate = find(DatiRaw(:,1)<=datenum(datainiKL)); + if isempty(RawDate) == 1 + cc = 2; + while cc <= Ndate + if TempDef(i,cc) > Tmax || TempDef(i,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef(i,j) = TempDef(i,cc); + else + if isnan(DatiRaw(RawDate(end),i)) == 0 + TempDef(i,j) = DatiRaw(RawDate(end),i+1); + ErrKlinoLink(j,jj) = 0.5; + wardat = 'Temperature data of Klino Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + else + cc = 2; + while cc <= c + if TempDef(i,cc) > Tmax || TempDef(i,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef(i,j) = TempDef(i,cc); + end + end + else + cc = 2; + while cc <= c + if TempDef(i,cc) > Tmax || TempDef(i,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef(i,j) = TempDef(i,cc); + end + else + if col == 3 + Angolo(nodo:nodo+1,j) = Angolo(nodo:nodo+1,j-1); + nodo = nodo+2; + elseif col == 4 + Angolo(nodo:nodo+2,j) = Angolo(nodo:nodo+2,j-1); + nodo = nodo+3; + end + TempDef(i,j) = TempDef(i,j-1); + ErrKlinoLink(j,jj) = 0.5; + end + end + textT = ['' num2str(cont2) ' correction executed for Klino Link - Temperature filter!']; + jj = jj+cEr/rKL; + end +end + +if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=ARRAYdateKL(1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(ARRAYdateKL(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(ARRAYdateKL(:,1)>DatiRaw(RawDate1(end)+1,1)); + end +else + RawDate1 = []; + RawDate2 = 1; +end +if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:); ARRAYdateKL(RawDate2(1):end,1) TempDef(:,RawDate2(1):end)']; +elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = [ARRAYdateKL TempDef']; +else + Dati = DatiRaw; +end +% Elimino appoggio più vecchio di un mese +RawDate3 = find(Dati(:,1) Ndatidespike + Ndati = NdatiMedia; + else + Ndati = Ndatidespike; + end + ini = round(Ndati/2)+1; + if rem(Ndati,2) == 0 + ini = ini+1; + end + clear NDati + ini = ini + margine; + if ini < 6 + ini = 6; + end + ErrKlinoLinkHR = ErrKlinoLinkHR(ini:end,:); + ANGdefKLHR = ANGdefKLHR(ini:end,:); + TdefKLHR = TdefKLHR(ini:end,:); + ARRAYdateKLHR = ARRAYdateKLHR(ini:end,1); +end + +if strcmp(NodoKlinoLinkHR(1,4),'IPTM') == 1 +else + %% Controllo della temperatura + FileTemperature = ['' IDcentralina '-' DTcatena '-KLHR-Therm.csv']; + if isfile(FileTemperature) == 1 + DatiRaw = csvread(FileTemperature); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + else + rDR = 1; + cDR = 1; + end + [r,c] = size(ANGdefKLHR); + contT = 1; % contatore + TempDef = TdefKLHR'; + Angolo = ANGdefKLHR'; + textT = 'There are not correction of Klino Link HR based on temperature filter'; + for j = 1:r % Data + nodo = 1; + jj = 6; + for i = 1:c/2 % Nodo + % NON considero i dati al di sopra di TempMAX °C o al di sotto di TempMIN °C! + if TempDef(i,j) > Tmax || TempDef(i,j) < Tmin + if j == 1 + if isfile(FileTemperature) == 1 + RawDate = find(DatiRaw(:,1)<=datenum(datainiKLHR)); + if isempty(RawDate) == 1 + cc = 2; + while cc <= Ndate + if TempDef(i,cc) > Tmax || TempDef(i,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef(i,j) = TempDef(i,cc); + else + if isnan(DatiRaw(RawDate(end),jj)) == 0 + TempDef(i,j) = DatiRaw(RawDate(end),j+1); + ErrKlinoLinkHR(j,jj) = 0.5; + wardat = 'Temperature data of Klino Link HR nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + else + cc = 2; + while cc <= c + if TempDef(i,cc) > Tmax || TempDef(i,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef(i,j) = TempDef(i,cc); + end + end + else + cc = 2; + while cc <= c + if TempDef(i,cc) > Tmax || TempDef(i,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef(i,j) = TempDef(i,cc); + end + else + Angolo(nodo:nodo+1,j) = Angolo(nodo:nodo+1,j-1); + TempDef(i,j) = TempDef(i,j-1); + ErrKlinoLinkHR(j,jj) = 0.5; + end + end + textT = ['' num2str(contT) ' correction executed for Klino Link HR - Temperature filter!']; + jj = jj+6; + end + end + + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=ARRAYdateKLHR(1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(ARRAYdateKLHR(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(ARRAYdateKLHR(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:); ARRAYdateKLHR(RawDate2(1):end,1) TempDef(:,RawDate2(1):end)']; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = [ARRAYdateKLHR TempDef']; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' time ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumTL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI && cI == 1 % Non ci sono dati per la data "date" + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumTL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + % Dati elaborati + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' NodeNumTL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiTL = datestr(data1,'yyyy-mm-dd'); + tempoiniTL = datestr(data1,'HH:MM:SS'); + NuovoZeroTL = 0; + DatiElabTiltLink = []; + margine = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < round(Ndatidespike/2) + cont = round(Ndatidespike/2); + end + [rDS,~] = size(Data_numero); + if rDS <= cont + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiTL = datestr(data2,'yyyy-mm-dd'); + tempoiniTL = datestr(data2,'HH:MM:SS'); + NuovoZeroTL = 1; + else + datainiTL = datestr(data1,'yyyy-mm-dd'); + tempoiniTL = datestr(data1,'HH:MM:SS'); + NuovoZeroTL = 0; + end + end + + if NuovoZeroTL == 1 % scarico gli ultimi dati elaborati + NAN = 0; + while NAN == 0 + if datenum(datainiTL) < datenum(date) + datainiTL = date; + end + NTiltLink = cell2mat(NodoTiltLink(:,2)); + % mi serve almeno una settimana per calcolare i maggiori spostamenti settimanali + ii = 1; % contatore + col = 16; % contatore colonne + Condition = 0; + while ii <= rTL + ini_col = col-15; + nN = num2str(NTiltLink(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, HShift, HShift_local, HShiftDir, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate = ''' ... + Data_scarico(1,1:10) ''' and EventTime >= ''' Data_scarico(1,12:end) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLd = curs.Data; + % Giorni successivi + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, HShift, HShift_local, HShiftDir, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate > ''' ... + Data_scarico(1,1:10) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTL = curs.Data; + [~,c1] = size(DATnodoTL); + [~,c2] = size(DATnodoTLd); + if c1 == c2 + DATnodoTL = [DATnodoTLd; DATnodoTL]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoTL = DATnodoTLd; + end + [rDAT,cDAT] = size(DATnodoTL); + if rDAT==1 && cDAT==1 + clear DatiElabTiltLink + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + Condition = 1; + break + else + if ii > 1 % Nodo successivo al primo + [rDE,~] = size(DatiElabTiltLink); + if rDE ~= rDAT + clear DatiElabTiltLink + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + Condition = 1; + break + end + end + DatiElabTiltLink(:,ini_col:col) = DATnodoTL(:,:); + end + col = col+16; + ii = ii+1; + end + if Condition == 1 + datainiTL = datenum(datainiTL) - 1; + Data_scarico = datestr(datainiTL,'yyyy-mm-dd HH:MM:SS'); + datainiTL = Data_scarico; + fileID = fopen(FileName,'a'); + else + Check = isnan(cell2mat(DatiElabTiltLink(1,3:16:end))); + for jj = 1:rTL + if Check == 1 + datainiTL = datenum(datainiTL) - 1; + Data_scarico = datestr(datainiTL,'yyyy-mm-dd HH:MM:SS'); + datainiTL = Data_scarico; + break + else + NAN = 1; + end + end + end + end + text = 'Tilt Link executed during LastElab function'; + fprintf(fileID,fmt,text); + else + DatiElabTiltLink = []; + end +else + datainiTL = []; + tempoiniTL = []; + DatiElabTiltLink = []; + NuovoZeroTL = 0; + margine = []; +end + +%% Tilt Link HD V +if yesHD == 1 % Importo ultimo dato elaborato dei Tilt Link HD V + NodeNumHD = num2str(cell2mat(NodoTiltLinkHD(1,2))); % scarico i dati del primo nodo Tilt Link HD V + NodeType = 'Tilt Link HD'; + + % Dati Grezzi + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and Time >= ''' time ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumHD ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI && cI == 1 % Non ci sono dati per la data "date" + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumHD ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + % Dati elaborati + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' NodeNumHD ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiHD = datestr(data1,'yyyy-mm-dd'); + tempoiniHD = datestr(data1,'HH:MM:SS'); + NuovoZeroHD = 0; + DatiElabTiltLinkHD = []; + margine = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < round(Ndatidespike/2) + cont = round(Ndatidespike/2); + end + [rDS,~] = size(Data_numero); + if rDS <= cont + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiHD = datestr(data2,'yyyy-mm-dd'); + tempoiniHD = datestr(data2,'HH:MM:SS'); + NuovoZeroHD = 1; + else + datainiHD = datestr(data1,'yyyy-mm-dd'); + tempoiniHD = datestr(data1,'HH:MM:SS'); + NuovoZeroHD = 0; + end + end + + if NuovoZeroHD == 1 % scarico gli ultimi dati elaborati + NAN = 0; + while NAN == 0 + if datenum(datainiHD) < datenum(date) + datainiHD = date; + end + NTiltLinkHD = cell2mat(NodoTiltLinkHD(:,2)); + % mi serve almeno una settimana per calcolare i maggiori spostamenti settimanali + ii = 1; % contatore + col = 16; % contatore colonne + Condition = 0; + while ii <= rHD + ini_col = col-15; + nN = num2str(NTiltLinkHD(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, HShift, HShift_local, HShiftDir, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate = ''' ... + Data_scarico(1,1:10) ''' and EventTime >= ''' Data_scarico(1,12:end) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoHDd = curs.Data; + % Giorni successivi + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, HShift, HShift_local, HShiftDir, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate > ''' ... + Data_scarico(1,1:10) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoHD = curs.Data; + [~,c1] = size(DATnodoHD); + [~,c2] = size(DATnodoHDd); + if c1 == c2 + DATnodoHD = [DATnodoHDd; DATnodoHD]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoHD = DATnodoHDd; + end + [rDAT,cDAT] = size(DATnodoHD); + if rDAT==1 && cDAT==1 + clear DatiElabTiltLinkHD + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + Condition = 1; + break + else + if ii > 1 % Nodo successivo al primo + [rDE,~] = size(DatiElabTiltLinkHD); + if rDE ~= rDAT + clear DatiElabTiltLinkHD + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + Condition = 1; + break + end + end + DatiElabTiltLinkHD(:,ini_col:col) = DATnodoHD(:,:); + end + col = col+16; + ii = ii+1; + end + if Condition == 1 + datainiHD = datenum(datainiHD) - 1; + Data_scarico = datestr(datainiHD,'yyyy-mm-dd HH:MM:SS'); + datainiHD = Data_scarico; + fileID = fopen(FileName,'a'); + else + Check = isnan(cell2mat(DatiElabTiltLinkHD(1,3:16:end))); + for jj = 1:rHD + if Check == 1 + datainiHD = datenum(datainiHD) - 1; + Data_scarico = datestr(datainiHD,'yyyy-mm-dd HH:MM:SS'); + datainiHD = Data_scarico; + break + else + NAN = 1; + end + end + end + end + text = 'Tilt Link HD VR executed during LastElab function'; + fprintf(fileID,fmt,text); + else + DatiElabTiltLinkHD = []; + end +else + datainiHD = []; + tempoiniHD = []; + DatiElabTiltLinkHD = []; + NuovoZeroHD = 0; +end + +%% Tilt Link HD VR +if yesHDVR == 1 % Importo ultimo dato elaborato dei Tilt Link HD VR + NodeNumHDVR = num2str(cell2mat(NodoTiltLinkHDVR(1,2))); % scarico i dati del primo nodo Tilt Link HD VR + NodeType = 'Tilt Link HD VR'; + + % Dati Grezzi + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and Time >= ''' time ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumHDVR ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI && cI == 1 % Non ci sono dati per la data "date" + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumHDVR ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + % Dati elaborati + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' NodeNumHDVR ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiHDVR = datestr(data1,'yyyy-mm-dd'); + tempoiniHDVR = datestr(data1,'HH:MM:SS'); + NuovoZeroHDVR = 0; + DatiElabTiltLinkHDVR = []; + margine = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < round(Ndatidespike/2) + cont = round(Ndatidespike/2); + end + [rDS,~] = size(Data_numero); + if rDS <= cont + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiHDVR = datestr(data2,'yyyy-mm-dd'); + tempoiniHDVR = datestr(data2,'HH:MM:SS'); + NuovoZeroHDVR = 1; + else + datainiHDVR = datestr(data1,'yyyy-mm-dd'); + tempoiniHDVR = datestr(data1,'HH:MM:SS'); + NuovoZeroHDVR = 0; + end + end + + if NuovoZeroHDVR == 1 % scarico gli ultimi dati elaborati + NAN = 0; + while NAN == 0 + if datenum(datainiHDVR) < datenum(date) + datainiHDVR = date; + end + NTiltLinkHDVR = cell2mat(NodoTiltLinkHDVR(:,2)); + % mi serve almeno una settimana per calcolare i maggiori spostamenti settimanali + ii = 1; % contatore + col = 16; % contatore colonne + Condition = 0; + while ii <= rHDVR + ini_col = col-15; + nN = num2str(NTiltLinkHDVR(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, HShift, HShift_local, HShiftDir, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate = ''' ... + Data_scarico(1,1:10) ''' and EventTime >= ''' Data_scarico(1,12:end) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoHDVRd = curs.Data; + % Giorni successivi + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, HShift, HShift_local, HShiftDir, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate > ''' ... + Data_scarico(1,1:10) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoHDVR = curs.Data; + [~,c1] = size(DATnodoHDVR); + [~,c2] = size(DATnodoHDVRd); + if c1 == c2 + DATnodoHDVR = [DATnodoHDVRd; DATnodoHDVR]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoHDVR = DATnodoHDVRd; + end + [rDAT,cDAT] = size(DATnodoHDVR); + if rDAT==1 && cDAT==1 + clear DatiElabTiltLinkHDVR + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + Condition = 1; + break + else + if ii > 1 % Nodo successivo al primo + [rDE,~] = size(DatiElabTiltLinkHDVR); + if rDE ~= rDAT + clear DatiElabTiltLinkHD + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + Condition = 1; + break + end + end + DatiElabTiltLinkHDVR(:,ini_col:col) = DATnodoHDVR(:,:); + end + col = col+16; + ii = ii+1; + end + if Condition == 1 + datainiHDVR = datenum(datainiHDVR) - 1; + Data_scarico = datestr(datainiHDVR,'yyyy-mm-dd HH:MM:SS'); + datainiHDVR = Data_scarico; + fileID = fopen(FileName,'a'); + else + Check = isnan(cell2mat(DatiElabTiltLinkHDVR(1,3:16:end))); + for jj = 1:rHDVR + if Check == 1 + datainiHDVR = datenum(datainiHDVR) - 1; + Data_scarico = datestr(datainiHDVR,'yyyy-mm-dd HH:MM:SS'); + datainiHDVR = Data_scarico; + break + else + NAN = 1; + end + end + end + end + text = 'Tilt Link HD VR executed during LastElab function'; + fprintf(fileID,fmt,text); + else + DatiElabTiltLinkHDVR = []; + end +else + datainiHDVR = []; + tempoiniHDVR = []; + DatiElabTiltLinkHDVR = []; + NuovoZeroHDVR = 0; +end + +%% Tilt Link HR V +if yesTLHR == 1 % Importo ultimo dato elaborato dei Tilt Link HR V + NodeNumTLHR = num2str(cell2mat(NodoTiltLinkHR(1,2))); % scarico i dati del primo nodo Tilt Link HR V + NodeType = 'Tilt Link HR'; + + % Dati Grezzi + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and Time >= ''' time ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumTLHR ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumTLHR ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + % Dati elaborati + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumTLHR ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiTLHR = datestr(data1,'yyyy-mm-dd'); + tempoiniTLHR = datestr(data1,'HH:MM:SS'); + NuovoZeroTLHR = 0; + DatiElabTiltLinkHR = []; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst_HR > Ndati + if margine < Wdevst_HR/2 + margine = round(Wdevst_HR/2+1); + end + cont = Wdevst_HR + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < round(Ndatidespike/2) + cont = round(Ndatidespike/2); + end + [rDS,~] = size(Data_numero); + if rDS <= cont + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiTLHR = datestr(data2,'yyyy-mm-dd'); + tempoiniTLHR = datestr(data2,'HH:MM:SS'); + NuovoZeroTLHR = 1; %1 + else + datainiTLHR = datestr(data1,'yyyy-mm-dd'); + tempoiniTLHR = datestr(data1,'HH:MM:SS'); + NuovoZeroTLHR = 0; + end + end + + if NuovoZeroTLHR == 1 % scarico gli ultimi dati elaborati + NAN = 0; + while NAN == 0 + if datenum(datainiTLHR) < datenum(date) + datainiTLHR = date; + end + NTiltLinkHR = cell2mat(NodoTiltLinkHR(:,2)); + % mi serve almeno una settimana per calcolare i maggiori spostamenti settimanali + ii = 1; % contatore + col = 16; % contatore colonne + Condition = 0; + while ii <= rTLHR + ini_col = col-15; + nN = num2str(NTiltLinkHR(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, HShift, HShift_local, HShiftDir, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate = ''' ... + Data_scarico(1,1:10) ''' and EventTime >= ''' Data_scarico(1,12:end) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHRd = curs.Data; + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, HShift, HShift_local, HShiftDir, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate > ''' ... + Data_scarico(1,1:10) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHR = curs.Data; + [~,c1] = size(DATnodoTLHR); + [~,c2] = size(DATnodoTLHRd); + if c1 == c2 + DATnodoTLHR = [DATnodoTLHRd; DATnodoTLHR]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoTLHR = DATnodoTLHRd; + end + [rDAT,cDAT] = size(DATnodoTLHR); + if rDAT==1 && cDAT==1 + clear DatiElabTiltLinkHR + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + Condition = 1; + break + else + if ii > 1 % Nodo successivo al primo + [rDE,~] = size(DatiElabTiltLinkHR); + if rDE ~= rDAT + clear DatiElabTiltLinkHR + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + Condition = 1; + break + end + end + DatiElabTiltLinkHR(:,ini_col:col) = DATnodoTLHR(:,:); + end + col = col+16; + ii = ii+1; + end + if Condition == 1 + datainiTLHR = datenum(datainiTLHR) - 1; + Data_scarico = datestr(datainiTLHR,'yyyy-mm-dd HH:MM:SS'); + datainiTLHR = Data_scarico; + fileID = fopen(FileName,'a'); + else + Check = isnan(cell2mat(DatiElabTiltLinkHR(1,3:16:end))); + for jj = 1:rTLHR + if Check == 1 + datainiTLHR = datenum(datainiTLHR) - 1; + Data_scarico = datestr(datainiTLHR,'yyyy-mm-dd HH:MM:SS'); + datainiTLHR = Data_scarico; + break + else + NAN = 1; + end + end + end + end + text = 'Tilt Link HR executed during LastElab function'; + fprintf(fileID,fmt,text); + else + DatiElabTiltLinkHR = []; + end +else + datainiTLHR = []; + tempoiniTLHR = []; + DatiElabTiltLinkHR = []; + NuovoZeroTLHR = 0; +end + +%% Tilt Link H +if yesTLH == 1 % Importo ultimo dato elaborato dei Tilt Link H + NodeNumTLH = num2str(cell2mat(NodoTiltLinkH(1,2))); % scarico i dati del primo nodo Tilt Link H + NodeType = 'Tilt Link H'; + + % Dati Grezzi + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and Time >= ''' time ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumTLH ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI && cI == 1 % Non ci sono dati per la data "date" + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumTLH ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI == 1 && cI == 1 + Data_num_ini=0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + % Dati elaborati + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumTLH ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiTLH = datestr(data1,'yyyy-mm-dd'); + tempoiniTLH = datestr(data1,'HH:MM:SS'); + NuovoZeroTLH = 0; + DatiElabTiltLinkH = []; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < round(Ndatidespike/2) + cont = round(Ndatidespike/2); + end + [rDS,~] = size(Data_numero); + if rDS <= cont + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiTLH = datestr(data2,'yyyy-mm-dd'); + tempoiniTLH = datestr(data2,'HH:MM:SS'); + NuovoZeroTLH = 1; + else + datainiTLH = datestr(data1,'yyyy-mm-dd'); + tempoiniTLH = datestr(data1,'HH:MM:SS'); + NuovoZeroTLH = 0; + end + end + + if NuovoZeroTLH == 1 % scarico gli ultimi dati elaborati + NAN = 0; + while NAN == 0 + if datenum(datainiTLH) < datenum(date) + datainiTLH = date; + end + NTiltLinkH = cell2mat(NodoTiltLinkH(:,2)); + ii = 1; % contatore + col = 13; % contatore colonne + Condition = 0; + while ii <= rTLH + ini_col = col-12; + nN = num2str(NTiltLinkH(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate = ''' ... + Data_scarico(1,1:10) ''' and EventTime >= ''' Data_scarico(1,12:end) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHd = curs.Data; + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate > ''' ... + Data_scarico(1,1:10) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLH = curs.Data; + [~,c1] = size(DATnodoTLH); + [~,c2] = size(DATnodoTLHd); + if c1 == c2 + DATnodoTLH = [DATnodoTLHd; DATnodoTLH]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoTLH = DATnodoTLHd; + end + [rDAT,cDAT] = size(DATnodoTLH); + if rDAT==1 && cDAT==1 + if strcmp(IDcentralina,'ID0174')==0 + clear DatiElabTiltLinkH + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + Condition = 1; + break + end + else + if ii > 1 % Nodo successivo al primo + [rDE,~] = size(DatiElabTiltLinkH); + if rDE ~= rDAT + if strcmp(IDcentralina,'ID0174')==0 + clear DatiElabTiltLinkH + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + Condition = 1; + break + end + end + end + DatiElabTiltLinkH(:,ini_col:col) = DATnodoTLH(:,:); + end + col = col+13; + ii = ii+1; + end + if Condition == 1 + datainiTLH = datenum(datainiTLH) - 1; + Data_scarico = datestr(datainiTLH,'yyyy-mm-dd HH:MM:SS'); + datainiTLH = Data_scarico; + fileID = fopen(FileName,'a'); + else + Check = isnan(cell2mat(DatiElabTiltLinkH(1,5:13:end))); + for jj = 1:rTLH + if Check == 1 + datainiTLH = datenum(datainiTLH) - 1; + Data_scarico = datestr(datainiTLH,'yyyy-mm-dd HH:MM:SS'); + datainiTLH = Data_scarico; + break + else + NAN = 1; + end + end + end + end + text = 'Tilt Link H executed during LastElab function'; + fprintf(fileID,fmt,text); + else + DatiElabTiltLinkH = []; + end +else + datainiTLH = []; + tempoiniTLH = []; + DatiElabTiltLinkH = []; + NuovoZeroTLH = 0; +end + +%% Tilt Link HR H +if yesTLHRH == 1 % Importo ultimo dato elaborato dei Tilt Link HR H + NodeNumTLHRH = num2str(cell2mat(NodoTiltLinkHRH(1,2))); % scarico i dati del primo nodo Tilt Link HR H + NodeType = 'Tilt Link HR H'; + + % Dati Grezzi + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and Time >= ''' time ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumTLHRH ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI && cI == 1 % Non ci sono dati per la data "date" + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumTLHRH ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI == 1 && cI == 1 + Data_num_ini=0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + % Dati elaborati + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumTLHRH ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiTLHRH = datestr(data1,'yyyy-mm-dd'); + tempoiniTLHRH = datestr(data1,'HH:MM:SS'); + NuovoZeroTLHRH = 0; + DatiElabTiltLinkHRH = []; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst_HR > Ndati + if margine < Wdevst_HR/2 + margine = round(Wdevst_HR/2+1); + end + cont = Wdevst_HR + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < round(Ndatidespike/2) + cont = round(Ndatidespike/2); + end + [rDS,~] = size(Data_numero); + if rDS <= cont + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiTLHRH = datestr(data2,'yyyy-mm-dd'); + tempoiniTLHRH = datestr(data2,'HH:MM:SS'); + NuovoZeroTLHRH = 1; %1 + else + datainiTLHRH = datestr(data1,'yyyy-mm-dd'); + tempoiniTLHRH = datestr(data1,'HH:MM:SS'); + NuovoZeroTLHRH = 0; + end + end + + if NuovoZeroTLHRH == 1 % scarico gli ultimi dati elaborati + NAN = 0; + while NAN == 0 + if datenum(datainiTLHRH) < datenum(date) + datainiTLHRH = date; + end + NTiltLinkHRH = cell2mat(NodoTiltLinkHRH(:,2)); + ii = 1; % contatore + col = 13; % contatore colonne + Condition = 0; + while ii <= rTLHRH + ini_col = col-12; + nN = num2str(NTiltLinkHRH(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate = ''' ... + Data_scarico(1,1:10) ''' and EventTime >= ''' Data_scarico(1,12:end) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHRHd = curs.Data; + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate > ''' ... + Data_scarico(1,1:10) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHRH = curs.Data; + [~,c1] = size(DATnodoTLHRH); + [~,c2] = size(DATnodoTLHRHd); + if c1 == c2 + DATnodoTLHRH = [DATnodoTLHRHd; DATnodoTLHRH]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoTLHRH = DATnodoTLHRHd; + end + [rDAT,cDAT] = size(DATnodoTLHRH); + if rDAT==1 && cDAT==1 + clear DatiElabTiltLinkHRH + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + Condition = 1; + break + else + if ii > 1 % Nodo successivo al primo + [rDE,~] = size(DatiElabTiltLinkHRH); + if rDE ~= rDAT + clear DatiElabTiltLinkHRH + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + Condition = 1; + break + end + end + DatiElabTiltLinkHRH(:,ini_col:col) = DATnodoTLHRH(:,:); + end + col = col+13; + ii = ii+1; + end + if Condition == 1 + datainiTLHRH = datenum(datainiTLHRH) - 1; + Data_scarico = datestr(datainiTLHRH,'yyyy-mm-dd HH:MM:SS'); + datainiTLHRH = Data_scarico; + fileID = fopen(FileName,'a'); + else + Check = isnan(cell2mat(DatiElabTiltLinkHRH(1,5:13:end))); + for jj = 1:rTLHRH + if Check == 1 + datainiTLHRH = datenum(datainiTLHRH) - 1; + Data_scarico = datestr(datainiTLHRH,'yyyy-mm-dd HH:MM:SS'); + datainiTLHRH = Data_scarico; + break + else + NAN = 1; + end + end + end + end + text = 'Tilt Link HR H executed during LastElab function'; + fprintf(fileID,fmt,text); + else + DatiElabTiltLinkHRH = []; + end +else + datainiTLHRH = []; + tempoiniTLHRH = []; + DatiElabTiltLinkHRH = []; + NuovoZeroTLHRH = 0; +end + +%% Piezo Link +if yesPL == 1 % Importo ultimo dato elaborato dei Piezo Link + NodeNumPL = num2str(cell2mat(NodoPiezoLink(1,2))); % scarico i dati del primo nodo Piezo Link + NodeType = 'Piezo Link'; + + % Dati Grezzi + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and time >= ''' time ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumPL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI && cI == 1 % Non ci sono dati per la data "date" + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumPL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI == 1 && cI == 1 + Data_num_ini=0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + % Dati elaborati + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumPL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiPL = datestr(data1,'yyyy-mm-dd'); + tempoiniPL = datestr(data1,'HH:MM:SS'); + NuovoZeroPL = 0; + marginePiezo = []; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + marginePiezo = 1; + if Ndatidespike > NdatiMediaP + Ndati = Ndatidespike; + else + Ndati = NdatiMediaP; + end + if Wdevst > Ndati + if marginePiezo < Wdevst/2 + marginePiezo = round(Wdevst/2+1); + end + cont = Wdevst + marginePiezo; + else + if marginePiezo < Ndati/2 + marginePiezo = round(Ndati/2+1); + end + cont = Ndati + marginePiezo; + end + if cont < round(Ndatidespike/2) + cont = round(Ndatidespike/2); + end + [rDS,~] = size(Data_numero); + if rDS <= cont + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiPL = datestr(data2,'yyyy-mm-dd'); + tempoiniPL = datestr(data2,'HH:MM:SS'); + NuovoZeroPL = 1; + else + datainiPL = datestr(data1,'yyyy-mm-dd'); + tempoiniPL = datestr(data1,'HH:MM:SS'); + NuovoZeroPL = 0; + end + end + text = 'Piezo Link executed during LastElab function'; + fprintf(fileID,fmt,text); +else + datainiPL = []; + tempoiniPL = []; + NuovoZeroPL = 0; + marginePiezo = []; +end + +%% Baro Link +if strcmp(NodoPiezoLink(1,4),'VW kPa') == 1 || strcmp(NodoPiezoLink(1,4),'VW kg/cm2') == 1 +elseif yesBL == 0 && yesPL == 1 + % carico le informazioni relative al numero e alla profondità per + % BARO LINK recuperato + IDunitBaro = Barometri(:,2); + DTcatenaBaro = Barometri(:,1); + [rIB,~] = size(IDunitBaro); + unitID = cell(rIB,1); + idToolB = cell(rIB,1); + Leggo = cell(rIB,2); + for b = 1:rIB + comando = ['select id from units where name = ''' char(IDunitBaro(b,1)) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + unitID(b,1) = cellstr(num2str(cell2mat(curs.Data))); + + comando = ['select id from tools where name = ''' char(DTcatenaBaro(b,1)) ''' and unit_id = '''... + char(unitID(b,1)) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + idToolB(b,1) = cellstr(num2str(cell2mat(curs.Data))); + + comando = ['select num, depth from nodes where tool_id = ''' char(idToolB(b,1)) ''' and nodetype_id = 3']; + curs = exec(conn,comando); + curs = fetch(curs); + Leggo(b,:) = cell(curs.Data); + end + % cambio il segno della profondità (nel DB è positivo) + depthB = cell2mat(Leggo(:,2)); + depthB = (-1)*depthB; + depthB = num2cell(depthB); + [r,~] = size(depthB); + nome = cell(r,1); + for i=1:r + nome(i,1) = cellstr('Baro Link'); + end + NodoBaroLink = [nome Leggo(:,1) depthB]; +end + +if yesBL == 1 % Importo ultimo dato elaborato dei Baro Link + NodeNumBL = num2str(cell2mat(NodoBaroLink(1,2))); % scarico i dati del primo nodo Baro Link + NodeType = 'Baro Link'; + + % Dati Grezzi + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and time >= ''' time ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumBL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI && cI == 1 % Non ci sono dati per la data "date" + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumBL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI == 1 && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + % Dati elaborati + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumBL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end +end + +if strcmp(NodoPiezoLink(1,4),'VW kPa') == 1 || strcmp(NodoPiezoLink(1,4),'VW kg/cm2') == 1 + Barometro = []; + % Non ho il barometro, ma ho il piezometro +elseif yesBL == 0 && yesPL == 1 + % Cerco se ci sono dati del barometro in corrispondenza di datainiPL + NodeType = 'Baro Link'; + option = 0; + for b = 1:rIB + IDcentralinaBaro = char(Barometri(b,2)); + DTcatenaBaro = char(Barometri(b,1)); + NodeNumBL = cellstr(num2str(cell2mat(Leggo(b,1)))); + % Dati Grezzi + comando = ['select Date, Time from RawDataView where Date = ''' ... + datainiPL ''' and time >= ''' tempoiniPL ''' and UnitName = ''' IDcentralinaBaro ''' and ToolNameID = '''... + DTcatenaBaro ''' and NodeType = ''' NodeType ''' and NodeNum =' char(NodeNumBL) ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + option = 0; + break + end + end + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 % Se in nessuno dei barometri ho trovato dati per + % quella data, cerco una data precedente e prendo la maggiore + for b = 1:rIB + IDcentralinaBaro = char(Barometri(b,2)); + DTcatenaBaro = char(Barometri(b,1)); + NodeNumBL = cellstr(num2str(cell2mat(Leggo(b,1)))); + % Dati Grezzi + comando = ['select Date, Time from RawDataView where Date < ''' ... + datainiPL ''' and UnitName = ''' IDcentralinaBaro ''' and ToolNameID = '''... + DTcatenaBaro ''' and NodeType = ''' NodeType ''' and NodeNum =' char(NodeNumBL) ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + option = 1; + break + end + end + end + + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + Barometro = Barometri(b,:); + if option == 0 + dataBaro = Data_num_ini(1); + elseif option == 1 + dataBaro = Data_num_ini(end); + end + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + if dataBaro>data1a + data1 = dataBaro; + else + data1 = data1a; + end + rLE = 2; % forzo il parametro per il passaggio successivo + cLE = 2; % forzo il parametro per il passaggio successivo +else + Barometro = []; +end + +if yesBL == 1 || yesPL == 1 + if rLE==1 && cLE==1 + datainiBL = datestr(data1,'yyyy-mm-dd'); + tempoiniBL = datestr(data1,'HH:MM:SS'); + NuovoZeroBL = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + if strcmp(char(Data_LastElab),'No Data') == 0 + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + marginePiezo = 1; + if Ndatidespike > NdatiMediaP + Ndati = Ndatidespike; + else + Ndati = NdatiMediaP; + end + if Wdevst > Ndati + if marginePiezo < Wdevst/2 + marginePiezo = round(Wdevst/2+1); + end + cont = Wdevst + marginePiezo; + else + if marginePiezo < Ndati/2 + marginePiezo = round(Ndati/2+1); + end + cont = Ndati + marginePiezo; + end + if cont < round(Ndatidespike/2) + cont = round(Ndatidespike/2); + end + [rDS,~] = size(Data_numero); + if rDS <= cont + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiBL = datestr(data2,'yyyy-mm-dd'); + tempoiniBL = datestr(data2,'HH:MM:SS'); + NuovoZeroBL = 1; %1 + else + datainiBL = datestr(data1,'yyyy-mm-dd'); + tempoiniBL = datestr(data1,'HH:MM:SS'); + NuovoZeroBL = 0; + end + else + datainiBL = datestr(data1,'yyyy-mm-dd'); + tempoiniBL = datestr(data1,'HH:MM:SS'); + NuovoZeroBL = 0; + end + end + if yesBL == 0 && yesPL == 1 + dataBL = datenum(datainiBL); + dataPL = datenum(datainiPL); + if dataBL > dataPL % la data di primo scarico del barometro è maggiore del piezometro. Per l'elaborazione deve essere almeno il contrario + datainiBL = datainiPL; + end + end + text = 'Baro Link executed during LastElab function'; + fprintf(fileID,fmt,text); +else + datainiBL = []; + tempoiniBL = []; + NuovoZeroBL = 0; + Barometro = []; +end + +%% Therm Link +if yesThL == 1 % Importo ultimo dato elaborato dei Therm Link + NodeNumThL = num2str(cell2mat(NodoThermLink(1,2))); % scarico i dati del primo nodo Therm Link + NodeType = 'Therm Link HR'; + + % Dati Grezzi + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and time >= ''' time ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumThL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI && cI == 1 % Non ci sono dati per la data "date" + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumThL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI == 1 && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + % Dati elaborati + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumThL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiThL = datestr(data1,'yyyy-mm-dd'); + tempoiniThL = datestr(data1,'HH:MM:SS'); + NuovoZeroThL = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < round(Ndatidespike/2) + cont = round(Ndatidespike/2); + end + [rDS,~] = size(Data_numero); + if rDS <= cont + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiThL = datestr(data2,'yyyy-mm-dd'); + tempoiniThL = datestr(data2,'HH:MM:SS'); + NuovoZeroThL = 1; + else + datainiThL = datestr(data1,'yyyy-mm-dd'); + tempoiniThL = datestr(data1,'HH:MM:SS'); + NuovoZeroThL = 0; + end + end + text = 'Therm Link HR executed during LastElab function'; + fprintf(fileID,fmt,text); +else + datainiThL = []; + tempoiniThL = []; + NuovoZeroThL = 0; +end + +%% Load Link +if yesLL == 1 % Importo ultimo dato elaborato dei Load Link + NodeNumLL = num2str(cell2mat(NodoLoadLink(1,2))); % scarico i dati del primo nodo Load Link + NodeType = 'Load Link'; + + % Dati Grezzi + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and time >= ''' time ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumLL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI && cI == 1 % Non ci sono dati per la data "date" + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumLL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI == 1 && cI == 1 + Data_num_ini=0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + % Dati elaborati + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumLL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiLL = datestr(data1,'yyyy-mm-dd'); + tempoiniLL = datestr(data1,'HH:MM:SS'); + NuovoZeroLL = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < round(Ndatidespike/2) + cont = round(Ndatidespike/2); + end + [rDS,~] = size(Data_numero); + if rDS <= cont + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiLL = datestr(data2,'yyyy-mm-dd'); + tempoiniLL = datestr(data2,'HH:MM:SS'); + NuovoZeroLL = 1; %1 + else + datainiLL = datestr(data1,'yyyy-mm-dd'); + tempoiniLL = datestr(data1,'HH:MM:SS'); + NuovoZeroLL = 0; + end + end + text = 'Load Link executed during LastElab function'; + fprintf(fileID,fmt,text); +else + datainiLL = []; + tempoiniLL = []; + NuovoZeroLL = 0; +end + +%% Rain Link +if yesRL == 1 % Importo ultimo dato elaborato dei Rain Link + NodeNumRL = num2str(cell2mat(NodoRainLink(1,2))); % scarico i dati del primo nodo Rain Link + NodeType = 'Rain Link'; + + % Dati Grezzi + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and time >= ''' time ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumRL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI && cI == 1 % Non ci sono dati per la data "date" + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumRL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI == 1 && cI == 1 + Data_num_ini=0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + % Dati elaborati + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumRL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiRL = datestr(data1,'yyyy-mm-dd'); + tempoiniRL = datestr(data1,'HH:MM:SS'); + NuovoZeroRL = 0; + DatiElabRainLink = []; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < round(Ndatidespike/2) + cont = round(Ndatidespike/2); + end + [rDS,~] = size(Data_numero); + if rDS <= cont + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiRL = datestr(data2,'yyyy-mm-dd'); + tempoiniRL = datestr(data2,'HH:MM:SS'); + NuovoZeroRL = 1; %1 + else + datainiRL = datestr(data1,'yyyy-mm-dd'); + tempoiniRL = datestr(data1,'HH:MM:SS'); + NuovoZeroRL = 0; + end + end + + if NuovoZeroRL == 1 % scarico gli ultimi dati elaborati + NAN = 0; + while NAN == 0 + if datenum(datainiRL) < datenum(date) + datainiRL = date; + end + NRainLink = cell2mat(NodoRainLink(:,2)); + % mi serve almeno una settimana per calcolare i maggiori spostamenti settimanali + ii = 1; % contatore + col = 4; % contatore colonne + Condition = 0; + while ii <= rRL + ini_col = col-3; + nN = num2str(NRainLink(ii,1)); + % Scarico di dati di pioggia + comando = ['select EventDate, EventTime, ZShift, Z from ElabDataView where EventDate = ''' ... + Data_scarico(1,1:10) ''' and EventTime >= ''' Data_scarico(1,12:end) ''' and UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRLd = curs.Data; + % Scarico di dati di pioggia + comando = ['select EventDate, EventTime, ZShift, Z from ElabDataView where EventDate > ''' ... + Data_scarico(1,1:10) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRL = curs.Data; + [~,c1] = size(DATnodoRL); + [~,c2] = size(DATnodoRLd); + if c1 == c2 + DATnodoRL = [DATnodoRLd; DATnodoRL]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoRL = DATnodoRLd; + end + [rDAT,cDAT] = size(DATnodoRL); + if rDAT==1 && cDAT==1 + clear DatiElabRainLink + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + Condition = 1; + break + else + if ii > 1 % Nodo successivo al primo + [rDE,~] = size(DatiElabRainLink); + if rDE ~= rDAT + clear DatiElabRainLink + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + Condition = 1; + break + end + end + DatiElabRainLink(:,ini_col:col) = DATnodoRL(:,:); + end + col = col+4; + ii = ii+1; + end + if Condition == 1 + datainiRL = datenum(datainiRL) - 1; + Data_scarico = datestr(datainiRL,'yyyy-mm-dd HH:MM:SS'); + datainiRL = Data_scarico; + fileID = fopen(FileName,'a'); + else + Check = isnan(cell2mat(DatiElabRainLink(1,3:16:end))); + for jj = 1:rRL + if Check == 1 + datainiRL = datenum(datainiRL) - 1; + Data_scarico = datestr(datainiRL,'yyyy-mm-dd HH:MM:SS'); + datainiRL = Data_scarico; + break + else + NAN = 1; + end + end + end + end + else + DatiElabRainLink = []; + end + text = 'Rain Link executed during LastElab function'; + fprintf(fileID,fmt,text); +else + datainiRL = []; + tempoiniRL = []; + NuovoZeroRL = 0; + DatiElabRainLink = []; +end + +%% SPP Link +if yesSPP == 1 % Importo ultimo dato elaborato dei SPP Link + NodeNumSPP = num2str(cell2mat(NodoSPPLink(1,2))); % scarico i dati del primo nodo SPP Link + NodeType = 'SPP Link'; + + % Dati Grezzi + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and time >= ''' time ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumSPP ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI && cI == 1 % Non ci sono dati per la data "date" + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumSPP ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI == 1 && cI == 1 + Data_num_ini=0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + % Dati elaborati + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumSPP ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiSPP = datestr(data1,'yyyy-mm-dd'); + tempoiniSPP = datestr(data1,'HH:MM:SS'); + NuovoZeroSPP = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < round(Ndatidespike/2) + cont = round(Ndatidespike/2); + end + [rDS,~] = size(Data_numero); + if rDS <= cont + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiSPP = datestr(data2,'yyyy-mm-dd'); + tempoiniSPP = datestr(data2,'HH:MM:SS'); + NuovoZeroSPP = 1; + else + datainiSPP = datestr(data1,'yyyy-mm-dd'); + tempoiniSPP = datestr(data1,'HH:MM:SS'); + NuovoZeroSPP = 0; + end + end + text = 'SPP Link executed during LastElab function'; + fprintf(fileID,fmt,text); +else + datainiSPP = []; + tempoiniSPP = []; + NuovoZeroSPP = []; +end + +%% Klino Link +if yesKL == 1 % Importo ultimo dato elaborato dei Klino Link + NodeNumKL = num2str(cell2mat(NodoKlinoLink(rKL,2))); % scarico i dati del primo nodo Klino Link + NodeType = 'Klino Link'; + + % Dati Grezzi + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and time >= ''' time ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumKL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI && cI == 1 % Non ci sono dati per la data "date" + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumKL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI == 1 && cI == 1 + Data_num_ini=0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + % Dati elaborati + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumKL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiKL = datestr(data1,'yyyy-mm-dd'); + tempoiniKL = datestr(data1,'HH:MM:SS'); + NuovoZeroKL = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < round(Ndatidespike/2) + cont = round(Ndatidespike/2); + end + [rDS,~] = size(Data_numero); + if rDS <= cont + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiKL = datestr(data2,'yyyy-mm-dd'); + tempoiniKL = datestr(data2,'HH:MM:SS'); + NuovoZeroKL = 1; %1 + else + datainiKL = datestr(data1,'yyyy-mm-dd'); + tempoiniKL = datestr(data1,'HH:MM:SS'); + NuovoZeroKL = 0; + end + end + text = 'Klino Link executed during LastElab function'; + fprintf(fileID,fmt,text); +else + datainiKL = []; + tempoiniKL = []; + NuovoZeroKL = 0; +end + +%% Klino Link HR +if yesKLHR == 1 % Importo ultimo dato elaborato dei Klino Link + NodeNumKLHR = num2str(cell2mat(NodoKlinoLinkHR(rKLHR,2))); % scarico i dati del primo nodo Klino Link HR + NodeType = 'Klino Link HR'; + + % Dati Grezzi + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and time >= ''' time ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumKLHR ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI && cI == 1 % Non ci sono dati per la data "date" + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumKLHR ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI == 1 && cI == 1 + Data_num_ini=0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + % Dati elaborati + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumKLHR ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiKLHR = datestr(data1,'yyyy-mm-dd'); + tempoiniKLHR = datestr(data1,'HH:MM:SS'); + NuovoZeroKLHR = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst_HR > Ndati + if margine < Wdevst_HR/2 + margine = round(Wdevst_HR/2+1); + end + cont = Wdevst_HR + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < round(Ndatidespike/2) + cont = round(Ndatidespike/2); + end + [rDS,~] = size(Data_numero); + if rDS <= cont + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiKLHR = datestr(data2,'yyyy-mm-dd'); + tempoiniKLHR = datestr(data2,'HH:MM:SS'); + NuovoZeroKLHR = 1; %1 + else + datainiKLHR = datestr(data1,'yyyy-mm-dd'); + tempoiniKLHR = datestr(data1,'HH:MM:SS'); + NuovoZeroKLHR = 0; + end + end + text = 'Klino Link HR executed during LastElab function'; + fprintf(fileID,fmt,text); +else + datainiKLHR = []; + tempoiniKLHR = []; + NuovoZeroKLHR = 0; +end + +%% PT100 Link +if yesPT100 == 1 % Importo ultimo dato elaborato dei PT100 Link + [rPT100,~] = size(NodoPT100Link); + NodeNumPT100 = num2str(cell2mat(NodoPT100Link(rPT100,2))); % scarico i dati del primo nodo PT100 Link + NodeType = 'PT100 Link'; + + % Dati Grezzi + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and time >= ''' time ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumPT100 ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI && cI == 1 % Non ci sono dati per la data "date" + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumPT100 ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI == 1 && cI == 1 + Data_num_ini=0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + % Dati elaborati + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumPT100 ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiPT100 = datestr(data1,'yyyy-mm-dd'); + tempoiniPT100 = datestr(data1,'HH:MM:SS'); + NuovoZeroPT100 = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < round(Ndatidespike/2) + cont = round(Ndatidespike/2); + end + [rDS,~] = size(Data_numero); + if rDS <= cont + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiPT100 = datestr(data2,'yyyy-mm-dd'); + tempoiniPT100 = datestr(data2,'HH:MM:SS'); + NuovoZeroPT100 = 1; + else + datainiPT100 = datestr(data1,'yyyy-mm-dd'); + tempoiniPT100 = datestr(data1,'HH:MM:SS'); + NuovoZeroPT100 = 0; + end + end + text = 'PT100 Link executed during LastElab function'; + fprintf(fileID,fmt,text); +else + datainiPT100 = []; + tempoiniPT100 = []; + NuovoZeroPT100 = 0; +end + +%% In Place Link +if yesIPL == 1 % Importo ultimo dato elaborato dei In Place Link + NodeNumIPL = num2str(cell2mat(NodoInPlaceLink(1,2))); % scarico i dati del primo nodo In Place Link + NodeType = 'In Place Link'; + + % Dati Grezzi + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and Time >= ''' time ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumIPL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI && cI == 1 % Non ci sono dati per la data "date" + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumIPL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + % Dati elaborati + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumIPL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiIPL = datestr(data1,'yyyy-mm-dd'); + tempoiniIPL = datestr(data1,'HH:MM:SS'); + NuovoZeroIPL = 0; + DatiElabInPlaceLink = []; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < round(Ndatidespike/2) + cont = round(Ndatidespike/2); + end + [rDS,~] = size(Data_numero); + if rDS <= cont + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiIPL = datestr(data2,'yyyy-mm-dd'); + tempoiniIPL = datestr(data2,'HH:MM:SS'); + NuovoZeroIPL = 1; + else + datainiIPL = datestr(data1,'yyyy-mm-dd'); + tempoiniIPL = datestr(data1,'HH:MM:SS'); + NuovoZeroIPL = 0; + end + end + + if NuovoZeroIPL == 1 % scarico gli ultimi dati elaborati + NAN = 0; + while NAN == 0 + if datenum(datainiIPL) < datenum(date) + datainiIPL = date; + end + NInPlaceLink = cell2mat(NodoInPlaceLink(:,2)); + % mi serve almeno una settimana per calcolare i maggiori spostamenti settimanali + ii = 1; % contatore + col = 16; % contatore colonne + Condition = 0; + while ii <= rIPL + ini_col = col-15; + nN = num2str(NInPlaceLink(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, HShift, HShift_local, HShiftDir, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate = ''' ... + Data_scarico(1,1:10) ''' and EventTime >= ''' Data_scarico(1,12:end) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoIPLd = curs.Data; + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, HShift, '... + 'HShift_local, HShiftDir, T_node, speed, speed_local, acceleration, acceleration_local '... + 'from ElabDataView where EventDate > ''' Data_scarico(1,1:10) ''' and UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoIPL = curs.Data; + [~,c1] = size(DATnodoIPL); + [~,c2] = size(DATnodoIPLd); + if c1 == c2 + DATnodoIPL = [DATnodoIPLd; DATnodoIPL]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoIPL = DATnodoIPLd; + end + [rDAT,cDAT] = size(DATnodoIPL); + if rDAT==1 && cDAT==1 + if strcmp(IDcentralina,'ID0146') == 0 || strcmp(IDcentralina,'ID0214') == 0 ... + || strcmp(IDcentralina,'ID0236') == 0 + clear DatiElabInPlaceLink + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + Condition = 1; + break + end + else + if ii > 1 % Nodo successivo al primo + [rDE,~] = size(DatiElabInPlaceLink); + if rDE ~= rDAT + if strcmp(IDcentralina,'ID0146') == 0 || strcmp(IDcentralina,'ID0214') == 0 ... + || strcmp(IDcentralina,'ID0236') == 0 + clear DatiElabInPlaceLink + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + Condition = 1; + break + else + DATnodoIPL(end+1:rDE,:) = DATnodoIPL(end,:); + end + end + end + DatiElabInPlaceLink(:,ini_col:col) = DATnodoIPL(:,:); + end + col = col+16; + ii = ii+1; + end + if Condition == 1 + datainiIPL = datenum(datainiIPL) - 1; + Data_scarico = datestr(datainiIPL,'yyyy-mm-dd HH:MM:SS'); + datainiIPL = Data_scarico; + fileID = fopen(FileName,'a'); + else + Check = isnan(cell2mat(DatiElabInPlaceLink(1,3:16:end))); + for jj = 1:rIPL + if Check(1,jj) == 1 + datainiIPL = datenum(datainiIPL) - 1; + Data_scarico = datestr(datainiIPL,'yyyy-mm-dd HH:MM:SS'); + datainiIPL = Data_scarico; + break + else + NAN = 1; + end + end + end + end + text = 'In Place Link executed during LastElab function'; + fprintf(fileID,fmt,text); + else + DatiElabInPlaceLink = []; + end +else + datainiIPL = []; + tempoiniIPL = []; + DatiElabInPlaceLink = []; + NuovoZeroIPL = 0; +end + +%% In Place Link HR +if yesIPLHR == 1 % Importo ultimo dato elaborato dei In Place Link HR + NodeNumIPLHR = num2str(cell2mat(NodoInPlaceLinkHR(1,2))); % scarico i dati del primo nodo + NodeType = 'In Place Link HR'; + + % Dati Grezzi + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and Time >= ''' time ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumIPLHR ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI == 1 && cI == 1 + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumIPLHR ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI && cI == 1 + Data_num_ini = 0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + % Dati elaborati + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumIPLHR ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiIPLHR = datestr(data1,'yyyy-mm-dd'); + tempoiniIPLHR = datestr(data1,'HH:MM:SS'); + NuovoZeroIPLHR = 0; + DatiElabInPlaceLinkHR = []; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst_HR > Ndati + if margine < Wdevst_HR/2 + margine = round(Wdevst_HR/2+1); + end + cont = Wdevst_HR + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < round(Ndatidespike/2) + cont = round(Ndatidespike/2); + end + [rDS,~] = size(Data_numero); + if rDS <= cont + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiIPLHR = datestr(data2,'yyyy-mm-dd'); + tempoiniIPLHR = datestr(data2,'HH:MM:SS'); + NuovoZeroIPLHR = 1; %1 + else + datainiIPLHR = datestr(data1,'yyyy-mm-dd'); + tempoiniIPLHR = datestr(data1,'HH:MM:SS'); + NuovoZeroIPLHR = 0; + end + end + + if NuovoZeroIPLHR == 1 % scarico gli ultimi dati elaborati + NAN = 0; + while NAN == 0 + if datenum(datainiIPLHR) < datenum(date) + datainiIPLHR = date; + end + NInPlaceLinkHR = cell2mat(NodoInPlaceLinkHR(:,2)); + % mi serve almeno una settimana per calcolare i maggiori spostamenti settimanali + ii = 1; % contatore + col = 16; % contatore colonne + Condition = 0; + while ii <= rIPLHR + ini_col = col-15; + nN = num2str(NInPlaceLinkHR(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, HShift, HShift_local, HShiftDir, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate = ''' ... + Data_scarico(1,1:10) ''' and EventTime >= ''' Data_scarico(1,12:end) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoIPLHRd = curs.Data; + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, HShift, HShift_local, HShiftDir, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate > ''' ... + Data_scarico(1,1:10) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoIPLHR = curs.Data; + [~,c1] = size(DATnodoIPLHR); + [~,c2] = size(DATnodoIPLHRd); + if c1 == c2 + DATnodoIPLHR = [DATnodoIPLHRd; DATnodoIPLHR]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoIPLHR = DATnodoIPLHRd; + end + [rDAT,cDAT] = size(DATnodoIPLHR); + if rDAT==1 && cDAT==1 + if strcmp(IDcentralina,'ID0146') == 0 || strcmp(IDcentralina,'ID0214') == 0 || ... + strcmp(IDcentralina,'ID0236') == 0 + clear DatiElabInPlaceLinkHR + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + Condition = 1; + break + end + else + if ii > 1 % Nodo successivo al primo + [rDE,~] = size(DatiElabInPlaceLinkHR); + if rDE ~= rDAT + if strcmp(IDcentralina,'ID0146') == 0 || strcmp(IDcentralina,'ID0214') == 0 || ... + strcmp(IDcentralina,'ID0236') == 0 + clear DatiElabInPlaceLinkHR + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + Condition = 1; + break + else + DATnodoIPLHR(end+1:rDE,:) = DATnodoIPLHR(end,:); + end + end + end + DatiElabInPlaceLinkHR(:,ini_col:col) = DATnodoIPLHR(:,:); + end + col = col+16; + ii = ii+1; + end + if Condition == 1 + datainiIPLHR = datenum(datainiIPLHR) - 1; + Data_scarico = datestr(datainiIPLHR,'yyyy-mm-dd HH:MM:SS'); + datainiIPLHR = Data_scarico; + fileID = fopen(FileName,'a'); + else + Check = isnan(cell2mat(DatiElabInPlaceLinkHR(1,3:16:end))); + for jj = 1:rIPLHR + if Check(1,jj) == 1 + datainiIPLHR = datenum(datainiIPLHR) - 1; + Data_scarico = datestr(datainiIPLHR,'yyyy-mm-dd HH:MM:SS'); + datainiIPLHR = Data_scarico; + break + else + NAN = 1; + end + end + end + end + text = 'In Place Link HR executed during LastElab function'; + fprintf(fileID,fmt,text); + else + DatiElabInPlaceLinkHR = []; + end +else + datainiIPLHR = []; + tempoiniIPLHR = []; + DatiElabInPlaceLinkHR = []; + NuovoZeroIPLHR = 0; +end + +%% Weir Link +if yesWL == 1 % Importo ultimo dato elaborato dei Weir Link + [rWL,~] = size(NodoWeirLink); + NodeNumWeir = num2str(cell2mat(NodoWeirLink(rWL,2))); % scarico i dati del primo nodo Weir Link + NodeType = 'Weir Link'; + + % Dati Grezzi + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and time >= ''' time ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumWeir ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI && cI == 1 % Non ci sono dati per la data "date" + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumWeir ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI == 1 && cI == 1 + Data_num_ini=0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + % Dati elaborati + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumWeir ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiWL = datestr(data1,'yyyy-mm-dd'); + tempoiniWL = datestr(data1,'HH:MM:SS'); + NuovoZeroWL = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < round(Ndatidespike/2) + cont = round(Ndatidespike/2); + end + [rDS,~] = size(Data_numero); + if rDS <= cont + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiWL = datestr(data2,'yyyy-mm-dd'); + tempoiniWL = datestr(data2,'HH:MM:SS'); + NuovoZeroWL = 1; + else + datainiWL = datestr(data1,'yyyy-mm-dd'); + tempoiniWL = datestr(data1,'HH:MM:SS'); + NuovoZeroWL = 0; + end + end + text = 'Weir Link executed during LastElab function'; + fprintf(fileID,fmt,text); +else + datainiWL = []; + tempoiniWL = []; + NuovoZeroWL = 0; +end + +%% Pendulum +if yesPE == 1 % Importo ultimo dato elaborato dei Pendulum + [rPE,~] = size(NodoPendulum); + NodeNumPE = num2str(cell2mat(NodoPendulum(rPE,2))); % scarico i dati del primo nodo Pendulum + NodeType = 'Pendulum'; + + % Dati Grezzi + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and time >= ''' time ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumPE ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI && cI == 1 % Non ci sono dati per la data "date" + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumPE ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI == 1 && cI == 1 + Data_num_ini=0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + % Dati elaborati + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumPE ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiPE = datestr(data1,'yyyy-mm-dd'); + tempoiniPE = datestr(data1,'HH:MM:SS'); + NuovoZeroPE = 0; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < round(Ndatidespike/2) + cont = round(Ndatidespike/2); + end + [rDS,~] = size(Data_numero); + if rDS <= cont + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiPE = datestr(data2,'yyyy-mm-dd'); + tempoiniPE = datestr(data2,'HH:MM:SS'); + NuovoZeroPE = 1; + else + datainiPE = datestr(data1,'yyyy-mm-dd'); + tempoiniPE = datestr(data1,'HH:MM:SS'); + NuovoZeroPE = 0; + end + end + text = 'Pendulum executed during LastElab function'; + fprintf(fileID,fmt,text); +else + datainiPE = []; + tempoiniPE = []; + NuovoZeroPE = 0; +end + +%% Snow Link +if yesSL == 1 + NodeNumSL = num2str(cell2mat(NodoSnowLink(1,2))); + NodeType = 'Snow Link'; + + % Dati Grezzi + comando = ['select Date, Time from RawDataView where Date = ''' ... + date ''' and time >= ''' time ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumSL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + if rI && cI == 1 % Non ci sono dati per la data "date" + comando = ['select Date, Time from RawDataView where Date > ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumSL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + [rI,cI] = size(D_num_ini); + end + if rI == 1 && cI == 1 + Data_num_ini=0; + else + Data_num_ini = [cell2mat(D_num_ini(:,1)) repmat(' ', [rI,1]) cell2mat(D_num_ini(:,2))]; + end + Data_num_ini = datenum(Data_num_ini); % tutte le date presenti nel DB grezzo + + % Dati elaborati + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + date ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' DTcatena ... + ''' and NodeType = ''' NodeType ''' and NodeNum =' NodeNumSL ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Data_LastElab = curs.Data; + [rLE,cLE] = size(Data_LastElab); + + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = Data_num_ini(1); + if data1b>data1a + data1 = data1b; + else + data1 = data1a; + end + + if rLE==1 && cLE==1 + datainiSL = datestr(data1,'yyyy-mm-dd'); + tempoiniSL = datestr(data1,'HH:MM:SS'); + NuovoZeroSL = 0; + DatiElabSnowLink = []; + else + % Modifico il formato di data e ora in DATini. + [rD,~] = size(Data_LastElab); + Data_numero = [cell2mat(Data_LastElab(:,1)) repmat(' ', [rD,1]) cell2mat(Data_LastElab(:,2))]; + Data_numero = datenum(Data_numero); % tutte le date presenti nel DB grezzo + margine = 1; + if Ndatidespike > NdatiMedia + Ndati = Ndatidespike; + else + Ndati = NdatiMedia; + end + if Wdevst > Ndati + if margine < Wdevst/2 + margine = round(Wdevst/2+1); + end + cont = Wdevst + margine; + else + if margine < Ndati/2 + margine = round(Ndati/2+1); + end + cont = Ndati + margine; + end + if cont < round(Ndatidespike/2) + cont = round(Ndatidespike/2); + end + [rDS,~] = size(Data_numero); + if rDS <= cont + cont = rDS-1; + end + Data_scarico = Data_numero(end-cont); + Data_scarico = datestr(Data_scarico,'yyyy-mm-dd HH:MM:SS'); + data2 = datenum(Data_scarico); + if data2 > data1 + datainiSL = datestr(data2,'yyyy-mm-dd'); + tempoiniSL = datestr(data2,'HH:MM:SS'); + NuovoZeroSL = 1; %1 + else + datainiSL = datestr(data1,'yyyy-mm-dd'); + tempoiniSL = datestr(data1,'HH:MM:SS'); + NuovoZeroSL = 0; + end + end + + if NuovoZeroSL == 1 % scarico gli ultimi dati elaborati + NAN = 0; + while NAN == 0 + if datenum(datainiSL) < datenum(date) + datainiSL = date; + end + NSnowLink = cell2mat(NodoSnowLink(:,2)); + % mi serve almeno una settimana per calcolare i maggiori spostamenti settimanali + ii = 1; % contatore + col = 4; % contatore colonne + Condition = 0; + while ii <= rSL + ini_col = col-3; + nN = num2str(NSnowLink(ii,1)); + % Scarico di dati di pioggia + comando = ['select EventDate, EventTime, ZShift, Z from ElabDataView where EventDate = ''' ... + Data_scarico(1,1:10) ''' and EventTime >= ''' Data_scarico(1,12:end) ''' and UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoSLd = curs.Data; + % Scarico di dati di pioggia + comando = ['select EventDate, EventTime, ZShift, Z from ElabDataView where EventDate > ''' ... + Data_scarico(1,1:10) ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoSL = curs.Data; + [~,c1] = size(DATnodoSL); + [~,c2] = size(DATnodoSLd); + if c1 == c2 + DATnodoSL = [DATnodoSLd; DATnodoSL]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoSL = DATnodoSLd; + end + [rDAT,cDAT] = size(DATnodoSL); + if rDAT==1 && cDAT==1 + clear DatiElabSnowLink + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + Condition = 1; + break + else + if ii > 1 % Nodo successivo al primo + [rDE,~] = size(DatiElabSnowLink); + if rDE ~= rDAT + clear DatiElabSnowLink + fclose(fileID); + cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn); + Condition = 1; + break + end + end + DatiElabSnowLink(:,ini_col:col) = DATnodoSL(:,:); + end + col = col+4; + ii = ii+1; + end + if Condition == 1 + datainiSL = datenum(datainiSL) - 1; + Data_scarico = datestr(datainiSL,'yyyy-mm-dd HH:MM:SS'); + datainiSL = Data_scarico; + fileID = fopen(FileName,'a'); + else + Check = isnan(cell2mat(DatiElabSnowLink(1,3:16:end))); + for jj = 1:rRL + if Check == 1 + datainiSL = datenum(datainiSL) - 1; + Data_scarico = datestr(datainiSL,'yyyy-mm-dd HH:MM:SS'); + datainiSL = Data_scarico; + break + else + NAN = 1; + end + end + end + end + else + DatiElabSnowLink = []; + end + text = 'Snow Link executed during LastElab function'; + fprintf(fileID,fmt,text); +else + datainiSL = []; + tempoiniSL = []; + NuovoZeroSL = 0; + DatiElabSnowLink = []; +end + +text = 'LastElab function worked correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/Tilt/LastElab_bisIPL.m b/Tilt/LastElab_bisIPL.m new file mode 100755 index 0000000..5fc2a0f --- /dev/null +++ b/Tilt/LastElab_bisIPL.m @@ -0,0 +1,42 @@ +function DatiElabInPlaceLink = LastElab_bisIPL(conn,NodoInPlaceLink,rIPL,... + datainiIPL,tempoiniIPL,IDcentralina,DTcatena,FileName) + +NInPlaceLink = cell2mat(NodoInPlaceLink(:,2)); +NodeType = 'In Place Link'; +ii = 1; % contatore +col = 16; % contatore colonne +while ii <= rIPL + ini_col = col-15; + nN = num2str(NInPlaceLink(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, HShift, HShift_local, HShiftDir, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate = ''' ... + datainiIPL ''' and EventTime >= ''' tempoiniIPL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoIPLd = curs.Data; + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, HShift, HShift_local, HShiftDir, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate > ''' ... + datainiIPL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoIPL = curs.Data; + [~,c1] = size(DATnodoIPL); + [~,c2] = size(DATnodoIPLd); + if c1==c2 + DATnodoIPL = [DATnodoIPLd; DATnodoIPL]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoIPL = DATnodoIPLd; + end + DatiElabInPlaceLink(:,ini_col:col) = DATnodoIPL(:,:); + col = col+16; + ii = ii+1; +end + +text = 'LastElab_bisIPL function worked correctly for In Place Link'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/Tilt/LastElab_bisIPLHR.m b/Tilt/LastElab_bisIPLHR.m new file mode 100755 index 0000000..d451fa2 --- /dev/null +++ b/Tilt/LastElab_bisIPLHR.m @@ -0,0 +1,42 @@ +function DatiElabInPlaceLinkHR = LastElab_bisIPLHR(conn,NodoInPlaceLinkHR,rIPLHR,... + datainiIPLHR,tempoiniIPLHR,IDcentralina,DTcatena,FileName) + +NInPlaceLinkHR = cell2mat(NodoInPlaceLinkHR(:,2)); +NodeType = 'In Place Link HR'; +ii = 1; % contatore +col = 16; % contatore colonne +while ii <= rIPLHR + ini_col = col-15; + nN = num2str(NInPlaceLinkHR(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, HShift, HShift_local, HShiftDir, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate = ''' ... + datainiIPLHR ''' and EventTime >= ''' tempoiniIPLHR ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoIPLHRd = curs.Data; + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, HShift, HShift_local, HShiftDir, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate > ''' ... + datainiIPLHR ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoIPLHR = curs.Data; + [~,c1] = size(DATnodoIPLHR); + [~,c2] = size(DATnodoIPLHRd); + if c1==c2 + DATnodoIPLHR = [DATnodoIPLHRd; DATnodoIPLHR]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoIPLHR = DATnodoIPLHRd; + end + DatiElabInPlaceLinkHR(:,ini_col:col) = DATnodoIPLHR(:,:); + col = col+16; + ii = ii+1; +end + +text = 'LastElab_bisIPLHR function worked correctly for In Place Link HR'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/Tilt/LastElab_bisRL.m b/Tilt/LastElab_bisRL.m new file mode 100755 index 0000000..213468c --- /dev/null +++ b/Tilt/LastElab_bisRL.m @@ -0,0 +1,42 @@ +function DatiElabRainLink = LastElab_bisRL(conn,NodoRainLink,rRL,datainiRL,... + tempoiniRL,IDcentralina,DTcatena,FileName) + +NRainLink = cell2mat(NodoRainLink(:,2)); +NodeType = 'Rain Link'; +ii = 1; % contatore +col = 4; % contatore colonne +while ii <= rRL + ini_col = col-3; + nN = num2str(NRainLink(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, ZShift, Z from ElabDataView where EventDate = ''' ... + datainiRL ''' and EventTime >= ''' tempoiniRL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRLd = curs.Data; + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, ZShift, Z from ElabDataView where EventDate > ''' ... + datainiRL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRL = curs.Data; + [~,c1] = size(DATnodoRL); + [~,c2] = size(DATnodoRLd); + if c1==c2 + DATnodoRL = [DATnodoRLd; DATnodoRL]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoRL = DATnodoRLd; + end + DatiElabRainLink(:,ini_col:col) = DATnodoRL(:,:); + col = col+4; + ii = ii+1; +end + +text = 'LastElab_bisRL function worked correctly for Rain Link'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/Tilt/LastElab_bisSL.m b/Tilt/LastElab_bisSL.m new file mode 100755 index 0000000..8fe80a3 --- /dev/null +++ b/Tilt/LastElab_bisSL.m @@ -0,0 +1,42 @@ +function DatiElabSnowLink = LastElab_bisSL(conn,NodoSnowLink,rSL,datainiSL,... + tempoiniSL,IDcentralina,DTcatena,FileName) + +NSnowLink = cell2mat(NodoSnowLink(:,2)); +NodeType = 'Snow Link'; +ii = 1; % contatore +col = 4; % contatore colonne +while ii <= rSL + ini_col = col-3; + nN = num2str(NSnowLink(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, ZShift, Z from ElabDataView where EventDate = ''' ... + datainiSL ''' and EventTime >= ''' tempoiniSL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoSLd = curs.Data; + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, ZShift, Z from ElabDataView where EventDate > ''' ... + datainiSL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoSL = curs.Data; + [~,c1] = size(DATnodoSL); + [~,c2] = size(DATnodoSLd); + if c1==c2 + DATnodoSL = [DATnodoSLd; DATnodoSL]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoSL = DATnodoSLd; + end + DatiElabSnowLink(:,ini_col:col) = DATnodoSL(:,:); + col = col+4; + ii = ii+1; +end + +text = 'LastElab_bisSL function worked correctly for Snow Link'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/Tilt/LastElab_bisTL.m b/Tilt/LastElab_bisTL.m new file mode 100755 index 0000000..850c410 --- /dev/null +++ b/Tilt/LastElab_bisTL.m @@ -0,0 +1,42 @@ +function DatiElabTiltLink = LastElab_bisTL(conn,NodoTiltLink,rTL,datainiTL,... + tempoiniTL,IDcentralina,DTcatena,FileName) + +NTiltLink = cell2mat(NodoTiltLink(:,2)); +NodeType = 'Tilt Link'; +ii = 1; % contatore +col = 16; % contatore colonne +while ii <= rTL + ini_col = col-15; + nN = num2str(NTiltLink(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, HShift, HShift_local, HShiftDir, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate = ''' ... + datainiTL ''' and EventTime >= ''' tempoiniTL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLd = curs.Data; + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, HShift, HShift_local, HShiftDir, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate > ''' ... + datainiTL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTL = curs.Data; + [~,c1] = size(DATnodoTL); + [~,c2] = size(DATnodoTLd); + if c1==c2 + DATnodoTL = [DATnodoTLd; DATnodoTL]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoTL = DATnodoTLd; + end + DatiElabTiltLink(:,ini_col:col) = DATnodoTL(:,:); + col = col+16; + ii = ii+1; +end + +text = 'LastElab_bisTL function worked correctly for Tilt Link V'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/Tilt/LastElab_bisTLH.m b/Tilt/LastElab_bisTLH.m new file mode 100755 index 0000000..1a57f5c --- /dev/null +++ b/Tilt/LastElab_bisTLH.m @@ -0,0 +1,42 @@ +function DatiElabTiltLinkH = LastElab_bisTLH(conn,NodoTiltLinkH,rTLH,datainiTLH,... + tempoiniTLH,IDcentralina,DTcatena,FileName) + +NTiltLinkH = cell2mat(NodoTiltLinkH(:,2)); +NodeType = 'Tilt Link H'; +ii = 1; % contatore +col = 13; % contatore colonne +while ii <= rTLH + ini_col = col-12; + nN = num2str(NTiltLinkH(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate = ''' ... + datainiTLH ''' and EventTime >= ''' tempoiniTLH ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHd = curs.Data; + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate > ''' ... + datainiTLH ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLH = curs.Data; + [~,c1] = size(DATnodoTLH); + [~,c2] = size(DATnodoTLHd); + if c1==c2 + DATnodoTLH = [DATnodoTLHd; DATnodoTLH]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoTLH = DATnodoTLHd; + end + DatiElabTiltLinkH(:,ini_col:col) = DATnodoTLH(:,:); + col = col+13; + ii = ii+1; +end + +text = 'LastElab_bisTLH function worked correctly for Tilt Link H'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/Tilt/LastElab_bisTLHR.m b/Tilt/LastElab_bisTLHR.m new file mode 100755 index 0000000..16e9fd8 --- /dev/null +++ b/Tilt/LastElab_bisTLHR.m @@ -0,0 +1,42 @@ +function DatiElabTiltLinkHR = LastElab_bisTLHR(conn,NodoTiltLinkHR,rTLHR,... + datainiTLHR,tempoiniTLHR,IDcentralina,DTcatena,FileName) + +NTiltLinkHR = cell2mat(NodoTiltLinkHR(:,2)); +NodeType = 'Tilt Link HR'; +ii = 1; % contatore +col = 16; % contatore colonne +while ii <= rTLHR + ini_col = col-15; + nN = num2str(NTiltLinkHR(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, HShift, HShift_local, HShiftDir, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate = ''' ... + datainiTLHR ''' and EventTime >= ''' tempoiniTLHR ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHRd = curs.Data; + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, HShift, HShift_local, HShiftDir, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate > ''' ... + datainiTLHR ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHR = curs.Data; + [~,c1] = size(DATnodoTLHR); + [~,c2] = size(DATnodoTLHRd); + if c1==c2 + DATnodoTLHR = [DATnodoTLHRd; DATnodoTLHR]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoTLHR = DATnodoTLHRd; + end + DatiElabTiltLinkHR(:,ini_col:col) = DATnodoTLHR(:,:); + col = col+16; + ii = ii+1; +end + +text = 'LastElab_bisTLHR function worked correctly for Tilt Link HR V'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/Tilt/LastElab_bisTLHRH.m b/Tilt/LastElab_bisTLHRH.m new file mode 100755 index 0000000..ecd56db --- /dev/null +++ b/Tilt/LastElab_bisTLHRH.m @@ -0,0 +1,43 @@ +function DatiElabTiltLinkHRH = LastElab_bisTLHRH(conn,NodoTiltLinkHRH,rTLHRH,... + datainiTLHRH,tempoiniTLHRH,IDcentralina,DTcatena,FileName) + +NTiltLinkHRH = cell2mat(NodoTiltLinkHRH(:,2)); +NodeType = 'Tilt Link HR H'; +ii = 1; % contatore +col = 13; % contatore colonne +while ii <= rTLHRH + ini_col = col-12; + nN = num2str(NTiltLinkHRH(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate = ''' ... + datainiTLHRH ''' and EventTime >= ''' tempoiniTLHRH ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHRHd = curs.Data; + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, T_node, speed, speed_local, acceleration, acceleration_local from ElabDataView where EventDate = ''' ... + datainiTLHRH ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHRH = curs.Data; + DATnodoTLHRH = [DATnodoTLHRHd; DATnodoTLHRH]; + [~,c1] = size(DATnodoTLHRH); + [~,c2] = size(DATnodoTLHRHd); + if c1==c2 + DATnodoTLHRH = [DATnodoTLHRHd; DATnodoTLHRH]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoTLHRH = DATnodoTLHRHd; + end + DatiElabTiltLinkHRH(:,ini_col:col) = DATnodoTLHRH(:,:); + col = col+13; + ii = ii+1; +end + +text = 'LastElab_bisTLHRH function worked correctly for Tilt Link HR H'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/Tilt/MediaDati_BL.m b/Tilt/MediaDati_BL.m new file mode 100755 index 0000000..15dff4c --- /dev/null +++ b/Tilt/MediaDati_BL.m @@ -0,0 +1,32 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per i piezometri +% PIEZdef contiene le medie per l'intervallo definito dei valori di +% pressione registrati dal piezometro +% ARRAYdatePL contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [BaroDef,BaroDefT,ARRAYdateBL] = MediaDati_BL(DatiBaro,DatiBaroT,... + TimeBL,NdatiMediaP,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'MediaDati_BL function started'; +fprintf(fileID,fmt,text); + +%% Barometro +[r,~]=size(DatiBaro); +if NdatiMediaP > r + NdatiMediaP = r; +end +BaroDef = smoothdata(DatiBaro,'gaussian',NdatiMediaP); + +ARRAYdateBL = TimeBL; + +%% Termometro +BaroDefT = DatiBaroT; + +text = 'Average mean of Baro Link data executed correctly. MediaDati_BL function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/MediaDati_HD.m b/Tilt/MediaDati_HD.m new file mode 100755 index 0000000..8a3c954 --- /dev/null +++ b/Tilt/MediaDati_HD.m @@ -0,0 +1,125 @@ +function [ACCdef_HD,ANGdef_HD,MAGdef_HD,ARRAYdateHD,ACCdefRisHD,MAGdefRisHD] = MediaDati_HD(... + accHD,angHD,magHD,TimeHD,ris_acc_HD,ris_mag_HD,tolleranzaAcc,... + tolleranzaMag,NdatiMedia,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'MediaDati_HD function started'; +fprintf(fileID,fmt,text); + +%% Accelerazione +[r,~]=size(accHD); +if NdatiMedia > r + NdatiMedia = r; +end +ACCdef_HD = smoothdata(accHD,'gaussian',NdatiMedia); + +% Angoli +ANGdef_HD = smoothdata(angHD,'gaussian',NdatiMedia); + +%% Matrice date +ARRAYdateHD = TimeHD; + +%% Risultante acc +ACCdefRisHD = ris_acc_HD; % Non faccio la media, mi serve il dato come è per applicare i filtri + +% Applico un controllo importante! Se la risultante varia più di 0.01, NON +% faccio la media dei dati attorno, che altrimenti ne sono condizionati! +[r,c] = size(ACCdefRisHD); % Nodi in colonna, date in riga +Win = NdatiMedia/2; % Individuo la finestra da NON mediare +cont = 0; % Contatore +cont2 = 0; +for i = 2:r % data + for j = 2:c % nodo + % se il valore assoluto della differenza è maggiore della + % tolleranza, NON faccio la media + if abs(ACCdefRisHD(i,j)-ACCdefRisHD(i-1,j)) > tolleranzaAcc || ACCdefRisHD(i,j) < 0.9 || ACCdefRisHD(i,j) > 1.1 + Sp = i-Win; % Punto di partenza (date) + if Sp <= 0 + Sp = 1; + end + if i+Win > r + Ep = r; + else + Ep = i+Win; % Punto di arrivo (date) + end + Cax = 3*j-2; + Cay = 3*j-1; + Caz = 3*j; + ACCdef_HD(Sp:Ep,Cax) = accHD(Sp:Ep,Cax); % ax + ACCdef_HD(Sp:Ep,Cay) = accHD(Sp:Ep,Cay); % ay + ACCdef_HD(Sp:Ep,Caz) = accHD(Sp:Ep,Caz); % az + cont = cont+1; + end + end +end +text = ['' num2str(cont) ' values of Tilt Link HD VR accelerometer vector of gravity not subjected to mean process due to values with excessive variations!']; +fprintf(fileID,fmt,text); +text = ['' num2str(cont2) ' values of Tilt Link HD VR accelerometer vector of gravity not subjected to mean process due to not calibrated values!']; +fprintf(fileID,fmt,text); + +%% Campi magnetici +MAGdef_HD = smoothdata(magHD,'gaussian',NdatiMedia); + +% Applico un controllo importante! Se la risultante delle accelerazioni +% varia più di 0.01, NON faccio la media dei dati di campo magnetico attorno, +% che altrimenti ne sono condizionati! +[r,c] = size(ACCdefRisHD); % Nodi in colonna, date in riga +Win = NdatiMedia/2; % Individuo la finestra da NON mediare +cont = 0; +cont2 = 0; +for i = 2:r % data + for j = 2:c % nodo + % se il valore assoluto della differenza è maggiore della + % tolleranza, NON faccio la media + if abs(ACCdefRisHD(i,j)-ACCdefRisHD(i-1,j)) > tolleranzaMag + Sp = i-Win; % Punto di partenza (date) + if Sp <= 0 + Sp = 1; + end + if i+Win > r + Ep = r; + else + Ep = i+Win; % Punto di arrivo (date) + end + Cmx = 3*j-2; + Cmy = 3*j-1; + Cmz = 3*j; + MAGdef_HD(Sp:Ep,Cmx) = magHD(Sp:Ep,Cmx); % mx + MAGdef_HD(Sp:Ep,Cmy) = magHD(Sp:Ep,Cmy); % my + MAGdef_HD(Sp:Ep,Cmz) = magHD(Sp:Ep,Cmz); % mz + cont = cont+1; + end + if ACCdefRisHD(i,j) < 0.9 || ACCdefRisHD(i,j) > 1.1 % Il nodo è fuori taratura! + Sp = i-Win; % Punto di partenza (date) + if Sp <= 0 + Sp = 1; + end + if i+Win > r + Ep = r; + else + Ep = i+Win; % Punto di arrivo (date) + end + Cmx = 3*j-2; + Cmy = 3*j-1; + Cmz = 3*j; + MAGdef_HD(Sp:Ep,Cmx) = magHD(Sp:Ep,Cmx); % mx + MAGdef_HD(Sp:Ep,Cmy) = magHD(Sp:Ep,Cmy); % my + MAGdef_HD(Sp:Ep,Cmz) = magHD(Sp:Ep,Cmz); % mz + cont2 = cont2+1; + end + end +end +text = ['' num2str(cont) ' values of Tilt Link HD VR magnetometer vector not subjected to mean process due to accelerometers values with excessive variations!']; +fprintf(fileID,fmt,text); +text = ['' num2str(cont2) ' values of Tilt Link HD VR magnetometer vector of gravity not subjected to mean process due to not calibrated accelerometer values!']; +fprintf(fileID,fmt,text); + +%% Risultante campi magnetici +MAGdefRisHD = ris_mag_HD; % Non faccio la media, mi serve il dato come è per applicare i filtri + +text = 'Average mean of Tilt Link HD VR data executed correctly. MediaDati_HD function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/MediaDati_HDVR.m b/Tilt/MediaDati_HDVR.m new file mode 100755 index 0000000..44f57ee --- /dev/null +++ b/Tilt/MediaDati_HDVR.m @@ -0,0 +1,127 @@ +function [ACCdef_HDVR,MAGdef_HDVR,ARRAYdateHDVR,ACCdefRisHDVR,MAGdefRisHDVR] = MediaDati_HDVR(... + accHDVR,magHDVR,TimeHDVR,ris_acc_HDVR,ris_mag_HDVR,tolleranzaAcc,... + tolleranzaMag,NdatiMedia,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'MediaDati_HDVR function started'; +fprintf(fileID,fmt,text); + +%% Accelerazione +[r,~]=size(accHDVR); +if NdatiMedia > r + NdatiMedia = r; +end +ACCdef_HDVR = smoothdata(accHDVR,'gaussian',NdatiMedia); + +%% Matrice date +ARRAYdateHDVR = TimeHDVR; + +%% Risultante acc +ACCdefRisHDVR = ris_acc_HDVR; % Non faccio la media, mi serve il dato come è per applicare i filtri + +% Applico un controllo importante! Se la risultante varia più di 0.01, NON +% faccio la media dei dati attorno, che altrimenti ne sono condizionati! +[r,c] = size(ACCdefRisHDVR); % Nodi in colonna, date in riga +Win = NdatiMedia/2; % Individuo la finestra da NON mediare +cont = 0; % Contatore +cont2 = 0; +for i = 2:r % data + for j = 2:c % nodo + % se il valore assoluto della differenza è maggiore della + % tolleranza, NON faccio la media + if abs(ACCdefRisHDVR(i,j)-ACCdefRisHDVR(i-1,j)) > tolleranzaAcc || ... + ACCdefRisHDVR(i,j) < 0.9 || ACCdefRisHDVR(i,j) > 1.1 + Sp = i-Win; % Punto di partenza (date) + if Sp <= 0 + Sp = 1; + end + if i+Win > r + Ep = r; + else + Ep = i+Win; % Punto di arrivo (date) + end + Cax = 3*j-2; + Cay = 3*j-1; + Caz = 3*j; + ACCdef_HDVR(Sp:Ep,Cax) = accHDVR(Sp:Ep,Cax); % ax + ACCdef_HDVR(Sp:Ep,Cay) = accHDVR(Sp:Ep,Cay); % ay + ACCdef_HDVR(Sp:Ep,Caz) = accHDVR(Sp:Ep,Caz); % az + cont = cont+1; + end + end +end +text = ['' num2str(cont) ' values of Tilt Link HD VR accelerometer vector of '... + 'gravity not subjected to mean process due to values with excessive variations!']; +fprintf(fileID,fmt,text); +text = ['' num2str(cont2) ' values of Tilt Link HD VR accelerometer vector of '... + 'gravity not subjected to mean process due to not calibrated values!']; +fprintf(fileID,fmt,text); + +%% Campi magnetici +MAGdef_HDVR = smoothdata(magHDVR,'gaussian',NdatiMedia); + +% Applico un controllo importante! Se la risultante delle accelerazioni +% varia più di 0.01, NON faccio la media dei dati di campo magnetico attorno, +% che altrimenti ne sono condizionati! +[r,c] = size(ACCdefRisHDVR); % Nodi in colonna, date in riga +Win = NdatiMedia/2; % Individuo la finestra da NON mediare +cont = 0; +cont2 = 0; +for i = 2:r % data + for j = 2:c % nodo + % se il valore assoluto della differenza è maggiore della + % tolleranza, NON faccio la media + if abs(ACCdefRisHDVR(i,j)-ACCdefRisHDVR(i-1,j)) > tolleranzaMag + Sp = i-Win; % Punto di partenza (date) + if Sp <= 0 + Sp = 1; + end + if i+Win > r + Ep = r; + else + Ep = i+Win; % Punto di arrivo (date) + end + Cmx = 3*j-2; + Cmy = 3*j-1; + Cmz = 3*j; + MAGdef_HDVR(Sp:Ep,Cmx) = magHDVR(Sp:Ep,Cmx); % mx + MAGdef_HDVR(Sp:Ep,Cmy) = magHDVR(Sp:Ep,Cmy); % my + MAGdef_HDVR(Sp:Ep,Cmz) = magHDVR(Sp:Ep,Cmz); % mz + cont = cont+1; + end + if ACCdefRisHDVR(i,j) < 0.9 || ACCdefRisHDVR(i,j) > 1.1 % Il nodo è fuori taratura! + Sp = i-Win; % Punto di partenza (date) + if Sp <= 0 + Sp = 1; + end + if i+Win > r + Ep = r; + else + Ep = i+Win; % Punto di arrivo (date) + end + Cmx = 3*j-2; + Cmy = 3*j-1; + Cmz = 3*j; + MAGdef_HDVR(Sp:Ep,Cmx) = magHDVR(Sp:Ep,Cmx); % mx + MAGdef_HDVR(Sp:Ep,Cmy) = magHDVR(Sp:Ep,Cmy); % my + MAGdef_HDVR(Sp:Ep,Cmz) = magHDVR(Sp:Ep,Cmz); % mz + cont2 = cont2+1; + end + end +end +text = ['' num2str(cont) ' values of Tilt Link HD VR magnetometer vector not '... + 'subjected to mean process due to accelerometers values with excessive variations!']; +fprintf(fileID,fmt,text); +text = ['' num2str(cont2) ' values of Tilt Link HD VR magnetometer vector of '... + 'gravity not subjected to mean process due to not calibrated accelerometer values!']; +fprintf(fileID,fmt,text); + +%% Risultante campi magnetici +MAGdefRisHDVR = ris_mag_HDVR; % Non faccio la media, mi serve il dato come è per applicare i filtri + +text = 'Average mean of Tilt Link HD VR data executed correctly. MediaDati_HD function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/MediaDati_IPL.m b/Tilt/MediaDati_IPL.m new file mode 100755 index 0000000..279eb3e --- /dev/null +++ b/Tilt/MediaDati_IPL.m @@ -0,0 +1,137 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per i TiltLink +% ACCdef contiene le medie per l'intervallo definito delle accelerazioni +% ARRAYdate contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [ACCdef_IPL,MAGdef_IPL,ARRAYdateIPL,ACCdefRis_IPL,MAGdefRis_IPL,TempDef_IPL]... + = MediaDati_IPL(accIPL,magIPL,TimeIPL,ris_acc_IPL,ris_mag_IPL,tempIPL,tolleranzaAcc,... + tolleranzaMag,NdatiMedia,NodoInPlaceLink,MEMS,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'MediaDati_IPL function started'; +fprintf(fileID,fmt,text); + +%% Accelerazione o angoli +[r,~] = size(accIPL); +if NdatiMedia > r + NdatiMedia = r; +end +ACCdef_IPL = smoothdata(accIPL,'gaussian',NdatiMedia); + +%% Matrice date +ARRAYdateIPL = TimeIPL; + +%% Risultante acc +ACCdefRis_IPL = ris_acc_IPL; % Non faccio la media, mi serve il dato come è per applicare i filtri + +if MEMS == 1 || MEMS == 2 || strcmp(NodoInPlaceLink(1,4),'g') == 1 + % Applico un controllo importante! Se la risultante varia più di 0.01, NON + % faccio la media dei dati attorno, che altrimenti ne sono condizionati! + [r,c] = size(ACCdefRis_IPL); % Nodi in colonna, date in riga + Win = NdatiMedia/2; % Individuo la finestra da NON mediare + cont = 0; % Contatore + cont2 = 0; + for i = 2:r % data + for j = 2:c % nodo + % se il valore assoluto della differenza è maggiore della + % tolleranza, NON faccio la media + if abs(ACCdefRis_IPL(i,j)-ACCdefRis_IPL(i-1,j)) > tolleranzaAcc || ACCdefRis_IPL(i,j) < 0.9 || ACCdefRis_IPL(i,j) > 1.1 + Sp = i-Win; % Punto di partenza (date) + if Sp <= 0 + Sp = 1; + end + if i+Win > r + Ep = r; + else + Ep = i+Win; % Punto di arrivo (date) + end + Cax = 3*j-2; + Cay = 3*j-1; + Caz = 3*j; + ACCdef_IPL(Sp:Ep,Cax) = accIPL(Sp:Ep,Cax); % ax + ACCdef_IPL(Sp:Ep,Cay) = accIPL(Sp:Ep,Cay); % ay + ACCdef_IPL(Sp:Ep,Caz) = accIPL(Sp:Ep,Caz); % az + cont = cont+1; + end + end + end + text = ['' num2str(cont) ' values of In Place Link accelerometer vector of '... + 'gravity not subjected to mean process due to values with excessive variations!']; + fprintf(fileID,fmt,text); + text = ['' num2str(cont2) ' values of In Place Link accelerometer vector of gravity '... + 'not subjected to mean process due to not calibrated values!']; + fprintf(fileID,fmt,text); + + %% Campi magnetici + MAGdef_IPL = smoothdata(magIPL,'gaussian',NdatiMedia); + + % Applico un controllo importante! Se la risultante delle accelerazioni + % varia più di 0.01, NON faccio la media dei dati di campo magnetico attorno, + % che altrimenti ne sono condizionati! + [r,c] = size(ACCdefRis_IPL); % Nodi in colonna, date in riga + Win = NdatiMedia/2; % Individuo la finestra da NON mediare + cont = 0; + cont2 = 0; + for i = 2:r % data + for j = 2:c % nodo + % se il valore assoluto della differenza è maggiore della + % tolleranza, NON faccio la media + if abs(ACCdefRis_IPL(i,j)-ACCdefRis_IPL(i-1,j)) > tolleranzaMag + Sp = i-Win; % Punto di partenza (date) + if Sp <= 0 + Sp = 1; + end + if i+Win > r + Ep = r; + else + Ep = i+Win; % Punto di arrivo (date) + end + Cmx = 3*j-2; + Cmy = 3*j-1; + Cmz = 3*j; + MAGdef_IPL(Sp:Ep,Cmx) = magIPL(Sp:Ep,Cmx); % mx + MAGdef_IPL(Sp:Ep,Cmy) = magIPL(Sp:Ep,Cmy); % my + MAGdef_IPL(Sp:Ep,Cmz) = magIPL(Sp:Ep,Cmz); % mz + cont = cont+1; + end + if ACCdefRis_IPL(i,j) < 0.9 || ACCdefRis_IPL(i,j) > 1.1 % Il nodo è fuori taratura! + Sp = i-Win; % Punto di partenza (date) + if Sp <= 0 + Sp = 1; + end + if i+Win > r + Ep = r; + else + Ep = i+Win; % Punto di arrivo (date) + end + Cmx = 3*j-2; + Cmy = 3*j-1; + Cmz = 3*j; + MAGdef_IPL(Sp:Ep,Cmx) = magIPL(Sp:Ep,Cmx); % mx + MAGdef_IPL(Sp:Ep,Cmy) = magIPL(Sp:Ep,Cmy); % my + MAGdef_IPL(Sp:Ep,Cmz) = magIPL(Sp:Ep,Cmz); % mz + cont2 = cont2+1; + end + end + end + text = ['' num2str(cont) ' values of In Place Link magnetometer vector not subjected to mean process due to accelerometers values with excessive variations!']; + fprintf(fileID,fmt,text); + text = ['' num2str(cont2) ' values of In Place Link magnetometer vector of gravity not subjected to mean process due to not calibrated accelerometer values!']; + fprintf(fileID,fmt,text); +else + MAGdef_IPL = []; +end + +%% Risultante campi magnetici +MAGdefRis_IPL = ris_mag_IPL; % Non faccio la media, mi serve il dato come è per applicare i filtri + +%% Temperatura +TempDef_IPL = tempIPL; % Non faccio la media, mi serve il dato come è per applicare i filtri + +text = 'Average mean of In Place Link data executed correctly. MediaDati_IPL function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/MediaDati_IPLHR.m b/Tilt/MediaDati_IPLHR.m new file mode 100755 index 0000000..3f263f6 --- /dev/null +++ b/Tilt/MediaDati_IPLHR.m @@ -0,0 +1,32 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per i Tilt Link HR +% ACCdefTLHR contiene le medie per l'intervallo definito delle accelerazioni +% ARRAYdateTLHR contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [ANGdef_IPLHR,ARRAYdateIPLHR,TempDef_IPLHR] = MediaDati_IPLHR(angIPLHR,... + TimeIPLHR,tempIPLHR,NdatiMedia,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'MediaDati_IPLHR function started'; +fprintf(fileID,fmt,text); + +%% Angoli +[r,~]=size(angIPLHR); +if NdatiMedia > r + NdatiMedia = r; +end +ANGdef_IPLHR = smoothdata(angIPLHR,'gaussian',NdatiMedia); + +%% Matrice date +ARRAYdateIPLHR = TimeIPLHR; + +%% Temperature +TempDef_IPLHR = tempIPLHR; % Non faccio la media, mi serve il dato come è per applicare i filtri + +text = 'Average mean of In Place Link HR data executed correctly. MediaDati_IPLHR function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/MediaDati_KL.m b/Tilt/MediaDati_KL.m new file mode 100755 index 0000000..f9d193f --- /dev/null +++ b/Tilt/MediaDati_KL.m @@ -0,0 +1,27 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive + +function [ANGdefKL,TdefKL,ARRAYdateKL] = MediaDati_KL(ang_KL,temp_KL,TimeKL,NdatiMedia,FileName) + +text = 'MediaDati_KL function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +%% Angoli +[r,~]=size(ang_KL); +if NdatiMedia > r + NdatiMedia = r; +end +ANGdefKL = smoothdata(ang_KL,'gaussian',NdatiMedia); + +ARRAYdateKL = TimeKL; + +%% Temperature +TdefKL = temp_KL; % Non faccio la media, mi serve il dato come è per applicare i filtri + +text = 'Mean values of Klino Link data calculated correctly. MediaDati_KL function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/MediaDati_KLHR.m b/Tilt/MediaDati_KLHR.m new file mode 100755 index 0000000..c2d318c --- /dev/null +++ b/Tilt/MediaDati_KLHR.m @@ -0,0 +1,28 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive + +function [ANGdefKLHR,TdefKLHR,ARRAYdateKLHR] = MediaDati_KLHR(ang_KLHR,... + temp_KLHR,TimeKLHR,NdatiMedia,FileName) + +text = 'MediaDati_KLHR function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +%% Angoli +[r,~]=size(ang_KLHR); +if NdatiMedia > r + NdatiMedia = r; +end +ANGdefKLHR = smoothdata(ang_KLHR,'gaussian',NdatiMedia); + +ARRAYdateKLHR = TimeKLHR; + +%% Temperature +TdefKLHR = temp_KLHR; % Non faccio la media, mi serve il dato come è per applicare i filtri + +text = 'Mean values of Klino Link HR data calculated correctly. MediaDati_KLHR function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/MediaDati_LL.m b/Tilt/MediaDati_LL.m new file mode 100755 index 0000000..92168b0 --- /dev/null +++ b/Tilt/MediaDati_LL.m @@ -0,0 +1,27 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per la cella di carico +% LOADdef contiene le medie per l'intervallo definito dei valori di forza +% ARRAYdateLL contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [LoadDef,ARRAYdateLL] = MediaDati_LL(DatiLoad,TimeLL,NdatiMedia,FileName) + +text = 'MediaDati_LL function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +%% Cella di carico +[r,~]=size(DatiLoad); +if NdatiMedia > r + NdatiMedia = r; +end +LoadDef = smoothdata(DatiLoad,'gaussian',NdatiMedia); + +ARRAYdateLL = TimeLL; + +text = 'Average mean of Load Link data executed correctly. MediaDati_LL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/MediaDati_PE.m b/Tilt/MediaDati_PE.m new file mode 100755 index 0000000..47bc676 --- /dev/null +++ b/Tilt/MediaDati_PE.m @@ -0,0 +1,24 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive + +function [Dati_PE,ARRAYdatePE] = MediaDati_PE(Def_PE,TimePE,NdatiMedia,FileName) + +text = 'MediaDati_PE function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +%% Deformazione +[r,~]=size(Def_PE); +if NdatiMedia > r + NdatiMedia = r; +end +Dati_PE = smoothdata(Def_PE,'gaussian',NdatiMedia); + +ARRAYdatePE = TimePE; + +text = 'MediaDati_PE function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/MediaDati_PL.m b/Tilt/MediaDati_PL.m new file mode 100755 index 0000000..31fb398 --- /dev/null +++ b/Tilt/MediaDati_PL.m @@ -0,0 +1,31 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per i piezometri +% PIEZdef contiene le medie per l'intervallo definito dei valori di +% pressione registrati dal piezometro +% ARRAYdatePL contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [PiezDef,PiezDefT,ARRAYdatePL] = MediaDati_PL(DatiPiez,DatiPiezT,TimePL,NdatiMediaP,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'MediaDati_PL function started'; +fprintf(fileID,fmt,text); + +%% Piezometro +[r,~]=size(DatiPiez); + +ARRAYdatePL = TimePL; +if NdatiMediaP > r + NdatiMediaP = r; +end +PiezDef = smoothdata(DatiPiez,'gaussian',NdatiMediaP); + +%% Termometro +PiezDefT = DatiPiezT; + +text = 'Average mean of Piezo Link data executed correctly. MediaDati_PL function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/MediaDati_PT100.m b/Tilt/MediaDati_PT100.m new file mode 100755 index 0000000..b9cd954 --- /dev/null +++ b/Tilt/MediaDati_PT100.m @@ -0,0 +1,19 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive + +function [Dati_PT100,ARRAYdatePT100] = MediaDati_PT100(val_PT100,TimePT100,FileName) + +%% Temperatura +Time = TimePT100; + +Dati_PT100 = val_PT100; + +ARRAYdatePT100 = Time; + +text = 'Mean values of PT100 Link data NOT calculated. MediaDati_PT100 function closed'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/MediaDati_RL.m b/Tilt/MediaDati_RL.m new file mode 100755 index 0000000..c6b09a2 --- /dev/null +++ b/Tilt/MediaDati_RL.m @@ -0,0 +1,17 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive + +function [Dati_RL,ARRAYdateRL] = MediaDati_RL(val_RL,TimeRL,FileName) + +%% Pioggia + +ARRAYdateRL = TimeRL; +Dati_RL = val_RL; + +text = 'Mean values of Rain Link NOT calculated. MediaDati_RL closed'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/MediaDati_TL.m b/Tilt/MediaDati_TL.m new file mode 100755 index 0000000..2341e85 --- /dev/null +++ b/Tilt/MediaDati_TL.m @@ -0,0 +1,131 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per i TiltLink +% ACCdef contiene le medie per l'intervallo definito delle accelerazioni +% ARRAYdate contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [ACCdef,MAGdef,ARRAYdateTL,ACCdefRis,MAGdefRis_TL,TempDef_TL] = MediaDati_TL(... + accTL,magTL,TimeTL,ris_acc,ris_mag,tempTL,tolleranzaAcc,... + tolleranzaMag,NdatiMedia,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'MediaDati_TL function started'; +fprintf(fileID,fmt,text); + +%% Accelerazione +[r,~]=size(accTL); +if NdatiMedia > r + NdatiMedia = r; +end +ACCdef = smoothdata(accTL,'gaussian',NdatiMedia); + +%% Matrice date +ARRAYdateTL = TimeTL; + +%% Risultante acc +ACCdefRis = ris_acc; % Non faccio la media, mi serve il dato come è per applicare i filtri + +% Applico un controllo importante! Se la risultante varia più di 0.01, NON +% faccio la media dei dati attorno, che altrimenti ne sono condizionati! +[r,c] = size(ACCdefRis); % Nodi in colonna, date in riga +Win = NdatiMedia/2; % Individuo la finestra da NON mediare +cont = 0; % Contatore +cont2 = 0; +for i = 2:r % data + for j = 2:c % nodo + % se il valore assoluto della differenza è maggiore della + % tolleranza, NON faccio la media + if abs(ACCdefRis(i,j)-ACCdefRis(i-1,j)) > tolleranzaAcc || ACCdefRis(i,j) < 0.9 || ACCdefRis(i,j) > 1.1 + Sp = i-Win; % Punto di partenza (date) + if Sp <= 0 + Sp = 1; + end + if i+Win > r + Ep = r; + else + Ep = i+Win; % Punto di arrivo (date) + end + Cax = 3*j-2; + Cay = 3*j-1; + Caz = 3*j; + ACCdef(Sp:Ep,Cax) = accTL(Sp:Ep,Cax); % ax + ACCdef(Sp:Ep,Cay) = accTL(Sp:Ep,Cay); % ay + ACCdef(Sp:Ep,Caz) = accTL(Sp:Ep,Caz); % az + cont = cont+1; + end + end +end +text = ['' num2str(cont) ' values of Tilt Link V accelerometer vector of gravity not subjected to mean process due to values with excessive variations!']; +fprintf(fileID,fmt,text); +text = ['' num2str(cont2) ' values of Tilt Link V accelerometer vector of gravity not subjected to mean process due to not calibrated values!']; +fprintf(fileID,fmt,text); + +%% Campi magnetici +MAGdef = smoothdata(magTL,'gaussian',NdatiMedia); + +% Applico un controllo importante! Se la risultante delle accelerazioni +% varia più di 0.01, NON faccio la media dei dati di campo magnetico attorno, +% che altrimenti ne sono condizionati! +[r,c] = size(ACCdefRis); % Nodi in colonna, date in riga +Win = NdatiMedia/2; % Individuo la finestra da NON mediare +cont = 0; +cont2 = 0; +for i = 2:r % data + for j = 2:c % nodo + % se il valore assoluto della differenza è maggiore della + % tolleranza, NON faccio la media + if abs(ACCdefRis(i,j)-ACCdefRis(i-1,j)) > tolleranzaMag + Sp = i-Win; % Punto di partenza (date) + if Sp <= 0 + Sp = 1; + end + if i+Win > r + Ep = r; + else + Ep = i+Win; % Punto di arrivo (date) + end + Cmx = 3*j-2; + Cmy = 3*j-1; + Cmz = 3*j; + MAGdef(Sp:Ep,Cmx) = magTL(Sp:Ep,Cmx); % mx + MAGdef(Sp:Ep,Cmy) = magTL(Sp:Ep,Cmy); % my + MAGdef(Sp:Ep,Cmz) = magTL(Sp:Ep,Cmz); % mz + cont = cont+1; + end + if ACCdefRis(i,j) < 0.9 || ACCdefRis(i,j) > 1.1 % Il nodo è fuori taratura! + Sp = i-Win; % Punto di partenza (date) + if Sp <= 0 + Sp = 1; + end + if i+Win > r + Ep = r; + else + Ep = i+Win; % Punto di arrivo (date) + end + Cmx = 3*j-2; + Cmy = 3*j-1; + Cmz = 3*j; + MAGdef(Sp:Ep,Cmx) = magTL(Sp:Ep,Cmx); % mx + MAGdef(Sp:Ep,Cmy) = magTL(Sp:Ep,Cmy); % my + MAGdef(Sp:Ep,Cmz) = magTL(Sp:Ep,Cmz); % mz + cont2 = cont2+1; + end + end +end +text = ['' num2str(cont) ' values of Tilt Link V magnetometer vector not subjected to mean process due to accelerometers values with excessive variations!']; +fprintf(fileID,fmt,text); +text = ['' num2str(cont2) ' values of Tilt Link V magnetometer vector of gravity not subjected to mean process due to not calibrated accelerometer values!']; +fprintf(fileID,fmt,text); + +%% Risultante campi magnetici +MAGdefRis_TL = ris_mag; % Non faccio la media, mi serve il dato come è per applicare i filtri + +%% Temperatura +TempDef_TL = tempTL; % Non faccio la media, mi serve il dato come è per applicare i filtri + +text = 'Average mean of Tilt Link V data executed correctly. MediaDati_TL function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/MediaDati_TLH.m b/Tilt/MediaDati_TLH.m new file mode 100755 index 0000000..919fbf1 --- /dev/null +++ b/Tilt/MediaDati_TLH.m @@ -0,0 +1,88 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per i TiltLink +% ACCdef contiene le medie per l'intervallo definito delle accelerazioni +% ARRAYdate contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [ACCdef_TLH,ARRAYdateTLH,ACCdefRis_TLH,TempDef_TLH] = MediaDati_TLH... + (accTLH,TimeTLH,ris_acc_TLH,tempTLH,tolleranzaAcc,NdatiMedia,FileName) + + fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'MediaDati_TLH function started'; +fprintf(fileID,fmt,text); + +%% Accelerazione +[r,~]=size(accTLH); +if NdatiMedia > r + NdatiMedia = r; +end +ACCdef_TLH = smoothdata(accTLH,'gaussian',NdatiMedia); + +%% Matrice date +ARRAYdateTLH = TimeTLH; + +%% Risultante acc +ACCdefRis_TLH = ris_acc_TLH; % Non faccio la media, mi serve il dato come è per applicare i filtri + +% Applico un controllo importante! Se la risultante varia più di 0.01, NON +% faccio la media dei dati attorno, che altrimenti ne sono condizionati! +[r,c] = size(ACCdefRis_TLH); % Nodi in colonna, date in riga +Win = NdatiMedia/2; % Individuo la finestra da NON mediare +cont = 0; % Contatore +cont2 = 0; +for i = 2:r % data + for j = 2:c % nodo + % se il valore assoluto della differenza è maggiore della + % tolleranza, NON faccio la media + if abs(ACCdefRis_TLH(i,j)-ACCdefRis_TLH(i-1,j)) > tolleranzaAcc + Sp = i-Win; % Punto di partenza (date) + if Sp <= 0 + Sp = 1; + end + if i+Win > r + Ep = r; + else + Ep = i+Win; % Punto di arrivo (date) + end + Cax = 3*j-2; + Cay = 3*j-1; + Caz = 3*j; + ACCdef_TLH(Sp:Ep,Cax) = accTLH(Sp:Ep,Cax); % ax + ACCdef_TLH(Sp:Ep,Cay) = accTLH(Sp:Ep,Cay); % ay + ACCdef_TLH(Sp:Ep,Caz) = accTLH(Sp:Ep,Caz); % az + cont = cont+1; + end + if ACCdefRis_TLH(i,j) < 0.9 || ACCdefRis_TLH(i,j) > 1.1 % Il nodo è fuori taratura! + Sp = i-Win; % Punto di partenza (date) + if Sp <= 0 + Sp = 1; + end + if i+Win > r + Ep = r; + else + Ep = i+Win; % Punto di arrivo (date) + end + Cax = 3*j-2; + Cay = 3*j-1; + Caz = 3*j; + ACCdef_TLH(Sp:Ep,Cax) = accTLH(Sp:Ep,Cax); % ax + ACCdef_TLH(Sp:Ep,Cay) = accTLH(Sp:Ep,Cay); % ay + ACCdef_TLH(Sp:Ep,Caz) = accTLH(Sp:Ep,Caz); % az + cont2 = cont2+1; + end + end +end +text = [' ' num2str(cont) ' values of Tilt Link H accelerometer vector of gravity not subjected to mean process due to values with excessive variations!']; +fprintf(fileID,fmt,text); +text = [' ' num2str(cont2) ' values of Tilt Link H accelerometer vector of gravity not subjected to mean process due to not calibrated values!']; +fprintf(fileID,fmt,text); + +%% Temperatura +TempDef_TLH = tempTLH; % Non faccio la media, mi serve il dato come è per applicare i filtri + +text = 'Average mean of Tilt Link H data executed correctly. MediaDati_TLH function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/MediaDati_TLHR.m b/Tilt/MediaDati_TLHR.m new file mode 100755 index 0000000..97123db --- /dev/null +++ b/Tilt/MediaDati_TLHR.m @@ -0,0 +1,34 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per i Tilt Link HR +% ACCdefTLHR contiene le medie per l'intervallo definito delle accelerazioni +% ARRAYdateTLHR contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [ANGdef_TLHR,ARRAYdateTLHR,TempDef_TLHR] = MediaDati_TLHR(angTLHR,... + TimeTLHR,tempTLHR,NdatiMedia,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'MediaDati_TLHR function started'; +fprintf(fileID,fmt,text); + +%% Angoli +[r,~]=size(angTLHR); +if NdatiMedia > r + NdatiMedia = r; +end +ANGdef_TLHR = smoothdata(angTLHR,'gaussian',NdatiMedia); + +%% Matrice date +ARRAYdateTLHR = TimeTLHR; + +%% Temperature +TempDef_TLHR = tempTLHR; % Non faccio la media, mi serve il dato come è per applicare i filtri + +text = 'Average mean of Tilt Link HR V data executed correctly. MediaDati_TLHR function ended'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/MediaDati_TLHRH.m b/Tilt/MediaDati_TLHRH.m new file mode 100755 index 0000000..81bdaf9 --- /dev/null +++ b/Tilt/MediaDati_TLHRH.m @@ -0,0 +1,32 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive per i Tilt Link HR +% ACCdefTLHR contiene le medie per l'intervallo definito delle accelerazioni +% ARRAYdateTLHR contiene le date e il tempo per ogni dato (per media +% giornaliera, la data di quel giorno) + +function [ANGdef_TLHRH,ARRAYdateTLHRH,TempDef_TLHRH] = MediaDati_TLHRH(angTLHRH,... + TimeTLHRH,tempTLHRH,NdatiMedia,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'MediaDati_TLHRH function started'; +fprintf(fileID,fmt,text); + +%% Angoli +[r,~]=size(angTLHRH); +if NdatiMedia > r + NdatiMedia = r; +end +ANGdef_TLHRH = smoothdata(angTLHRH,'gaussian',NdatiMedia); + +%% Matrice date +ARRAYdateTLHRH = TimeTLHRH; + +%% Temperature +TempDef_TLHRH = tempTLHRH; % Non faccio la media, mi serve il dato come è per applicare i filtri + +text = 'Average mean of Tilt Link HR H data executed correctly. MediaDati_TLHRH function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/MediaDati_ThL.m b/Tilt/MediaDati_ThL.m new file mode 100755 index 0000000..6dae529 --- /dev/null +++ b/Tilt/MediaDati_ThL.m @@ -0,0 +1,24 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive + +function [Dati_ThL,ARRAYdateThL] = MediaDati_ThL(val_ThL,TimeThL,NdatiMedia,FileName) + +text = 'MediaDati_ThL function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +%% Dati Temperatura +[r,~]=size(val_ThL); +if NdatiMedia > r + NdatiMedia = r; +end +Dati_ThL = smoothdata(val_ThL,'gaussian',NdatiMedia); + +ARRAYdateThL = TimeThL; + +text = 'MediaDati_ThL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/MediaDati_WL.m b/Tilt/MediaDati_WL.m new file mode 100755 index 0000000..e4b12f3 --- /dev/null +++ b/Tilt/MediaDati_WL.m @@ -0,0 +1,19 @@ +% Questa routine calcola le medie (giornaliere o per intervalli definiti) +% necessarie per le elaborazioni successive + +function [Dati_WL,ARRAYdateWL] = MediaDati_WL(lev_WL,TimeWL,FileName) + +%% Temperatura +Time = TimeWL; + +Dati_WL = lev_WL; + +ARRAYdateWL = Time; + +text = 'Mean values of Weir Link data NOT calculated. MediaDati_WL function closed'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/NuovaConversione.m b/Tilt/NuovaConversione.m new file mode 100755 index 0000000..b5d56e4 --- /dev/null +++ b/Tilt/NuovaConversione.m @@ -0,0 +1,240 @@ +function [DCalTLTot,DCalTLHTot,DCalPLTot,DCalBLTot,DCalTLHRTot,DCalTLHRHTot,... + DCalALTot,DCalLLTot,DCalThLTot,DCalKLTot,DCalKLHRTot,DCalRLTot,DCalPT100Tot,... + DCalIPLTot,DCalIPLHRTot,DCalWLTot,DCalPETot] = NuovaConversione(DCalTLTot,... + DCalTLHTot,DCalPLTot,DCalBLTot,DCalTLHRTot,DCalTLHRHTot,DCalALTot,DCalLLTot,... + DCalThLTot,DCalKLTot,DCalKLHRTot,DCalRLTot,DCalPT100Tot,DCalIPLTot,DCalIPLHRTot,... + DCalWLTot,DCalPETot,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'NuovaConversione function started'; +fprintf(fileID,fmt,text); + +% Conversione del formato dati che usiamo con il database Ase_New + +%% Tilt Link +[r,c] = size(DCalTLTot); +MATconv = zeros(r,c); +if r == 0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalTLTot{ii,jj}; + end + end + DCalTLTot = MATconv; +end + +%% Tilt Link H +[r,c] = size(DCalTLHTot); +MATconv = zeros(r,c); +if r == 0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalTLHTot{ii,jj}; + end + end + DCalTLHTot = MATconv; +end + +%% Piezo Link +[r,c] = size(DCalPLTot); +MATconv = zeros(r,c); +if r == 0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalPLTot{ii,jj}; + end + end + DCalPLTot = MATconv; +end + +%% Baro Link +[r,c] = size(DCalBLTot); +MATconv = zeros(r,c); +if r == 0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalBLTot{ii,jj}; + end + end + DCalBLTot = MATconv; +end + +%% Tilt Link HR +[r,c] = size(DCalTLHRTot); +MATconv = zeros(r,c); +if r == 0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalTLHRTot{ii,jj}; + end + end + DCalTLHRTot = MATconv; +end + +%% Tilt Link HR H +[r,c] = size(DCalTLHRHTot); +MATconv = zeros(r,c); +if r == 0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalTLHRHTot{ii,jj}; + end + end + DCalTLHRHTot = MATconv; +end + +%% Analog Link +[r,c] = size(DCalALTot); +MATconv = zeros(r,c); +if r == 0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalALTot{ii,jj}; + end + end + DCalALTot = MATconv; +end + +%% Load Link +[r,c] = size(DCalLLTot); +MATconv = zeros(r,c); +if r == 0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalLLTot{ii,jj}; + end + end + DCalLLTot = MATconv; +end + +%% Therm Link +[r,c] = size(DCalThLTot); +MATconv = zeros(r,c); +if r == 0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalThLTot{ii,jj}; + end + end + DCalThLTot = MATconv; +end + +%% Klino Link +[r,c] = size(DCalKLTot); +MATconv = zeros(r,c); +if r == 0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalKLTot{ii,jj}; + end + end + DCalKLTot = MATconv; +end + +%% Klino Link HR +[r,c] = size(DCalKLHRTot); +MATconv = zeros(r,c); +if r == 0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalKLHRTot{ii,jj}; + end + end + DCalKLHRTot = MATconv; +end + +%% Rain Link +[r,c] = size(DCalRLTot); +MATconv = zeros(r,c); +if r == 0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalRLTot{ii,jj}; + end + end + DCalRLTot = MATconv; +end + +%% PT100 Link +[r,c] = size(DCalPT100Tot); +MATconv = zeros(r,c); +if r == 0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalPT100Tot{ii,jj}; + end + end + DCalPT100Tot = MATconv; +end + +%% In Place Link +[r,c] = size(DCalIPLTot); +MATconv = zeros(r,c); +if r == 0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalIPLTot{ii,jj}; + end + end + DCalIPLTot = MATconv; +end + +%% In Place Link HR +[r,c] = size(DCalIPLHRTot); +MATconv = zeros(r,c); +if r == 0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalIPLHRTot{ii,jj}; + end + end + DCalIPLHRTot = MATconv; +end + +%% Weir Link +[r,c] = size(DCalWLTot); +MATconv = zeros(r,c); +if r == 0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalWLTot{ii,jj}; + end + end + DCalWLTot = MATconv; +end + +%% Pendulum +[r,c] = size(DCalPETot); +MATconv = zeros(r,c); +if r == 0 % Non ci sono dati +else + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalPETot{ii,jj}; + end + end + DCalPETot = MATconv; +end + +text = 'NuovaConversione function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/PT100.m b/Tilt/PT100.m new file mode 100755 index 0000000..640bc21 --- /dev/null +++ b/Tilt/PT100.m @@ -0,0 +1,134 @@ +function [Dati_PT100,ARRAYdatePT100,ErrPT100Link] = PT100(Dati_PT100,... + ARRAYdatePT100,NuovoZeroPT100,ErrPT100Link,NdatiMedia,margine,Tmax,Tmin,... + datainiPT100,IDcentralina,DTcatena,FileName) + +text = 'PT100 function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +if NuovoZeroPT100 == 1 + ini = round(NdatiMedia/2); + if rem(NdatiMedia,2) == 0 + ini = ini+1; + end + ini = ini + margine; + if ini < 6 + ini = 6; + end + ErrPT100Link = ErrPT100Link(ini:end,:)'; + Dati_PT100 = Dati_PT100(ini:end,:); + ARRAYdatePT100 = ARRAYdatePT100(ini:end,1); +else + ErrPT100Link = ErrPT100Link'; +end + +[r,c] = size(Dati_PT100); +FileTemperature = ['' IDcentralina '-' DTcatena '-PT100-Therm.csv']; +if isfile(FileTemperature) == 1 + DatiRaw = csvread(FileTemperature); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; +else + rDR = 1; + cDR = 1; +end +cont2 = 1; +for a = 1:r % Data + for b = 1:c % Nodo + % NON considero i dati al di sopra dei 80 °C o al di sotto dei -30 °C! + if Dati_PT100(a,b) > Tmax || Dati_PT100(a,b) < Tmin + cont2 = cont2+1; + if a == 1 + if isfile(FileTemperature) == 1 + RawDate = find(DatiRaw(:,1)<=datenum(datainiPT100)); + if isempty(RawDate) == 1 + cc = 2; + while cc <= c + if Dati_PT100(cc,b) > Tmax || Dati_PT100(cc,b) < Tmin + cc = cc+1; + else + break + end + end + Dati_PT100(a,b) = Dati_PT100(cc,b); + else + if isnan(DatiRaw(RawDate(end),b+1)) == 0 + Dati_PT100(a,b) = DatiRaw(RawDate(end),b+1); + ErrPT100Link(b,a) = 1; + wardat = 'Temperature data of PT100 Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + else + cc = 2; + while cc <= c + if Dati_PT100(cc,b) > Tmax || Dati_PT100(cc,b) < Tmin + cc = cc+1; + else + break + end + end + Dati_PT100(a,b) = Dati_PT100(cc,b); + end + end + else + cc = 2; + while cc <= c + if Dati_PT100(cc,b) > Tmax || Dati_PT100(cc,b) < Tmin + cc = cc+1; + else + break + end + end + Dati_PT100(a,b) = Dati_PT100(cc,b); + end + else + Dati_PT100(a,b) = Dati_PT100(a-1,b); + ErrPT100Link(b,a) = 1; + end + textT = ['' num2str(cont2) ' correction executed for PT100 Link - Temperature filter!']; + fprintf(fileID,fmt,textT); + end + end +end + +if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=ARRAYdatePT100(1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(ARRAYdatePT100(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(ARRAYdatePT100(:,1)>DatiRaw(RawDate1(end)+1,1)); + end +else + RawDate1 = []; + RawDate2 = 1; +end +if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:); ARRAYdatePT100(RawDate2(1):end) Dati_PT100(RawDate2(1):end,:)]; +elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = [ARRAYdatePT100 Dati_PT100]; +else + Dati = DatiRaw; +end +% Elimino appoggio più vecchio di un mese +RawDate3 = find(Dati(:,1) Ndatidespike + Ndati = NdatiMediaP; + else + Ndati = Ndatidespike; + end + ini = round(Ndati/2)+1; + if rem(Ndati,2) == 0 + ini = ini+1; + end + clear NDati + ini = ini + marginePiezo; + ErrPiezoLink = ErrPiezoLink(ini:end,:); + PiezDef = PiezDef(ini:end,:); + PiezDefT = PiezDefT(ini:end,:); + BaroDef = BaroDef(ini:end,:); + ARRAYdatePL = ARRAYdatePL(ini:end,1); +end + +[dati,~] = size(PiezDef); +ProfFalda = zeros(dati,rPL); % in riga le date, in colonna i piezometri +for p = 1:rPL + if strcmp(NodoPiezoLink(1,4),'VW kPa') == 1 || strcmp(NodoPiezoLink(1,4),'VW kg/cm2') == 1 + ProfFalda(:,p) = (PiezDef(:,p))/9806.65; + else + ProfFalda(:,p) = (PiezDef(:,p) - BaroDef(:,1))/9806.65; + end +end + +if Anchor_real ~= 0 % correggo la profondità del piezometro +% Nodi = [cell2mat(catena(:,3)) cell2mat(catena(:,2)) cell2mat(catena(:,1))]; +% [r,~] = size(Nodi); +% % Cerco l'ancora +% for i = 1:r +% if Nodi(i,3) == 9 +% break +% end +% end +% diff = Anchor_real - Nodi(i,2); + NodoPiezoLink(:,3) = num2cell(cell2mat(NodoPiezoLink(:,3)) - Anchor_real); +end + +Livello = zeros(dati,rPL); % Dove sta la falda rispetto al Piano Campagna +clear p +for ii = 1:dati + for p = 1:rPL + if ProfFalda(ii,p) <= 0 % La falda è sotto al piezometro e questo non può leggerne dunque la profondità + Livello(ii,p) = cell2mat(NodoPiezoLink(p,3)); + else + Livello(ii,p) = cell2mat(NodoPiezoLink(p,3)) + ProfFalda(ii,p); + end + end +end + +% Impacchettamento matrice errori +[r,~] = size(ErrPiezoLink); +Matrice_err = zeros(r,rPL); +for i = 1:r % date + d = 1; + for n = 1:rPL % nodi + j = 1; + err = ErrPiezoLink(i,d:d+1); + while j <= 2 + if err(1,j) == 1 + Matrice_err(i,n) = 1; + break + end + j = j+1; + end + d = d+2; + end +end +ErrPiezoLink = Matrice_err'; + +text = 'Piezo Link elaborated correctly. Piezo function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/QuaternioniASE.m b/Tilt/QuaternioniASE.m new file mode 100755 index 0000000..3e523e5 --- /dev/null +++ b/Tilt/QuaternioniASE.m @@ -0,0 +1,175 @@ +function [DNS,DEO,Dz,becc,roll,imba,q,qy]=QuaternioniASE(axb,ayb,azb,mxb,myb,mzb,SP,MEMS,FileName) + +% OPERAZIONI PRELIMINARI +% calcola la norma dell'accelerazione e del campo magnetico +Na = (axb^2+ayb^2+azb^2)^0.5; +Nm = (mxb^2+myb^2+mzb^2)^0.5; +% normalizzo l'accelerazione +axbN = axb/Na; +aybN = ayb/Na; +azbN = azb/Na; +% normalizzo il campo magnetico +mxbN = mxb/Nm; +mybN = myb/Nm; +mzbN = mzb/Nm; + +if MEMS == 1 % Correggo i segni degli assi + % correggo la direzione degli assi del sistema di coordinate + % aggiornato al 15 febbraio 2016 + axsN = axbN; + aysN = aybN; + azsN = -azbN; + % anche per il campo magnetico... + mxsN = -mxbN; + mysN = -mybN; + mzsN = mzbN; +elseif MEMS == 2 + % correggo la direzione degli assi del sistema di coordinate + % aggiornato al 09 febbraio 2017 + axsN = axbN; + aysN = aybN; + azsN = -azbN; + % anche per il campo magnetico... + mxsN = -mxbN; + mysN = -mybN; + mzsN = mzbN; +elseif MEMS == 3 + % correggo la direzione degli assi del sistema di coordinate + % aggiornato al 10 ottobre 2022 + axsN = axbN; + aysN = aybN; + azsN = azbN; + % anche per il campo magnetico... + mxsN = mybN; + mysN = mxbN; + mzsN = -mzbN; +end + +% trovo i vettori dei campi gravitazionale e magnetico +VaN = [axsN aysN azsN]; +VmN = [mxsN mysN mzsN]; + +% CONTI SECONDO YUN +[qy,~,~] = fqa(VaN',VmN'); +qy = qy'; + +% determino i relativi quaternioni +qaN = [0 VaN]; +qmN = [0 VmN]; + +% calcolo il coseno del beccheggio +% gamma = acos(azsN); gamma non viene mai usato +COSteta = (1-axsN^2)^0.5; + +% VERIFICA DELLA SINGOLARITA' +% impongo un epsilon piccolo a piacere +epsilon = 0.1; +if COSteta <= epsilon + % 20 deg espresso in radianti + alpha = 0.3491; +else + alpha = 0; +end + +SENalphamezzi = sign(sin(alpha))*((1-cos(alpha))/2)^0.5; +COSalphamezzi = ((1+cos(alpha))/2)^0.5; + +%% calcolo il quaternione qalpha e il suo coniugato +qalpha = [COSalphamezzi 0 SENalphamezzi 0]; +qalphaC = quatconj(qalpha); + +% modifico il vettore accelerazione... +qacc = quatmultiply(qalpha,qaN); +qacc = quatmultiply(qacc,qalphaC); + +% ...e quello campo magnetico +qmag = quatmultiply(qalpha,qmN); +qmag = quatmultiply(qmag,qalphaC); + +%% CALCOLA IL QUATERNIONE ELEVAZIONE +% NB: il valore di COSteta sarà riscritto +SENteta = qacc(2); +COSteta = (1-SENteta^2)^0.5; +SENtetamezzi = sign(SENteta)*((1-COSteta)/2)^0.5; +COStetamezzi = ((1+COSteta)/2)^0.5; +qe = [COStetamezzi 0 SENtetamezzi 0]; + +%% CALCOLA IL QUATERNIONE ROLLIO +SENphi = -qacc(3)/COSteta; +COSphi = -qacc(4)/COSteta; +% caso in cui l'asse x sia orientato verticalmente +if COSteta == 0 + SENphi = 0; + COSphi = 1; +end +% determinazione degli elementi di qr +if COSphi == -1 + SENphimezzi = 1*((1-COSphi)/2)^0.5; + COSphimezzi = 0; +else + SENphimezzi = sign(SENphi)*((1-COSphi)/2)^0.5; + COSphimezzi = ((1+COSphi)/2)^0.5; + if isreal(SENphimezzi) + elseif imag(SENphimezzi)<0.001 + SENphimezzi=0; + text = 'SENphi/2 corrected'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + end +end +% scrittura di qr +qr = [COSphimezzi SENphimezzi 0 0]; + +%% CALCOLA IL QUATERNIONE AZIMUTALE +% Campo magnetico nel sistema di coordinate Earth +qaus = quatmultiply(qe,qr); +qauC = quatconj(qaus); +qEm = quatmultiply(qaus,qmag); +qEm = quatmultiply(qEm,qauC); +% Campo magnetico di riferimento +Nx = 1; +Ny = 0; +% Normalizzazione delle componenti orizzontali del campo magnetico misurato +mxmearot = qEm(2); +mymearot = qEm(3); +Mx = (1/(mxmearot^2+mymearot^2)^0.5)*mxmearot; +My = (1/(mxmearot^2+mymearot^2)^0.5)*mymearot; + +% determino coseno e seno dell'angolo di imbardata +COSpsi = Mx*Nx+My*Ny; +SENpsi = -My*Nx+Mx*Ny; +% determinazione degli elementi di qa +SENpsimezzi = sign(SENpsi)*((1-COSpsi)/2)^0.5; +COSpsimezzi = ((1+COSpsi)/2)^0.5; +% scrittura di qa +qa = [COSpsimezzi 0 0 SENpsimezzi]; + +% QUATERNIONE FINALE +q = quatmultiply(qa,qe); +q = quatmultiply(q,qr); +qINV = [q(:,1) q(:,2).*-1 q(:,3).*-1 q(:,4).*-1]; + +% RIPERCORRE AL CONTRARIO LA ROTAZIONE IMPOSTA PER EVITARE LA SINGOLARITA' +q = quatmultiply(q,qalpha); +Q0 = q(1); +Q1 = q(2); +Q2 = q(3); +Q3 = q(4); + +% CALCOLO GLI ANGOLI DAI QUATERNIONI +roll = atan2(2*(Q0*Q1+Q2*Q3),(1-2*(Q1^2+Q2^2))); +becc = asin(2*(Q0*Q2-Q3*Q1)); +imba = atan2(2*(Q0*Q3+Q1*Q2),(1-2*(Q2^2+Q3^2))); + +% Calcolo degli spostamenti relativi al nodo +qVett = [0 0 0 SP]; +qVettR = quatmultiply(q,qVett); +qVettR = quatmultiply(qVettR,qINV); + +DNS = qVettR(2); +DEO = qVettR(3); +Dz = qVettR(4); + +end \ No newline at end of file diff --git a/Tilt/Report_ASE.m b/Tilt/Report_ASE.m new file mode 100755 index 0000000..15c9355 --- /dev/null +++ b/Tilt/Report_ASE.m @@ -0,0 +1,249 @@ +function Report_ASE(IDcentralina,unitID,chainID,alarms,Chain_Scheme,num_nodi,... + Users_Report,Mail,time,activeEN,siteID,conn,FileName) +% Software per la generazione automatica di report sull'attività di +% monitoraggio ASE + +% try + +diary on +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_ASE function started'; +fprintf(fileID,fmt,text); +fclose(fileID); + +RPT_ON = 0; % parametro che regola la creazione o meno del report +NomeFile = strcat('Report',siteID,'.txt'); +meseadesso = str2double(datestr(today,'mm')); +if isfile(NomeFile) == 1 % Esiste + + % Scarico la frequenza del report + comando = ['select freq_report from sites where id like ''' siteID ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Freq = cell2mat(curs.Data); + numgiorni = Freq; + + Filetesto = importdata(NomeFile); + [rTXT,~] = size(Filetesto); + if rTXT > 1 + datainvio = Filetesto(1,1); % mese di invio OPPURE data di ultimo invio + attivaReport = Filetesto(2,1); + else % file txt vuoto + if numgiorni == 30 + datainvio = str2double(datestr(today,'mm'))+1; % mese successivo + else + datainvio = now; + end + attivaReport = 1; % report disattivato + end + + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = ['Report frequency:' num2str(numgiorni) ' days']; + fprintf(fileID,fmt,text); + fclose(fileID); + + if numgiorni == 30 + adesso = str2double(datestr(today,'mm')); + if datainvio == adesso + RPT_ON = 1; + end + else + adesso = now; + if adesso >= datainvio + numgiorni + RPT_ON = 1; + end + end + + if RPT_ON == 1 && attivaReport == 0 + try + attivaReport = 1; + outdat = fopen(NomeFile,'wt+'); + fopen(NomeFile,'wt'); + fmt = '%d \r'; + fileID = fopen(NomeFile,'a'); + fprintf(fileID,fmt,meseadesso); + fprintf(fileID,fmt,attivaReport); + fclose(fileID); + + % salvo variabili da caricare in Report + nomevar = ['variabili_RPT' siteID '.mat']; + save(nomevar, 'unitID', 'chainID', 'alarms', 'Chain_Scheme', 'num_nodi', 'Users_Report', 'Mail', ... + 'time', 'meseadesso', 'adesso', 'datainvio', 'numgiorni', 'activeEN', 'FileName'); + + rilancio = ['/usr/local/matlab_func/run_Report_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 '... + siteID '']; + + status = system(rilancio); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,status); + catch err + FileErr = ['ErrorFile-Report-' siteID '-' datestr(today) '-' datestr(now,'hhMMss')]; + fid = fopen(FileErr,'a+'); + fprintf(fid, '%s', err.getReport('extended','hyperlinks','off')); + fclose(fid); + + %% 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 + + % Uso il siteID per identificare il nome del sito + comando = ['select name from sites where id like ''' siteID ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + NomeSito = num2str(cell2mat(curs.Data)); + + subject_ITA = ('CRASH funzione Report'); + testo = cellstr('Ciao Andrea e Alessandro,'); + testobis = cellstr(''); + testo2 = cellstr(['Il mostro biblico della funzione Report ha al proprio interno qualche minchiata '... + 'per cui il SW crasha nel realizzare il report di ' NomeSito '. Vi prego di correggermi '... + 'o continuer' char(243) ' a crashare e ad assillarvi con questa mail. BUAHAHAH! Troverete l''errore in allegato.']); + message_ITA = [testo; testobis; testo2]; + message = cellstr('Tanti Blip e Blop a voi, '); + message2 = cellstr('Software Tilt'); + message_ITA = [message_ITA; message; message2]; + + recipients_ASE{1,1} = 'alessandro.valletta@aseltd.eu'; + recipients_ASE{2,1} = 'andrea.carri@aseltd.eu'; + + allegato = FileErr; + + sendmail(recipients_ASE, subject_ITA, message_ITA, allegato) + + end + end +else + datainvio = meseadesso+1; + if datainvio > 12 + datainvio = datainvio-12; + end +end +%% --- Modifica file di testo --- %%% +if numgiorni == 30 + if datainvio == 12 + nuovofile = 1; + elseif datainvio == 13 + nuovofile = 13; + else + nuovofile = adesso+1; + end +else + nuovofile = datainvio + numgiorni; +end +attivaReport = 0; +outdat = fopen(NomeFile,'wt+'); +fopen(NomeFile,'wt'); +fmt = '%d \r'; +fileID = fopen(NomeFile,'a'); +fprintf(fileID,fmt,nuovofile); +fprintf(fileID,fmt,attivaReport); +fclose(fileID); + +% catch err +% FileErr = ['ErrorFile-' IDcentralina '-' datestr(today) '-' datestr(now,'hhMMss') '.txt']; +% fid = fopen(FileErr,'a+'); +% fprintf(fid, '%s', err.getReport('extended','hyperlinks','off')); +% fclose(fid); +% +% % Scarico la frequenza del report +% comando = ['select freq_report from sites where id like ''' siteID ''' ']; +% curs = exec(conn,comando); +% curs = fetch(curs); +% Freq = cell2mat(curs.Data); +% numgiorni = Freq; +% meseadesso = str2double(datestr(today,'mm')); +% +% NomeFile = strcat('Report',siteID,'.txt'); +% +% if isfile(NomeFile) == 1 % Esiste +% Filetesto = importdata(NomeFile); +% [rTXT,~] = size(Filetesto); +% if rTXT >1 +% datainvio = Filetesto(1,1); % mese di invio OPPURE data di ultimo invio +% else % file txt vuoto +% if numgiorni == 30 +% datainvio = meseadesso; +% else +% datainvio = now; +% end +% end +% else +% datainvio = meseadesso+1; +% if datainvio > 12 +% datainvio = datainvio-12; +% end +% end +% +% attivaReport = 0; +% outdat = fopen(NomeFile,'wt+'); +% fopen(NomeFile,'wt'); +% fmt = '%d \r'; +% fileID = fopen(NomeFile,'a'); +% if numgiorni == 30 +% if datainvio == 12 +% nuovofile = 12; +% elseif datainvio == 13 +% nuovofile = 13; +% else +% nuovofile = meseadesso; +% end +% else +% nuovofile = datainvio; +% end +% fprintf(fileID,fmt,nuovofile); +% fprintf(fileID,fmt,attivaReport); +% fclose(fileID); +% +% %% 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 +% +% % Uso il siteID per identificare il nome del sito +% comando = ['select name from sites where id like ''' siteID ''' ']; +% curs = exec(conn,comando); +% curs = fetch(curs); +% NomeSito = num2str(cell2mat(curs.Data)); +% +% subject_ITA = (['CRASH del Report Automatico - ' NomeSito '']); +% testo = cellstr('Ciao Andrea e Alessandro,'); +% testobis = cellstr(''); +% testo2 = cellstr(['Nella funzione del report avete scritto qualche minchiata per cui crasha. Vi prego di correggermi '... +% 'o continuer' char(243) ' a crashare e ad assillarvi con questa mail. Troverete l''errore in allegato.']); +% message_ITA = [testo; testobis; testo2]; +% message = cellstr('Tanti Bip e Bop a te, '); +% message2 = cellstr('Software Tilt'); +% message_ITA = [message_ITA; message; message2]; +% +% recipients_ASE{1,1} = 'alessandro.valletta@aseltd.eu'; +% recipients_ASE{2,1} = 'andrea.carri@aseltd.eu'; +% +% allegato = FileErr; +% +% sendmail(recipients_ASE, subject_ITA, message_ITA, allegato) + +% end + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_ASE function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +diary off + +end \ No newline at end of file diff --git a/Tilt/Report_ASE_bckUp.m b/Tilt/Report_ASE_bckUp.m new file mode 100755 index 0000000..9700343 --- /dev/null +++ b/Tilt/Report_ASE_bckUp.m @@ -0,0 +1,932 @@ +function Report_ASE_LOC(IDcentralina,siteID,unitID,chainID,Chain_Scheme,num_nodi,... + alarms,Mail,Users_Report,activeEN,time,conn,FileName) +% Software per la generazione automatica di report sull'attività di +% monitoraggio ASE + +try + + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'report_ASE function started'; + fprintf(fileID,fmt,text); + fclose(fileID); + + RPT_ON = 0; % parametro che regola la creazione o meno del report + NomeFile = strcat('Report',siteID,'.txt'); + meseadesso = str2double(datestr(today,'mm')); + if isfile(NomeFile) == 1 % Esiste + Filetesto = importdata(NomeFile); + datainvio = Filetesto(1,1); % mese di invio OPPURE data di ultimo invio + attivaReport = Filetesto(2,1); + + % Scarico la frequenza del report + comando = ['select freq_report from sites where id like ''' siteID ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Freq = cell2mat(curs.Data); + numgiorni = Freq; + + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = ['Report frequency:' num2str(numgiorni) ' days']; + fprintf(fileID,fmt,text); + fclose(fileID); + + if numgiorni == 30 + adesso = str2double(datestr(today,'mm')); + if datainvio == adesso + RPT_ON = 1; + end + else + adesso = now; + if adesso >= datainvio + numgiorni + RPT_ON = 1; + end + end + + if RPT_ON == 1 + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'Report creation started'; + fprintf(fileID,fmt,text); + fclose(fileID); + if attivaReport == 0 + attivaReport = 1; + outdat = fopen(NomeFile,'wt+'); + fopen(NomeFile,'wt'); + fmt = '%d \r'; + fileID = fopen(NomeFile,'a'); + fprintf(fileID,fmt,meseadesso); + fprintf(fileID,fmt,attivaReport); + fclose(fileID); + + recipients_ASE{1,1} = 'alessandro.valletta@aseltd.eu'; + recipients_ASE{2,1} = 'andrea.carri@aseltd.eu'; + recipients_ASE{3,1} = 'roberto.savi@aseltd.eu'; + Mail_ASE = 1; + + if Mail_ASE == 1 || Mail == 1 + + % Importo librerie Matlab Report Generator e creo report + import mlreportgen.dom.* + import mlreportgen.report.* + + FIG = 1; % Contatore Figure + FIG_ENG = 1; + NomeReport = (['Report_ASE_' siteID]); + rpt = Report(NomeReport, 'pdf'); % Crea report + NomeReport_ENG = (['Report_ASE_' siteID '_ENG']); + rpt_ENG = Report(NomeReport_ENG, 'pdf'); % Crea report + Section.number(rpt,false); % elimina numerazione capitoli + Section.number(rpt_ENG,false); % elimina numerazione capitoli + Font_caption = '8.5pt'; + Font_table = '9pt'; + Font_table_Loc = '8pt'; + Font_section = '14pt'; + Font_tools = '12pt'; + Font_Chapter = '16pt'; + + %% Ricavo info sul sito + + % Uso il siteID per identificare il nome del sito + comando = ['select name from sites where id like ''' siteID ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + NomeSito = num2str(cell2mat(curs.Data)); + + [arraysito,arraysitoENG,controlsito,yesTL,yesTLHR,yesTLH,yesTLHRH,yesPL,yesBL,yesLL,... + yesRL,yesKL,yesKLHR,yesThL,yesPT100,yesIPL,yesIPLHR,yesTuL,yesRaL,yesPCL,yesPCLHR,... + yesPrL,yesEL,yes3DEL,yesWEL,yesMPBEL,yesCrL,yes3DCrL,yesBML,yesHL,... + yesLuxL,yesCO2,yesRSN,yesRSNHR,yesTrL,yesSM,yes2DCrL,yesPE,yesWL,yesGF,yesGS,... + rTL,rTLHR,rTLH,rTLHRH,rPL,rBL,rLL,rRL,rKL,rKLHR,rThL,rPT100,rIPL,rIPLHR,rTuL,rRaL,... + rPCL,rPCLHR,rPrL,rEL,r3DEL,rWEL,rMPBEL,rCrL,r3DCrL,rBML,rHL,rLuxL,rCO2,rRSN,rRSNHR,... + rTrL,rSM,r2DCrL,rPE,rWL,rGF,rGS,nCT,... + NodoTiltLink,NodoTiltLinkHR,NodoTiltLinkH,NodoTiltLinkHRH,NodoPiezoLink,NodoBaroLink,... + NodoLoadLink,NodoRainLink,NodoKlinoLink,NodoKlinoLinkHR,NodoThermLink,NodoPT100Link,... + NodoInPlaceLink,NodoInPlaceLinkHR,NodoTunnelLink,NodoRadialLink,NodoPreConvLink,... + NodoPreConvLinkHR,NodoPressureLink,NodoExtensometerLink,Nodo3DExtensometerLink,... + NodoWireExtensometerLink,NodoMultiPointExtensometerLink,NodoCrackLink,Nodo3DCrackLink,... + NodoBaroMusaLink,NodoHumidityLink,NodoLuxLink,NodoCO2Link,NodoRSNLink,NodoRSNHRLink,... + NodoTriggerLink,NodoStressMeter,Nodo2DCrackLink,NodoPendulum,NodoWeirLink,NodoGflowLink,... + NodoGshockLink,tipoarray,tipoalarms,nVMS,nTL,nCAM,nAL] = info_Sito(chainID,alarms,... + Chain_Scheme,conn,num_nodi,FileName); + + info_sito = [chainID(:,2) chainID(:,4)]; + + %% Pagina titolo ITA + template_cover(rpt); + tp = TitlePage; + Titolo = Paragraph(['Report di monitoraggio del sito: ' NomeSito]); + Titolo.Style = {HAlign('center'),Bold(1), FontSize('32pt'),OuterMargin('0in','0in','3in','0.2in')}; + tp.Title = (Titolo); + sottotitolo = Paragraph('Report automatico - Versione Beta Test'); + sottotitolo.Style = {FontSize('12pt'),Bold(1),HAlign('center')}; + tp.Subtitle = sottotitolo; + tp.Author = ' '; + datapub = Paragraph(datestr(today,'dd-mm-yyyy')); + datapub.Style = {FontSize('12pt'),HAlign('center')}; + tp.PubDate = datapub; + add(rpt,tp); + + if activeEN == 1 + %% Pagina titolo ENG + template_cover(rpt_ENG); + tp_ENG = TitlePage; + Titolo = Paragraph('Monitoring activity report '); + Titolo.Style = {HAlign('center'),Bold(1), FontSize('32pt'),OuterMargin('0in','0in','3in','0in')}; + tp_ENG.Title = (Titolo); + sottotitolo = Paragraph(NomeSito); + sottotitolo.Style = {HAlign('center'),Bold(1), FontSize('32pt'),OuterMargin('0in','0in','0in','0.2in')}; + tp_ENG.Subtitle = sottotitolo; + report = Paragraph('Automatic report - Alpha test version'); + report.Style = {FontSize('12pt'),Bold(1),HAlign('center'),OuterMargin('0in','0in','0.4in','0.2in')}; + tp_ENG.Author = report; + datapub = Paragraph(datestr(today,'dd-mm-yyyy')); + datapub.Style = {FontSize('12pt'),HAlign('center')}; + tp_ENG.PubDate = datapub; + add(rpt_ENG,tp_ENG); + end + + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'Title page created'; + fprintf(fileID,fmt,text); + + %% Pagina sommario + % Add a default table of contents object to the report + template(rpt); + TOC = TableOfContents(); + TOC.Layout.PageNumberFormat = 'I'; + add(rpt,TOC); + if activeEN == 1 + template(rpt_ENG); + TOC_ENG = TableOfContents(); + TOC_ENG.Layout.PageNumberFormat = 'I'; + add(rpt_ENG,TOC_ENG); + end + text = 'Summary page created'; + fprintf(fileID,fmt,text); + + %% Disclaimer iniziale + disclaimer = Chapter; + dis = Heading1('Disclaimer'); + dis.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + disclaimer.Title = dis; + text = Paragraph(['Il presente report ' char(232) ' un documento generato automaticamente '... + 'dal software proprietario sviluppato da ASE S.r.l. Il suo obiettivo ' char(232) ' quello '... + 'di riassumere i principali risultati ottenuti dalla strumentazione installata '... + 'in un determinato sito del cliente, nel corso di un periodo temporale di riferimento. '... + 'Il report riporta le principali informazioni relative al sito monitorato: queste includono '... + 'numero e tipologia degli Array presenti, data di installazione, data di riferimento '... + 'per i calcoli successivi, principali caratteristiche dei sensori utilizzati, etc. ']); + text2 = Paragraph(['Il report viene creato automaticamente il primo giorno di ogni mese e '... + 'contiene i dati di monitoraggio elaborati a partire dal mese precedente (o dal mese '... + 'della redazione dell''ultimo report, nel caso di Array inattivo), fornendo una panoramica generale '... + 'del livello di attivit' char(224) ' del sito durante il periodo temporale di riferimento. '... + 'Inoltre, nel caso in cui gli strumenti lo consentano, sono riportati grafici che '... + 'integrano i dati raccolti da diverse tipologie di sensori, con l''obiettivo di '... + 'evidenziare eventuali correlazioni tra le grandezze monitorate.']); + Link = Paragraph(ExternalLink('https://www2.aseltd.eu','cliccando qui.')); + text3 = Paragraph(['Si vuole sottolineare che questo documento ' char(232) ' generato completamente in automatico '... + 'e non contiene pertanto alcuna valutazione o validazione di carattere tecnico '... + 'relativamente ai risultati ottenuti dalla strumentazione installata. '... + 'Si ricorda inoltre che quanto riportato nel report ' char(232) ' inteso come un riassunto dei risultati '... + 'dell''attivit' char(224) ' di monitoraggio. Per la consultazione completa di tutti i dati '... + 'relativi al sito in esame, ' char(232) ' possibile accedere con le proprie credenziali '... + 'alla piattaforma interattiva web-based']); + text4 = Paragraph('ASE - Advanced Slope Engineering S.r.l.'); + text5 = Paragraph('Via Robert Koch 53/A, 43123 Fraz. Pilastrello, Parma - Italy'); + text6 = Paragraph('Tel: +39 0521 1404292'); + text7 = Paragraph('REA n. 258983 - Cod Fis. e P.IVA 02687890349'); + text8 = Paragraph('info@aseltd.eu - www.aseltd.eu'); + text.HAlign = 'justify'; + text2.HAlign = 'justify'; + text3.HAlign = 'justify'; + text4.Style = {Bold(1),HAlign('left')}; + text5.Style = {HAlign('left'),OuterMargin('0in','0in','0in','0in'),FontSize('8pt')}; + text6.Style = {HAlign('left'),OuterMargin('0in','0in','0in','0in'),FontSize('8pt')}; + text7.Style = {HAlign('left'),OuterMargin('0in','0in','0in','0in'),FontSize('8pt')}; + text8.Style = {HAlign('left'),OuterMargin('0in','0in','0in','0in'),FontSize('8pt')}; + + logo = Image('aselogo.jpeg'); + logo.Style = {Height('9cm'),HAlign('left')}; + + add(disclaimer,text); + add(disclaimer,text2); + add(disclaimer,text3); + Link.Style = {OuterMargin('0in','0in','0in','0in')}; + add(disclaimer,Link); + add(disclaimer,logo); + add(disclaimer,text4); + add(disclaimer,text5); + add(disclaimer,text6); + add(disclaimer,text7); + add(disclaimer,text8); + br = PageBreak(); + add(disclaimer,br); + add(rpt,disclaimer); + + if activeEN == 1 + disclaimer_ENG = Chapter; + dis_ENG = Heading1('Disclaimer'); + dis_ENG.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + disclaimer_ENG.Title = dis_ENG; + % Disclaimer ENG + text = Paragraph(['This report consists of a document automatically generated by ASE proprietary software. Its objective is '... + 'to summarize the main monitoring results recorded during a specific time interval by the instrumentation installed on-site. Moreover, '... + 'this document presents all the key information concerning the monitored site, including Arrays number and typology, installation date, '... + 'reference date, installed sensors features, etc. The report is generated automatically on the first day of each month, and it contains '... + 'monitoring data elaborated from the beginning of the previous month, in order to provide a general overview of the site activity '... + 'during the reference time period. For specific typologies of sensors, the report also includes graphs composed of different physical quantities, '... + 'in order to highlight any correlation between data sampled by these sensors.']); + Link = Paragraph(ExternalLink('https://www2.aseltd.eu','this link.')); + text2 = Paragraph(['We would like to remind that the report generation is completely automated, therefore it does not contain '... + 'any technical evaluation or validation concerning the results obtained by the instrumentation installed on-site. '... + 'Moreover, the report is intended as a resume of the main outcomes resulting from the monitoring activity. The user can access complete datasets '... + 'and information concerning the monitored site by logging into the interactive web-based platform developed by ASE S.r.l., available at']); + text7 = Paragraph('REA n. 258983 - VAT ID 02687890349'); + text.HAlign = 'justify'; + text2.HAlign = 'justify'; + text7.Style = {HAlign('left'),OuterMargin('0in','0in','0in','0in'),FontSize('8pt')}; + + add(disclaimer_ENG,text); + add(disclaimer_ENG,text2); + Link.Style = {OuterMargin('0in','0in','0in','0in')}; + add(disclaimer_ENG,Link); + add(disclaimer_ENG,logo); + add(disclaimer_ENG,text4); + add(disclaimer_ENG,text5); + add(disclaimer_ENG,text6); + add(disclaimer_ENG,text7); + add(disclaimer_ENG,text8); + br = PageBreak(); + add(disclaimer_ENG,br); + add(rpt_ENG,disclaimer_ENG); + end + + text = 'Disclaimer page created'; + fprintf(fileID,fmt,text); + fileID = fopen(FileName,'a'); + + %% Capitolo 1 - sistema MUMS + sys = Chapter; + app = Heading1('Sistema MUMS'); + app.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + sys.Title = app; + testo = Paragraph(['Il monitoraggio ' char(232) ' svolto mediante sistema MUMS '... + '(Modular Underground Monitoring System), progettato per il controllo multiparametrico dei movimenti '... + 'orizzontali o verticali del terreno, delle deformazioni di strutture civili '... + 'e/o geotecniche, di barriere paramassi o debris flow. In ogni nodo possono essere collocati sensori per monitorare '... + 'grandezze fisiche di varia natura come spostamenti, inclinazioni, pressione interstiziale, temperatura, etc.']); + testo2 = Paragraph(['In particolare, il sito ' char(232) ' caratterizzato dalla presenza di ' arraysito ' e relativo sistema'... + ' di acquisizione automatico, completato da batteria tampone ed adeguato sistema di ricarica.']); + if controlsito ~= 0 + [rTA,~] = size(tipoalarms); + aVMS = 0; + aCAM = 0; + aAL = 0; + aTL = 0; + for mm = 1:rTA + if strcmp(char(tipoalarms(mm)),'Variable Message System') + aVMS = 1; + elseif strcmp(char(tipoalarms(mm)),'Traffic Lights') + aCAM = 1; + elseif strcmp(char(tipoalarms(mm)),'Alarms') + aAL = 1; + elseif strcmp(char(tipoalarms(mm)),'Camera') + aCAM = 1; + end + end + testo2prep = []; + spazio = ''; + if aAL > 0 + if nAL == 1 + testo2prep = [num2str(nAL) ' allarme acustico-visivo']; + else + testo2prep = [num2str(nAL) ' allarmi acustico-visivi']; + end + spazio = ', '; + end + if aTL > 0 + if nTL == 1 + testo2prep = [testo2prep spazio num2str(nTL) ' impianto semaforico']; + else + testo2prep = [testo2prep spazio num2str(nTL) ' impianti semaforici']; + end + spazio = ', '; + end + if aVMS > 0 + if nVMS == 1 + testo2prep = [testo2prep spazio num2str(nVMS) ' pannello a messaggio variabile']; + else + testo2prep = [testo2prep spazio num2str(nVMS) ' pannelli a messaggio variabile']; + end + spazio = ', '; + end + if aCAM > 0 + if nCAM == 1 + testo2prep = [testo2prep spazio num2str(nCAM) ' videocamera']; + else + testo2prep = [testo2prep spazio num2str(nCAM) ' videocamere']; + end + end + testo2bis = Paragraph(['Il sistema inoltre include un dispositivo di allertamento composto da ' testo2prep '.']); + else + testo2bis = []; + end + testo3 = Paragraph(['I dati grezzi (punti elettrici) sono salvati su apposito supporto' ... + ' di memoria locale (scheda SD) ed inviati al centro di elaborazione secondo la frequenza impostata. '... + 'Una volta ricevute le informazioni, il dato viene salvato su un Database con backup giornaliero automatico, '... + 'elaborato mediante software con algoritmi proprietari e reso disponibile su piattaforma web ad accesso '... + 'controllato in pochi secondi.']); + testo4 = Paragraph(['Il funzionamento completo del sisema MUMS ' char(232) ' schematizzato nella figura seguente.']); + ionh = Image(('ionh.png')); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + testo3.HAlign = 'justify'; + testo4.HAlign = 'justify'; + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + testo3.HAlign = 'justify'; + testo4.HAlign = 'justify'; + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Struttura del sistema di monitoraggio']); + FIG = FIG + 1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + ionh.Style = {Height('8cm'),HAlign('center')}; + add(sys,testo); + add(sys,testo2); + if controlsito ~= 0 + add(sys,testo2bis); + end + add(sys,testo3); + add(sys,testo4); + add(sys,ionh); + add(sys,ionhcaption); + add(rpt,sys); + template(rpt); + + if activeEN == 1 + sys_ENG = Chapter; + app_ENG = Heading1('MUMS System'); + app_ENG.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + sys_ENG.Title = app_ENG; + testo = Paragraph(['The monitoring activity is performed with MUMS '... + '(Modular Underground Monitoring System) technology, specifically developed for the '... + 'multi-parametric monitoring of slopes, civil and/or geotechnical structures, rockfall and '... + 'debris flow barriers. Each node of the Array can equip sensors able to measure different '... + 'physical quantities like displacements, tilts, pressure, temperatures, etc.']); + testo2 = Paragraph(['In particular, the monitoring system installed on-site includes ' arraysitoENG... + ', the automatic data acquisition '... + 'system and a battery, with dedicated recharge apparatus.']); + if controlsito ~= 0 + testo2prep = []; + spazio = ''; + if aAL > 0 + if aAL == 1 + testo2prep = [num2str(nAL) ' visual-acoustic alarm']; + else + testo2prep = [num2str(nAL) ' visual-acoustic alarms']; + end + spazio = ', '; + end + if aTL > 0 + if aTL == 1 + testo2prep = [testo2prep spazio num2str(nTL) ' traffic light']; + else + testo2prep = [testo2prep spazio num2str(nTL) ' traffic lights']; + end + spazio = ', '; + end + if aVMS > 0 + if aVMS == 1 + testo2prep = [testo2prep spazio num2str(nVMS) ' variable message panel (VMP)']; + else + testo2prep = [testo2prep spazio num2str(nVMS) ' variable message panels (VMPs)']; + end + spazio = ', '; + end + if aCAM > 0 + if aCAM == 1 + testo2prep = [testo2prep spazio num2str(nCAM) ' camera']; + else + testo2prep = [testo2prep spazio num2str(nCAM) ' cameras']; + end + end + testo2bis = Paragraph(['Moreover, the following devices are included for early warning purposes: ' testo2prep '.']); + end + testo3 = Paragraph(['The datalogger saves raw data (electrical signals) on a volatile memory (SD card) and then transmits them '... + 'to the elaboration centre, according to a predefined frequency. Upon arrival on central server, a proprietary '... + 'software routine automatically elaborates raw data and converts them into physical units. '... + 'Results are stored in a "parallel" database from which they can be accessed and analysed '... + 'thanks to a dedicated web-based platform with private access.']); + testo4 = Paragraph('The following image describes the structure of the MUMS-based system.'); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + testo3.HAlign = 'justify'; + testo4.HAlign = 'justify'; + ionhcaption = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Structure of the monitoring system']); + FIG_ENG = FIG_ENG + 1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + ionh.Style = {Height('9cm'),HAlign('center')}; + add(sys_ENG,testo); + add(sys_ENG,testo2); + if controlsito ~= 0 + add(sys_ENG,testo2bis); + end + add(sys_ENG,testo3); + add(sys_ENG,testo4); + add(sys_ENG,ionh); + add(sys_ENG,ionhcaption); + add(rpt_ENG,sys_ENG); + template(rpt_ENG); + end + + text = 'MUMS system defined'; + fprintf(fileID,fmt,text); + fileID = fopen(FileName,'a'); + fclose(fileID); + + %% Capitolo 2 - Geografia e composizione + geoloc = Chapter; + app = Heading1('Caratteristiche del sito'); + app.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + geoloc.Title = app; + + testo = Paragraph(['Le principali caratteristiche della strumentazione installata nel sito '... + 'in esame sono riportate nella seguente tabella. Le figure sottostanti presentano la localizzazione '... + 'geografica degli Array e del relativo sistema di acquisizione (immagini '... + 'tratte da Mappe di Bing).']); + + comando = ['select lat, lon from sites where id like ''' siteID ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Coordinate = (cell2mat(curs.Data))'; + latNS = 'N'; + lonEO = 'E'; + if Coordinate(1) < 0 + latNS = 'S'; + end + if Coordinate(2) < 0 + lonEO = 'O'; + end + testo.HAlign = 'justify'; + + testo2 = Paragraph(['In particolare, il sito in esame si trova '... + 'alle seguenti coordinate geografiche: Latitudine ' num2str(abs(Coordinate(1))) ... + ' ' latNS ', Longitudine ' num2str(abs(Coordinate(2,:))) ' ' lonEO '.']); + testo2.HAlign = 'justify'; + + %--- IMMAGINI GEOGRAFICHE ---% + mapsito = ['sito' siteID '.png']; + geo = Image((mapsito)); + geo.Style = [geo.Style {ScaleToFit}]; + geo_cap = Paragraph(['Fig. ' num2str(FIG) ' - Localizzazione geografica della strumentazione installata e del sistema di acquisizione dati']); + FIG = FIG+1; + geo_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + mapcatene = ['sito' siteID 'det.png']; + sito = Image((mapcatene)); + sito.Style = [sito.Style {ScaleToFit}]; + sito_cap = Paragraph(['Fig. ' num2str(FIG) ' - Posizione in sito delle centraline e degli strumenti installati']); + FIG = FIG+1; + sito_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + %--- TABELLA SITO MONITORATO ---% + Font_Loc = 0; + [Font_Loc,status,firstdata_num,datasample,colonna1,colonna2,colonna2bis,colonna3,... + colonna4,colonna5,colonna6,colonna6_short,colonna7,yesKLHR3D,c1trigger,c6trigger,cA] = ... + report_table(Font_Loc,info_sito,controlsito,tipoarray,tipoalarms,alarms,chainID,Chain_Scheme,... + yesTL,yesTLHR,yesTLH,yesTLHRH,yesPL,yesBL,yesLL,yesRL,yesKL,yesKLHR,yesThL,... + yesPT100,yesIPL,yesIPLHR,yesTuL,yesRaL,yesPCL,yesPCLHR,yesPrL,yesEL,yes3DEL,... + yesWEL,yesMPBEL,yesCrL,yes3DCrL,yesBML,yesHL,yesLuxL,yesCO2,yesRSN,yesRSNHR,yesTrL,... + yesPE,yesWL,yes2DCrL,yesGF,yesGS,rTL,rTLHR,rTLH,rTLHRH,rKL,rKLHR,rIPL,rIPLHR,nCT,... + num_nodi,time,conn,FileName) ; + + % Controllo che Colonna 5 (lunghezza Array) abbia dei dati, + % altrimenti la elimino + [rC5,~] = size(colonna5); + C5 = 0; + for c = 2:rC5 + if strcmp(char(colonna5(c)),'-') == 0 % Esiste almeno un valore di lunghezza + C5 = 1; + break + end + end + + if C5 == 1 + tab = FormalTable([colonna1,colonna2,colonna2bis,colonna3,colonna4,colonna5,colonna6_short,colonna7]); + else + tab = FormalTable([colonna1,colonna2,colonna2bis,colonna3,colonna4,colonna6,colonna7]); + end + + % formattazione tabella + if Font_Loc == 1 + tab.TableEntriesStyle = {HAlign('center'),VAlign('middle'),FontSize(Font_table_Loc),InnerMargin('0.5mm')}; + else + tab.TableEntriesStyle = {HAlign('center'),VAlign('middle'),FontSize(Font_table),InnerMargin('0.5mm')}; + end + tab.Style = {ResizeToFitContents(true),Width("100%"),RowSep('solid','black','1px'),... + ColSep('solid','black','1px'),Hyphenation(false),BackgroundColor('#E0F1FF')}; + tab.Border = 'single'; + tabCaption = Paragraph('Tab. 1 - Tipologia e caratteristiche della strumentazione installata in sito'); + tabCaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + bodyFirstRow = tab.Body.Children(1); + bodyFirstRow.Style = [bodyFirstRow.Style {Bold()}]; + if C5 == 0 + grps(1) = TableColSpecGroup; + grps(1).Span = 7; + specs(1) = TableColSpec; + specs(1).Span = 1; + specs(1).Style = {Width("7.5%")}; + specs(2) = TableColSpec; + specs(2).Span = 3; + specs(2).Style = {Width("15%")}; + specs(3) = TableColSpec; + specs(3).Span = 1; + specs(3).Style = {Width("10%")}; + specs(4) = TableColSpec; + specs(4).Span = 1; + specs(5) = TableColSpec; + specs(5).Span = 1; + specs(5).Style = {Width("12%")}; + grps(1).ColSpecs = specs; + tab.ColSpecGroups = grps; + end + + % Installazione + testo3 = Paragraph(['La prima lettura disponibile, riportata in Tab. 1, si riferisce '... + 'alla data di inizio monitoraggio. Va sottolineato come i primissimi dati '... + 'rilevati da uno strumento possano essere influenzati dagli assestamenti occorsi in '... + 'seguito all''installazione o dall''adattamento del sensore in sito. Per questo motivo '... + 'viene definita la lettura di riferimento come data in cui i dati raccolti non mostrano '... + 'pi' char(249) ' i caratteri tipici dell''adattamento strumentale in sito (per maggiori informazioni '... + 'consigliamo di fare riferimento agli standard ISO 18674-1:2015).']); + testo3.HAlign = 'justify'; + + add(geoloc,testo); + add(geoloc,testo2); + add(geoloc,testo3); + add(geoloc,tabCaption); + add(geoloc,tab); + add(geoloc,br); + add(geoloc,geo); + add(geoloc,geo_cap); + add(geoloc,sito); + add(geoloc,sito_cap); + add(rpt,geoloc); + template(rpt); + + if activeEN == 1 + geoloc_ENG = Chapter; + app_ENG = Heading1('Site features'); + app_ENG.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + geoloc_ENG.Title = app_ENG; + + testo = Paragraph(['The table reported below summarizes the main characteristics of the instrumentation installed on-site. '... + 'Moreover, following images display the geographical position of the monitoring system, including the location of Arrays '... + 'and acquisition devices (source: Bing Maps).']); + + if Coordinate(2) < 0 + lonEO = 'W'; + end + testo.HAlign = 'justify'; + + testo2 = Paragraph(['Geographical coordinates of the monitored site are: '... + 'Latitude ' num2str(abs(Coordinate(1))) ... + ' ' latNS ', Longitude ' num2str(abs(Coordinate(2,:))) ' ' lonEO '.']); + testo2.HAlign = 'justify'; + + %--- IMMAGINI GEOGRAFICHE ---% + geo_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Geographical position of the monitored site']); + FIG_ENG = FIG_ENG+1; + geo_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + sito_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - On-site location of monitoring devices']); + FIG_ENG = FIG_ENG+1; + sito_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + %--- TABELLA SITO MONITORATO ---% + [status,firstdata_num,datasample,colonna1,colonna2,colonna2bis,colonna3,... + colonna4,colonna5,colonna6,colonna6_short,colonna7,yesKLHR3D,c1trigger,c6trigger,cA]... + = report_table_ENG(info_sito,controlsito,tipoarray,tipoalarms,alarms,chainID,Chain_Scheme,... + yesTL,yesTLHR,yesTLH,yesTLHRH,yesPL,yesBL,yesLL,yesRL,yesKL,yesKLHR,yesThL,... + yesPT100,yesIPL,yesIPLHR,yesTuL,yesRaL,yesPCL,yesPCLHR,yesPrL,yesEL,yes3DEL,... + yesWEL,yesMPBEL,yesCrL,yes3DCrL,yesBML,yesHL,yesLuxL,yesCO2,yesRSN,yesRSNHR,yesTrL,... + yesPE,yesWL,yes2DCrL,yesGF,yesGS,rTL,rTLHR,rTLH,rTLHRH,rKL,rKLHR,rIPL,rIPLHR,nCT,... + num_nodi,time,conn,FileName); + + % Controllo che Colonna 5 (lunghezza Array) abbia dei dati, + % altrimenti la elimino + [rC5,~] = size(colonna5); + C5 = 0; + for c = 2:rC5 + if strcmp(char(colonna5(c)),'-') == 0 % Esiste almeno un valore di lunghezza + C5 = 1; + break + end + end + + if C5 == 1 + tab = FormalTable([colonna1,colonna2,colonna2bis,colonna3,colonna4,colonna5,colonna6_short,colonna7]); + else + tab = FormalTable([colonna1,colonna2,colonna2bis,colonna3,colonna4,colonna6,colonna7]); + end + + % formattazione tabella + if Font_Loc == 1 + tab.TableEntriesStyle = {HAlign('center'),VAlign('middle'),FontSize(Font_table_Loc),InnerMargin('0.5mm')}; + else + tab.TableEntriesStyle = {HAlign('center'),VAlign('middle'),FontSize(Font_table),InnerMargin('0.5mm')}; + end + tab.Style = {ResizeToFitContents(true),Width("100%"),RowSep('solid','black','1px'),... + ColSep('solid','black','1px'),Hyphenation(false),BackgroundColor('#E0F1FF')}; + tab.Border = 'single'; + tabCaption = Paragraph('Tab. 1 - Instrumentation typologies and features'); + tabCaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + bodyFirstRow = tab.Body.Children(1); + bodyFirstRow.Style = [bodyFirstRow.Style {Bold()}]; + if C5 == 0 + grps(1) = TableColSpecGroup; + grps(1).Span = 7; + specs(1) = TableColSpec; + specs(1).Span = 1; + specs(1).Style = {Width("7.5%")}; + specs(2) = TableColSpec; + specs(2).Span = 3; + specs(2).Style = {Width("15%")}; + specs(3) = TableColSpec; + specs(3).Span = 1; + specs(3).Style = {Width("10%")}; + specs(4) = TableColSpec; + specs(4).Span = 1; + specs(5) = TableColSpec; + specs(5).Span = 1; + specs(5).Style = {Width("12%")}; + grps(1).ColSpecs = specs; + tab.ColSpecGroups = grps; + end + + % Installazione + testo3 = Paragraph(['The first available reading date, reported in Tab. 1, '... + 'refers to the beginning of the monitoring activity. '... + 'It should be taken into account that the very first monitoring data '... + 'are usually influenced by stabilization phenomena, which are a '... + 'natural consequence of the tool installation on-site. For this reason, '... + 'a reference reading date is defined, representing a time reference '... + 'where the device can be considered fully operational since no more '... + 'stabilization movements are observed from sampled data '... + '(we suggest to refer to the International Standard EN ISO 18674-1:2015 '... + 'documentation for further information on this matter).']); + testo3.HAlign = 'justify'; + + add(geoloc_ENG,testo); + add(geoloc_ENG,testo2); + add(geoloc_ENG,testo3); + add(geoloc_ENG,tabCaption); + add(geoloc_ENG,tab); + add(geoloc_ENG,br); + add(geoloc_ENG,geo); + add(geoloc_ENG,geo_cap); + add(geoloc_ENG,sito); + add(geoloc_ENG,sito_cap); + add(rpt_ENG,geoloc_ENG); + template(rpt_ENG); + end + + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'Site information defined'; + fprintf(fileID,fmt,text); + fileID = fopen(FileName,'a'); + fclose(fileID); + + %% Capitolo 3 - Centraline + % --- Analisi centraline e catene --- + + datalogger = Chapter; + app = Heading1('Risultati - Dati delle centraline'); + app.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + datalogger.Title = app; + + datalogger_ENG = Chapter; + if activeEN == 1 + app_ENG = Heading1('Results - Control units'); + app_ENG.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + datalogger_ENG.Title = app_ENG; + end + + [FIG,FIG_ENG,datarif,contunit,IDscaduta] = report_CU(unitID,chainID,adesso,datainvio,numgiorni,... + datasample,tipoarray,firstdata_num,siteID,datalogger,datalogger_ENG,FIG,FIG_ENG,rpt,rpt_ENG,... + Font_caption,Font_section,activeEN,conn,FileName); + + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'Control units information defined'; + fprintf(fileID,fmt,text); + fileID = fopen(FileName,'a'); + fclose(fileID); + + %% Capitolo 4 - Catene + + MUMS = Chapter; + app = Heading1('Risultati - Dati della strumentazione installata'); + app.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter)}; + MUMS.Title = app; + + if activeEN == 1 + MUMS_ENG = Chapter; + app_ENG = Heading1('Results - Monitoring tools'); + app_ENG.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter)}; + MUMS_ENG.Title = app_ENG; + else + MUMS_ENG = []; + end + + [PL_A,PL_D,FIG,FIG_ENG] = report_AR(chainID,unitID,tipoarray,contunit,... + siteID,FIG,FIG_ENG,rpt,rpt_ENG,Font_caption,Font_Chapter,Font_section,... + Font_tools,datarif,yesKLHR3D,rTL,rTLHR,rTLH,rTLHRH,rPL,rBL,rLL,rRL,rKL,... + rKLHR,rThL,rPT100,rIPL,rIPLHR,rTuL,rRaL,rPCL,rPCLHR,rPrL,rEL,r3DEL,rWEL,rMPBEL,... + rCrL,r2DCrL,r3DCrL,rBML,rHL,rLuxL,rCO2,rRSN,rRSNHR,rTrL,rPE,rWL,rGF,rGS,... + NodoTiltLink,NodoTiltLinkH,NodoPiezoLink,NodoBaroLink,NodoLoadLink,... + NodoRainLink,NodoKlinoLink,NodoKlinoLinkHR,NodoThermLink,NodoPT100Link,... + NodoInPlaceLink,NodoInPlaceLinkHR,NodoTunnelLink,NodoRadialLink,NodoPreConvLink,... + NodoPressureLink,NodoExtensometerLink,Nodo3DExtensometerLink,... + NodoWireExtensometerLink,NodoMultiPointExtensometerLink,NodoCrackLink,... + Nodo2DCrackLink,Nodo3DCrackLink,NodoBaroMusaLink,NodoHumidityLink,NodoLuxLink,... + NodoCO2Link,NodoRSNLink,NodoRSNHRLink,NodoTriggerLink,NodoStressMeter,NodoWeirLink,... + NodoPendulum,MUMS,MUMS_ENG,colonna2,colonna2bis,colonna4,firstdata_num,activeEN,IDscaduta,... + status,br,conn,FileName); + + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'Arrays information defined'; + fprintf(fileID,fmt,text); + fileID = fopen(FileName,'a'); + fclose(fileID); + + %% Capitolo 5 - Control Tools + if cA > 1 % Significa che ci sono CT + CT = Chapter; + app = Heading1('Risultati - Attivazioni dei Control Tools'); + app.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter)}; + CT.Title = app; + + if activeEN == 1 + CT_ENG = Chapter; + app_ENG = Heading1('Results - Control Tools activations'); + app_ENG.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter)}; + CT_ENG.Title = app_ENG; + else + CT_ENG = []; + end + + [FIG,FIG_ENG] = report_CT(c1trigger,c6trigger,alarms,nCT,rpt,Font_caption,... + Font_table,Font_section,datarif,CT,CT_ENG,FIG,FIG_ENG,activeEN,conn,FileName); + + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'Control tools information defined'; + fprintf(fileID,fmt,text); + fileID = fopen(FileName,'a'); + fclose(fileID); + end + + %% Appendice + [dim,~]= size(colonna6); + appendice = Chapter; + app = Heading1('Appendice'); + app.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + appendice.Title = app; + + if activeEN == 1 + appendice_ENG = Chapter; + app_ENG = Heading1('Appendix'); + app_ENG.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + appendice_ENG.Title = app_ENG; + else + appendice_ENG = []; + end + + report_appendix(yesTL,yesIPL,yesIPLHR,yesTLH,yesPCL,yesTLHR,yesTLHRH,yesPCLHR,... + yesPL,yesBL,yesTuL,yesRaL,yesThL,yesKL,yesKLHR,yesRL,yesLL,yesPrL,yesPT100,... + yesCrL,yes3DCrL,yesEL,yes3DEL,yesWEL,yesMPBEL,yesTrL,nCAM,yesWL,yesPE,PL_A,PL_D,... + Font_section,Font_caption,Font_tools,FIG,FIG_ENG,dim,appendice,appendice_ENG,... + colonna4,colonna6,rpt,rpt_ENG,activeEN,FileName) + + % Chiudi report + close(rpt); + close(rpt_ENG); + + %% ---Email--- + [rU,cU] = size(Users_Report); + sendReportmail(NomeSito,Coordinate,meseadesso,NomeReport,NomeReport_ENG,... + Users_Report,recipients_ASE,Mail,Mail_ASE,activeEN,rU,cU,FileName); + end + end + end + else + datainvio = meseadesso+1; + if datainvio > 12 + datainvio = datainvio-12; + end + end + %% --- Modifica file di testo --- %%% + if numgiorni == 30 + if datainvio == 12 + nuovofile = 1; + elseif datainvio == 13 + nuovofile = 13; + else + nuovofile = adesso+1; + end + else + nuovofile = datainvio + numgiorni; + end + attivaReport = 0; + outdat = fopen(NomeFile,'wt+'); + fopen(NomeFile,'wt'); + fmt = '%d \r'; + fileID = fopen(NomeFile,'a'); + fprintf(fileID,fmt,nuovofile); + fprintf(fileID,fmt,attivaReport); + fclose(fileID); + +catch err + FileErr = ['ErrorFile-' IDcentralina '-' datestr(today) '-' datestr(now,'hhMMss') '.txt']; + fid = fopen(FileErr,'a+'); + fprintf(fid, '%s', err.getReport('extended','hyperlinks','off')); + fclose(fid); + + % Scarico la frequenza del report + comando = ['select freq_report from sites where id like ''' siteID ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Freq = cell2mat(curs.Data); + numgiorni = Freq; + + NomeFile = strcat('Report',siteID,'.txt'); + + if isfile(NomeFile) == 1 % Esiste + Filetesto = importdata(NomeFile); + datainvio = Filetesto(1,1); % mese di invio OPPURE data di ultimo invio + else + datainvio = meseadesso+1; + if datainvio > 12 + datainvio = datainvio-12; + end + end + + attivaReport = 0; + outdat = fopen(NomeFile,'wt+'); + fopen(NomeFile,'wt'); + fmt = '%d \r'; + fileID = fopen(NomeFile,'a'); + if numgiorni == 30 + if datainvio == 12 + nuovofile = 12; + elseif datainvio == 13 + nuovofile = 13; + else + nuovofile = adesso; + end + else + nuovofile = datainvio; + end + fprintf(fileID,fmt,nuovofile); + fprintf(fileID,fmt,attivaReport); + fclose(fileID); + + %% Email + setpref('Internet','E_mail','aseparma@gmail.com'); + setpref('Internet','SMTP_Server','smtp.gmail.com'); + setpref('Internet','SMTP_Username','aseparma@gmail.com'); + setpref('Internet','SMTP_Password','Mums@2016'); + 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 = (['CRASH del Report Automatico - ' NomeSito '']); + testo = cellstr('Ciao Andrea e Alessandro,'); + testobis = cellstr(''); + testo2 = cellstr(['Nella funzione del report avete scritto qualche minchiata per cui crasha. Vi prego di correggermi '... + 'o continuer' char(243) ' a crashare e ad assillarvi con questa mail. Troverete l''errore in allegato.']); + message_ITA = [testo; testobis; testo2]; + message = cellstr('Tanti Bip e Bop a te, '); + message2 = cellstr('Software Tilt'); + message_ITA = [message_ITA; message; message2]; + + recipients_ASE{1,1} = 'alessandro.valletta@aseltd.eu'; + recipients_ASE{2,1} = 'andrea.carri@aseltd.eu'; + + allegato = FileErr; + + sendmail(recipients_ASE, subject_ITA, message_ITA, allegato) + +end + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_ASE function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/SMS.m b/Tilt/SMS.m new file mode 100755 index 0000000..f640021 --- /dev/null +++ b/Tilt/SMS.m @@ -0,0 +1,114 @@ +function SMS(IDcentralina,DTcatena,Sito,Users_SMS,Criterio,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; + +[rU,cU] = size(Users_SMS); +NumTel = cell(1); +Language = cell(1); +j = 1; +if cU > 1 + for i = 1:rU + if isempty(Users_SMS{i,6}) == 0 % l'utente ha un numero di telefono + NumTel(j,1) = Users_SMS(i,6); + Language(j,1) = Users_SMS(i,4); + j = j+1; + end + end +end + +%% ------ INVIO SMS TRAMITE MAIL-TO-SMS SKEBBY ------- + +% Settaggio Email mittente +setpref('Internet','E_mail','aseparma@gmail.com'); +setpref('Internet','SMTP_Server','smtp.gmail.com'); +setpref('Internet','SMTP_Username','aseparma@gmail.com'); +setpref('Internet','SMTP_Password','Mums@2016'); +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 + +if strcmp(Criterio,'Fukuzono') + sms = 1; +elseif strcmp(Criterio,'FIFA') + sms = 2; +end + +% --- Invio sms di allertamento utenti --- +[r,~]=size(NumTel); +Condizione = cell2mat(NumTel); + +if isempty(Condizione) == 0 % almeno un utente da avvisare + for k=1:r + check = char(NumTel(k,1)); + [~,cC] = size(check); + if cC >= 1 + if Language{k,1} == 2 %ITA + if sms == 1 + testosms = (['ALLARME - Criterio Inverso della Velocità attivato per la Centralina ' IDcentralina... + ', Catena ' DTcatena ' nel sito di ' Sito '. Controllare l''email per maggiori dettagli.']); %testo sms + elseif sms == 2 + testosms = (['ALLARME - Criterio FIFA attivato per la Centralina ' IDcentralina... + ', Catena ' DTcatena ' nel sito di ' Sito '. Controllare l''email per maggiori dettagli.']); %testo sms + end + else %ENG + if sms == 1 + testosms = (['ALARM - Inverse of Velocity Criterion Activated for Datalogger ' IDcentralina ', Array ' DTcatena ', Site: ' Sito... + '. Check the email for further details. ''']); %testo sms + elseif sms == 2 + testosms = (['ALARM - FIFA Criterion Activated for Datalogger ' IDcentralina ', Array ' DTcatena ', Site: ' Sito... + '. Check the email for further details. ''']); %testo sms + end + end + NUMERO_TEL = num2str(cell2mat(NumTel(k,1))); % numero telefono + soggetto = 'ASE: Allarme Fukuzono!'; + utente = [NUMERO_TEL '@classic.skebby.com']; + sendmail(utente,soggetto,testosms) + if sms == 1 + text = ['Alert of Level #5 SMS sent to ' NUMERO_TEL '!']; + elseif sms == 2 + text = ['Alert of Red Code SMS sent to ' NUMERO_TEL '!']; + end + fprintf(fileID,fmt,text); + end + end + % scrivo invio sms a utenti autorizzati nel logfile + text = 'Alarm activated, email-to-sms process completed - Alert sent to authorized users!'; + fprintf(fileID,fmt,text); +end + +% --- Invio sms a destinatari ASE --- +recipients_ITA{1,1} = '+393482453680'; % Alessandro Valletta +recipients_ITA{2,1} = '+393493048545'; % Andrea Carri +recipients_ITA{3,1} = '+393406654863'; % Roberto Savi +recipients_ITA{4,1} = '+393485113211'; % Andrea Segalini +[rASE,~]=size(recipients_ITA); + +for z = 1:rASE + if sms == 1 + smsASE = (['ALLARME di livello massimo - Criterio di Fukuzono Attivato per la Centralina' IDcentralina... + ', Catena ' DTcatena ' nel sito di ' Sito '. Controllare l''email per maggiori dettagli.']); + soggettoASE = 'ASE: Allarme Fukuzono!'; + elseif sms == 2 + smsASE = (['ALLARME - Criterio FIFA Attivato per la Centralina' IDcentralina... + ', Catena ' DTcatena ' nel sito di ' Sito '. Controllare l''email per maggiori dettagli.']); + soggettoASE = 'ASE: Allarme FIFA!'; + end + Num_ASE = num2str(cell2mat(recipients_ITA(z,1))); % numero telefono ASE + utenteASE = [Num_ASE '@classic.skebby.com']; + sendmail(utenteASE,soggettoASE,smsASE) + % scrivo invio sms a utenti autorizzati nel logfile + if sms == 1 + text = ['Alert of Level #5 SMS sent to ' Num_ASE '!']; + elseif sms == 2 + text = ['Alert of Red Code SMS sent to ' Num_ASE '!']; + end + fprintf(fileID,fmt,text); +end + +text = 'Alarm activated, email-to-sms process completed - Alert sent to ASE users!'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/SWSearch.m b/Tilt/SWSearch.m new file mode 100755 index 0000000..9f6846c --- /dev/null +++ b/Tilt/SWSearch.m @@ -0,0 +1,286 @@ +% Funzione che ricostruisce la tipologia di nodi presenti +% NodoTiltLink ad esempio contiene numero del nodo e profondità per tutti i +% nodi di questo tipo +% idTool rappresenta l'identificativo con cui sono definite le +% installazioni su DB, serve più avanti nell'elaborazione +% idNode scrive gli identificativi dei nodi del DB. E' un output di +% controllo + +function [yesATD,yesRSN,yesMusa] = SWSearch(idTool,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'SWSearch function started'; +fprintf(fileID,fmt,text); + +yesATD = 0; +yesRSN = 0; +yesMusa = 0; + +%% Tunnel Link +% carico le informazioni relative al numero e alla posizione (rispetto all'ancora +% considerando la circonferenza come una retta verticale) per Tunnel LINK +comando = ['select num, depth from nodes where tool_id = ''' idTool ''' and nodetype_id = 17 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesATD = 1; + text = 'Tunnel Links identified, ATD relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% Radial Link +% carico le informazioni relative al numero e alla posizione (rispetto all'ancora +% considerando la circonferenza come una retta verticale) per Radial LINK +comando = ['select num, depth from nodes where tool_id = ''' idTool ''' and nodetype_id = 18 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesATD = 1; + text = 'Radial Links identified, ATD relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% PreConv Link +% carico le informazioni relative al numero e alla lunghezza per PreConv +% Link (nodo per la misura di PRE-Convergenza) +comando = ['select num, depth from nodes where tool_id = ''' idTool ''' and nodetype_id = 23 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesATD = 1; + text = 'PreConv Links identified, ATD relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% PreConv Link HR +% carico le informazioni relative al numero e alla lunghezza per TILT LINK +% HR H (ampolla orizzontale) +comando = ['select num, depth from nodes where tool_id = ''' idTool ''' and nodetype_id = 24 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesATD = 1; + text = 'PreConv Links HR identified, ATD relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% Pressure Link +% carico le informazioni relative al numero per Pressure LINK +comando = ['select num, depth, channels, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 21 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesATD = 1; + text = 'Pressure Links identified, ATD relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% Load Link +% carico le informazioni relative al numero per LOAD LINK +comando = ['select num, depth, channels, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 15 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesATD = 1; + text = 'Load Links identified, ATD relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% Extensometer Link +% carico le informazioni relative al numero per EXTENSOMETER LINK +comando = ['select num, depth, channels, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 16 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesATD = 1; + text = 'Extensometer Links identified, ATD relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% 3D Extensometer Link +% carico le informazioni relative al numero per 3D EXTENSOMETER LINK +comando = ['select num, depth, channels, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 19 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesATD = 1; + text = '3D Extensometer Links identified, ATD relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% Wire Extensometer Link +% carico le informazioni relative al numero per Wire EXTENSOMETER LINK +comando = ['select num, depth, channels, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 22 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesATD = 1; + text = 'Wire Extensometer Links identified, ATD relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% Multi Point Borehole Rod Extensometer +% carico le informazioni relative al numero per Multi Point Borehole Rod Extensometer +comando = ['select num, depth, channels, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 25 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesATD = 1; + text = 'Multi-Point Rod Extensometers identified, ATD relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% Crack Link +comando = ['select num, depth, channels, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 36 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesATD = 1; + text = 'Cracks Links identified, ATD relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% 2D Crack Link +comando = ['select num, depth, channels, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 51 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesATD = 1; + text = '2D Cracks Links identified, ATD relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% 3D Crack Link +comando = ['select num, depth, channels, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 37 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesATD = 1; + text = '3D Cracks Links identified, ATD relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% Stress Meter +comando = ['select num, depth, channels, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 47 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesATD = 1; + text = 'Stress Meters identified, ATD relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% Baro Musa Link +comando = ['select num, depth from nodes where tool_id = ''' idTool ''' and nodetype_id = 41 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesMusa = 1; + text = 'Baro Musa Links identified, Musa relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% Humidity link +comando = ['select num, depth from nodes where tool_id = ''' idTool ''' and nodetype_id = 35 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesMusa = 1; + text = 'Humidity Links identified, Musa relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% CO2 Link +comando = ['select num, depth from nodes where tool_id = ''' idTool ''' and nodetype_id = 33 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesMusa = 1; + text = 'CO2 Links identified, Musa relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% Lux Link +comando = ['select num, depth from nodes where tool_id = ''' idTool ''' and nodetype_id = 34 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesMusa = 1; + text = 'Lux Links identified, Musa relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% RSN Link +comando = ['select num, depth from nodes where tool_id = ''' idTool ''' and nodetype_id = 38 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesRSN = 1; + text = 'RSN Links identified, RSN relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% RSN Link HR +comando = ['select num, depth from nodes where tool_id = ''' idTool ''' and nodetype_id = 39 order by num']; +Leggo = fetch(conn,comando); +[~,cL] = size(Leggo); +if cL > 1 + yesRSN = 1; + text = 'RSN Links HR identified, RSN relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% Trigger Link +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 40 order by num']; +curs = exec(conn,comando); +curs = fetch(curs); +Leggo = curs.Data; +[~,cL] = size(Leggo); +if cL > 1 + yesRSN = 1; + text = 'Trigger Links identified, RSN relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% G-Flow Link +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 48 order by num']; +curs = exec(conn,comando); +curs = fetch(curs); +Leggo = curs.Data; +[~,cL] = size(Leggo); +if cL > 1 + yesRSN = 1; + text = 'G-Flow Links identified, RSN relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% G-Shock Link +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 50 order by num']; +curs = exec(conn,comando); +curs = fetch(curs); +Leggo = curs.Data; +[~,cL] = size(Leggo); +if cL > 1 + yesRSN = 1; + text = 'G-Shock Links identified, RSN relaunch activated'; + fprintf(fileID,fmt,text); +end + +%% Debris Link +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 49 order by num']; +curs = exec(conn,comando); +curs = fetch(curs); +Leggo = curs.Data; +[~,cL] = size(Leggo); +if cL > 1 + yesRSN = 1; + text = 'Debris Links identified, RSN relaunch activated'; + fprintf(fileID,fmt,text); +end + +text = 'SWSearch function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/Tilt/Siren.m b/Tilt/Siren.m new file mode 100755 index 0000000..cb32210 --- /dev/null +++ b/Tilt/Siren.m @@ -0,0 +1,219 @@ +function Siren(alarms,yesKL,yesKLHR,yesTL,yesIPL,datainiKL,tempoiniKL,datainiKLHR,tempoiniKLHR,... + datainiTL,tempoiniTL,datainiIPL,tempoiniIPL,ARRAYdateKL,ARRAYdateKLHR,ARRAYdateTL,ARRAYdateIPL,... + conn,date,time,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; + +text = 'Siren function started'; +fprintf(fileID,fmt,text); + +[rA,cA] = size(alarms); + +sirena = 0; +if rA > 0 && cA > 1 + for aa = 1:rA + if cell2mat(alarms(aa,3)) == 1 + sirena = 1; + break + end + end +end + +if cA ~= 1 && sirena == 1 + if yesKL == 1 + ARRAYdateAL = ARRAYdateKL; + elseif yesKLHR == 1 + ARRAYdateAL = ARRAYdateKLHR; + elseif yesTL == 1 + ARRAYdateAL = ARRAYdateTL; + end + [ListaDate,~] = size(ARRAYdateAL); + val_AL = zeros(ListaDate,rA); + StoricoAllarmi = zeros(ListaDate,rA); + % Attivazione della Sirena al superamento di una determinata soglia + + if yesKL == 1 + dataini = datainiKL; + tempoini = tempoiniKL; + elseif yesKLHR == 1 + dataini = datainiKLHR; + tempoini = tempoiniKLHR; + elseif yesTL == 1 + dataini = datainiTL; + tempoini = tempoiniTL; + end + dateCheck = [date ' ' time]; + if dataini < datenum(dateCheck) + dataini = date; + tempoini = time; + else + dataini = datestr(dataini,'yyyy-mm-dd HH:MM:SS'); + end + + %% QUI ANDRA' INSERITO IL CRITERIO DI ATTIVAZIONE DELL'ALLARME + + % Criterio di attivazione dell'allarme + %------------------------------------- + + % Criterio di attivazione dell'SMS + AL = 1; + DATAinsert = cell(1,5); + Data = datestr(ARRAYdateAL(end,1),'yyyy-mm-dd HH:MM:SS'); + for ii = 1:rA % numero di allarmi + if val_AL(end,ii) == 1 && ARRAYdateAL(end,1) > alarms(ii,end) + desc = strjoin(alarms(ii,5),alarms(ii,6),'ON'); + DATAinsert{AL,1} = 6; % Sirena e lampeggiante + DATAinsert{AL,2} = alarms(ii,2); % ID del CT + DATAinsert{AL,3} = Data; % Data & ora + DATAinsert{AL,4} = 1; % SMS + DATAinsert{AL,5} = desc; % Codice da inviare + allarme = 1; + AL = AL+1; + end + end + + if allarme == 1 + AL = AL-1; % Numero totale di allarmi + for a = 1:AL + % Cerco se il dato è già presente + Data = DATAinsert{a,3}; + type = num2str(DATAinsert{a,1}); % tipologia + IDtool = num2str(DATAinsert{a,2}); % ID del CT + desc = DATAinsert{a,5}; % Descrizione + comando = ['select id from alarms where tool_name = ''' IDtool ''' and date_time = ''' ... + Data ''' and type_id = ''' type ''' and description like ''' desc ''' order by date_time']; + curs = exec(conn,comando); + curs = fetch(curs); + idDate = curs.Data; + if cell2mat(idDate) == 0 + idElabData = 0; % 0 indica che il dato non è presente su DB + else + idElabData = cell2mat(idDate); + end + tablename = 'alarms'; + colnames = {'type_id','tool_name','date_time','send_sms','description'}; + data = [DATAinsert(a,1),DATAinsert(a,2),DATAinsert(a,3),DATAinsert(a,4),DATAinsert(a,5)]; + if idElabData == 0 % Scrivo + fastinsert(conn,tablename,colnames,data); + text = ['ALERT was written in the DB by Siren function for date: ''' Data ''' ']; + else % Aggiorno + whereclause = ['WHERE tool_name = ''' DATAinsert{a,2} ''' and date_time = ''' DATAinsert{a,3} ... + ''' and type_id = ''' type ''' and description like ''' desc ''' ']; + update(conn,tablename,colnames,data,whereclause) + text = ['ALERT was updated in the DB by Siren function for date: ''' Data ''' ']; + end + fprintf(fileID,fmt,text); + end + end + + Control = 1; + while Control == 1 + for nn = 1:rA + % Scarico i dati storici di attivazione dell'allarme + comando = ['select EventDate, EventTime, X from ELABDATACTRL where EventDate = ''' ... + dataini ''' and EventTime >= ''' tempoini ''' and CtrlToolName = '''... + char(alarms(nn,2)) ''' and NodeNum = 1 ']; + curs = exec(conn,comando); + curs = fetch(curs); + AlarmTot_1 = curs.Data; % numero cumulato di attivazioni prima della lettura in elaborazione + + comando = ['select EventDate, EventTime, X from ELABDATACTRL where EventDate > ''' ... + dataini ''' and CtrlToolName = ''' char(alarms(nn,2)) ''' and NodeNum = 1 ']; + curs = exec(conn,comando); + curs = fetch(curs); + AlarmTot_2 = curs.Data; % numero cumulato di attivazioni prima della lettura in elaborazione + + [r1,c1] = size(AlarmTot_1); + [r2,c2] = size(AlarmTot_2); + if r1 == 1 && c1 == 1 + if r2 == 1 && c2 == 1 + if dataini < datenum(dateCheck) + AlarmTot(1,1) = cellstr(date); + AlarmTot(1,2) = cellstr(time); + AlarmTot(1,3) = cell; + Control = 0; + else + dataini = dataini-1; + break + end + else + AlarmTot = AlarmTot_2; + Control = 0; + end + else + Control = 0; + if r2 == 1 && c2 == 1 + AlarmTot = AlarmTot_1; + else + AlarmTot = [AlarmTot_1; AlarmTot_2]; + end + end + [rA,~] = size(AlarmTot); + Data = [cell2mat(AlarmTot(:,1)) repmat(' ', [rA,1]) cell2mat(AlarmTot(:,2))]; + Data = datenum(Data); + Var = find(Data < datenum(ARRAYdateAL(1,1))); + if isempty(Var) == 1 + StoricoAllarmi(:,nn) = cumsum(val_AL); + else + StoricoAllarmi(:,nn) = cumsum(val_AL)+cell2mat(AlarmTot(Var(end),3)); + end + + DATAinsert = cell(ListaDate,6); + % Creo i dati da scrivere + for ii=1:ListaDate + DATAinsert{ii,1} = alarms(nn,2); + DATAinsert{ii,2} = datestr(ARRAYdateAL(ii),'yyyy-mm-dd'); + DATAinsert{ii,3} = datestr(ARRAYdateAL(ii),'HH:MM:SS'); + DATAinsert{ii,4} = val_AL(ii,nn); + DATAinsert{ii,5} = StoricoAllarmi(ii,nn); + DATAinsert{ii,6} = 1; + end + idElabData = zeros(ListaDate,1); % Contiene gli id delle date delle quali ho già dati + cc = 1; % contatore + % Cerco su DB se i dati sono da aggiornare o scrivere + for ii = 1:ListaDate + dString = datestr(ARRAYdateAL(ii),'yyyy-mm-dd'); + tString = datestr(ARRAYdateAL(ii),'HH:MM:SS'); + + comando = ['select idElabDataCtrl from ELABDATACTRL where CtrlToolName = '''... + char(alarms(nn,2)) ''' and NodeNum = 1 and EventDate = ''' ... + dString ''' and EventTime = ''' tString ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + idDate = curs.Data; + if strcmp(idDate,'No Data') + idElabData(cc,1) = 0; % 0 indica che il dato non è presente su DB + else + idElabData(cc,1) = cell2mat(idDate); + end + cc = cc+1; + % Scrivo o Aggiorno i dati + idData = idElabData(ii,1); + tablename = 'ELABDATACTRL'; + if idData == 0 % Se la data non è su DB (=0), scrivo i dati + colnames = {'CtrlToolName','EventDate','EventTime','XShift','X','NodeNum',}; + data = [DATAinsert(ii,1),DATAinsert(ii,2),DATAinsert(ii,3),... + DATAinsert(ii,4),DATAinsert(ii,5),DATAinsert(ii,6)]; + fastinsert(conn,tablename,colnames,data); + else % altrimenti li aggiorno + colnames = {'XShift','X'}; + data = [DATAinsert(ii,4),DATAinsert(ii,5)]; + whereclause = ['WHERE CtrlToolName = ''' char(alarms(nn,2)) ... + ''' and NodeNum = 1 and EventDate = ''' cell2mat(DATAinsert(ii,2))... + ''' and EventTime = ''' cell2mat(DATAinsert(ii,3)) ''' ']; + update(conn,tablename,colnames,data,whereclause) + end + end + text = ['Data of Control Tools ' char(alarms(nn,2)) ' uploaded in the DB correctly']; + fprintf(fileID,fmt,text); + end + end +end + +text = 'Siren function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); +end + + \ No newline at end of file diff --git a/Tilt/Site_Info.m b/Tilt/Site_Info.m new file mode 100755 index 0000000..4a7ca82 --- /dev/null +++ b/Tilt/Site_Info.m @@ -0,0 +1,60 @@ +function [unitID,chainID,Chain_Scheme,num_nodi,alarms] = Site_Info(siteID,conn,FileName) + +text = 'Site_Info function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +% Scarico tutte le centraline presenti in sito +comando = ['select id, name from units where site_id = ''' siteID ''' order by name']; % il rapporto centralina sito è di 1 a 1 +curs = exec(conn,comando); +curs = fetch(curs); +unitID = curs.Data; + +col = size(unitID); +chainID = cell(1,4); +ini = 1; +for c = 1:col(1,1) + % dalle centraline presenti, risalgo alle catene disponibili + comando = ['select id, name from tools where unit_id = ''' num2str(cell2mat(unitID(c,1))) ''' order by name']; + curs = exec(conn,comando); + curs = fetch(curs); + chainID_down = curs.Data; % id tool, nome tool + [fin,~] = size(chainID_down); + fin = fin+ini-1; + chainID(ini:fin,3:4) = chainID_down; + for j = ini:fin + chainID(j,1:2) = unitID(c,1:2); % Id centralina, nome centralina, id tool, nome tool + end + ini = fin+1; +end + +% Scarico gli schemi delle catene +[col,~] = size(chainID); % Numero di Array +Chain_Scheme = cell(1,3); +num_nodi = zeros(col,1); +ini = 1; +cont = 1; +for c = 1:col(1,1) + comando = ['select nodetype_id, depth, num from nodes where tool_id = ''' num2str(cell2mat(chainID(c,3))) ''' order by num']; + curs = exec(conn,comando); + curs = fetch(curs); + scheme_down = curs.Data; % id nodo, profondità, numero + [fin,~] = size(scheme_down); + num_nodi(cont) = fin; + Chain_Scheme(1:fin,ini:ini+2) = scheme_down; + ini = ini+3; + cont = cont+1; +end + +% Scarico l'allarme relativo al sito +comando = ['select id, name, ctrltype_id, alarm_phone, conn_usr, conn_pwd, duedate from ctrltools where site_id = ''' siteID ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +alarms = curs.Data; + +text = 'Site_Info function worked correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/Therm.m b/Tilt/Therm.m new file mode 100755 index 0000000..0a14f16 --- /dev/null +++ b/Tilt/Therm.m @@ -0,0 +1,135 @@ +function [Dati_ThL,ARRAYdateThL,ErrThermLink] = Therm(Dati_ThL,ARRAYdateThL,... + NuovoZeroThL,ErrThermLink,NdatiMedia,margine,Tmax,Tmin,datainiThL,... + IDcentralina,DTcatena,FileName) + +text = 'Therm function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +if NuovoZeroThL == 1 + ini = round(NdatiMedia/2); + if rem(NdatiMedia,2) == 0 + ini = ini+1; + end + ini = ini + margine; + if ini < 6 + ini = 6; + end + ErrThermLink = ErrThermLink(ini:end,:)'; + Dati_ThL = Dati_ThL(ini:end,:); + ARRAYdateThL = ARRAYdateThL(ini:end,1); +else + ErrThermLink = ErrThermLink'; +end + +[r,c] = size(Dati_ThL); +FileTemperature = ['' IDcentralina '-' DTcatena '-ThL-Therm.csv']; +if isfile(FileTemperature) == 1 + DatiRaw = csvread(FileTemperature); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; +else + rDR = 1; + cDR = 1; +end +cont2 = 1; +textT = '0 correction executed for Therm Link - Temperature filter'; +for a = 1:r % Data + for b = 1:c % Nodo + % NON considero i dati al di sopra dei 80 °C o al di sotto dei -30 °C! + if Dati_ThL(a,b) > Tmax || Dati_ThL(a,b) < Tmin + cont2 = cont2+1; + if a == 1 + if isfile(FileTemperature) == 1 + RawDate = find(DatiRaw(:,1)<=datenum(datainiThL)); + if isempty(RawDate) == 1 + cc = 2; + while cc <= c + if Dati_ThL(cc,b) > Tmax || Dati_ThL(cc,b) < Tmin + cc = cc+1; + else + break + end + end + Dati_ThL(a,b) = Dati_ThL(cc,b); + else + if isnan(DatiRaw(RawDate(end),b+1)) == 0 + Dati_ThL(a,b) = DatiRaw(RawDate(end),b+1); + ErrThermLink(b,a) = 1; + wardat = 'Temperature data of Therm Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + else + cc = 2; + while cc <= c + if Dati_ThL(cc,b) > Tmax || Dati_ThL(cc,b) < Tmin + cc = cc+1; + else + break + end + end + Dati_ThL(a,b) = Dati_ThL(cc,b); + end + end + else + cc = 2; + while cc <= c + if Dati_ThL(cc,b) > Tmax || Dati_ThL(cc,b) < Tmin + cc = cc+1; + else + break + end + end + Dati_ThL(a,b) = Dati_ThL(cc,b); + end + else + Dati_ThL(a,b) = Dati_ThL(a-1,b); + ErrThermLink(b,a) = 1; + end + textT = ['' num2str(cont2) ' correction executed for Therm Link - Temperature filter!']; + end + end +end + +if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=ARRAYdateThL(1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(ARRAYdateThL(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(ARRAYdateThL(:,1)>DatiRaw(RawDate1(end)+1,1)); + end +else + RawDate1 = []; + RawDate2 = 1; +end +if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:); ARRAYdateThL(RawDate2(1):end) Dati_ThL(RawDate2(1):end,:)]; +elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = [ARRAYdateThL Dati_ThL]; +else + Dati = DatiRaw; +end +% Elimino appoggio più vecchio di un mese +RawDate3 = find(Dati(:,1) +text = ['Elaboration of chain ' DTcatena ' of control unit ' IDcentralina ' started correctly']; +d = datestr(datetime,'yyyy_mm_dd'); +t = datestr(datetime,'HH_MM_SS'); +FileName = ['LogFile-' IDcentralina '-' DTcatena '-' d '-' t '.txt']; +outdat = fopen(FileName,'wt+'); %#ok +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +DTcatenaRif = '0'; + +%% Parte generale + +% Associo ID company al relativo DB e definisco i parametri del Database +IDcompany = '1'; % DA INTEGRARE IN VERSIONI FUTURE +DB = database_definition(IDcompany,FileName); + +% Apro 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); +% conn = database('',,,'com.mysql.cj.jdbc.Driver','jdbc:mysql://servername:portnumber/databasename?serverTimezone=UTC&') + +% 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,NodoTiltLink,NodoTiltLinkHR,NodoTiltLinkH,NodoTiltLinkHRH,... + NodoTiltLinkHR3D,NodoTiltLinkHR3DH,NodoPiezoLink,NodoBaroLink,... + NodoThermLink,NodoAnalogLink,NodoLoadLink,NodoKlinoLink,NodoKlinoLinkHR,... + NodoRainLink,NodoPT100Link,NodoInPlaceLink,NodoInPlaceLinkHR,NodoInPlaceLinkHR3D,... + NodoWeirLink,NodoPendulum,NodoWind,NodoTiltLinkHD,NodoTiltLinkHDVR,NodoSPPLink,NodoSnowLink,... + rTL,rTLHR,rTLH,rTLHRH,~,~,rPL,rBL,rThL,rAL,rLL,rKL,rKLHR,... + rRL,rPT100,rIPL,rIPLHR,~,rWL,rPE,~,rHD,rHDVR,rSPP,rSL]... + = 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 +[yesTL,yesTLHR,yesTLHR3D,yesTLH,yesTLHRH,yesTLHR3DH,yesPL,yesBL,... + yesThL,yesAL,yesLL,yesKL,yesKLHR,yesRL,yesPT100,yesIPL,yesIPLHR,yesIPLHR3D,... + yesWL,yesPE,NodoPiezoLink,~,yesHD,yesHDVR,yesSPP,yesSL] = YesNo(NodoTiltLink,NodoTiltLinkHR,... + NodoTiltLinkHR3D,NodoTiltLinkH,NodoTiltLinkHRH,NodoTiltLinkHR3DH,NodoPiezoLink,... + NodoBaroLink,NodoThermLink,NodoAnalogLink,NodoLoadLink,NodoKlinoLink,NodoKlinoLinkHR,... + NodoRainLink,NodoPT100Link,NodoInPlaceLink,NodoInPlaceLinkHR,NodoInPlaceLinkHR3D,... + NodoWeirLink,NodoPendulum,NodoWind,NodoTiltLinkHD,NodoTiltLinkHDVR,NodoSPPLink,NodoSnowLink,FileName); + +% funzione che definisce tutti i parametri importanti per elaborare un'installazione +[MEMS,biax,triax,struct,tolleranzaAcc,tolleranzaMag,segnoNS,... + segnoEO,Ndevst,Wdevst,segnoNS_HR,segnoEO_HR,Ndevst_HR,Wdevst_HR,allineato,... + NdatiMedia,NdatiMediaP,Ndatidespike,Anchor_real,Tmax,Tmin,Corr_Azimuth,Traversine,... + base,altezza,larghezza] = ... + Parametri_Installazione(unitID,idTool,DTcatena,yesTL,yesTLHR,yesTLH,yesTLHRH,yesPL,... + yesThL,yesKL,yesKLHR,yesPT100,yesIPL,yesIPLHR,yesWL,yesHD,yesHDVR,conn,FileName); + +% funzione che ricostruisce segmenti di pertinenza etc +[SpeTL,PsTL,SpeTLHR,PsTLHR,SpeTLH,PsTLH,SpeTLHRH,PsTLHRH,SpeIPL,PsIPL,Inverti,... + SpeIPLHR,PsIPLHR,SpeHD,PsHD,SpeHDVR,PsHDVR] = schemaSP(yesTL,yesTLHR,yesTLH,yesTLHRH,yesTLHR3D,yesTLHR3DH,... + yesIPL,yesIPLHR,yesIPLHR3D,yesHD,yesHDVR,NodoTiltLink,NodoTiltLinkHR,NodoTiltLinkHR3D,... + NodoTiltLinkH,NodoTiltLinkHRH,NodoTiltLinkHR3DH,NodoInPlaceLink,NodoInPlaceLinkHR,... + NodoInPlaceLinkHR3D,NodoTiltLinkHD,NodoTiltLinkHDVR,Anchor_real,... + rTL,rTLH,rTLHR,rTLHRH,rIPL,rIPLHR,rHD,rHDVR,catena,IDcentralina,DTcatena,FileName); + +% tipologia di centralina +Unit = centralina(IDcentralina,conn,FileName); + +%% Scarico dei dati + +% funzione che scarica i dati di calibrazione +[DCalTLTot,DCalHDTot,DCalHDVRTot,DCalTLHRTot,DCalTLHTot,DCalTLHRHTot,DCalPLTot,DCalBLTot,... + ~,DCalLLTot,DCalKLTot,DCalKLHRTot,DCalRLTot,DCalThLTot,DCalPT100Tot,... + DCalIPLTot,DCalIPLHRTot,DCalWLTot,DCalPETot,Barometri,yesTL,yesHD,yesHDVR,yesTLHR,yesTLH,... + yesTLHRH,yesPL,yesBL,~,yesLL,yesKL,yesKLHR,yesThL,yesPT100,yesIPL,yesIPLHR,yesWL] = ... + letturaCal(IDcentralina,DTcatena,catena,yesTL,yesHD,yesHDVR,yesTLHR,yesTLH,yesTLHRH,... + yesPL,yesBL,yesAL,yesLL,yesKL,yesKLHR,yesThL,yesPT100,yesIPL,yesIPLHR,yesWL,... + rTL,rHD,rHDVR,rPL,rBL,rTLHR,rAL,rTLH,rTLHRH,rLL,rThL,rKL,rKLHR,rRL,rPT100,rIPL,rIPLHR,... + rWL,rPE,NodoTiltLink,NodoTiltLinkHD,NodoTiltLinkHDVR,NodoTiltLinkH,NodoPiezoLink,NodoBaroLink,... + NodoLoadLink,NodoKlinoLink,NodoKlinoLinkHR,NodoInPlaceLink,NodoInPlaceLinkHR,NodoWeirLink,... + NodoPendulum,NodoRainLink,NodoThermLink,conn,FileName); + +if strcmp(Unit,'Nesa evolution') + Data = datestr(now-30,'yyyy-mm-dd HH:MM:SS.FFF'); % faccio di default 30 gg + comando = ['select JSON_VALUE(dataJSON,"$.battery") from ELABDATANESA where EventTimestamp >= ''' Data ... + ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = 1']; + curs = exec(conn,comando); + curs = fetch(curs); + Batteria = curs.Data; + comando = ['select EventTimestamp from ELABDATANESA where EventTimestamp >= ''' Data ... + ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = 1']; + curs = exec(conn,comando); + curs = fetch(curs); + DataOra = curs.Data; + Batteria = [DataOra Batteria]; + ARRAYdateRL = []; + Batteria_LoRa = []; +elseif (strcmp(Unit,'SISGEO WR-GW-868')) + % --- Batteria --- + Data = datestr(now-30,'yyyy-mm-dd'); % faccio di default 30 gg + Ora = datestr(now-30,'HH:MM:SS.FFF'); % faccio di default 30 gg + comando = ['select Date, Time, BatLevel from RawDataView where Date = ''' ... + Data ''' and Time >= ''' Ora ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum = 1 ']; + curs = exec(conn,comando); + curs = fetch(curs); + BatTempo = curs.Data; + comando = ['select Date, Time, BatLevel from RawDataView where Date > ''' ... + Data ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum = 1 ']; + curs = exec(conn,comando); + curs = fetch(curs); + BatData = curs.Data; + if strcmp(char(BatData(1)),'No Data') + Batteria = BatTempo; + elseif strcmp(char(BatTempo(1)),'No Data') + Batteria = BatData; + else + Batteria = [BatTempo;BatData]; + end + + % --- Batteria LoRa --- + comando = ['select Date, Time, BatLevelModule from RawDataView where Date = ''' ... + Data ''' and Time >= ''' Ora ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum = 1 ']; + curs = exec(conn,comando); + curs = fetch(curs); + BatTempo = curs.Data; + comando = ['select Date, Time, BatLevelModule from RawDataView where Date > ''' ... + Data ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum = 1 ']; + curs = exec(conn,comando); + curs = fetch(curs); + BatData = curs.Data; + if strcmp(char(BatData(1)),'No Data') + Batteria_LoRa = BatTempo; + elseif strcmp(char(BatTempo(1)),'No Data') + Batteria_LoRa = BatData; + else + Batteria_LoRa = [BatTempo;BatData]; + end +else + % Funzione che scarica la data di riferimento + [DatiElabTiltLink,NuovoZeroTL,datainiTL,tempoiniTL,... + DatiElabTiltLinkHD,NuovoZeroHD,datainiHD,tempoiniHD,... + DatiElabTiltLinkHDVR,NuovoZeroHDVR,datainiHDVR,tempoiniHDVR,... + DatiElabTiltLinkHR,NuovoZeroTLHR,datainiTLHR,tempoiniTLHR,... + DatiElabTiltLinkH,NuovoZeroTLH,datainiTLH,tempoiniTLH,... + DatiElabTiltLinkHRH,NuovoZeroTLHRH,datainiTLHRH,tempoiniTLHRH,... + DatiElabInPlaceLink,NuovoZeroIPL,datainiIPL,tempoiniIPL,... + DatiElabInPlaceLinkHR,NuovoZeroIPLHR,datainiIPLHR,tempoiniIPLHR,... + NuovoZeroPL,datainiPL,tempoiniPL,NuovoZeroBL,datainiBL,tempoiniBL,Barometro,... + NuovoZeroThL,datainiThL,tempoiniThL,NuovoZeroLL,datainiLL,tempoiniLL,... + NuovoZeroKL,datainiKL,tempoiniKL,NuovoZeroKLHR,datainiKLHR,tempoiniKLHR,... + DatiElabRainLink,NuovoZeroRL,datainiRL,tempoiniRL,datainiSPP,tempoiniSPP,NuovoZeroSPP,... + DatiElabSnowLink,NuovoZeroSL,datainiSL,tempoiniSL,... + NuovoZeroPT100,datainiPT100,tempoiniPT100,NuovoZeroWL,datainiWL,tempoiniWL,... + NuovoZeroPE,datainiPE,tempoiniPE,margine,marginePiezo] = LastElab(... + conn,date,time,IDcentralina,DTcatena,Wdevst,Wdevst_HR,NdatiMedia,Ndatidespike,NdatiMediaP,... + NodoTiltLink,yesTL,rTL,NodoTiltLinkHD,yesHD,rHD,NodoTiltLinkHDVR,yesHDVR,rHDVR,... + NodoTiltLinkHR,yesTLHR,rTLHR,NodoTiltLinkH,yesTLH,rTLH,NodoTiltLinkHRH,yesTLHRH,rTLHRH,... + NodoPiezoLink,yesPL,NodoBaroLink,yesBL,Barometri,... + NodoLoadLink,yesLL,NodoThermLink,yesThL,NodoRainLink,yesRL,rRL,... + NodoSnowLink,yesSL,rSL,NodoSPPLink,yesSPP,NodoKlinoLink,yesKL,rKL,... + NodoKlinoLinkHR,yesKLHR,rKLHR,NodoPT100Link,yesPT100,NodoInPlaceLink,yesIPL,rIPL,... + NodoInPlaceLinkHR,yesIPLHR,rIPLHR,NodoWeirLink,yesWL,NodoPendulum,yesPE,FileName); + + % Sito Specificità + if strcmp(IDcentralina,'ID0003') && strcmp(DTcatena,'DT0002') + datainiBL = '2015-03-01'; + tempoiniBL = '00:00:01'; + datainiPL = '2015-03-01'; + tempoiniPL = '00:00:01'; + end + + if strcmp(IDcentralina,'ID0070') == 1 && strcmp(DTcatena,'DT0111 IPI') == 1 || ... + strcmp(IDcentralina,'ID0071') == 1 && strcmp(DTcatena,'DT0112 IPI') == 1 || ... + strcmp(IDcentralina,'ID0072') == 1 && strcmp(DTcatena,'DT0113 IPI') == 1 || ... + strcmp(IDcentralina,'ID0073') == 1 && strcmp(DTcatena,'DT0114 IPI') == 1 + DTcatenaRif = DTcatena; + if strcmp(DTcatena,'DT0111 IPI') == 1 + DTcatena = 'DT0111'; + elseif strcmp(DTcatena,'DT0112 IPI') == 1 + DTcatena = 'DT0112'; + elseif strcmp(DTcatena,'DT0113 IPI') == 1 + DTcatena = 'DT0113'; + elseif strcmp(DTcatena,'DT0114 IPI') == 1 + DTcatena = 'DT0114'; + end + % Carico i dati dal database a seconda della catena + [Batteria,Batteria_LoRa,DatiTiltLink,ErrTiltLink,datainiTL,yesTL,... + ErrTiltLinkHD,ErrTiltLinkHDVR,... + DatiTiltLinkH,ErrTiltLinkH,datainiTLH,yesTLH,DatiPiezoLink,ErrPiezoLink,yesPL,DatiBaroLink,ErrBaroLink,yesBL,... + DatiTiltLinkHR,ErrTiltLinkHR,datainiTLHR,yesTLHR,DatiTiltLinkHRH,ErrTiltLinkHRH,datainiTLHRH,yesTLHRH,... + DatiLoadLink,ErrLoadLink,yesLL,DatiThermLink,ErrThermLink,yesThL,DatiKlinoLink,ErrKlinoLink,yesKL,... + DatiKlinoLinkHR,ErrKlinoLinkHR,yesKLHR,DatiRainLink,ErrRainLink,datainiRL,yesRL,... + ErrSnowLink,DatiPT100Link,ErrPT100Link,yesPT100,DatiInPlaceLink,ErrInPlaceLink,datainiIPL,yesIPL,... + DatiInPlaceLinkHR,ErrInPlaceLinkHR,datainiIPLHR,yesIPLHR,DatiWeirLink,DatiNTCWeirLink,ErrWeirLink,datainiWL,yesWL,... + DatiPendulum,ErrPendulum,datainiPE,yesPE] = lettura_Hybrid(IDcentralina,DTcatena,DTcatenaRif,datainiTL,tempoiniTL,NodoTiltLink,NuovoZeroTL,... + datainiTLH,tempoiniTLH,NodoTiltLinkH,NuovoZeroTLH,datainiPL,tempoiniPL,NodoPiezoLink,NuovoZeroPL,... + datainiBL,tempoiniBL,NodoBaroLink,NuovoZeroBL,datainiTLHR,tempoiniTLHR,NodoTiltLinkHR,NuovoZeroTLHR,... + datainiTLHRH,tempoiniTLHRH,NodoTiltLinkHRH,NuovoZeroTLHRH,datainiThL,tempoiniThL,NodoThermLink,NuovoZeroThL,... + datainiLL,tempoiniLL,NodoLoadLink,NuovoZeroLL,datainiKL,tempoiniKL,NodoKlinoLink,NuovoZeroKL,... + datainiKLHR,tempoiniKLHR,NodoKlinoLinkHR,NuovoZeroKLHR,datainiRL,tempoiniRL,NodoRainLink,NuovoZeroRL,... + datainiPT100,tempoiniPT100,NodoPT100Link,NuovoZeroPT100,datainiIPL,tempoiniIPL,NodoInPlaceLink,NuovoZeroIPL,... + datainiIPLHR,tempoiniIPLHR,NodoInPlaceLinkHR,NuovoZeroIPLHR,datainiWL,tempoiniWL,NodoWeirLink,NuovoZeroWL,... + datainiPE,tempoiniPE,NodoPendulum,NuovoZeroPE,yesTL,yesTLH,yesTLHR,yesTLHRH,yesPL,yesBL,yesThL,yesKL,yesKLHR,yesRL,... + yesPT100,yesLL,yesIPL,yesIPLHR,yesWL,yesPE,rTL,rTLH,rTLHR,rTLHRH,rPL,rBL,rThL,rKL,rKLHR,rRL,rPT100,rLL,rIPL,rIPLHR,... + rWL,rPE,conn,Barometro,catena,date,time,FileName); + else + % Carico i dati dal database a seconda della catena + [Batteria,Batteria_LoRa,DatiTiltLink,ErrTiltLink,datainiTL,yesTL,... + DatiTiltLinkHD,ErrTiltLinkHD,datainiHD,yesHD,DatiTiltLinkHDVR,ErrTiltLinkHDVR,datainiHDVR,yesHDVR,... + DatiTiltLinkH,ErrTiltLinkH,datainiTLH,yesTLH,DatiPiezoLink,ErrPiezoLink,yesPL,DatiBaroLink,ErrBaroLink,yesBL,... + DatiTiltLinkHR,ErrTiltLinkHR,datainiTLHR,yesTLHR,DatiTiltLinkHRH,ErrTiltLinkHRH,datainiTLHRH,yesTLHRH,... + DatiLoadLink,ErrLoadLink,yesLL,DatiThermLink,ErrThermLink,yesThL,DatiKlinoLink,ErrKlinoLink,yesKL,... + DatiKlinoLinkHR,ErrKlinoLinkHR,yesKLHR,DatiRainLink,ErrRainLink,datainiRL,yesRL,... + DatiSPPLink,~,yesSPP,DatiSnowLink,ErrSnowLink,datainiSL,yesSL,... + DatiPT100Link,ErrPT100Link,yesPT100,DatiInPlaceLink,ErrInPlaceLink,datainiIPL,yesIPL,... + DatiInPlaceLinkHR,ErrInPlaceLinkHR,datainiIPLHR,yesIPLHR,DatiWeirLink,DatiNTCWeirLink,ErrWeirLink,datainiWL,yesWL,... + DatiPendulum,ErrPendulum,~,yesPE] = lettura(IDcentralina,DTcatena,datainiTL,tempoiniTL,NodoTiltLink,NuovoZeroTL,... + datainiHD,tempoiniHD,NodoTiltLinkHD,NuovoZeroHD,datainiHDVR,tempoiniHDVR,NodoTiltLinkHDVR,NuovoZeroHDVR,... + datainiTLH,tempoiniTLH,NodoTiltLinkH,NuovoZeroTLH,... + datainiPL,tempoiniPL,NodoPiezoLink,NuovoZeroPL,datainiBL,tempoiniBL,NodoBaroLink,NuovoZeroBL,... + datainiTLHR,tempoiniTLHR,NodoTiltLinkHR,NuovoZeroTLHR,... + datainiTLHRH,tempoiniTLHRH,NodoTiltLinkHRH,NuovoZeroTLHRH,datainiThL,tempoiniThL,NodoThermLink,NuovoZeroThL,... + datainiLL,tempoiniLL,NodoLoadLink,NuovoZeroLL,datainiKL,tempoiniKL,NodoKlinoLink,NuovoZeroKL,... + datainiKLHR,tempoiniKLHR,NodoKlinoLinkHR,NuovoZeroKLHR,datainiRL,tempoiniRL,NodoRainLink,NuovoZeroRL,... + datainiSPP,tempoiniSPP,NuovoZeroSPP,NodoSPPLink,datainiPT100,tempoiniPT100,NodoPT100Link,NuovoZeroPT100,... + datainiIPL,tempoiniIPL,NodoInPlaceLink,NuovoZeroIPL,datainiIPLHR,tempoiniIPLHR,NodoInPlaceLinkHR,NuovoZeroIPLHR,... + datainiWL,tempoiniWL,NodoWeirLink,NuovoZeroWL,datainiPE,tempoiniPE,NodoPendulum,NuovoZeroPE,... + datainiSL,tempoiniSL,NodoSnowLink,NuovoZeroSL,... + yesTL,yesTLH,yesTLHR,yesTLHRH,yesPL,yesBL,yesThL,yesKL,yesKLHR,yesRL,yesSPP,yesSL,... + yesPT100,yesLL,yesIPL,yesIPLHR,yesWL,yesPE,yesHD,yesHDVR,rTL,rTLH,rTLHR,rTLHRH,rPL,... + rBL,rThL,rKL,rKLHR,rRL,rSPP,rSL,rPT100,rLL,rIPL,rIPLHR,rWL,rPE,rHD,rHDVR,conn,Barometro,catena,date,time,FileName); + end + + if strcmp(IDcentralina,'ID0070') == 1 && strcmp(DTcatenaRif,'DT0111 IPI') == 1 || ... + strcmp(IDcentralina,'ID0071') == 1 && strcmp(DTcatenaRif,'DT0112 IPI') == 1 || ... + strcmp(IDcentralina,'ID0072') == 1 && strcmp(DTcatenaRif,'DT0113 IPI') == 1 || ... + strcmp(IDcentralina,'ID0073') == 1 && strcmp(DTcatenaRif,'DT0114 IPI') == 1 + DTcatena = DTcatenaRif; + end + + % Controllo incrociato fra la data iniziale definita da Lettura e la data + % iniziale definita da LastElab + [DatiElabTiltLink,DatiElabTiltLinkHR,DatiElabTiltLinkH,DatiElabTiltLinkHRH,... + DatiElabRainLink,DatiElabInPlaceLink,DatiElabInPlaceLinkHR,DatiElabSnowLink] = checkdata(... + yesTL,yesTLHR,yesTLH,yesTLHRH,yesRL,yesSL,yesIPL,yesIPLHR,... + DatiElabTiltLink,DatiElabTiltLinkHR,DatiElabTiltLinkH,DatiElabTiltLinkHRH,... + DatiElabRainLink,DatiElabInPlaceLink,DatiElabInPlaceLinkHR,DatiElabSnowLink,... + datainiTL,tempoiniTL,datainiTLHR,tempoiniTLHR,datainiTLH,tempoiniTLH,... + datainiTLHRH,tempoiniTLHRH,datainiRL,tempoiniRL,datainiIPL,tempoiniIPL,... + datainiIPLHR,tempoiniIPLHR,datainiSL,tempoiniSL,rTL,rTLHR,rTLH,rTLHRH,rRL,rSL,rIPL,rIPLHR,... + NodoTiltLink,NodoTiltLinkHR,NodoTiltLinkH,NodoTiltLinkHRH,... + NodoRainLink,NodoInPlaceLink,NodoInPlaceLinkHR,NodoSnowLink,... + NuovoZeroTL,NuovoZeroTLHR,NuovoZeroTLH,NuovoZeroTLHRH,NuovoZeroRL,NuovoZeroSL,... + NuovoZeroIPL,NuovoZeroIPLHR,IDcentralina,DTcatena,conn,FileName); + + if strcmp(IDcentralina,'ID0070') == 1 && strcmp(DTcatenaRif,'DT0111 IPI') == 1 || ... + strcmp(IDcentralina,'ID0071') == 1 && strcmp(DTcatenaRif,'DT0112 IPI') == 1 || ... + strcmp(IDcentralina,'ID0072') == 1 && strcmp(DTcatenaRif,'DT0113 IPI') == 1 || ... + strcmp(IDcentralina,'ID0073') == 1 && strcmp(DTcatenaRif,'DT0114 IPI') == 1 + if strcmp(DTcatenaRif,'DT0111 IPI') == 1 + DTcatena = 'DT0111'; + elseif strcmp(DTcatenaRif,'DT0112 IPI') == 1 + DTcatena = 'DT0112'; + elseif strcmp(DTcatenaRif,'DT0113 IPI') == 1 + DTcatena = 'DT0113'; + elseif strcmp(DTcatenaRif,'DT0114 IPI') == 1 + DTcatena = 'DT0114'; + end + end + + %% Parte di definizione dati, conversione in unità fisiche e calcolo medie + + % ---Tilt Link V--- + if yesTL == 1 + [TimeTL,accTL,magTL,tempTL,ErrTiltLink] = defDatiTL(DatiTiltLink,... + ErrTiltLink,Ndatidespike,rTL,MEMS,conn,catena,IDcentralina,DTcatena,Unit,FileName); + % Conversione dei dati grezzi + [accTL,magTL,ris_acc,ris_mag,tempTL,ErrTiltLink] = conv_grezziTL(rTL,accTL,magTL,... + tempTL,DCalTLTot,tolleranzaAcc,MEMS,ErrTiltLink,IDcentralina,DTcatena,FileName); + % Calcolo medie + [ACCdef_TL,MAGdef_TL,ARRAYdateTL,ACCdefRis_TL,~,TempDef_TL] = MediaDati_TL(... + accTL,magTL,TimeTL,ris_acc,ris_mag,tempTL,tolleranzaAcc,tolleranzaMag,... + NdatiMedia,FileName); + else + ARRAYdateTL = []; + text = 'There are not data to convert for Tilt Link V'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiTiltLink + clear TimeTL + clear accTL + clear magTL + clear tempTL + clear DCalTLTot + clear ris_acc + clear ris_mag + + % ---In Place Link--- + if yesIPL == 1 + [TimeIPL,accIPL,magIPL,tempIPL,ErrInPlaceLink] = defDatiIPL(DatiInPlaceLink,... + ErrInPlaceLink,NodoInPlaceLink,Ndatidespike,rIPL,MEMS,Unit,FileName); + % Conversione dei dati grezzi + [accIPL,magIPL,ris_acc_IPL,ris_mag_IPL,tempIPL,ErrInPlaceLink] = conv_grezziIPL(IDcentralina,rIPL,... + accIPL,magIPL,tempIPL,DCalIPLTot,tolleranzaAcc,ErrInPlaceLink,NodoInPlaceLink,MEMS,FileName); + % Calcolo medie + [ACCdef_IPL,MAGdef_IPL,ARRAYdateIPL,ACCdefRis_IPL,~,TempDef_IPL]... + = MediaDati_IPL(accIPL,magIPL,TimeIPL,ris_acc_IPL,ris_mag_IPL,tempIPL,tolleranzaAcc,... + tolleranzaMag,NdatiMedia,NodoInPlaceLink,MEMS,FileName); + else + ARRAYdateIPL = []; + text = 'There are not data to convert for In Place Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiInPlaceLink + clear TimeIPL + clear accIPL + clear magIPL + clear tempIPL + clear DCalIPLTot + clear ris_acc_IPL + clear ris_mag_IPL + + % ---Tilt Link HD--- + if yesHD == 1 + [TimeHD,accHD,magHD,tempHD,ErrTiltLinkHD] = defDatiHD(DatiTiltLinkHD,... + ErrTiltLinkHD,NodoTiltLinkHD,Ndatidespike,rHD,Unit,FileName); + % Conversione dei dati grezzi + [accHD,angHD,magHD,ris_acc_HD,ris_mag_HD,tempHD,ErrTiltLinkHD] = conv_grezziHD(rHD,accHD,magHD,... + tempHD,DCalHDTot,tolleranzaAcc,NodoTiltLinkHD,ErrTiltLinkHD,IDcentralina,DTcatena,FileName); + % Calcolo medie + [ACCdef_HD,ANGdef_HD,MAGdef_HD,ARRAYdateHD,ACCdefRisHD,MAGdefRisHD] = MediaDati_HD(... + accHD,angHD,magHD,TimeHD,ris_acc_HD,ris_mag_HD,tolleranzaAcc,... + tolleranzaMag,NdatiMedia,FileName); + else + ARRAYdateHD = []; + ACCdefRisHD = []; + MAGdefRisHD = []; + text = 'There are not data to convert for Tilt Link HD VR'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiTiltLinkHD + clear TimeHD + clear accHD + clear angHD + clear magHD + clear DCalHDTot + clear ris_acc_HD + clear ris_mag_HD + + % ---Tilt Link HD VR--- + if yesHDVR == 1 + [TimeHDVR,accHDVR,magHDVR,tempHDVR,ErrTiltLinkHDVR] = defDatiHDVR(DatiTiltLinkHDVR,... + ErrTiltLinkHDVR,NodoTiltLinkHDVR,Ndatidespike,rHDVR,Unit,FileName); + % Conversione dei dati grezzi + [accHDVR,magHDVR,ris_acc_HDVR,ris_mag_HDVR,tempHDVR,ErrTiltLinkHDVR] = ... + conv_grezziHDVR(rHDVR,accHDVR,magHDVR,tempHDVR,DCalHDVRTot,tolleranzaAcc,... + NodoTiltLinkHDVR,ErrTiltLinkHDVR,IDcentralina,DTcatena,FileName); + % Calcolo medie + [ACCdef_HDVR,MAGdef_HDVR,ARRAYdateHDVR,ACCdefRisHDVR,MAGdefRisHDVR] = MediaDati_HDVR(... + accHDVR,magHDVR,TimeHDVR,ris_acc_HDVR,ris_mag_HDVR,tolleranzaAcc,... + tolleranzaMag,NdatiMedia,FileName); + else + ARRAYdateHDVR = []; + ACCdefRisHDVR = []; + MAGdefRisHDVR = []; + text = 'There are not data to convert for Tilt Link HD VR'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiTiltLinkHDVR + clear TimeHDVR + clear accHDVR + clear magHDVR + clear DCalHDVRTot + clear ris_acc_HDVR + clear ris_mag_HDVR + + % ---Tilt Link H--- + if yesTLH == 1 + % definizione dei dati + [TimeTLH,accTLH,tempTLH,ErrTiltLinkH] = defDatiTLH(DatiTiltLinkH,... + ErrTiltLinkH,Ndatidespike,rTLH,MEMS,FileName); + % Conversione dei dati grezzi + [accTLH,ris_acc_TLH,tempTLH,ErrTiltLinkH] = conv_grezziTLH(rTLH,... + accTLH,tempTLH,DCalTLHTot,tolleranzaAcc,MEMS,ErrTiltLinkH,FileName); + % Calcolo medie + [ACCdef_TLH,ARRAYdateTLH,ACCdefRis_TLH,TempDef_TLH] = MediaDati_TLH... + (accTLH,TimeTLH,ris_acc_TLH,tempTLH,tolleranzaAcc,NdatiMedia,FileName); + else + ARRAYdateTLH = []; + text = 'There are not data to convert for Tilt Link H'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiTiltLinkH + clear TimeTLH + clear accTLH + clear tempTLH + clear DCalTLHTot + clear ris_acc_TLH + + % ---Tilt Link HR V--- + if yesTLHR == 1 % attiva l'elaborazione dei Tilt Link HR + [TimeTLHR,angTLHR,tempTLHR,ErrTiltLinkHR] = defDatiTLHR(... + DatiTiltLinkHR,ErrTiltLinkHR,Ndatidespike,MEMS,rTLHR,NodoTiltLinkHR,... + NuovoZeroTLHR,IDcentralina,DTcatena,Unit,FileName); + % Conversione dei dati grezzi + [angTLHR,tempTLHR] = conv_grezziTLHR(angTLHR,tempTLHR,DCalTLHRTot,... + rTLHR,FileName); + % Calcolo medie + [ANGdef_TLHR,ARRAYdateTLHR,TempDef_TLHR] = MediaDati_TLHR(angTLHR,... + TimeTLHR,tempTLHR,NdatiMedia,FileName); + else + ARRAYdateTLHR = []; + text = 'There are not data to convert for Tilt Link HR V'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiTiltLinkHR + clear TimeTLHR + clear angTLHR + clear tempTLHR + clear DCalTLHRTot + clear tempTLHR + + % ---In Place Link HR--- + if yesIPLHR == 1 + [TimeIPLHR,angIPLHR,tempIPLHR,ErrInPlaceLinkHR] = defDatiIPLHR(... + DatiInPlaceLinkHR,ErrInPlaceLinkHR,Ndatidespike,rIPLHR,NodoInPlaceLinkHR,... + NuovoZeroIPLHR,IDcentralina,DTcatena,Unit,FileName); + % Conversione dei dati grezzi + [angIPLHR,tempIPLHR] = conv_grezziIPLHR(angIPLHR,tempIPLHR,DCalIPLHRTot,... + NodoInPlaceLinkHR,rIPLHR,FileName); + % Calcolo medie + [ANGdef_IPLHR,ARRAYdateIPLHR,TempDef_IPLHR] = MediaDati_IPLHR(angIPLHR,... + TimeIPLHR,tempIPLHR,NdatiMedia,FileName); + else + ARRAYdateIPLHR = []; + text = 'There are not data to convert for In Place Link HR'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiInPlaceLinkHR + clear TimeIPLHR + clear angIPLHR + clear tempIPLHR + clear DCalIPLHRTot + clear tempIPLHR + + % ---Tilt Link HR H--- + if yesTLHRH == 1 % attiva l'elaborazione dei Tilt Link HR H + [TimeTLHRH,angTLHRH,tempTLHRH,ErrTiltLinkHRH] = defDatiTLHRH(... + DatiTiltLinkHRH,ErrTiltLinkHRH,Ndatidespike,MEMS,rTLHRH,NodoTiltLinkHRH,... + NuovoZeroTLHRH,IDcentralina,DTcatena,FileName); + % Conversione dei dati grezzi + [angTLHRH,tempTLHRH] = conv_grezziTLHRH(angTLHRH,tempTLHRH,DCalTLHRHTot,... + rTLHRH,FileName); + % Calcolo medie + [ANGdef_TLHRH,ARRAYdateTLHRH,TempDef_TLHRH] = MediaDati_TLHRH(angTLHRH,... + TimeTLHRH,tempTLHRH,NdatiMedia,FileName); + else + ARRAYdateTLHRH = []; + text = 'There are not data to convert for Tilt Link HR H'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiTiltLinkHRH + clear TimeTLHRH + clear angTLHRH + clear tempTLHRH + clear DCalTLHRHTot + clear tempTLHRH + + % ---Piezo Link--- + if yesPL == 1 % attiva l'elaborazione dei Piezo Link + [TimePL,ADCPiez,tempPiez,ErrPiezoLink] = defDatiPL(DatiPiezoLink,ErrPiezoLink,rPL,FileName); + % Conversione dei dati grezzi + [DatiPiez,DatiPiezT,~] = conv_grezziPL(rPL,ADCPiez,tempPiez,DCalPLTot,... + NodoPiezoLink,NuovoZeroPL,IDcentralina,DTcatena,FileName); + % Calcolo medie + [PiezDef,PiezDefT,ARRAYdatePL] = MediaDati_PL(DatiPiez,DatiPiezT,TimePL,NdatiMediaP,FileName); + else + ARRAYdatePL = []; + text = 'There are not data to convert for Piezo Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiPiezoLink + clear TimePL + clear ADCPiez + clear tempPiez + clear DatiPiez + clear DatiPiezT + + % ---Baro Link--- + % Attivazione/disattivazione elaborazione e definizione dati + if strcmp(NodoPiezoLink(1,4),'VW kPa') == 1 || strcmp(NodoPiezoLink(1,4),'VW kg/cm2') == 1 + BaroDef = []; + ARRAYdateBL = []; + text = 'There are not data to convert for Baro Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + elseif yesBL == 1 || yesPL == 1 % attiva l'elaborazione dei Baro Link + [TimeBL,ADCBaro,tempBaro,ErrBaroLink] = defDatiBL(DatiBaroLink,ErrBaroLink,rBL,FileName); + % Conversione dei dati grezzi + if yesBL == 0 % Recupero il barometro corretto + [rB,~] = size(Barometri); + for b = 1:rB + if strcmp(Barometri(b,1),Barometro(1,1)) == 1 + DCalBLTot = DCalBLTot(b,:); + rBL = 1; + break + end + end + end + [DatiBaro,DatiBaroT] = conv_grezziBL(rBL,ADCBaro,tempBaro,DCalBLTot,FileName); + % Calcolo medie + [BaroDef,BaroDefT,ARRAYdateBL] = MediaDati_BL(DatiBaro,DatiBaroT,TimeBL,NdatiMediaP,FileName); + else + BaroDef = []; + ARRAYdateBL = []; + text = 'There are not data to convert for Baro Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiBaroLink + clear TimeBL + clear ADCBaro + clear tempBaro + clear DCalBLTot + clear DatiBaro + clear DatiBaroT + + % ---Klino Link--- + if yesKL == 1 % attiva l'elaborazione dei Klino Link + [TimeKL,ang_KL,temp_KL,ErrKlinoLink] = defDatiKL(DatiKlinoLink,... + ErrKlinoLink,NodoKlinoLink,MEMS,Ndatidespike,rKL,FileName); + % Conversione dei dati grezzi + [ang_KL,temp_KL,ris_acc,ErrKlinoLink] = conv_grezziKL(ang_KL,temp_KL,... + rKL,DCalKLTot,IDcentralina,DTcatena,NodoKlinoLink,ErrKlinoLink,FileName); + % Medie + [ANGdefKL,TdefKL,ARRAYdateKL] = MediaDati_KL(ang_KL,temp_KL,TimeKL,NdatiMedia,FileName); + else + ANGdefKL = []; + TdefKL = []; + ARRAYdateKL = []; + text = 'There are not data to convert for Klino Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiKlinoLink + clear TimeKL + clear ang_KL + clear temp_KL + clear DCalKLTot + clear ANGoutKL + clear TEMPoutKL + clear TimeRcKL + + % ---Klino Link HR--- + if yesKLHR == 1 % attiva l'elaborazione dei Klino Link HR + [TimeKLHR,ang_KLHR,temp_KLHR,ErrKlinoLinkHR] = defDatiKLHR(... + DatiKlinoLinkHR,ErrKlinoLinkHR,Ndatidespike,rKLHR,NodoKlinoLinkHR,... + NuovoZeroKLHR,IDcentralina,DTcatena,FileName); + % Conversione dei dati grezzi + [ang_KLHR,temp_KLHR] = conv_grezziKLHR(ang_KLHR,temp_KLHR,rKLHR,... + DCalKLHRTot,FileName); + % Calcolo medie + [ANGdefKLHR,TdefKLHR,ARRAYdateKLHR] = MediaDati_KLHR(ang_KLHR,... + temp_KLHR,TimeKLHR,NdatiMedia,FileName); + else + ANGdefKLHR = []; + TdefKLHR = []; + ARRAYdateKLHR = []; + text = 'There are not data to convert for Klino Link HR'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiKlinoLinkHR + clear TimeKLHR + clear ang_KLHR + clear temp_KLHR + clear DCalKLHRTot + + % ---Load Link--- + if yesLL == 1 % attiva l'elaborazione dei Load Link + [TimeLL,ADCLoad,ErrLoadLink] = defDatiLL(DatiLoadLink,ErrLoadLink,Ndatidespike,rLL,FileName); + % Conversione dei dati grezzi + DatiLoad = conv_grezziLL(ADCLoad,DCalLLTot,NodoLoadLink,FileName); + % Calcolo medie + [LoadDef,ARRAYdateLL] = MediaDati_LL(DatiLoad,TimeLL,NdatiMedia,FileName); + else + ARRAYdateLL = []; + text = 'There are not data to convert for Load Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiLoadLink + clear TimeLL + clear ADCLoad + clear DCalLLTot + clear DatiLoad + clear TimeLL + + % ---Rain Link--- + if yesRL == 1 % attiva l'elaborazione dei Klino Link + [TimeRL,val_RL,ErrRainLink] = defDatiRL(DatiRainLink,ErrRainLink,FileName); + % Conversione dei dati grezzi + val_RL = conv_grezziRL(val_RL,rRL,DCalRLTot,NodoRainLink,FileName); + % Calcolo media + [Dati_RL,ARRAYdateRL] = MediaDati_RL(val_RL,TimeRL,FileName); + else + ARRAYdateRL = []; + Rain = []; + RainCum = []; + text = 'There are not data to convert for Rain Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiRainLink + clear TimeRL + clear val_RL + clear DCalRLTot + + % ---Therm Link--- + if yesThL == 1 + [TimeThL,val_ThL,ErrThermLink] = defDatiThL(DatiThermLink,ErrThermLink,rThL,FileName); + % Conversione dei dati grezzi + val_ThL = conv_grezziThL(val_ThL,rThL,DCalThLTot,FileName); + % Calcolo medie + [Dati_ThL,ARRAYdateThL] = MediaDati_ThL(val_ThL,TimeThL,NdatiMedia,FileName); + else + ARRAYdateThL = []; + Dati_ThL = []; + text = 'There are not data to convert for Therm Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiThermLink + clear TimeThL + clear val_ThL + clear DCalThLTot + + % ---PT100 Link--- + if yesPT100 == 1 + [TimePT100,val_PT100,ErrPT100Link] = defDatiPT100(DatiPT100Link,ErrPT100Link,FileName); + % Conversione dei dati grezzi + val_PT100 = conv_grezziPT100(val_PT100,rPT100,DCalPT100Tot,FileName); + % Calcolo medie + [Dati_PT100,ARRAYdatePT100] = MediaDati_PT100(val_PT100,TimePT100,FileName); + else + ARRAYdatePT100 = []; + Dati_PT100 = []; + text = 'There are not data to convert for PT100 Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiPT100Link + clear TimePT100 + clear val_PT100 + clear DCalPT100Tot + + % ---Weir Link--- + if yesWL == 1 + [TimeWL,lev_WL,temp_WL,ErrWeirLink] = defDatiWL(DatiWeirLink,... + DatiNTCWeirLink,ErrWeirLink,FileName); + % Conversione dei dati grezzi + [lev_WL,TdefWL,ErrWeirLink] = conv_grezziWL(lev_WL,temp_WL,rWL,... + DCalWLTot,Tmax,Tmin,NodoWeirLink,ErrWeirLink,datainiWL,TimeWL,... + IDcentralina,DTcatena,FileName); + % Media + [Dati_WL,ARRAYdateWL] = MediaDati_WL(lev_WL,TimeWL,FileName); + else + ARRAYdateWL = []; + Dati_WL = []; + TdefWL = []; + text = 'There are not data to convert for Weir Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + + % ---Pendulum--- + if yesPE == 1 + [TimePE,Def_PE,ErrPendulum] = defDatiPE(DatiPendulum,ErrPendulum,FileName); + % Conversione dei dati grezzi + Def_PE = conv_grezziPE(Def_PE,rPE,DCalPETot,NodoPendulum,FileName); + % Media + [Dati_PE,ARRAYdatePE] = MediaDati_PE(Def_PE,TimePE,NdatiMedia,FileName); + else + ARRAYdatePE = []; + Dati_PE = []; + text = 'There are not data to convert for Pendulum'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + + %% Parte di elaborazione + + % --- Analisi Tilt Link V --- + if yesTL == 1 + if struct == 1 % Vertical Array Structure + % ...... + elseif triax == 1 % Analisi ai Quaternioni + [X,Y,Z,Xlocal,Ylocal,Zlocal,HShift,HShift_local,AlfaX,AlfaY,Azimuth,... + Speed_local,Speed,Acceleration_local,Acceleration,TempDef_TL,ARRAYdateTL,... + ErrTiltLink,MAGdef_TL] = triax_TL(IDcentralina,DTcatena,rTL,ACCdef_TL,... + ACCdefRis_TL,MAGdef_TL,TempDef_TL,SpeTL,PsTL,NodoTiltLink,tolleranzaAcc,... + tolleranzaMag,DatiElabTiltLink,segnoNS,segnoEO,MEMS,Ndevst,Wdevst,ARRAYdateTL,... + Tmax,Tmin,NuovoZeroTL,NdatiMedia,Ndatidespike,ErrTiltLink,margine,datainiTL,FileName); + elseif biax == 1 % Analisi semplificata 2D + [X,Y,Z,Xlocal,Ylocal,Zlocal,HShift,HShift_local,AlfaX,AlfaY,Azimuth,... + Speed_local,Speed,Acceleration_local,Acceleration,TempDef_TL,... + ARRAYdateTL,ErrTiltLink,MAGdef_TL] = biax_TL(IDcentralina,DTcatena,rTL,... + ACCdef_TL,ACCdefRis_TL,MAGdef_TL,TempDef_TL,SpeTL,PsTL,... + NodoTiltLink,tolleranzaAcc,tolleranzaMag,DatiElabTiltLink,segnoNS,segnoEO,... + Ndevst,Wdevst,ARRAYdateTL,Tmax,Tmin,NuovoZeroTL,NdatiMedia,Ndatidespike,... + ErrTiltLink,margine,date,datainiTL,FileName); + end + else + [X,Y,Z,Xlocal,Ylocal,Zlocal,HShift,HShift_local,Azimuth,TempDef_TL,Speed_local,... + Speed,Acceleration_local,Acceleration,AlfaX,AlfaY] = matrici_vuote_TL(FileName); + end + clear ACCdefRis_TL + clear SpeTL + clear PsTL + clear DatiElabTiltLink + clear NuovoZeroTL + % fine elaborazione Tilt Link V + + % --- Analisi Tilt Link H --- + if yesTLH == 1 + [Y_TLH,Z_TLH,Xlocal_TLH,Ylocal_TLH,Zlocal_TLH,AlfaX_TLH,AlfaY_TLH,TempDef_TLH,... + Speed_TLH,Speed_local_TLH,Acceleration_TLH,Acceleration_local_TLH,ARRAYdateTLH,... + ErrTiltLinkH] = biax_TLH(IDcentralina,DTcatena,rTLH,ACCdef_TLH,ACCdefRis_TLH,... + TempDef_TLH,SpeTLH,PsTLH,tolleranzaAcc,DatiElabTiltLinkH,Ndevst,Wdevst,ARRAYdateTLH,... + NuovoZeroTLH,Tmax,Tmin,NodoTiltLinkH,NdatiMedia,Ndatidespike,Traversine,ErrTiltLinkH,... + margine,FileName); + else + [Y_TLH,Z_TLH,Xlocal_TLH,Ylocal_TLH,Zlocal_TLH,AlfaX_TLH,AlfaY_TLH,TempDef_TLH,... + Speed_TLH,Speed_local_TLH,Acceleration_TLH,Acceleration_local_TLH] = ... + matrici_vuote_TLH(FileName); + end + clear ACCdef_TLH + clear ACCdefRis_TLH + clear SpeTLH + clear PsTLH + clear Ndevst_TLH + clear Wdevst_TLH + clear NuovoZeroTLH + % fine elaborazione Tilt Link H + + % --- Analisi In Place Link --- + if yesIPL == 1 + if triax == 1 + [X_IPL,Y_IPL,Z_IPL,Xlocal_IPL,Ylocal_IPL,Zlocal_IPL,HShift_IPL,... + HShift_local_IPL,AlfaX_IPL,AlfaY_IPL,Azimuth_IPL,Speed_local_IPL,... + Speed_IPL,Acceleration_local_IPL,Acceleration_IPL,TempDef_IPL,... + ARRAYdateIPL,ErrInPlaceLink,MAGdef_IPL] = triax_IPL(IDcentralina,... + DTcatena,rIPL,ACCdef_IPL,ACCdefRis_IPL,MAGdef_IPL,TempDef_IPL,SpeIPL,PsIPL,... + NodoInPlaceLink,tolleranzaAcc,tolleranzaMag,DatiElabInPlaceLink,... + segnoNS,segnoEO,MEMS,Ndevst,Wdevst,ARRAYdateIPL,NuovoZeroIPL,Tmax,Tmin,... + NdatiMedia,Ndatidespike,ErrInPlaceLink,Corr_Azimuth,margine,datainiIPL,FileName); + elseif biax == 1 + [X_IPL,Y_IPL,Z_IPL,Xlocal_IPL,Ylocal_IPL,Zlocal_IPL,HShift_IPL,HShift_local_IPL,... + AlfaX_IPL,AlfaY_IPL,Azimuth_IPL,Speed_local_IPL,Speed_IPL,Acceleration_local_IPL,... + Acceleration_IPL,TempDef_IPL,ARRAYdateIPL,ErrInPlaceLink] = biax_IPL(IDcentralina,... + DTcatena,rIPL,ACCdef_IPL,TempDef_IPL,SpeIPL,PsIPL,NodoInPlaceLink,tolleranzaAcc,... + DatiElabInPlaceLink,segnoNS,segnoEO,MEMS,Ndevst,Wdevst,ARRAYdateIPL,NuovoZeroIPL,... + Tmax,Tmin,NdatiMedia,Ndatidespike,ErrInPlaceLink,Corr_Azimuth,Inverti,margine,datainiIPL,FileName); + end + else + [X_IPL,Y_IPL,Z_IPL,Xlocal_IPL,Ylocal_IPL,Zlocal_IPL,HShift_IPL,... + HShift_local_IPL,Azimuth_IPL,TempDef_IPL,Speed_local_IPL,Speed_IPL,... + Acceleration_local_IPL,Acceleration_IPL,AlfaX_IPL,AlfaY_IPL,ACCdef_IPL,... + MAGdef_IPL] = matrici_vuote_IPL(FileName); + end + clear segnoNS + clear segnoEO + clear ACCdefRis_IPL + clear SpeIPL + clear PsIPL + clear DatiElabInPlaceLink + clear NuovoZeroIPL + % fine elaborazione In Place Link + +% --- Analisi Tilt Link HD --- + if yesHD == 1 + if cell2mat(NodoTiltLinkHD(1,5)) == 1 % Analisi ai Quaternioni - USO i Magnetometri + [X_HD,Y_HD,Z_HD,Xlocal_HD,Ylocal_HD,Zlocal_HD,HShift_HD,HShift_local_HD,... + AlfaX_HD,AlfaY_HD,Azimuth_HD,Speed_local_HD,Speed_HD,Acceleration_local_HD,... + Acceleration_HD,tempHD,ARRAYdateHD,ErrTiltLinkHD] = triax_HD(rHD,... + ACCdef_HD,ACCdefRisHD,MAGdef_HD,tempHD,SpeHD,PsHD,NodoTiltLinkHD,tolleranzaAcc,... + tolleranzaMag,DatiElabTiltLinkHD,Ndevst,Wdevst,ARRAYdateHD,Tmax,Tmin,NuovoZeroHD,... + NdatiMedia,Ndatidespike,ErrTiltLinkHD,margine,datainiHD,MEMS,IDcentralina,DTcatena,FileName); + else % Analisi semplificata 2D + [X_HD,Y_HD,Z_HD,Xlocal_HD,Ylocal_HD,Zlocal_HD,HShift_HD,HShift_local_HD,... + AlfaX_HD,AlfaY_HD,Azimuth_HD,Speed_local_HD,Speed_HD,Acceleration_local_HD,... + Acceleration_HD,tempHD,ARRAYdateHD,ErrTiltLinkHD] = biax_HD(rHD,... + ACCdef_HD,ANGdef_HD,ACCdefRisHD,tempHD,SpeHD,PsHD,NodoTiltLinkHD,tolleranzaAcc,... + DatiElabTiltLinkHD,Ndevst,Wdevst,ARRAYdateHD,Tmax,Tmin,NuovoZeroHD,... + NdatiMedia,Ndatidespike,ErrTiltLinkHD,margine,Corr_Azimuth,datainiHD,IDcentralina,DTcatena,FileName); + end + else + [X_HD,Y_HD,Z_HD,Xlocal_HD,Ylocal_HD,Zlocal_HD,HShift_HD,HShift_local_HD,... + Azimuth_HD,tempHD,Speed_local_HD,Speed_HD,Acceleration_local_HD,Acceleration_HD,... + AlfaX_HD,AlfaY_HD] = matrici_vuote_HD(FileName); + end + clear SpeHD + clear PsHD + clear DatiElabTiltLinkHD + clear NuovoZeroHD +% fine elaborazione Tilt Link HD + +% --- Analisi Tilt Link HD VR --- + if yesHDVR == 1 + if cell2mat(NodoTiltLinkHDVR(1,5)) == 1 % Analisi ai Quaternioni - USO i Magnetometri + [X_HDVR,Y_HDVR,Z_HDVR,Xlocal_HDVR,Ylocal_HDVR,Zlocal_HDVR,HShift_HDVR,HShift_local_HDVR,... + AlfaX_HDVR,AlfaY_HDVR,Azimuth_HDVR,Speed_local_HDVR,Speed_HDVR,Acceleration_local_HDVR,... + Acceleration_HDVR,tempHDVR,ARRAYdateHDVR,ErrTiltLinkHDVR] = triax_HDVR(rHDVR,... + ACCdef_HDVR,ACCdefRisHDVR,MAGdef_HDVR,tempHDVR,SpeHDVR,PsHDVR,NodoTiltLinkHDVR,tolleranzaAcc,... + tolleranzaMag,DatiElabTiltLinkHDVR,Ndevst,Wdevst,ARRAYdateHDVR,Tmax,Tmin,NuovoZeroHDVR,... + NdatiMedia,Ndatidespike,ErrTiltLinkHDVR,margine,datainiHDVR,MEMS,IDcentralina,DTcatena,FileName); + elseif biax == 1 % Analisi semplificata 2D + [X_HDVR,Y_HDVR,Z_HDVR,Xlocal_HDVR,Ylocal_HDVR,Zlocal_HDVR,HShift_HDVR,HShift_local_HDVR,... + AlfaX_HDVR,AlfaY_HDVR,Azimuth_HDVR,Speed_local_HDVR,Speed_HDVR,Acceleration_local_HDVR,... + Acceleration_HDVR,tempHDVR,ARRAYdateHDVR,ErrTiltLinkHDVR] = biax_HDVR(rHDVR,... + ACCdef_HDVR,ANGdef_HDVR,ACCdefRisHDVR,tempHDVR,SpeHDVR,PsHDVR,NodoTiltLinkHDVR,tolleranzaAcc,... + DatiElabTiltLinkHDVR,Ndevst,Wdevst,ARRAYdateHDVR,Tmax,Tmin,NuovoZeroHDVR,... + NdatiMedia,Ndatidespike,ErrTiltLinkHDVR,margine,Corr_Azimuth,datainiHDVR,IDcentralina,DTcatena,FileName); + end + else + [X_HDVR,Y_HDVR,Z_HDVR,Xlocal_HDVR,Ylocal_HDVR,Zlocal_HDVR,HShift_HDVR,HShift_local_HDVR,... + Azimuth_HDVR,tempHDVR,Speed_local_HDVR,Speed_HDVR,Acceleration_local_HDVR,Acceleration_HDVR,... + AlfaX_HDVR,AlfaY_HDVR] = matrici_vuote_HDVR(FileName); + end + clear SpeHDVR + clear PsHDVR + clear DatiElabTiltLinkHDVR + clear NuovoZeroHDVR + clear Ndevst + clear Wdevst +% fine elaborazione Tilt Link HD VR + + % --- Analisi Tilt Link HR V --- + if yesTLHR == 1 + [X_HR,Y_HR,Z_HR,Xlocal_HR,Ylocal_HR,Zlocal_HR,HShift_HR,HShift_local_HR,... + AlfaX_HR,AlfaY_HR,Azimuth_HR,Speed_local_HR,Speed_HR,Acceleration_local_HR,... + Acceleration_HR,TempDef_TLHR,ARRAYdateTLHR,ErrTiltLinkHR] = biax_TLHR(IDcentralina,... + DTcatena,rTLHR,rTL,ANGdef_TLHR,ACCdef_TL,MAGdef_TL,TempDef_TLHR,SpeTLHR,... + PsTLHR,yesTL,yesTLHR3D,NodoTiltLinkHR,NodoTiltLink,NodoTiltLinkHR3D,... + DatiElabTiltLinkHR,segnoNS_HR,segnoEO_HR,Ndevst_HR,Wdevst_HR,ARRAYdateTLHR,... + NuovoZeroTLHR,NdatiMedia,Ndatidespike,allineato,ErrTiltLinkHR,Tmax,Tmin,datainiTLHR,... + margine,date,FileName); + else + [X_HR,Y_HR,Z_HR,Xlocal_HR,Ylocal_HR,Zlocal_HR,AlfaX_HR,AlfaY_HR,... + TempDef_TLHR,HShift_HR,HShift_local_HR,Azimuth_HR,Speed_HR,Speed_local_HR,... + Acceleration_HR,Acceleration_local_HR] = matrici_vuote_TLHR(FileName); + end + % Faccio Pulizia di Variabili + clear ANGdefTLHR + clear ACCdef + clear MAGdef + clear SpeTLHR + clear PsTLHR + clear DatiElabTiltLinkHR + clear DatiElabTiltLink + clear NuovoZeroTLHR + clear ACCdef_TL + clear MAGdef_TL + % fine elaborazione Tilt Link HR V + + % --- Analisi Tilt Link HR H --- + if yesTLHRH == 1 + [Y_TLHRH,Z_TLHRH,Ylocal_TLHRH,Zlocal_TLHRH,AlfaX_TLHRH,AlfaY_TLHRH,... + TempDef_TLHRH,Speed_TLHRH,Speed_local_TLHRH,Acceleration_TLHRH,... + Acceleration_local_TLHRH,ARRAYdateTLHRH,ErrTiltLinkHRH] = biax_TLHRH(... + IDcentralina,DTcatena,NodoTiltLinkHRH,rTLHRH,ANGdef_TLHRH,TempDef_TLHRH,SpeTLHRH,PsTLHRH,... + DatiElabTiltLinkHRH,Ndevst_HR,Wdevst_HR,ARRAYdateTLHRH,NuovoZeroTLHRH,NdatiMedia,... + Ndatidespike,ErrTiltLinkHRH,Tmax,Tmin,datainiTLHRH,margine,FileName); + else + [Y_TLHRH,Z_TLHRH,Ylocal_TLHRH,Zlocal_TLHRH,AlfaX_TLHRH,AlfaY_TLHRH,TempDef_TLHRH,... + Speed_TLHRH,Speed_local_TLHRH,Acceleration_TLHRH,Acceleration_local_TLHRH] = ... + matrici_vuote_TLHRH(FileName); + end + % Faccio Pulizia di Variabili + % Faccio Pulizia di Variabili + clear ANGdef_TLHRH + clear SpeTLHRH + clear PsTLHRH + clear DatiElabTiltLinkHRH + clear Ndevst_TLHRH + clear Wdevst_TLHRH + clear NuovoZeroTLHRH + % fine elaborazione Tilt Link HR H + + % --- Analisi In Place Link HR --- + if yesIPLHR == 1 + [X_IPLHR,Y_IPLHR,Z_IPLHR,Xlocal_IPLHR,Ylocal_IPLHR,Zlocal_IPLHR,... + HShift_IPLHR,HShift_local_IPLHR,AlfaX_IPLHR,AlfaY_IPLHR,Azimuth_IPLHR,... + Speed_local_IPLHR,Speed_IPLHR,Acceleration_local_IPLHR,Acceleration_IPLHR,... + TempDef_IPLHR,ARRAYdateIPLHR,ErrInPlaceLinkHR] = biax_IPLHR(IDcentralina,... + DTcatena,rIPLHR,rIPL,ANGdef_IPLHR,ACCdef_IPL,MAGdef_IPL,TempDef_IPLHR,... + SpeIPLHR,PsIPLHR,yesIPL,yesIPLHR3D,NodoInPlaceLinkHR,NodoInPlaceLink,... + NodoInPlaceLinkHR3D,DatiElabInPlaceLinkHR,segnoNS_HR,segnoEO_HR,Ndevst_HR,... + Wdevst_HR,ARRAYdateIPLHR,NuovoZeroIPLHR,NdatiMedia,Ndatidespike,allineato,... + Tmax,Tmin,datainiIPLHR,ErrInPlaceLinkHR,Corr_Azimuth,margine,FileName); + else + [X_IPLHR,Y_IPLHR,Z_IPLHR,Xlocal_IPLHR,Ylocal_IPLHR,Zlocal_IPLHR,... + HShift_IPLHR,HShift_local_IPLHR,Azimuth_IPLHR,AlfaX_IPLHR,AlfaY_IPLHR,... + TempDef_IPLHR,Speed_IPLHR,Speed_local_IPLHR,Acceleration_IPLHR,... + Acceleration_local_IPLHR] = matrici_vuote_IPLHR(FileName); + end + % Faccio Pulizia di Variabili + clear ANGdefIPLHR + clear ACCdef_TLHR + clear MAGdef_TLHR + clear SpeIPLHR + clear PsIPLHR + clear tolleranzaMag + clear DatiElabInPlaceLinkHR + clear DatiElabInPlaceLink + clear segnoNS_HR + clear segnoEO_HR + clear Ndevst_HR + clear Wdevst_HR + clear NuovoZeroIPLHR + clear allineato + clear ACCdef_IPL + clear MAGdef_IPL + % fine elaborazione In Place Link HR + + % --- Analisi Piezo Link --- + if yesPL == 1 + % if strcmp(NodoPiezoLink(1,4),'VW kPa') == 1 + % C = DCalPLTot(:,3); + % if C == 0 % Identifica i piezometri di Geosense + % for p=1:rPL + % PiezDef(:,p) = PiezDef(:,p)+RIF_PL(p,1)'; + % end + % end + % end + [Livello,PiezDef,PiezDefT,ErrPiezoLink,ARRAYdatePL] = Piezo(PiezDef,PiezDefT,... + BaroDef,ARRAYdatePL,NuovoZeroPL,NdatiMediaP,Ndatidespike,NodoPiezoLink,ErrPiezoLink,rPL,... + Anchor_real,marginePiezo,FileName); + else + [Livello,PiezDef,PiezDefT] = matrici_vuote_PL(FileName); + end + clear NuovoZeroPL + clear NodoPiezoLink + clear Anchor_real + clear DCalPLTot + + % --- Analisi Baro Link --- + if yesBL == 1 + [BaroDef,BaroDefT,ARRAYdateBL,ErrBaroLink] = Baro(BaroDef,BaroDefT,... + ARRAYdateBL,NuovoZeroBL,NdatiMediaP,Ndatidespike,ErrBaroLink,rBL,... + marginePiezo,FileName); + else + [BaroDef,BaroDefT] = matrici_vuote_BL(FileName); + end + clear NuovoZeroBL + clear NdatiMediaP + clear marginePiezo + clear NodoBaroLink + + % --- Analisi Load Link --- + if yesLL == 1 + [DatiLoad,ErrLoadLink,ARRAYdateLL] = loadcell(LoadDef,ErrLoadLink,... + ARRAYdateLL,NuovoZeroLL,NdatiMedia,Ndatidespike,margine,FileName); + else + DatiLoad = []; + end + clear LoadDef + clear NuovoZeroLL + clear NodoLoadLink + + %--- Analisi Klino Link --- + if yesKL == 1 + [ANGdefKL,TdefKL,ErrKlinoLink,ARRAYdateKL] = Klino(ANGdefKL,TdefKL,... + ARRAYdateKL,ErrKlinoLink,NuovoZeroKL,NdatiMedia,Ndatidespike,ris_acc,tolleranzaAcc,... + Tmax,Tmin,datainiKL,rKL,IDcentralina,DTcatena,margine,NodoKlinoLink,FileName); + end + clear NuovoZeroKL + clear ris_acc + clear tolleranzaAcc + + %--- Analisi Klino Link HR --- + if yesKLHR == 1 + [ANGdefKLHR,TdefKLHR,ErrKlinoLinkHR,ARRAYdateKLHR] = KlinoHR(ANGdefKLHR,... + TdefKLHR,ARRAYdateKLHR,ErrKlinoLinkHR,NuovoZeroKLHR,NodoKlinoLinkHR,NdatiMedia,... + Ndatidespike,Tmax,Tmin,datainiKLHR,rKLHR,IDcentralina,DTcatena,margine,FileName); + end + clear NuovoZeroKLHR + clear NodoKlinoLinkHR + + %--- Analisi Rain Link --- + if yesRL == 1 + [Rain,RainCum,ARRAYdateRL,ErrRainLink] = CalcoloRain(Dati_RL,ARRAYdateRL,... + DatiElabRainLink,NuovoZeroRL,NdatiMedia,ErrRainLink,rRL,margine,Unit,... + IDcentralina,conn,FileName); + end + clear NuovoZeroRL + clear Dati_RL + clear DatiElabRainLink + + %--- Analisi SPP Link --- + if yesSPP == 1 + [SPP,ARRAYdateSPP] = CalcoloSPP(DatiSPPLink,FileName); + else + SPP = []; + ARRAYdateSPP = []; + end + clear DatiSPPLink + + %--- Analisi Snow Link --- + if yesSL == 1 + [Snow,SnowCum,ARRAYdateSL,ErrSnowLink] = CalcoloSnow(DatiSnowLink,... + DatiElabSnowLink,NuovoZeroSL,NdatiMedia,ErrSnowLink,rSL,margine,Unit,... + IDcentralina,conn,FileName); + else + Snow = []; + SnowCum = []; + ARRAYdateSL = []; + ErrSnowLink = []; + end + clear DatiSnowLink + + %--- Analisi Therm Link --- + if yesThL == 1 + [Dati_ThL,ARRAYdateThL,ErrThermLink] = Therm(Dati_ThL,ARRAYdateThL,... + NuovoZeroThL,ErrThermLink,NdatiMedia,margine,Tmax,Tmin,datainiThL,... + IDcentralina,DTcatena,FileName); + end + clear NuovoZeroThL + clear NodoThermLink + + %--- Analisi PT100 Link --- + if yesPT100 == 1 + [Dati_PT100,ARRAYdatePT100,ErrPT100Link] = PT100(Dati_PT100,... + ARRAYdatePT100,NuovoZeroPT100,ErrPT100Link,NdatiMedia,margine,Tmax,Tmin,... + datainiPT100,IDcentralina,DTcatena,FileName); + end + clear NuovoZeroPT100 + clear NdatiMedia + clear margine + clear NodoPT100Link + + %--- Analisi Weir Link --- + if yesWL == 1 + therm = cell2mat(NodoWeirLink(:,6)); + for ii = 1:rWL + if therm(ii,1)==1 % è presente il termometro + Dati_WL(:,ii) = Dati_WL(:,ii)./(1-0.0002*TdefWL(:,ii)); % vale solo per correzione LINEARE + end + end + % Calcolo differenziali + NomeFile = ['' IDcentralina '-' DTcatena '-RifWL.csv']; + if NuovoZeroWL == 0 % prima elaborazione + csvwrite(NomeFile,Dati_WL(1,:)); + Dati_WL = Dati_WL(1,:) - Dati_WL; + else % Ci sono già dei dati elaborati + RIF = csvread(NomeFile); + Dati_WL = RIF - Dati_WL; + end + H = Dati_WL/1000; + [rH,cH] = size(H); + for i=1:rH + for j=1:cH + if H(i,j)<0 + H(i,j)=0; % Per la radice quadrata mi servono numeri positivi o nulli + end + end + end + h = H.^1.5; % passo in metri + b = larghezza + 2*base/altezza; + Portata = 1.86*b*h*1000; % litri/secondo + else + Portata = []; + end + + if strcmp(IDcentralina,'ID0070') == 1 && strcmp(DTcatenaRif,'DT0111 IPI') == 1 + DTcatena = 'DT0111 IPI'; + elseif strcmp(IDcentralina,'ID0071') == 1 && strcmp(DTcatenaRif,'DT0112 IPI') == 1 + DTcatena = 'DT0112 IPI'; + elseif strcmp(IDcentralina,'ID0072') == 1 && strcmp(DTcatenaRif,'DT0113 IPI') == 1 + DTcatena = 'DT0113 IPI'; + elseif strcmp(IDcentralina,'ID0073') == 1 && strcmp(DTcatenaRif,'DT0114 IPI') == 1 + DTcatena = 'DT0114 IPI'; + end + + %% Scrittura Database + database_write(catena,IDcentralina,DTcatena,... + X,Y,Z,Xlocal,Ylocal,Zlocal,HShift,HShift_local,AlfaX,AlfaY,Azimuth,TempDef_TL,... + Speed_local,Speed,Acceleration,Acceleration_local,ErrTiltLink,ARRAYdateTL,... + X_HD,Y_HD,Z_HD,Xlocal_HD,Ylocal_HD,Zlocal_HD,HShift_HD,HShift_local_HD,... + AlfaX_HD,AlfaY_HD,Azimuth_HD,tempHD,Speed_HD,Speed_local_HD,Acceleration_HD,... + Acceleration_local_HD,ErrTiltLinkHD,ARRAYdateHD,ACCdefRisHD,MAGdefRisHD,... + X_HDVR,Y_HDVR,Z_HDVR,Xlocal_HDVR,Ylocal_HDVR,Zlocal_HDVR,HShift_HDVR,HShift_local_HDVR,... + AlfaX_HDVR,AlfaY_HDVR,Azimuth_HDVR,tempHDVR,Speed_HDVR,Speed_local_HDVR,Acceleration_HDVR,... + Acceleration_local_HDVR,ErrTiltLinkHDVR,ARRAYdateHDVR,ACCdefRisHDVR,MAGdefRisHDVR,... + Y_TLH,Z_TLH,Xlocal_TLH,Ylocal_TLH,Zlocal_TLH,AlfaX_TLH,AlfaY_TLH,TempDef_TLH,Speed_TLH,Traversine,... + Speed_local_TLH,Acceleration_TLH,Acceleration_local_TLH,ErrTiltLinkH,ARRAYdateTLH,... + X_IPL,Y_IPL,Z_IPL,Xlocal_IPL,Ylocal_IPL,Zlocal_IPL,HShift_IPL,... + HShift_local_IPL,Azimuth_IPL,TempDef_IPL,Speed_local_IPL,Speed_IPL,... + Acceleration_local_IPL,Acceleration_IPL,AlfaX_IPL,AlfaY_IPL,ErrInPlaceLink,ARRAYdateIPL,... + X_HR,Y_HR,Z_HR,Xlocal_HR,Ylocal_HR,Zlocal_HR,HShift_HR,HShift_local_HR,... + AlfaX_HR,AlfaY_HR,Azimuth_HR,TempDef_TLHR,Speed_local_HR,Speed_HR,... + Acceleration_HR,Acceleration_local_HR,ErrTiltLinkHR,ARRAYdateTLHR,... + Y_TLHRH,Z_TLHRH,Ylocal_TLHRH,Zlocal_TLHRH,AlfaX_TLHRH,AlfaY_TLHRH,TempDef_TLHRH,Speed_TLHRH,... + Speed_local_TLHRH,Acceleration_TLHRH,Acceleration_local_TLHRH,ErrTiltLinkHRH,ARRAYdateTLHRH,... + X_IPLHR,Y_IPLHR,Z_IPLHR,Xlocal_IPLHR,Ylocal_IPLHR,Zlocal_IPLHR,HShift_IPLHR,... + HShift_local_IPLHR,AlfaX_IPLHR,AlfaY_IPLHR,TempDef_IPLHR,Azimuth_IPLHR,Speed_IPLHR,... + Speed_local_IPLHR,Acceleration_IPLHR,Acceleration_local_IPLHR,ErrInPlaceLinkHR,ARRAYdateIPLHR,... + Livello,PiezDef,PiezDefT,ErrPiezoLink,ARRAYdatePL,BaroDef,BaroDefT,ErrBaroLink,ARRAYdateBL,... + DatiLoad,ErrLoadLink,ARRAYdateLL,Rain,RainCum,ErrRainLink,ARRAYdateRL,SPP,ARRAYdateSPP,... + Snow,SnowCum,ErrSnowLink,ARRAYdateSL,ANGdefKL,TdefKL,ErrKlinoLink,ARRAYdateKL,NodoKlinoLink,... + ANGdefKLHR,TdefKLHR,ErrKlinoLinkHR,ARRAYdateKLHR,... + Dati_ThL,ErrThermLink,ARRAYdateThL,Dati_PT100,ErrPT100Link,ARRAYdatePT100,... + Dati_PE,ErrPendulum,ARRAYdatePE,Dati_WL,Portata,TdefWL,ErrWeirLink,NodoWeirLink,ARRAYdateWL,... + conn,FileName); + + %% Parte di lancio SW complementari + [yesATD,yesRSN,yesMusa] = SWSearch(idTool,conn,FileName); + try + if yesATD == 1 + rilancio = ['/usr/local/matlab_func/run_ATD_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 ' IDcentralina ' ' DTcatena '']; + status = system(rilancio); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'ATD relaunch operation executed with success'; + fprintf(fileID,fmt,text); + fprintf(fileID,fmt,status); + fclose(fileID); + end + if yesRSN == 1 + rilancio = ['/usr/local/matlab_func/run_RSN_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 ' IDcentralina ' ' DTcatena '']; + status = system(rilancio); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'RSN relaunch operation executed with success'; + fprintf(fileID,fmt,text); + fprintf(fileID,fmt,status); + fclose(fileID); + end + 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 +end + +%% Parte di allertamento + +if strcmp(Unit,'Nesa evolution') == 0 && strcmp(Unit,'SISGEO WR-GW-868')==0 + % ---Soglie imposte dal cliente--- + threshold(yesHD,ARRAYdateHD,Xlocal_HD,Ylocal_HD,X_HD,Y_HD,HShift_local_HD,... + HShift_HD,NodoTiltLinkHD,unitID,IDcentralina,DTcatena,conn,FileName); + + % ---Soglie da codice Matlab--- + alert_Levels(ARRAYdateIPL,HShift_local_IPL,Zlocal_IPL,NodoInPlaceLink,ARRAYdateRL,... + ARRAYdateKL,ANGdefKL,NodoKlinoLink,IDcentralina,DTcatena,conn,FileName); +end + +% 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); + +if strcmp(Unit,'Nesa evolution') == 0 && strcmp(Unit,'SISGEO WR-GW-868')==0 + + % Calcolo con Fukuzono - Inverso della Velocità + Users_Alert = []; + Users_SMS = []; + ini_CoV = 1; + activeIT = 1; + sms = 0; + Time_Of_Failure(IDcentralina,DTcatena,date,ARRAYdateTL,ARRAYdateIPL,... + yesTL,yesTLHR3D,yesIPL,yesIPLHR3D,rTL,rIPL,NodoTiltLink,NodoTiltLinkHR,... + NodoTiltLinkHR3D,NodoInPlaceLink,NodoInPlaceLinkHR,NodoInPlaceLinkHR3D,... + Mail,Users_Alert,Users_SMS,ini_CoV,activeIT,activeEN,sms,siteID,conn,FileName); + + % Attivazione di sistemi di allertamento + Siren(alarms,yesKL,yesKLHR,yesTL,yesIPL,datainiKL,tempoiniKL,datainiKLHR,tempoiniKLHR,... + datainiTL,tempoiniTL,datainiIPL,tempoiniIPL,ARRAYdateKL,ARRAYdateKLHR,ARRAYdateTL,ARRAYdateIPL,... + conn,date,time,FileName); +end + +% Controllo del Livello della Batteria +checkBattery(Batteria,Batteria_LoRa,IDcentralina,DTcatena,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 per una determinata SIM +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); + +close(conn) + +toc +text = ['Tilt calculation ended in ' num2str(toc)]; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +RC = 0; +end diff --git a/Tilt/Tilt_bck.m b/Tilt/Tilt_bck.m new file mode 100755 index 0000000..5b9f4aa --- /dev/null +++ b/Tilt/Tilt_bck.m @@ -0,0 +1,1040 @@ +function RC = Tilt(IDcentralina,DTcatena) +%%% Programma per l'elaborazione dei dati inclinometrici +%%% Versione 2.6 iniziata a maggio 21 + +tic + +RC = 1; %#ok +text = ['Elaboration of chain ' DTcatena ' of control unit ' IDcentralina ' started correctly']; +d = datestr(datetime,'yyyy_mm_dd'); +t = datestr(datetime,'HH_MM_SS'); +FileName = ['LogFile-' IDcentralina '-' DTcatena '-' d '-' t '.txt']; +outdat = fopen(FileName,'wt+'); %#ok +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +%% Parte generale + +% Associo ID company al relativo DB e definisco i parametri del Database +IDcompany = '1'; % DA INTEGRARE IN VERSIONI FUTURE +DB = database_definition(IDcompany,FileName); + +% Apro connessione al DB +dbname = cell2mat(DB{1,1}); +username = cell2mat(DB{2,1}); +password = cell2mat(DB{3,1}); +driver = cell2mat(DB{4,1}); +dburl = cell2mat(DB{5,1}); +conn = database(dbname, username, password, driver, dburl); +% conn = database('',,,'com.mysql.cj.jdbc.Driver','jdbc:mysql://servername:portnumber/databasename?serverTimezone=UTC&') + +% 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,NodoTiltLink,NodoTiltLinkHR,NodoTiltLinkH,NodoTiltLinkHRH,... + NodoTiltLinkHR3D,NodoTiltLinkHR3DH,NodoPiezoLink,NodoBaroLink,... + NodoThermLink,NodoAnalogLink,NodoLoadLink,NodoKlinoLink,NodoKlinoLinkHR,... + NodoRainLink,NodoPT100Link,NodoInPlaceLink,NodoInPlaceLinkHR,NodoInPlaceLinkHR3D,... + NodoWeirLink,NodoPendulum,NodoWind,rTL,rTLHR,rTLH,rTLHRH,~,~,rPL,rBL,... + rThL,rAL,rLL,rKL,rKLHR,rRL,rPT100,rIPL,rIPLHR,~,rWL,rPE,rWI] = 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 +[yesTL,yesTLHR,yesTLHR3D,yesTLH,yesTLHRH,yesTLHR3DH,yesPL,yesBL,... + yesThL,yesAL,yesLL,yesKL,yesKLHR,yesRL,yesPT100,yesIPL,yesIPLHR,yesIPLHR3D,... + yesWL,yesPE,NodoPiezoLink,yesWI] = YesNo(NodoTiltLink,NodoTiltLinkHR,NodoTiltLinkHR3D,... + NodoTiltLinkH,NodoTiltLinkHRH,NodoTiltLinkHR3DH,NodoPiezoLink,NodoBaroLink,... + NodoThermLink,NodoAnalogLink,NodoLoadLink,NodoKlinoLink,NodoKlinoLinkHR,... + NodoRainLink,NodoPT100Link,NodoInPlaceLink,NodoInPlaceLinkHR,NodoInPlaceLinkHR3D,... + NodoWeirLink,NodoPendulum,NodoWind,FileName); + +% funzione che definisce tutti i parametri importanti per elaborare un'installazione +[MEMS,biax,triax,struct,tolleranzaAcc,tolleranzaMag,segnoNS,... + segnoEO,Ndevst,Wdevst,segnoNS_HR,segnoEO_HR,Ndevst_HR,Wdevst_HR,allineato,... + NdatiMedia,NdatiMediaP,Ndatidespike,Anchor_real,Tmax,Tmin] = Parametri_Installazione... + (unitID,idTool,DTcatena,yesTL,yesTLHR,yesTLH,yesTLHRH,yesPL,yesThL,yesKL,yesKLHR,... + yesPT100,yesIPL,yesIPLHR,yesWL,conn,FileName); + +% funzione che ricostruisce segmenti di pertinenza etc +[SpeTL,PsTL,SpeTLHR,PsTLHR,SpeTLH,PsTLH,SpeTLHRH,PsTLHRH,SpeIPL,PsIPL,... + SpeIPLHR,PsIPLHR] = schemaSP(yesTL,yesTLHR,yesTLH,yesTLHRH,yesTLHR3D,yesTLHR3DH,... + yesIPL,yesIPLHR,yesIPLHR3D,NodoTiltLink,NodoTiltLinkHR,NodoTiltLinkHR3D,... + NodoTiltLinkH,NodoTiltLinkHRH,NodoTiltLinkHR3DH,NodoInPlaceLink,NodoInPlaceLinkHR,... + NodoInPlaceLinkHR3D,Anchor_real,rTL,rTLH,rTLHR,rTLHRH,rIPL,rIPLHR,catena,... + IDcentralina,DTcatena,FileName); + +% tipologia di centralina +Unit = centralina(IDcentralina,conn,FileName); + +%% Scarico dei dati + +% funzione che scarica i dati di calibrazione +[DCalTLTot,DCalTLHRTot,DCalTLHTot,DCalTLHRHTot,DCalPLTot,DCalBLTot,... + ~,DCalLLTot,DCalKLTot,DCalKLHRTot,DCalRLTot,DCalThLTot,DCalPT100Tot,... + DCalIPLTot,DCalIPLHRTot,DCalWLTot,DCalPETot,Barometri,yesTL,yesTLHR,yesTLH,... + yesTLHRH,yesPL,yesBL,~,yesLL,yesKL,yesKLHR,yesThL,yesPT100,yesIPL,yesIPLHR,yesWL] = ... + letturaCal(IDcentralina,DTcatena,catena,yesTL,yesTLHR,yesTLH,yesTLHRH,... + yesPL,yesBL,yesAL,yesLL,yesKL,yesKLHR,yesThL,yesPT100,yesIPL,yesIPLHR,yesWL,... + rTL,rPL,rBL,rTLHR,rAL,rTLH,rTLHRH,rLL,rThL,rKL,rKLHR,rRL,rPT100,rIPL,rIPLHR,... + rWL,rPE,NodoTiltLink,NodoTiltLinkH,NodoPiezoLink,NodoBaroLink,NodoLoadLink,... + NodoKlinoLink,NodoKlinoLinkHR,NodoInPlaceLink,NodoInPlaceLinkHR,NodoWeirLink,... + NodoPendulum,NodoRainLink,NodoThermLink,conn,FileName); + +if strcmp(Unit,'Nesa evolution') + Data = datestr(now-30,'yyyy-mm-dd HH:MM:SS.FFF'); % faccio di default 30 gg + comando = ['select JSON_VALUE(dataJSON,"$.battery") from ELABDATANESA where EventTimestamp >= ''' Data ... + ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = 1']; + curs = exec(conn,comando); + curs = fetch(curs); + Batteria = curs.Data; + comando = ['select EventTimestamp from ELABDATANESA where EventTimestamp >= ''' Data ... + ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeNum = 1']; + curs = exec(conn,comando); + curs = fetch(curs); + DataOra = curs.Data; + Batteria = [DataOra Batteria]; + ARRAYdateRL = []; +else + % Funzione che scarica la data di riferimento + [DatiElabTiltLink,NuovoZeroTL,datainiTL,tempoiniTL,... + DatiElabTiltLinkHR,NuovoZeroTLHR,datainiTLHR,tempoiniTLHR,... + DatiElabTiltLinkH,NuovoZeroTLH,datainiTLH,tempoiniTLH,... + DatiElabTiltLinkHRH,NuovoZeroTLHRH,datainiTLHRH,tempoiniTLHRH,... + DatiElabInPlaceLink,NuovoZeroIPL,datainiIPL,tempoiniIPL,... + DatiElabInPlaceLinkHR,NuovoZeroIPLHR,datainiIPLHR,tempoiniIPLHR,... + NuovoZeroPL,datainiPL,tempoiniPL,NuovoZeroBL,datainiBL,tempoiniBL,Barometro,... + NuovoZeroThL,datainiThL,tempoiniThL,NuovoZeroLL,datainiLL,tempoiniLL,... + NuovoZeroKL,datainiKL,tempoiniKL,NuovoZeroKLHR,datainiKLHR,tempoiniKLHR,... + DatiElabRainLink,NuovoZeroRL,datainiRL,tempoiniRL,NuovoZeroPT100,datainiPT100,tempoiniPT100,... + NuovoZeroWL,datainiWL,tempoiniWL,NuovoZeroPE,datainiPE,tempoiniPE,margine,marginePiezo] = LastElab(... + conn,date,time,IDcentralina,DTcatena,Wdevst,Wdevst_HR,NdatiMedia,Ndatidespike,NdatiMediaP,... + NodoTiltLink,yesTL,rTL,NodoTiltLinkHR,yesTLHR,rTLHR,... + NodoTiltLinkH,yesTLH,rTLH,NodoTiltLinkHRH,yesTLHRH,rTLHRH,... + NodoPiezoLink,yesPL,NodoBaroLink,yesBL,Barometri,... + NodoLoadLink,yesLL,NodoThermLink,yesThL,NodoRainLink,yesRL,rRL,... + NodoKlinoLink,yesKL,rKL,NodoKlinoLinkHR,yesKLHR,rKLHR,NodoPT100Link,yesPT100,... + NodoInPlaceLink,yesIPL,rIPL,NodoInPlaceLinkHR,yesIPLHR,rIPLHR,... + NodoWeirLink,yesWL,NodoPendulum,yesPE,FileName); + + % Sito Specificità + if strcmp(IDcentralina,'ID0003') && strcmp(DTcatena,'DT0002') + datainiBL = '2015-03-01'; + tempoiniBL = '00:00:01'; + datainiPL = '2015-03-01'; + tempoiniPL = '00:00:01'; + end + + if strcmp(IDcentralina,'ID0070') == 1 && strcmp(DTcatena,'DT0111 IPI') == 1 + DTcatenaRif = DTcatena; + DTcatena = 'DT0111'; + % Carico i dati dal database a seconda della catena + [Batteria,DatiTiltLink,ErrTiltLink,datainiTL,yesTL,DatiTiltLinkH,ErrTiltLinkH,datainiTLH,yesTLH,... + DatiPiezoLink,ErrPiezoLink,yesPL,DatiBaroLink,ErrBaroLink,yesBL,... + DatiTiltLinkHR,ErrTiltLinkHR,datainiTLHR,yesTLHR,DatiTiltLinkHRH,ErrTiltLinkHRH,datainiTLHRH,yesTLHRH,... + DatiLoadLink,ErrLoadLink,yesLL,DatiThermLink,ErrThermLink,yesThL,DatiKlinoLink,ErrKlinoLink,yesKL,... + DatiKlinoLinkHR,ErrKlinoLinkHR,yesKLHR,DatiRainLink,ErrRainLink,datainiRL,yesRL,... + DatiPT100Link,ErrPT100Link,yesPT100,DatiInPlaceLink,ErrInPlaceLink,datainiIPL,yesIPL,... + DatiInPlaceLinkHR,ErrInPlaceLinkHR,datainiIPLHR,yesIPLHR,DatiWeirLink,DatiNTCWeirLink,ErrWeirLink,datainiWL,yesWL,... + DatiPendulum,ErrPendulum,datainiPE,yesPE] = lettura_Hybrid(IDcentralina,DTcatena,DTcatenaRif,datainiTL,tempoiniTL,NodoTiltLink,NuovoZeroTL,... + datainiTLH,tempoiniTLH,NodoTiltLinkH,NuovoZeroTLH,datainiPL,tempoiniPL,NodoPiezoLink,NuovoZeroPL,... + datainiBL,tempoiniBL,NodoBaroLink,NuovoZeroBL,datainiTLHR,tempoiniTLHR,NodoTiltLinkHR,NuovoZeroTLHR,... + datainiTLHRH,tempoiniTLHRH,NodoTiltLinkHRH,NuovoZeroTLHRH,datainiThL,tempoiniThL,NodoThermLink,NuovoZeroThL,... + datainiLL,tempoiniLL,NodoLoadLink,NuovoZeroLL,datainiKL,tempoiniKL,NodoKlinoLink,NuovoZeroKL,... + datainiKLHR,tempoiniKLHR,NodoKlinoLinkHR,NuovoZeroKLHR,datainiRL,tempoiniRL,NodoRainLink,NuovoZeroRL,... + datainiPT100,tempoiniPT100,NodoPT100Link,NuovoZeroPT100,datainiIPL,tempoiniIPL,NodoInPlaceLink,NuovoZeroIPL,... + datainiIPLHR,tempoiniIPLHR,NodoInPlaceLinkHR,NuovoZeroIPLHR,datainiWL,tempoiniWL,NodoWeirLink,NuovoZeroWL,... + datainiPE,tempoiniPE,NodoPendulum,NuovoZeroPE,yesTL,yesTLH,yesTLHR,yesTLHRH,yesPL,yesBL,yesThL,yesKL,yesKLHR,yesRL,... + yesPT100,yesLL,yesIPL,yesIPLHR,yesWL,yesPE,rTL,rTLH,rTLHR,rTLHRH,rPL,rBL,rThL,rKL,rKLHR,rRL,rPT100,rLL,rIPL,rIPLHR,... + rWL,rPE,conn,Barometro,catena,date,time,FileName); + else + % Carico i dati dal database a seconda della catena + [Batteria,DatiTiltLink,ErrTiltLink,datainiTL,yesTL,DatiTiltLinkH,ErrTiltLinkH,datainiTLH,yesTLH,... + DatiPiezoLink,ErrPiezoLink,yesPL,DatiBaroLink,ErrBaroLink,yesBL,... + DatiTiltLinkHR,ErrTiltLinkHR,datainiTLHR,yesTLHR,DatiTiltLinkHRH,ErrTiltLinkHRH,datainiTLHRH,yesTLHRH,... + DatiLoadLink,ErrLoadLink,yesLL,DatiThermLink,ErrThermLink,yesThL,DatiKlinoLink,ErrKlinoLink,yesKL,... + DatiKlinoLinkHR,ErrKlinoLinkHR,yesKLHR,DatiRainLink,ErrRainLink,datainiRL,yesRL,... + DatiPT100Link,ErrPT100Link,yesPT100,DatiInPlaceLink,ErrInPlaceLink,datainiIPL,yesIPL,... + DatiInPlaceLinkHR,ErrInPlaceLinkHR,datainiIPLHR,yesIPLHR,DatiWeirLink,DatiNTCWeirLink,ErrWeirLink,datainiWL,yesWL,... + DatiPendulum,ErrPendulum,~,yesPE] = lettura(IDcentralina,DTcatena,datainiTL,tempoiniTL,NodoTiltLink,NuovoZeroTL,... + datainiTLH,tempoiniTLH,NodoTiltLinkH,NuovoZeroTLH,datainiPL,tempoiniPL,NodoPiezoLink,NuovoZeroPL,... + datainiBL,tempoiniBL,NodoBaroLink,NuovoZeroBL,datainiTLHR,tempoiniTLHR,NodoTiltLinkHR,NuovoZeroTLHR,... + datainiTLHRH,tempoiniTLHRH,NodoTiltLinkHRH,NuovoZeroTLHRH,datainiThL,tempoiniThL,NodoThermLink,NuovoZeroThL,... + datainiLL,tempoiniLL,NodoLoadLink,NuovoZeroLL,datainiKL,tempoiniKL,NodoKlinoLink,NuovoZeroKL,... + datainiKLHR,tempoiniKLHR,NodoKlinoLinkHR,NuovoZeroKLHR,datainiRL,tempoiniRL,NodoRainLink,NuovoZeroRL,... + datainiPT100,tempoiniPT100,NodoPT100Link,NuovoZeroPT100,datainiIPL,tempoiniIPL,NodoInPlaceLink,NuovoZeroIPL,... + datainiIPLHR,tempoiniIPLHR,NodoInPlaceLinkHR,NuovoZeroIPLHR,datainiWL,tempoiniWL,NodoWeirLink,NuovoZeroWL,... + datainiPE,tempoiniPE,NodoPendulum,NuovoZeroPE,yesTL,yesTLH,yesTLHR,yesTLHRH,yesPL,yesBL,yesThL,yesKL,yesKLHR,yesRL,... + yesPT100,yesLL,yesIPL,yesIPLHR,yesWL,yesPE,rTL,rTLH,rTLHR,rTLHRH,rPL,rBL,rThL,rKL,rKLHR,rRL,rPT100,rLL,rIPL,rIPLHR,... + rWL,rPE,conn,Barometro,catena,date,time,FileName); + end + + % Controllo incrociato fra la data iniziale definita da Lettura e la data + % iniziale definita da LastElab + [DatiElabTiltLink,DatiElabTiltLinkHR,DatiElabTiltLinkH,DatiElabTiltLinkHRH,... + DatiElabRainLink,DatiElabInPlaceLink,DatiElabInPlaceLinkHR] = checkdata(... + yesTL,yesTLHR,yesTLH,yesTLHRH,yesRL,yesIPL,yesIPLHR,... + DatiElabTiltLink,DatiElabTiltLinkHR,DatiElabTiltLinkH,DatiElabTiltLinkHRH,... + DatiElabRainLink,DatiElabInPlaceLink,DatiElabInPlaceLinkHR,... + datainiTL,tempoiniTL,datainiTLHR,tempoiniTLHR,datainiTLH,tempoiniTLH,... + datainiTLHRH,tempoiniTLHRH,datainiRL,tempoiniRL,datainiIPL,tempoiniIPL,... + datainiIPLHR,tempoiniIPLHR,rTL,rTLHR,rTLH,rTLHRH,rRL,rIPL,rIPLHR,... + NodoTiltLink,NodoTiltLinkHR,NodoTiltLinkH,NodoTiltLinkHRH,... + NodoRainLink,NodoInPlaceLink,NodoInPlaceLinkHR,... + NuovoZeroTL,NuovoZeroTLHR,NuovoZeroTLH,NuovoZeroTLHRH,NuovoZeroRL,... + NuovoZeroIPL,NuovoZeroIPLHR,IDcentralina,DTcatena,conn,FileName); + + %% Parte di definizione dati, conversione in unità fisiche e calcolo medie + + % ---Tilt Link V--- + if yesTL == 1 + [TimeTL,accTL,magTL,tempTL,ErrTiltLink] = defDatiTL(DatiTiltLink,... + ErrTiltLink,Ndatidespike,rTL,MEMS,conn,catena,IDcentralina,DTcatena,FileName); + % Conversione dei dati grezzi + [accTL,magTL,ris_acc,ris_mag,tempTL,ErrTiltLink] = conv_grezziTL(rTL,accTL,magTL,... + tempTL,DCalTLTot,tolleranzaAcc,MEMS,ErrTiltLink,IDcentralina,DTcatena,FileName); + % Calcolo medie + [ACCdef_TL,MAGdef_TL,ARRAYdateTL,ACCdefRis_TL,~,TempDef_TL] = MediaDati_TL(... + accTL,magTL,TimeTL,ris_acc,ris_mag,tempTL,tolleranzaAcc,tolleranzaMag,... + NdatiMedia,FileName); + else + ARRAYdateTL = []; + text = 'There are not data to convert for Tilt Link V'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiTiltLink + clear TimeTL + clear accTL + clear magTL + clear tempTL + clear DCalTLTot + clear ris_acc + clear ris_mag + + % ---In Place Link--- + if yesIPL == 1 + [TimeIPL,accIPL,magIPL,tempIPL,ErrInPlaceLink] = defDatiIPL(DatiInPlaceLink,... + ErrInPlaceLink,Ndatidespike,rIPL,MEMS,FileName); + % Conversione dei dati grezzi + [accIPL,magIPL,ris_acc_IPL,ris_mag_IPL,tempIPL,ErrInPlaceLink] = conv_grezziIPL(rIPL,... + accIPL,magIPL,tempIPL,DCalIPLTot,tolleranzaAcc,ErrInPlaceLink,NodoInPlaceLink,MEMS,FileName); + % Calcolo medie + [ACCdef_IPL,MAGdef_IPL,ARRAYdateIPL,ACCdefRis_IPL,~,TempDef_IPL]... + = MediaDati_IPL(accIPL,magIPL,TimeIPL,ris_acc_IPL,ris_mag_IPL,tempIPL,tolleranzaAcc,... + tolleranzaMag,NdatiMedia,NodoInPlaceLink,MEMS,FileName); + else + ARRAYdateIPL = []; + text = 'There are not data to convert for In Place Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiInPlaceLink + clear TimeIPL + clear accIPL + clear magIPL + clear tempIPL + clear DCalIPLTot + clear ris_acc_IPL + clear ris_mag_IPL + + % ---Tilt Link H--- + if yesTLH == 1 + % definizione dei dati + [TimeTLH,accTLH,tempTLH,ErrTiltLinkH] = defDatiTLH(DatiTiltLinkH,... + ErrTiltLinkH,Ndatidespike,rTLH,MEMS,FileName); + % Conversione dei dati grezzi + [accTLH,ris_acc_TLH,tempTLH,ErrTiltLinkH] = conv_grezziTLH(rTLH,... + accTLH,tempTLH,DCalTLHTot,tolleranzaAcc,MEMS,ErrTiltLinkH,FileName); + % Calcolo medie + [ACCdef_TLH,ARRAYdateTLH,ACCdefRis_TLH,TempDef_TLH] = MediaDati_TLH... + (accTLH,TimeTLH,ris_acc_TLH,tempTLH,tolleranzaAcc,NdatiMedia,FileName); + else + ARRAYdateTLH = []; + text = 'There are not data to convert for Tilt Link H'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiTiltLinkH + clear TimeTLH + clear accTLH + clear tempTLH + clear DCalTLHTot + clear ris_acc_TLH + + % ---Tilt Link HR V--- + if yesTLHR == 1 % attiva l'elaborazione dei Tilt Link HR + [TimeTLHR,angTLHR,tempTLHR,ErrTiltLinkHR] = defDatiTLHR(... + DatiTiltLinkHR,ErrTiltLinkHR,Ndatidespike,MEMS,rTLHR,NodoTiltLinkHR,... + NuovoZeroTLHR,IDcentralina,DTcatena,FileName); + % Conversione dei dati grezzi + [angTLHR,tempTLHR] = conv_grezziTLHR(angTLHR,tempTLHR,DCalTLHRTot,... + rTLHR,FileName); + % Calcolo medie + [ANGdef_TLHR,ARRAYdateTLHR,TempDef_TLHR] = MediaDati_TLHR(angTLHR,... + TimeTLHR,tempTLHR,NdatiMedia,FileName); + else + ARRAYdateTLHR = []; + text = 'There are not data to convert for Tilt Link HR V'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiTiltLinkHR + clear TimeTLHR + clear angTLHR + clear tempTLHR + clear DCalTLHRTot + clear tempTLHR + + % ---In Place Link HR--- + if yesIPLHR == 1 + [TimeIPLHR,angIPLHR,tempIPLHR,ErrInPlaceLinkHR] = defDatiIPLHR(... + DatiInPlaceLinkHR,ErrInPlaceLinkHR,Ndatidespike,rIPLHR,NodoInPlaceLinkHR,... + NuovoZeroIPLHR,IDcentralina,DTcatena,FileName); + % Conversione dei dati grezzi + [angIPLHR,tempIPLHR] = conv_grezziIPLHR(angIPLHR,tempIPLHR,DCalIPLHRTot,... + NodoInPlaceLinkHR,rIPLHR,FileName); + % Calcolo medie + [ANGdef_IPLHR,ARRAYdateIPLHR,TempDef_IPLHR] = MediaDati_IPLHR(angIPLHR,... + TimeIPLHR,tempIPLHR,NdatiMedia,FileName); + else + ARRAYdateIPLHR = []; + text = 'There are not data to convert for In Place Link HR'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiInPlaceLinkHR + clear TimeIPLHR + clear angIPLHR + clear tempIPLHR + clear DCalIPLHRTot + clear tempIPLHR + + % ---Tilt Link HR H--- + if yesTLHRH == 1 % attiva l'elaborazione dei Tilt Link HR H + [TimeTLHRH,angTLHRH,tempTLHRH,ErrTiltLinkHRH] = defDatiTLHRH(... + DatiTiltLinkHRH,ErrTiltLinkHRH,Ndatidespike,MEMS,rTLHRH,NodoTiltLinkHRH,... + NuovoZeroTLHRH,IDcentralina,DTcatena,FileName); + % Conversione dei dati grezzi + [angTLHRH,tempTLHRH] = conv_grezziTLHRH(angTLHRH,tempTLHRH,DCalTLHRHTot,... + rTLHRH,FileName); + % Calcolo medie + [ANGdef_TLHRH,ARRAYdateTLHRH,TempDef_TLHRH] = MediaDati_TLHRH(angTLHRH,... + TimeTLHRH,tempTLHRH,NdatiMedia,FileName); + else + ARRAYdateTLHRH = []; + text = 'There are not data to convert for Tilt Link HR H'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiTiltLinkHRH + clear TimeTLHRH + clear angTLHRH + clear tempTLHRH + clear DCalTLHRHTot + clear tempTLHRH + + % ---Piezo Link--- + if yesPL == 1 % attiva l'elaborazione dei Piezo Link + [TimePL,ADCPiez,tempPiez,ErrPiezoLink] = defDatiPL(DatiPiezoLink,ErrPiezoLink,rPL,FileName); + % Conversione dei dati grezzi + [DatiPiez,DatiPiezT,RIF_PL] = conv_grezziPL(rPL,ADCPiez,tempPiez,DCalPLTot,... + NodoPiezoLink,NuovoZeroPL,IDcentralina,DTcatena,FileName); + % Calcolo medie + [PiezDef,PiezDefT,ARRAYdatePL] = MediaDati_PL(DatiPiez,DatiPiezT,TimePL,NdatiMediaP,FileName); + else + ARRAYdatePL = []; + text = 'There are not data to convert for Piezo Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiPiezoLink + clear TimePL + clear ADCPiez + clear tempPiez + clear DatiPiez + clear DatiPiezT + + % ---Baro Link--- + % Attivazione/disattivazione elaborazione e definizione dati + if strcmp(NodoPiezoLink(1,4),'VW kPa') == 1 || strcmp(NodoPiezoLink(1,4),'VW kg/cm2') == 1 + BaroDef = []; + ARRAYdateBL = []; + text = 'There are not data to convert for Baro Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + elseif yesBL == 1 || yesPL == 1 % attiva l'elaborazione dei Baro Link + [TimeBL,ADCBaro,tempBaro,ErrBaroLink] = defDatiBL(DatiBaroLink,ErrBaroLink,rBL,FileName); + % Conversione dei dati grezzi + if yesBL == 0 % Recupero il barometro corretto + [rB,~] = size(Barometri); + for b = 1:rB + if strcmp(Barometri(b,1),Barometro(1,1)) == 1 + DCalBLTot = DCalBLTot(b,:); + rBL = 1; + break + end + end + end + [DatiBaro,DatiBaroT] = conv_grezziBL(rBL,ADCBaro,tempBaro,DCalBLTot,FileName); + % Calcolo medie + [BaroDef,BaroDefT,ARRAYdateBL] = MediaDati_BL(DatiBaro,DatiBaroT,TimeBL,NdatiMediaP,FileName); + else + BaroDef = []; + ARRAYdateBL = []; + text = 'There are not data to convert for Baro Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiBaroLink + clear TimeBL + clear ADCBaro + clear tempBaro + clear DCalBLTot + clear DatiBaro + clear DatiBaroT + + % ---Klino Link--- + if yesKL == 1 % attiva l'elaborazione dei Klino Link + [TimeKL,ang_KL,temp_KL,ErrKlinoLink] = defDatiKL(DatiKlinoLink,... + ErrKlinoLink,NodoKlinoLink,MEMS,Ndatidespike,rKL,FileName); + % Conversione dei dati grezzi + [ang_KL,temp_KL,ris_acc,ErrKlinoLink] = conv_grezziKL(ang_KL,temp_KL,... + rKL,DCalKLTot,tolleranzaAcc,NodoKlinoLink,ErrKlinoLink,FileName); + % Medie + [ANGdefKL,TdefKL,ARRAYdateKL] = MediaDati_KL(ang_KL,temp_KL,TimeKL,NdatiMedia,FileName); + else + ANGdefKL = []; + TdefKL = []; + ARRAYdateKL = []; + text = 'There are not data to convert for Klino Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiKlinoLink + clear TimeKL + clear ang_KL + clear temp_KL + clear DCalKLTot + clear ANGoutKL + clear TEMPoutKL + clear TimeRcKL + + % ---Klino Link HR--- + if yesKLHR == 1 % attiva l'elaborazione dei Klino Link HR + [TimeKLHR,ang_KLHR,temp_KLHR,ErrKlinoLinkHR] = defDatiKLHR(... + DatiKlinoLinkHR,ErrKlinoLinkHR,Ndatidespike,rKLHR,NodoKlinoLinkHR,... + NuovoZeroKLHR,IDcentralina,DTcatena,FileName); + % Conversione dei dati grezzi + [ang_KLHR,temp_KLHR] = conv_grezziKLHR(ang_KLHR,temp_KLHR,rKLHR,... + DCalKLHRTot,FileName); + % Calcolo medie + [ANGdefKLHR,TdefKLHR,ARRAYdateKLHR] = MediaDati_KLHR(ang_KLHR,... + temp_KLHR,TimeKLHR,NdatiMedia,FileName); + else + ANGdefKLHR = []; + TdefKLHR = []; + ARRAYdateKLHR = []; + text = 'There are not data to convert for Klino Link HR'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiKlinoLinkHR + clear TimeKLHR + clear ang_KLHR + clear temp_KLHR + clear DCalKLHRTot + + % ---Load Link--- + if yesLL == 1 % attiva l'elaborazione dei Load Link + [TimeLL,ADCLoad,ErrLoadLink] = defDatiLL(DatiLoadLink,ErrLoadLink,Ndatidespike,rLL,FileName); + % Conversione dei dati grezzi + DatiLoad = conv_grezziLL(ADCLoad,DCalLLTot,NodoLoadLink,FileName); + % Calcolo medie + [LoadDef,ARRAYdateLL] = MediaDati_LL(DatiLoad,TimeLL,NdatiMedia,FileName); + else + ARRAYdateLL = []; + text = 'There are not data to convert for Load Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiLoadLink + clear TimeLL + clear ADCLoad + clear DCalLLTot + clear DatiLoad + clear TimeLL + + % ---Rain Link--- + if yesRL == 1 % attiva l'elaborazione dei Klino Link + [TimeRL,val_RL,ErrRainLink] = defDatiRL(DatiRainLink,ErrRainLink,FileName); + % Conversione dei dati grezzi + val_RL = conv_grezziRL(val_RL,rRL,DCalRLTot,NodoRainLink,FileName); + % Calcolo media + [Dati_RL,ARRAYdateRL] = MediaDati_RL(val_RL,TimeRL,FileName); + else + ARRAYdateRL = []; + Rain = []; + RainCum = []; + text = 'There are not data to convert for Rain Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiRainLink + clear TimeRL + clear val_RL + clear DCalRLTot + + % ---Therm Link--- + if yesThL == 1 + [TimeThL,val_ThL,ErrThermLink] = defDatiThL(DatiThermLink,ErrThermLink,rThL,FileName); + % Conversione dei dati grezzi + val_ThL = conv_grezziThL(val_ThL,rThL,DCalThLTot,FileName); + % Calcolo medie + [Dati_ThL,ARRAYdateThL] = MediaDati_ThL(val_ThL,TimeThL,NdatiMedia,FileName); + else + ARRAYdateThL = []; + Dati_ThL = []; + text = 'There are not data to convert for Therm Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiThermLink + clear TimeThL + clear val_ThL + clear DCalThLTot + + % ---PT100 Link--- + if yesPT100 == 1 + [TimePT100,val_PT100,ErrPT100Link] = defDatiPT100(DatiPT100Link,ErrPT100Link,FileName); + % Conversione dei dati grezzi + val_PT100 = conv_grezziPT100(val_PT100,rPT100,DCalPT100Tot,FileName); + % Calcolo medie + [Dati_PT100,ARRAYdatePT100] = MediaDati_PT100(val_PT100,TimePT100,FileName); + else + ARRAYdatePT100 = []; + Dati_PT100 = []; + text = 'There are not data to convert for PT100 Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + % Pulisco le variabili che non uso + clear DatiPT100Link + clear TimePT100 + clear val_PT100 + clear DCalPT100Tot + + % ---Weir Link--- + if yesWL == 1 + [TimeWL,lev_WL,temp_WL,ErrWeirLink] = defDatiWL(DatiWeirLink,... + DatiNTCWeirLink,ErrWeirLink,FileName); + % Conversione dei dati grezzi + [lev_WL,TdefWL,ErrWeirLink] = conv_grezziWL(lev_WL,temp_WL,rWL,... + DCalWLTot,Tmax,Tmin,NodoWeirLink,ErrWeirLink,datainiWL,TimeWL,... + IDcentralina,DTcatena,FileName); + % Media + [Dati_WL,ARRAYdateWL] = MediaDati_WL(lev_WL,TimeWL,FileName); + else + ARRAYdateWL = []; + Dati_WL = []; + TdefWL = []; + text = 'There are not data to convert for Weir Link'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + + % ---Pendulum--- + if yesPE == 1 + [TimePE,Def_PE,ErrPendulum] = defDatiPE(DatiPendulum,ErrPendulum,FileName); + % Conversione dei dati grezzi + Def_PE = conv_grezziPE(Def_PE,rPE,DCalPETot,NodoPendulum,FileName); + % Media + [Dati_PE,ARRAYdatePE] = MediaDati_PE(Def_PE,TimePE,NdatiMedia,FileName); + else + ARRAYdatePE = []; + Dati_PE = []; + text = 'There are not data to convert for Pendulum'; + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + clear text + end + + %% Parte di elaborazione + + % --- Analisi Tilt Link V --- + if yesTL == 1 + if struct == 1 % Vertical Array Structure + % ...... + elseif triax == 1 % Analisi ai Quaternioni + [X,Y,Z,Xlocal,Ylocal,Zlocal,HShift,HShift_local,AlfaX,AlfaY,Azimuth,... + Speed_local,Speed,Acceleration_local,Acceleration,TempDef_TL,ARRAYdateTL,... + ErrTiltLink,MAGdef_TL] = triax_TL(IDcentralina,DTcatena,rTL,ACCdef_TL,... + ACCdefRis_TL,MAGdef_TL,TempDef_TL,SpeTL,PsTL,NodoTiltLink,tolleranzaAcc,... + tolleranzaMag,DatiElabTiltLink,segnoNS,segnoEO,MEMS,Ndevst,Wdevst,ARRAYdateTL,... + Tmax,Tmin,NuovoZeroTL,NdatiMedia,Ndatidespike,ErrTiltLink,margine,datainiTL,FileName); + elseif biax == 1 % Analisi semplificata 2D + [X,Y,Z,Xlocal,Ylocal,Zlocal,HShift,HShift_local,AlfaX,AlfaY,Azimuth,... + Speed_local,Speed,Acceleration_local,Acceleration,TempDef_TL,... + ARRAYdateTL,ErrTiltLink,MAGdef_TL] = biax_TL(IDcentralina,DTcatena,rTL,... + ACCdef_TL,ACCdefRis_TL,MAGdef_TL,TempDef_TL,SpeTL,PsTL,... + NodoTiltLink,tolleranzaAcc,tolleranzaMag,DatiElabTiltLink,segnoNS,segnoEO,... + Ndevst,Wdevst,ARRAYdateTL,Tmax,Tmin,NuovoZeroTL,NdatiMedia,Ndatidespike,... + ErrTiltLink,margine,date,datainiTL,FileName); + end + else + [X,Y,Z,Xlocal,Ylocal,Zlocal,HShift,HShift_local,Azimuth,TempDef_TL,Speed_local,... + Speed,Acceleration_local,Acceleration,AlfaX,AlfaY] = matrici_vuote_TL(FileName); + end + clear ACCdefRis_TL + clear SpeTL + clear PsTL + clear DatiElabTiltLink + clear NuovoZeroTL + % fine elaborazione Tilt Link V + + % --- Analisi Tilt Link H --- + if yesTLH == 1 + [Y_TLH,Z_TLH,Ylocal_TLH,Zlocal_TLH,AlfaX_TLH,AlfaY_TLH,TempDef_TLH,... + Speed_TLH,Speed_local_TLH,Acceleration_TLH,Acceleration_local_TLH,ARRAYdateTLH,... + ErrTiltLinkH] = biax_TLH(IDcentralina,DTcatena,rTLH,ACCdef_TLH,ACCdefRis_TLH,... + TempDef_TLH,SpeTLH,PsTLH,tolleranzaAcc,DatiElabTiltLinkH,Ndevst,Wdevst,ARRAYdateTLH,... + NuovoZeroTLH,Tmax,Tmin,NodoTiltLinkH,NdatiMedia,Ndatidespike,ErrTiltLinkH,margine,FileName); + else + [Y_TLH,Z_TLH,Ylocal_TLH,Zlocal_TLH,AlfaX_TLH,AlfaY_TLH,TempDef_TLH,... + Speed_TLH,Speed_local_TLH,Acceleration_TLH,Acceleration_local_TLH] = ... + matrici_vuote_TLH(FileName); + end + clear ACCdef_TLH + clear ACCdefRis_TLH + clear SpeTLH + clear PsTLH + clear Ndevst_TLH + clear Wdevst_TLH + clear NuovoZeroTLH + % fine elaborazione Tilt Link H + + % --- Analisi In Place Link --- + if yesIPL == 1 + [X_IPL,Y_IPL,Z_IPL,Xlocal_IPL,Ylocal_IPL,Zlocal_IPL,HShift_IPL,... + HShift_local_IPL,AlfaX_IPL,AlfaY_IPL,Azimuth_IPL,Speed_local_IPL,... + Speed_IPL,Acceleration_local_IPL,Acceleration_IPL,TempDef_IPL,... + ARRAYdateIPL,ErrInPlaceLink,MAGdef_IPL] = triax_IPL(IDcentralina,... + DTcatena,rIPL,ACCdef_IPL,ACCdefRis_IPL,MAGdef_IPL,TempDef_IPL,SpeIPL,PsIPL,... + NodoInPlaceLink,tolleranzaAcc,tolleranzaMag,DatiElabInPlaceLink,... + segnoNS,segnoEO,MEMS,Ndevst,Wdevst,ARRAYdateIPL,NuovoZeroIPL,Tmax,Tmin,... + NdatiMedia,Ndatidespike,ErrInPlaceLink,margine,datainiIPL,FileName); + else + [X_IPL,Y_IPL,Z_IPL,Xlocal_IPL,Ylocal_IPL,Zlocal_IPL,HShift_IPL,... + HShift_local_IPL,Azimuth_IPL,TempDef_IPL,Speed_local_IPL,Speed_IPL,... + Acceleration_local_IPL,Acceleration_IPL,AlfaX_IPL,AlfaY_IPL,ACCdef_IPL,... + MAGdef_IPL] = matrici_vuote_IPL(FileName); + end + clear segnoNS + clear segnoEO + clear Ndevst + clear Wdevst + clear ACCdefRis_IPL + clear SpeIPL + clear PsIPL + clear DatiElabInPlaceLink + clear NuovoZeroIPL + % fine elaborazione In Place Link + + % --- Analisi Tilt Link HR V --- + if yesTLHR == 1 + [X_HR,Y_HR,Z_HR,Xlocal_HR,Ylocal_HR,Zlocal_HR,HShift_HR,HShift_local_HR,... + AlfaX_HR,AlfaY_HR,Azimuth_HR,Speed_local_HR,Speed_HR,Acceleration_local_HR,... + Acceleration_HR,TempDef_TLHR,ARRAYdateTLHR,ErrTiltLinkHR] = biax_TLHR(IDcentralina,... + DTcatena,rTLHR,rTL,ANGdef_TLHR,ACCdef_TL,MAGdef_TL,TempDef_TLHR,SpeTLHR,... + PsTLHR,yesTL,yesTLHR3D,NodoTiltLinkHR,NodoTiltLink,NodoTiltLinkHR3D,... + DatiElabTiltLinkHR,segnoNS_HR,segnoEO_HR,Ndevst_HR,Wdevst_HR,ARRAYdateTLHR,... + NuovoZeroTLHR,NdatiMedia,Ndatidespike,allineato,ErrTiltLinkHR,Tmax,Tmin,datainiTLHR,... + margine,date,FileName); + else + [X_HR,Y_HR,Z_HR,Xlocal_HR,Ylocal_HR,Zlocal_HR,AlfaX_HR,AlfaY_HR,... + TempDef_TLHR,HShift_HR,HShift_local_HR,Azimuth_HR,Speed_HR,Speed_local_HR,... + Acceleration_HR,Acceleration_local_HR] = matrici_vuote_TLHR(FileName); + end + % Faccio Pulizia di Variabili + clear ANGdefTLHR + clear ACCdef + clear MAGdef + clear SpeTLHR + clear PsTLHR + clear DatiElabTiltLinkHR + clear DatiElabTiltLink + clear NuovoZeroTLHR + clear ACCdef_TL + clear MAGdef_TL + % fine elaborazione Tilt Link HR V + + % --- Analisi Tilt Link HR H --- + if yesTLHRH == 1 + [Y_TLHRH,Z_TLHRH,Ylocal_TLHRH,Zlocal_TLHRH,AlfaX_TLHRH,AlfaY_TLHRH,... + TempDef_TLHRH,Speed_TLHRH,Speed_local_TLHRH,Acceleration_TLHRH,... + Acceleration_local_TLHRH,ARRAYdateTLHRH,ErrTiltLinkHRH] = biax_TLHRH(... + IDcentralina,DTcatena,NodoTiltLinkHRH,rTLHRH,ANGdef_TLHRH,TempDef_TLHRH,SpeTLHRH,PsTLHRH,... + DatiElabTiltLinkHRH,Ndevst_HR,Wdevst_HR,ARRAYdateTLHRH,NuovoZeroTLHRH,NdatiMedia,... + Ndatidespike,ErrTiltLinkHRH,Tmax,Tmin,datainiTLHRH,margine,FileName); + else + [Y_TLHRH,Z_TLHRH,Ylocal_TLHRH,Zlocal_TLHRH,AlfaX_TLHRH,AlfaY_TLHRH,TempDef_TLHRH,... + Speed_TLHRH,Speed_local_TLHRH,Acceleration_TLHRH,Acceleration_local_TLHRH] = ... + matrici_vuote_TLHRH(FileName); + end + % Faccio Pulizia di Variabili + % Faccio Pulizia di Variabili + clear ANGdef_TLHRH + clear SpeTLHRH + clear PsTLHRH + clear DatiElabTiltLinkHRH + clear Ndevst_TLHRH + clear Wdevst_TLHRH + clear NuovoZeroTLHRH + % fine elaborazione Tilt Link HR H + + % --- Analisi In Place Link HR --- + if yesIPLHR == 1 + [X_IPLHR,Y_IPLHR,Z_IPLHR,Xlocal_IPLHR,Ylocal_IPLHR,Zlocal_IPLHR,... + HShift_IPLHR,HShift_local_IPLHR,AlfaX_IPLHR,AlfaY_IPLHR,Azimuth_IPLHR,... + Speed_local_IPLHR,Speed_IPLHR,Acceleration_local_IPLHR,Acceleration_IPLHR,... + TempDef_IPLHR,ARRAYdateIPLHR,ErrInPlaceLinkHR] = biax_IPLHR(IDcentralina,... + DTcatena,rIPLHR,rIPL,ANGdef_IPLHR,ACCdef_IPL,MAGdef_IPL,TempDef_IPLHR,... + SpeIPLHR,PsIPLHR,yesIPL,yesIPLHR3D,NodoInPlaceLinkHR,NodoInPlaceLink,... + NodoInPlaceLinkHR3D,DatiElabInPlaceLinkHR,segnoNS_HR,segnoEO_HR,Ndevst_HR,... + Wdevst_HR,ARRAYdateIPLHR,NuovoZeroIPLHR,NdatiMedia,Ndatidespike,allineato,... + Tmax,Tmin,datainiIPLHR,ErrInPlaceLinkHR,margine,FileName); + else + [X_IPLHR,Y_IPLHR,Z_IPLHR,Xlocal_IPLHR,Ylocal_IPLHR,Zlocal_IPLHR,... + HShift_IPLHR,HShift_local_IPLHR,Azimuth_IPLHR,AlfaX_IPLHR,AlfaY_IPLHR,... + TempDef_IPLHR,Speed_IPLHR,Speed_local_IPLHR,Acceleration_IPLHR,... + Acceleration_local_IPLHR] = matrici_vuote_IPLHR(FileName); + end + % Faccio Pulizia di Variabili + clear ANGdefIPLHR + clear ACCdef_TLHR + clear MAGdef_TLHR + clear SpeIPLHR + clear PsIPLHR + clear tolleranzaMag + clear DatiElabInPlaceLinkHR + clear DatiElabInPlaceLink + clear segnoNS_HR + clear segnoEO_HR + clear Ndevst_HR + clear Wdevst_HR + clear NuovoZeroIPLHR + clear allineato + clear ACCdef_IPL + clear MAGdef_IPL + % fine elaborazione In Place Link HR + + % --- Analisi Piezo Link --- + if yesPL == 1 + % if strcmp(NodoPiezoLink(1,4),'VW kPa') == 1 + % C = DCalPLTot(:,3); + % if C == 0 % Identifica i piezometri di Geosense + % for p=1:rPL + % PiezDef(:,p) = PiezDef(:,p)+RIF_PL(p,1)'; + % end + % end + % end + [Livello,PiezDef,PiezDefT,ErrPiezoLink,ARRAYdatePL] = Piezo(PiezDef,PiezDefT,... + BaroDef,ARRAYdatePL,NuovoZeroPL,NdatiMediaP,Ndatidespike,NodoPiezoLink,ErrPiezoLink,rPL,... + Anchor_real,marginePiezo,FileName); + else + [Livello,PiezDef,PiezDefT] = matrici_vuote_PL(FileName); + end + clear NuovoZeroPL + clear NodoPiezoLink + clear Anchor_real + clear DCalPLTot + + % --- Analisi Baro Link --- + if yesBL == 1 + [BaroDef,BaroDefT,ARRAYdateBL,ErrBaroLink] = Baro(BaroDef,BaroDefT,... + ARRAYdateBL,NuovoZeroBL,NdatiMediaP,Ndatidespike,ErrBaroLink,rBL,... + marginePiezo,FileName); + else + [BaroDef,BaroDefT] = matrici_vuote_BL(FileName); + end + clear NuovoZeroBL + clear NdatiMediaP + clear marginePiezo + clear NodoBaroLink + + % --- Analisi Load Link --- + if yesLL == 1 + [DatiLoad,ErrLoadLink,ARRAYdateLL] = loadcell(LoadDef,ErrLoadLink,... + ARRAYdateLL,NuovoZeroLL,NdatiMedia,Ndatidespike,margine,FileName); + else + DatiLoad = []; + end + clear LoadDef + clear NuovoZeroLL + clear NodoLoadLink + + %--- Analisi Klino Link --- + if yesKL == 1 + [ANGdefKL,TdefKL,ErrKlinoLink,ARRAYdateKL] = Klino(ANGdefKL,TdefKL,... + ARRAYdateKL,ErrKlinoLink,NuovoZeroKL,NdatiMedia,Ndatidespike,ris_acc,tolleranzaAcc,... + Tmax,Tmin,datainiKL,rKL,IDcentralina,DTcatena,margine,NodoKlinoLink,FileName); + end + clear NuovoZeroKL + clear ris_acc + clear tolleranzaAcc + + %--- Analisi Klino Link HR --- + if yesKLHR == 1 + [ANGdefKLHR,TdefKLHR,ErrKlinoLinkHR,ARRAYdateKLHR] = KlinoHR(ANGdefKLHR,... + TdefKLHR,ARRAYdateKLHR,ErrKlinoLinkHR,NuovoZeroKLHR,NodoKlinoLinkHR,NdatiMedia,... + Ndatidespike,Tmax,Tmin,datainiKLHR,rKLHR,IDcentralina,DTcatena,margine,FileName); + end + clear NuovoZeroKLHR + clear NodoKlinoLinkHR + + %--- Analisi Rain Link --- + if yesRL == 1 + [Rain,RainCum,ARRAYdateRL,ErrRainLink] = CalcoloRain(Dati_RL,ARRAYdateRL,... + DatiElabRainLink,NuovoZeroRL,NdatiMedia,ErrRainLink,rRL,margine,... + IDcentralina,conn,FileName); + end + clear NuovoZeroRL + clear Dati_RL + clear DatiElabRainLink + + %--- Analisi Therm Link --- + if yesThL == 1 + [Dati_ThL,ARRAYdateThL,ErrThermLink] = Therm(Dati_ThL,ARRAYdateThL,... + NuovoZeroThL,ErrThermLink,NdatiMedia,margine,Tmax,Tmin,datainiThL,... + IDcentralina,DTcatena,FileName); + end + clear NuovoZeroThL + clear NodoThermLink + + %--- Analisi PT100 Link --- + if yesPT100 == 1 + [Dati_PT100,ARRAYdatePT100,ErrPT100Link] = PT100(Dati_PT100,... + ARRAYdatePT100,NuovoZeroPT100,ErrPT100Link,NdatiMedia,margine,Tmax,Tmin,... + datainiPT100,IDcentralina,DTcatena,FileName); + end + clear NuovoZeroPT100 + clear NdatiMedia + clear margine + clear NodoPT100Link + + %--- Analisi Weir Link --- + if yesWL == 1 + therm = cell2mat(NodoWeirLink(:,6)); + for ii = 1:rWL + if therm(ii,1)==1 % è presente il termometro + Dati_WL(:,ii) = Dati_WL(:,ii)./(1-0.0002*TdefWL(:,ii)); % vale solo per correzione LINEARE + end + end + % Calcolo differenziali + NomeFile = ['' IDcentralina '-' DTcatena '-RifWL.csv']; + if NuovoZeroWL == 0 % prima elaborazione + csvwrite(NomeFile,Dati_WL(1,:)); + Dati_WL = Dati_WL(1,:) - Dati_WL; + else % Ci sono già dei dati elaborati + RIF = csvread(NomeFile); + Dati_WL = RIF - Dati_WL; + end + end + + if strcmp(IDcentralina,'ID0070') == 1 && strcmp(DTcatenaRif,'DT0111 IPI') == 1 + DTcatena = 'DT0111 IPI'; + end + + %% Scrittura Database + database_write(catena,IDcentralina,DTcatena,... + X,Y,Z,Xlocal,Ylocal,Zlocal,HShift,HShift_local,AlfaX,AlfaY,Azimuth,TempDef_TL,... + Speed_local,Speed,Acceleration,Acceleration_local,ErrTiltLink,ARRAYdateTL,... + Y_TLH,Z_TLH,Ylocal_TLH,Zlocal_TLH,AlfaX_TLH,AlfaY_TLH,TempDef_TLH,Speed_TLH,... + Speed_local_TLH,Acceleration_TLH,Acceleration_local_TLH,ErrTiltLinkH,ARRAYdateTLH,... + X_IPL,Y_IPL,Z_IPL,Xlocal_IPL,Ylocal_IPL,Zlocal_IPL,HShift_IPL,... + HShift_local_IPL,Azimuth_IPL,TempDef_IPL,Speed_local_IPL,Speed_IPL,... + Acceleration_local_IPL,Acceleration_IPL,AlfaX_IPL,AlfaY_IPL,ErrInPlaceLink,ARRAYdateIPL,... + X_HR,Y_HR,Z_HR,Xlocal_HR,Ylocal_HR,Zlocal_HR,HShift_HR,HShift_local_HR,... + AlfaX_HR,AlfaY_HR,Azimuth_HR,TempDef_TLHR,Speed_local_HR,Speed_HR,... + Acceleration_HR,Acceleration_local_HR,ErrTiltLinkHR,ARRAYdateTLHR,... + Y_TLHRH,Z_TLHRH,Ylocal_TLHRH,Zlocal_TLHRH,AlfaX_TLHRH,AlfaY_TLHRH,TempDef_TLHRH,Speed_TLHRH,... + Speed_local_TLHRH,Acceleration_TLHRH,Acceleration_local_TLHRH,ErrTiltLinkHRH,ARRAYdateTLHRH,... + X_IPLHR,Y_IPLHR,Z_IPLHR,Xlocal_IPLHR,Ylocal_IPLHR,Zlocal_IPLHR,HShift_IPLHR,... + HShift_local_IPLHR,AlfaX_IPLHR,AlfaY_IPLHR,TempDef_IPLHR,Azimuth_IPLHR,Speed_IPLHR,... + Speed_local_IPLHR,Acceleration_IPLHR,Acceleration_local_IPLHR,ErrInPlaceLinkHR,ARRAYdateIPLHR,... + Livello,PiezDef,PiezDefT,ErrPiezoLink,ARRAYdatePL,BaroDef,BaroDefT,ErrBaroLink,ARRAYdateBL,... + DatiLoad,ErrLoadLink,ARRAYdateLL,Rain,RainCum,ErrRainLink,ARRAYdateRL,... + ANGdefKL,TdefKL,ErrKlinoLink,ARRAYdateKL,NodoKlinoLink,ANGdefKLHR,TdefKLHR,ErrKlinoLinkHR,ARRAYdateKLHR,... + Dati_ThL,ErrThermLink,ARRAYdateThL,Dati_PT100,ErrPT100Link,ARRAYdatePT100,... + Dati_PE,ErrPendulum,ARRAYdatePE,Dati_WL,TdefWL,ErrWeirLink,NodoWeirLink,ARRAYdateWL,... + conn,FileName); + + %% Parte di lancio SW complementari + + [yesATD,yesRSN,yesMusa] = SWSearch(idTool,conn,FileName); + try + if yesATD == 1 + rilancio = ['/usr/local/matlab_func/run_ATD_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 ' IDcentralina ' ' DTcatena '']; + status = system(rilancio); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'ATD relaunch operation executed with success'; + fprintf(fileID,fmt,text); + fprintf(fileID,fmt,status); + fclose(fileID); + end + if yesRSN == 1 + rilancio = ['/usr/local/matlab_func/run_RSN_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 ' IDcentralina ' ' DTcatena '']; + status = system(rilancio); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'RSN relaunch operation executed with success'; + fprintf(fileID,fmt,text); + fprintf(fileID,fmt,status); + fclose(fileID); + end + 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 +end + +%% Parte di allertamento + +% Determino gli utenti da utilizzare in tutte le funzioni successive +[Mail,Users_Alert,Users_SMS,Users_Report,activeIT,activeEN,sms,siteID,ini_CoV] = ... + 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 imposte dal cliente +alert_Levels(ARRAYdateRL,IDcentralina,DTcatena,conn,FileName); + +if strcmp(Unit,'Nesa evolution') == 0 + % Calcolo con Fukuzono - Inverso della Velocità + Time_Of_Failure(IDcentralina,DTcatena,date,ARRAYdateTL,ARRAYdateIPL,... + yesTL,yesTLHR3D,yesIPL,yesIPLHR3D,rTL,rIPL,NodoTiltLink,NodoTiltLinkHR,... + NodoTiltLinkHR3D,NodoInPlaceLink,NodoInPlaceLinkHR,NodoInPlaceLinkHR3D,... + Mail,Users_Alert,Users_SMS,ini_CoV,activeIT,activeEN,sms,siteID,conn,FileName); + + % Attivazione di sistemi di allertamento + Siren(alarms,yesKL,yesKLHR,yesTL,datainiKL,tempoiniKL,datainiKLHR,tempoiniKLHR,... + datainiTL,tempoiniTL,ARRAYdateKL,ARRAYdateKLHR,ARRAYdateTL,conn,date,time,FileName); +end + +% 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) + +% Redazione del Report Automatico +Report_ASE(IDcentralina,unitID,chainID,alarms,Chain_Scheme,num_nodi,... + Users_Report,Mail,time,activeEN,siteID,conn,FileName); + +close(conn) + +toc +text = ['Tilt calculation ended in ' num2str(toc)]; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +RC = 0; +end diff --git a/Tilt/Time_Of_Failure.m b/Tilt/Time_Of_Failure.m new file mode 100755 index 0000000..64b55b0 --- /dev/null +++ b/Tilt/Time_Of_Failure.m @@ -0,0 +1,1572 @@ +function Time_Of_Failure(IDcentralina,DTcatena,date,ARRAYdateTL,ARRAYdateIPL,... + yesTL,yesTLHR3D,yesIPL,yesIPLHR3D,rTL,rIPL,NodoTiltLink,NodoTiltLinkHR,... + NodoTiltLinkHR3D,NodoInPlaceLink,NodoInPlaceLinkHR,NodoInPlaceLinkHR3D,... + Mail,Users_Alert,Users_SMS,ini_CoV,activeIT,activeEN,sms,siteID,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'Time_Of_Failure function started'; +fprintf(fileID,fmt,text); +fclose(fileID); + +if yesTL == 1 || yesIPL == 1 + + if yesTL == 1 % Vertical Array + ARRAYdate = ARRAYdateTL; + yes3D = yesTLHR3D; + rNL = rTL; + NodoTilt = NodoTiltLink; + NodoTiltHR = NodoTiltLinkHR; + NodoTiltHR3D = NodoTiltLinkHR3D; + else % In Place Array + ARRAYdate = ARRAYdateIPL; + yes3D = yesIPLHR3D; + rNL = rIPL; + NodoTilt = NodoInPlaceLink; + NodoTiltHR = NodoInPlaceLinkHR; + NodoTiltHR3D = NodoInPlaceLinkHR3D; + end + + FileNameFuk = ['' IDcentralina '-' DTcatena '-Fuk.txt']; + if isfile(FileNameFuk) == 0 % NON Esiste + outdat = fopen(FileNameFuk,'wt+'); + fileID = fopen(FileNameFuk,'a'); + fmt = '%.10f \r'; + DATA = 0; + fprintf(fileID,fmt,DATA); + fmt = '%.10f \r'; + fprintf(fileID,fmt,now); + fprintf(fileID,fmt,DATA); + fclose(fileID); + end + + if now-datenum(date) > 30 + + % Fukuzono real-time + [alert,alert_local,alarm,alarm_local,Date,RQ,RQ_Loc,DataFuK,DataFuK_local,... + Tr_mail,Tr_Loc_mail,Tr_Inf,Tr_Inf_Loc,Tr_Sup,Tr_Sup_Loc,Tr_Loc_HR,... + DataFuK_local_HR,Number,Number_Loc] = Fukuzono(IDcentralina,DTcatena,... + date,ARRAYdate,yes3D,rNL,NodoTilt,NodoTiltHR,NodoTiltHR3D,conn,FileName); + + % Fukuzono storico + [alarm_STORICO,alarm_local_STORICO,DateGiorno,Tr_Loc_Sup_S,Tr_Loc_Inf_S,... + Tr_Loc_S,Tr_Sup_S,Tr_Inf_S,Tr_S,Tr_Loc_HR_S,Tr_mail_S,Tr_Loc_mail_S,... + DataFuK_S,DataFuK_local_S,DataFuK_local_HR_S,Number_S,Number_Loc_S,... + RQ_S,RQ_Loc_S] = Fukuzono_Giornaliero(IDcentralina,DTcatena,date,... + ARRAYdate,yes3D,rNL,NodoTilt,NodoTiltHR,NodoTiltHR3D,conn,FileName); + + else + alert = []; + alert_local = []; + alarm = []; + alarm_local = []; + alarm_STORICO = []; + alarm_local_STORICO = []; + end + +else + alert = []; + alert_local = []; + alarm = []; + alarm_local = []; + alarm_STORICO = []; + alarm_local_STORICO = []; +end + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; + +activate = 0; % attiva l'invio di mail +FileNameFuk = ['' IDcentralina '-' DTcatena '-Fuk.txt']; +% - Allerta - +if isempty(find(alert)) == 1 && isempty(find(alert_local)) == 1 + Alert = 0; % non ho allerte +else + Alert = 1; % ho allerte + activate = 1; +end +if isempty(find(alarm)) == 1 && isempty(find(alarm_local)) == 1 + Alarm = 0; % non ho allarmi +else + Alarm = 1; % ho allarmi + activate = 1; +end +if isempty(find(alarm_STORICO)) == 1 && isempty(find(alarm_local_STORICO)) == 1 + Alarm_Storico = 0; % non ho allarmi +else + Alarm_Storico = 1; % ho allarmi + activate = 1; +end + +if activate == 1 % mando la mail + A = importdata(FileNameFuk); + DataRif = A(1,1); + %% Criterio Real Time + if Alert == 1 || Alarm == 1 + [numDate,~] = size(alert); + Level = zeros(numDate,rNL); + Level_Local = zeros(numDate,rNL); + for j = 1:rNL % nodi + for i = 1:numDate % date + % -------- Cumulati ---------- + if alert(i,j) == 1 % --- Livello 1 --- + if Date(i) >= DataRif + if Date(i) >= DataRif+1 + Level(i,j) = 1; + end + if alarm(i,j) == 1 + if Tr_mail(i,j)+Date(i) < now % --- Livello 1.5 --- + Level(i,j) = 1.5; + else % --- Livello 2 --- + INI = find(Date >= Date(i,1)-1); + Casi = 0; + Index = []; + for FANFANI = INI(1):i + for SCAJOLA = 1:rNL + if DataFuK(FANFANI,SCAJOLA)+Tr_mail(FANFANI,SCAJOLA) > now || ... + DataFuK_local(FANFANI,SCAJOLA)+Tr_Loc_mail(FANFANI,SCAJOLA) > now + Casi = Casi+1; + Index = [Index; FANFANI SCAJOLA]; + end + end + end + if Number(i,j) > 5 || RQ(i,j) > 0.92 || Casi > 1 % --- Livello 3 --- + [rII,~] = size(Index); + if rII > 0 + for II = 1:rII + if Number(i,j) > 5 && RQ(i,j) > 0.92 ||... + Number(i,j) > 5 && Number(Index(II,1),Index(II,2)) > 5 && Casi == 2 ||... + RQ(i,j) > 0.92 && RQ(Index(II,1),Index(II,2)) > 0.92 && Casi == 2 ||... + Casi > 2 % --- Livello 4 --- + if Number(i,j) > 5 && RQ(i,j) > 0.92 && Casi >= 2 + % --- Livello 5 --- + Level(i,j) = 5; + else + Level(i,j) = 4; + end + else + Level(i,j) = 3; + end + end + else + if Number(i,j) > 5 && RQ(i,j) > 0.92 || Casi > 2 % --- Livello 4 --- + if Number(i,j) > 5 && RQ(i,j) > 0.92 && Casi >= 2 + % --- Livello 5 --- + Level(i,j) = 5; + else + Level(i,j) = 4; + end + else + Level(i,j) = 3; + end + end + else + Level(i,j) = 2; + end + end + end + end + end + % -------- Locali ---------- + if alert_local(i,j) == 1 % --- Livello 1 --- + if Date(i) >= DataRif+1 + Level_Local(i,j) = 1; + end + if Date(i) >= DataRif + if alarm_local(i,j) == 1 + if Tr_Loc_mail(i,j)+Date(i) < now % --- Livello 1.5 --- + Level_Local(i,j) = 1.5; + else % --- Livello 2 --- + INI = find(Date >= Date(i,1)-1); + Casi = 0; + Index = []; + for CRAXI = INI(1):i + for ALEMANNO = 1:rNL + if DataFuK_local(CRAXI,ALEMANNO)+Tr_mail(CRAXI,ALEMANNO) > now ||... + DataFuK(CRAXI,ALEMANNO)+Tr_Loc_mail(CRAXI,ALEMANNO) > now + Casi = Casi+1; + Index = [Index; CRAXI ALEMANNO]; + end + end + end + if Number_Loc(i,j) > 5 || RQ_Loc(i,j) > 0.92 || Casi > 1 % --- Livello 3 --- + [rII,~] = size(Index); + if rII > 0 + for II = 1:rII + if Number_Loc(i,j) > 5 && RQ_Loc(i,j) > 0.92 ||... + Number_Loc(i,j) > 5 && Number_Loc(Index(II,1),Index(II,2)) > 5 && Casi == 2 ||... + RQ_Loc(i,j) > 0.92 && RQ_Loc(Index(II,1),Index(II,2)) > 0.92 && Casi == 2 ||... + Casi > 2 % --- Livello 4 --- + if Number_Loc(i,j) > 5 && RQ_Loc(i,j) > 0.92 && Casi >= 2 + % --- Livello 5 --- + Level_Local(i,j) = 5; + else + Level_Local(i,j) = 4; + end + else + Level_Local(i,j) = 3; + end + end + else + if Number_Loc(i,j) > 5 && RQ_Loc(i,j) > 0.92 || Casi > 2 % --- Livello 4 --- + if Number_Loc(i,j) > 5 && RQ_Loc(i,j) > 0.92 && Casi >= 2 + % --- Livello 5 --- + Level_Local(i,j) = 5; + else + Level_Local(i,j) = 4; + end + else + Level_Local(i,j) = 3; + end + end + else + Level_Local(i,j) = 2; + end + end + end + end + end + end + end + else + Level = 0; + Level_Local = 0; + end + %% Criterio Storico + if Alarm_Storico == 1 + [numDate,~] = size(alarm_STORICO); + Level_Storico = zeros(numDate,rNL); + Level_Local_Storico = zeros(numDate,rNL); + for j = 1:rNL % nodi + for i = 1:numDate % date + % -------- Cumulati ---------- + if DateGiorno(i) >= DataRif + if alarm_STORICO(i,j) == 1 + if Tr_S(i,j)+DateGiorno(i) < now % --- Livello 1.5 --- + Level_Storico(i,j) = 1.5; + else % --- Livello 2 --- + INI = find(DateGiorno >= DateGiorno(i,1)-1); + Casi = 0; + Index = []; + for COSSIGA = INI(1):i + for SCHIFANI = 1:rNL + if DataFuK_S(COSSIGA,SCHIFANI)+Tr_mail_S(COSSIGA,SCHIFANI) > 0 ||... + DataFuK_local_S(COSSIGA,SCHIFANI)+Tr_Loc_mail_S(COSSIGA,SCHIFANI) > 0 + Casi = Casi+1; + Index = [Index; COSSIGA SCHIFANI]; + end + end + end + if Number_S(i,j) > 5 || RQ_S(i,j) > 0.92 || Casi > 1 % --- Livello 3 --- + [rII,~] = size(Index); + if rII > 0 + for II = 1:rII + if Number_S(i,j) > 5 && RQ_S(i,j) > 0.92 ||... + Number_S(i,j) > 5 && Number_S(Index(II,1),Index(II,2)) > 5 && Casi == 2 ||... + RQ_S(i,j) > 0.92 && RQ_S(Index(II,1),Index(II,2)) > 0.92 && Casi == 2 ||... + Casi > 2 + % --- Livello 4 --- + if Number_S(i,j) > 5 && RQ_S(i,j) > 0.92 && Casi >= 2 + % --- Livello 5 --- + Level_Storico(i,j) = 5; + else + Level_Storico(i,j) = 4; + end + else + Level_Storico(i,j) = 3; + end + end + else + if Number_S(i,j) > 5 && RQ_S(i,j) > 0.92 || Casi > 2 % --- Livello 4 --- + if Number_S(i,j) > 5 && RQ_S(i,j) > 0.92 && Casi >= 2 + % --- Livello 5 --- + Level_Storico(i,j) = 5; + else + Level_Storico(i,j) = 4; + end + else + Level_Storico(i,j) = 3; + end + end + else + Level_Storico(i,j) = 2; + end + end + end + % -------- Locali ---------- + if alarm_local_STORICO(i,j) == 1 + if Tr_Loc_S(i,j)+DateGiorno(i) < now % --- Livello 1.5 --- + Level_Local_Storico(i,j) = 1.5; + else % --- Livello 2 --- + INI = find(DateGiorno >= DateGiorno(i,1)-1); + Casi = 0; + Index = []; + for CROSETTO = INI(1):i + for CAPEZZONE = 1:rNL + if DataFuK_local_S(CROSETTO,CAPEZZONE)+Tr_Loc_mail_S(CROSETTO,CAPEZZONE) > 0 ||... + DataFuK_S(CROSETTO,CAPEZZONE)+Tr_mail_S(CROSETTO,CAPEZZONE) > 0 + Casi = Casi+1; + Index = [Index; CROSETTO CAPEZZONE]; + end + end + end + if Number_Loc_S(i,j) > 5 || RQ_Loc_S(i,j) > 0.92 || Casi > 1 % --- Livello 3 --- + [rII,~] = size(Index); + if rII > 0 + for II = 1:rII + if Number_Loc_S(i,j) > 5 && RQ_Loc_S(i,j) > 0.92 ||... + Number_Loc_S(i,j) > 5 && Number_Loc_S(Index(II,1),Index(II,2)) > 5 && Casi == 2 ||... + RQ_Loc_S(i,j) > 0.92 && RQ_Loc_S(Index(II,1),Index(II,2)) > 0.92 && Casi == 2 ||... + Casi > 2 % --- Livello 4 --- + if Number_Loc_S(i,j) > 5 && RQ_Loc_S(i,j) > 0.92 && Casi >= 2 + % --- Livello 5 --- + Level_Local_Storico(i,j) = 5; + else + Level_Local_Storico(i,j) = 4; + end + else + Level_Local_Storico(i,j) = 3; + end + end + else + if Number_Loc_S(i,j) > 5 && RQ_Loc_S(i,j) > 0.92 || Casi > 2 % --- Livello 4 --- + if Number_Loc_S(i,j) > 5 && RQ_Loc_S(i,j) > 0.92 && Casi >= 2 + % --- Livello 5 --- + Level_Local_Storico(i,j) = 5; + else + Level_Local_Storico(i,j) = 4; + end + else + Level_Local_Storico(i,j) = 3; + end + end + else + Level_Local_Storico(i,j) = 2; + end + end + end + end + end + end + else + Level_Storico = 0; + Level_Local_Storico = 0; + end + + Data_Text = []; + + % A partire dal site ID, risalgo al Nome del sito + comando = ['select name from sites where id like ''' siteID ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Sito = char(curs.Data); + + %% Mail di Livello 5 + [rLV5,cLV5] = find(Level==5); + [rLV5_S,cLV5_S] = find(Level_Storico==5); + [rLV5_Loc,cLV5_Loc] = find(Level_Local==5); + [rLV5_Loc_S,cLV5_Loc_S] = find(Level_Local_Storico==5); + nC = 1; + nCS = 1; + nF = 1; + nFS = 1; + nW = 1; + D = 1; + nA = 1; % Contatore Allegati + nACL = 1; + nACLS = 1; + message_LV5 = []; + % --- Cumulati --- + if isempty(rLV5) ~= 1 || isempty(rLV5_S) ~= 1 + [dim,~] = size(rLV5); + [dim_S,~] = size(rLV5_S); + message_LV5_Cliente{nC,1} = 'Gentile Cliente,'; + message_LV5_Cliente{nC+1,1} = 'Il Software di elaborazione automatica Tilt ha rilevato un trend di spostamenti potenzialmente critico, la cui evoluzione ha attivato il Metodo di stima del Tempo di Collasso del versante monitorato: '; + message_LV5_Cliente{nC+2,1} = ['- Sito: ' Sito]; + message_LV5_Cliente{nC+3,1} = ['- Centralina: ' IDcentralina]; + message_LV5_Cliente{nC+4,1} = ['- Catena: ' DTcatena]; + message_LV5_Cliente_ENG{nC,1} = 'Dear Client,'; + message_LV5_Cliente_ENG{nC+1,1} = 'The automatic software Tilt has detected a potentially critical displacement trend, which triggered the activation of a Failure Forecasting Model in order to estimate the collapse date of the monitored slope: '; + message_LV5_Cliente_ENG{nC+2,1} = ['- Site: ' Sito]; + message_LV5_Cliente_ENG{nC+3,1} = ['- Data Logger: ' IDcentralina]; + message_LV5_Cliente_ENG{nC+4,1} = ['- Array: ' DTcatena]; + message_LV5_Cliente_ENG(nC:nC+4,2) = message_LV5_Cliente(nC:nC+4,1); % Prima colonna - Criterio Real Time, Seconda Colonna - Criterio Storico + nC = nC+5; + if dim ~= 0 % Criterio Real Time + for I = 1:dim + NodeNum = num2str(cell2mat(NodoTilt(cLV5(I),2))); + Depth = num2str(cell2mat(NodoTilt(cLV5(I),3))); + data = datestr(DataFuK(rLV5(I),cLV5(I)),'dd-mm-yyyy HH:MM'); + Data_Crollo = Tr_mail(rLV5(I),cLV5(I))+Date(rLV5(I),1); + if Data_Crollo-now >= 0 % Il dato è significativo solo se nel futuro + % --- Mail ASE --- + Collasso_Inf = datestr(Tr_Inf(rLV5(I),cLV5(I)),'dd-mm-yyyy HH:MM'); + Collasso_Sup = datestr(Tr_Sup(rLV5(I),cLV5(I)),'dd-mm-yyyy HH:MM'); + message_LV5{nW,1} = ['ALLARME sui dati cumulati del nodo numero ' NodeNum... + ' alla profondita'' di ' Depth ' m, centralina ' IDcentralina... + ', catena ' DTcatena ' nel sito di ' Sito '. Possibile inizio dell''accelerazione in data ' ... + data '. Possibile collasso stimato nella finestra temporale tra ' Collasso_Inf... + ' e ' Collasso_Sup ' ! Analisi eseguita con Metodo dell''Inverso della Velocita''.']; + Data_Img = datestr(DataFuK(rLV5(I),cLV5(I)),'dd-mm-yyyy'); + Tempo_Img = datestr(DataFuK(rLV5(I),cLV5(I)),'HH-MM-SS'); + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'.jpg'); + filename2 = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'_Vel.jpg'); + attachments{nA,1} = filename; + attachments{nA+1,1} = filename2; + Data_Text(D,1) = DataFuK(rLV5(I),cLV5(I)); + D = D+1; + nW = nW+1; + nA = nA+2; + % --- Mail Cliente --- + message_LV5_Cliente{nC,1} = ''; + message_LV5_Cliente{nC+1,1} = '- Tipologia dati: spostamenti cumulati'; + message_LV5_Cliente{nC+2,1} = ['- Nodo e Profondita'': ' NodeNum ', ' Depth ' m']; + message_LV5_Cliente_ENG{nC,1} = ''; + message_LV5_Cliente_ENG{nC+1,1} = '- Data Typology: cumulative displacements'; + message_LV5_Cliente_ENG{nC+2,1} = ['- Node Typology and Depth: ' NodeNum ', ' Depth 'm']; + Finestra_RealTime(nF,1) = Tr_Inf(rLV5(I),cLV5(I)); % Colonna 1: Limite inferiore + Finestra_RealTime(nF,2) = Tr_Sup(rLV5(I),cLV5(I)); % Colonna 2: Limite superiore + Finestra_RealTime(nF,3) = DataFuK(rLV5(I),cLV5(I)); % Colonna 3: Data di inizio accelerazione + allegati_cliente{nACL,1} = filename; + allegati_cliente{nACL+1,1} = filename2; + nF = nF+1; + nC = nC+3; + nACL = nACL+2; + end + text = ['Alarm of Level #5 activated by IVM analysis for cumulated values of node ' NodeNum ' with acceleration date equal to ' data '.']; + fprintf(fileID,fmt,text); + end + end + if dim_S ~= 0 % Criterio Storico + for I = 1:dim_S + NodeNum = num2str(cell2mat(NodoTilt(cLV5_S(I),2))); + Depth = num2str(cell2mat(NodoTilt(cLV5_S(I),3))); + data = datestr(DataFuK_S(rLV5_S(I),cLV5_S(I)),'dd-mm-yyyy HH:MM'); + Data_Crollo = Tr_S(rLV5_S(I),cLV5_S(I))+DateGiorno(rLV5_S(I),1); + if Data_Crollo-now >= 0 % Il dato è significativo solo se nel futuro + % --- Mail ASE --- + Collasso_Inf = datestr(Tr_Inf_S(rLV5_S(I),cLV5_S(I)),'dd-mm-yyyy HH:MM'); + Collasso_Sup = datestr(Tr_Sup_S(rLV5_S(I),cLV5_S(I)),'dd-mm-yyyy HH:MM'); + message_LV5{nW,1} = ['ALLARME sui dati cumulati del nodo numero ' NodeNum... + ' alla profondita'' di ' Depth ' della centralina ' IDcentralina... + ', catena ' DTcatena ' nel sito di ' Sito '. Possibile inizio dell''accelerazione in data ' ... + data '. Possibile collasso stimato nella finestra temporale tra ' Collasso_Inf... + ' e ' Collasso_Sup ' ! Analisi eseguita con Metodo Storico dell''Inverso della Velocita''.']; + Data_Img = datestr(DataFuK_S(rLV5_S(I),cLV5_S(I)),'dd-mm-yyyy'); + Tempo_Img = datestr(DataFuK_S(rLV5_S(I),cLV5_S(I)),'HH-MM-SS'); + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'_Storico.jpg'); + filename2 = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'_Vel_Storico.jpg'); + attachments{nA,1} = filename; + attachments{nA+1,1} = filename2; + Data_Text(D,1) = DataFuK_S(rLV5_S(I),cLV5_S(I)); + D = D+1; + nW = nW+1; + nA = nA+2; + % --- Mail Cliente --- + message_LV5_Cliente{nCS,2} = ''; + message_LV5_Cliente{nCS+1,2} = '- Tipologia dati: spostamenti cumulati'; + message_LV5_Cliente{nCS+2,2} = ['- Nodo e Profondita'': ' NodeNum ', ' Depth 'm']; + message_LV5_Cliente_ENG{nCS,2} = ''; + message_LV5_Cliente_ENG{nCS+1,2} = '- Data Typology: cumulative displacements'; + message_LV5_Cliente_ENG{nCS+2,2} = ['- Node Typology and Depth: ' NodeNum ', ' Depth 'm']; + Finestra_Storico(nFS,1)= Tr_Inf_S(rLV5_S(I),cLV5_S(I)); + Finestra_Storico(nFS,2)= Tr_Sup_S(rLV5_S(I),cLV5_S(I)); + Finestra_Storico(nFS,3) = DataFuK_S(rLV5_S(I),cLV5_S(I)); % Colonna 3: Data di inizio accelerazione + allegati_cliente{nACLS,1} = filename; + allegati_cliente{nACLS+1,1} = filename2; + nFS = nFS+1; + nCS = nCS+3; + nACLS = nACLS+2; + end + text = ['Alarm of Level #5 activated by Daily IVM analysis for cumulated values of node ' NodeNum ' with acceleration date equal to ' data '.']; + fprintf(fileID,fmt,text); + end + end + else + message_LV5_Cliente = []; + end + % --- Locali --- + if isempty(rLV5_Loc) ~= 1 || isempty(rLV5_Loc_S) ~= 1 % Criterio Locale + if isempty(message_LV5_Cliente) == 1 + message_LV5_Cliente{nC,1} = 'Gentile Cliente,'; + message_LV5_Cliente{nC+1,1} = 'Il Software di elaborazione automatica Tilt ha rilevato un trend di spostamenti potenzialmente critico, la cui evoluzione ha attivato il Metodo di stima del Tempo di Collasso del versante monitorato: '; + message_LV5_Cliente{nC+2,1} = ['- Sito: ' Sito]; + message_LV5_Cliente{nC+3,1} = ['- Centralina: ' IDcentralina]; + message_LV5_Cliente{nC+4,1} = ['- Catena: ' DTcatena]; + message_LV5_Cliente_ENG{nC,1} = 'Dear Client,'; + message_LV5_Cliente_ENG{nC+1,1} = 'The automatic software Tilt has detected a potentially critical displacement trend, which triggered the activation of a Failure Forecasting Model in order to estimate the collapse date of the monitored slope: '; + message_LV5_Cliente_ENG{nC+2,1} = ['- Site: ' Sito]; + message_LV5_Cliente_ENG{nC+3,1} = ['- Data Logger: ' IDcentralina]; + message_LV5_Cliente_ENG{nC+4,1} = ['- Array: ' DTcatena]; + message_LV5_Cliente_ENG(nC:nC+4,2) = message_LV5_Cliente(nC:nC+4,1); % Prima colonna - Criterio Real Time, Seconda Colonna - Criterio Storico + nC = nC+5; + end + [dim,~] = size(rLV5_Loc); + if dim ~= 0 + for I = 1:dim + NodeNum = num2str(cell2mat(NodoTilt(cLV5_Loc(I),2))); + Depth = num2str(cell2mat(NodoTilt(cLV5_Loc(I),3))); + data = datestr(DataFuK_local(rLV5_Loc(I),cLV5_Loc(I)),'dd-mm-yyyy HH:MM'); + Data_Crollo = Tr_Loc_mail(rLV5_Loc(I),cLV5_Loc(I))+Date(rLV5_Loc(I),1); + if Data_Crollo-now >= 0 % Il dato è significativo solo se nel futuro + % --- Mail ASE --- + Collasso_Inf = datestr(Tr_Inf_Loc(rLV5_Loc(I),cLV5_Loc(I)),'dd-mm-yyyy HH:MM'); + Collasso_Sup = datestr(Tr_Sup_Loc(rLV5_Loc(I),cLV5_Loc(I)),'dd-mm-yyyy HH:MM'); + message_LV5{nW,1} = ['ALLARME sui dati locali del nodo numero ' NodeNum... + ' alla profondita'' di ' Depth ' della centralina ' IDcentralina... + ', catena ' DTcatena ' nel sito di ' Sito '. Possibile inizio dell''accelerazione in data ' ... + data '. Possibile collasso stimato nella finestra temporale tra ' Collasso_Inf... + ' e ' Collasso_Sup ' ! Analisi eseguita con Metodo dell''Inverso della Velocita''.']; + Data_Img = datestr(DataFuK_local(rLV5_Loc(I),cLV5_Loc(I)),'dd-mm-yyyy'); + Tempo_Img = datestr(DataFuK_local(rLV5_Loc(I),cLV5_Loc(I)),'HH-MM-SS'); + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'-Local.jpg'); + filename2 = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'-Local_Vel.jpg'); + attachments{nA,1} = filename; + attachments{nA+1,1} = filename2; + Data_Text(D,1) = DataFuK_local(rLV5_Loc(I),cLV5_Loc(I)); + D = D+1; + nW = nW+1; + nA = nA+2; + % --- Mail Cliente --- + message_LV5_Cliente{nC,1} = ''; + message_LV5_Cliente{nC+1,1} = '- Tipologia dati: spostamenti locali'; + message_LV5_Cliente{nC+2,1} = ['- Nodo e Profondita'': ' NodeNum ', ' Depth ' m']; + message_LV5_Cliente_ENG{nC,1} = ''; + message_LV5_Cliente_ENG{nC+1,1} = '- Data Typology: local displacements'; + message_LV5_Cliente_ENG{nC+2,1} = ['- Node Typology and Depth: ' NodeNum ', ' Depth ' m']; + Finestra_RealTime(nF,1) = Tr_Inf_Loc(rLV5_Loc(I),cLV5_Loc(I)); + Finestra_RealTime(nF,2) = Tr_Sup_Loc(rLV5_Loc(I),cLV5_Loc(I)); + Finestra_RealTime(nF,3) = DataFuK_local(rLV5_Loc(I),cLV5_Loc(I)); + allegati_cliente{nACL,1} = filename; + allegati_cliente{nACL+1,1} = filename2; + nF = nF+1; + nC = nC+3; + nACL = nACL+2; + end + text = ['Alarm of Level #5 activated for local values of node ' NodeNum ' with acceleration date equal to ' data '.']; + fprintf(fileID,fmt,text); + end + end + [dim_S,~] = size(rLV5_Loc_S); + if dim_S ~= 0 % Criterio Storico + for I = 1:dim_S + NodeNum = num2str(cell2mat(NodoTilt(cLV5_Loc_S(I),2))); + Depth = num2str(cell2mat(NodoTilt(cLV5_Loc_S(I),3))); + data = datestr(DataFuK_local_S(rLV5_Loc_S(I),cLV5_Loc_S(I)),'dd-mm-yyyy HH:MM'); + Data_Crollo = Tr_Loc_S(rLV5_Loc_S(I),cLV5_Loc_S(I))+DateGiorno(rLV5_Loc_S(I),1); + if Data_Crollo-now >= 0 % Il dato è significativo solo se nel futuro + % --- Mail ASE --- + Collasso_Inf = datestr(Tr_Loc_Inf_S(rLV5_Loc_S(I),cLV5_Loc_S(I)),'dd-mm-yyyy HH:MM'); + Collasso_Sup = datestr(Tr_Loc_Sup_S(rLV5_Loc_S(I),cLV5_Loc_S(I)),'dd-mm-yyyy HH:MM'); + message_LV5{nW,1} = ['ALLARME sui dati locali del nodo numero ' NodeNum... + ' alla profondita'' di ' Depth ' della centralina ' IDcentralina... + ', catena ' DTcatena ' nel sito di ' Sito '. Possibile inizio dell''accelerazione in data ' ... + data '. Possibile collasso stimato nella finestra temporale tra ' Collasso_Inf... + ' e ' Collasso_Sup ' ! Analisi eseguita con Metodo Storico dell''Inverso della Velocita''.']; + Data_Img = datestr(DataFuK_local_S(rLV5_Loc_S(I),cLV5_Loc_S(I)),'dd-mm-yyyy'); + Tempo_Img = datestr(DataFuK_local_S(rLV5_Loc_S(I),cLV5_Loc_S(I)),'HH-MM-SS'); + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'-Local_Storico.jpg'); + filename2 = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'-Local_Vel_Storico.jpg'); + attachments{nA,1} = filename; + attachments{nA+1,1} = filename2; + Data_Text(D,1) = DataFuK_local_S(rLV5_Loc_S(I),cLV5_Loc_S(I)); + D = D+1; + nW = nW+1; + nA = nA+2; + % --- Mail Cliente --- + message_LV5_Cliente{nCS,1} = ''; + message_LV5_Cliente{nCS+1,2} = '- Tipologia dati: spostamenti locali'; + message_LV5_Cliente{nCS+2,2} = ['- Nodo e Profondita'': ' NodeNum ', ' Depth ' m']; + message_LV5_Cliente_ENG{nCS,2} = ''; + message_LV5_Cliente_ENG{nCS+1,2} = '- Data Typology: local displacements'; + message_LV5_Cliente_ENG{nCS+2,2} = ['- Node Typology and Depth: ' NodeNum ', ' Depth ' m']; + Finestra_Storico(nFS,1) = Tr_Loc_Inf_S(rLV5_Loc_S(I),cLV5_Loc_S(I)); + Finestra_Storico(nFS,2) = Tr_Loc_Sup_S(rLV5_Loc_S(I),cLV5_Loc_S(I)); + Finestra_Storico(nFS,3) = DataFuK_local_S(rLV5_Loc_S(I),cLV5_Loc_S(I)); + allegati_cliente{nACLS,1} = filename; + allegati_cliente{nACLS+1,1} = filename2; + nFS = nFS+1; + nCS = nCS+3; + nACLS = nACLS+2; + end + text = ['Alarm of Level #5 activated by Daily IVM analysis for local values of node ' NodeNum ' with acceleration date equal to ' data '.']; + fprintf(fileID,fmt,text); + end + end + end + + %% Mail di Livello 4 + [rLV4,cLV4] = find(Level==4); + [rLV4_S,cLV4_S] = find(Level_Storico==4); + [rLV4_Loc,cLV4_Loc] = find(Level_Local==4); + [rLV4_Loc_S,cLV4_Loc_S] = find(Level_Local_Storico==4); + message_LV4 = []; + % --- Cumulati --- + if isempty(rLV4) ~= 1 || isempty(rLV4_S) ~= 1 + message_LV4_Cliente{1,1} = 'Gentile Cliente,'; + message_LV4_Cliente{2,1} = ''; + message_LV4_Cliente{3,1} = 'Il Software di elaborazione automatica Tilt ha rilevato un progressivo aumento delle accelerazioni degli spostamenti relativamente al versante monitorato: '; + message_LV4_Cliente{4,1} = ['- Sito: ' Sito]; + message_LV4_Cliente{5,1} = ['- Centralina: ' IDcentralina]; + message_LV4_Cliente{6,1} = ['- Catena: ' DTcatena]; + message_LV4_Cliente{7,1} = ''; + message_LV4_Cliente_ENG{1,1} = 'Dear Client,'; + message_LV4_Cliente_ENG{2,1} = ''; + message_LV4_Cliente_ENG{3,1} = 'The automatic software Tilt has detected an increment of the displacements acceleration recorded on the monitored slope: '; + message_LV4_Cliente_ENG{4,1} = ['- Site: ' Sito]; + message_LV4_Cliente_ENG{5,1} = ['- Data Logger: ' IDcentralina]; + message_LV4_Cliente_ENG{6,1} = ['- Array: ' DTcatena]; + message_LV4_Cliente_ENG{7,1} = ''; + [dim,~] = size(rLV4); + [dim_S,~] = size(rLV4_S); + if dim ~= 0 % Criterio Real Time + for I = 1:dim + NodeNum = num2str(cell2mat(NodoTilt(cLV4(I),2))); + Depth = num2str(cell2mat(NodoTilt(cLV4(I),3))); + data = datestr(DataFuK(rLV4(I),cLV4(I)),'dd-mm-yyyy HH:MM'); + Data_Crollo = Tr_mail(rLV4(I),cLV4(I))+Date(rLV4(I),1); + if Data_Crollo-now >= 0 % Il dato è significativo solo se nel futuro + % --- Mail ASE --- + Collasso_Inf = datestr(Tr_Inf(rLV4(I),cLV4(I)),'dd-mm-yyyy HH:MM'); + Collasso_Sup = datestr(Tr_Sup(rLV4(I),cLV4(I)),'dd-mm-yyyy HH:MM'); + message_LV4{nW,1} = ['Pre-Allarme sui dati cumulati del nodo numero ' NodeNum... + ' alla profondita'' di ' Depth ' della centralina ' IDcentralina... + ', catena ' DTcatena ' nel sito di ' Sito '. Possibile inizio dell''accelerazione in data ' ... + data '. Possibile collasso stimato nella finestra temporale tra ' Collasso_Inf... + ' e ' Collasso_Sup ' ! Analisi eseguita con Metodo dell''Inverso della Velocita''.']; + Data_Img = datestr(DataFuK(rLV4(I),cLV4(I)),'dd-mm-yyyy'); + Tempo_Img = datestr(DataFuK(rLV4(I),cLV4(I)),'HH-MM-SS'); + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'.jpg'); + filename2 = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'_Vel.jpg'); + attachments{nA,1} = filename; + attachments{nA+1,1} = filename2; + Data_Text(D,1) = DataFuK(rLV4(I),cLV4(I)); + D = D+1; + nW = nW+1; + nA = nA+2; + % --- Mail Cliente --- + + end + text = ['Alarm of Level #4 activated by IVM analysis for cumulated values of node ' NodeNum ' with acceleration date equal to ' data '.']; + fprintf(fileID,fmt,text); + end + end + if dim_S ~= 0 % Criterio Storico + for I = 1:dim_S + NodeNum = num2str(cell2mat(NodoTilt(cLV4_S(I),2))); + Depth = num2str(cell2mat(NodoTilt(cLV4_S(I),3))); + data = datestr(DataFuK_S(rLV4_S(I),cLV4_S(I)),'dd-mm-yyyy HH:MM'); + Data_Crollo = Tr_S(rLV4_S(I),cLV4_S(I))+DateGiorno(rLV4_S(I),1); + if Data_Crollo-now >= 0 % Il dato è significativo solo se nel futuro + % --- Mail ASE --- + Collasso_Inf = datestr(Tr_Inf_S(rLV4_S(I),cLV4_S(I)),'dd-mm-yyyy HH:MM'); + Collasso_Sup = datestr(Tr_Sup_S(rLV4_S(I),cLV4_S(I)),'dd-mm-yyyy HH:MM'); + message_LV4{nW,1} = ['Pre-Allarme sui dati cumulati del nodo numero ' NodeNum... + ' alla profondita'' di ' Depth ' della centralina ' IDcentralina... + ', catena ' DTcatena ' nel sito di ' Sito '. Possibile inizio dell''accelerazione in data ' ... + data '. Possibile collasso stimato nella finestra temporale tra ' Collasso_Inf... + ' e ' Collasso_Sup ' ! Analisi eseguita con Metodo Storico dell''Inverso della Velocita''.']; + Data_Img = datestr(DataFuK_S(rLV4_S(I),cLV4_S(I)),'dd-mm-yyyy'); + Tempo_Img = datestr(DataFuK_S(rLV4_S(I),cLV4_S(I)),'HH-MM-SS'); + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'_Storico.jpg'); + filename2 = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'_Vel_Storico.jpg'); + attachments{nA,1} = filename; + attachments{nA+1,1} = filename2; + Data_Text(D,1) = DataFuK_S(rLV4_S(I),cLV4_S(I)); + D = D+1; + nW = nW+1; + nA = nA+2; + % --- Mail Cliente --- + + end + text = ['Alarm of Level #4 activated by Daily IVM analysis for cumulated values of node ' NodeNum ' with acceleration date equal to ' data '.']; + fprintf(fileID,fmt,text); + end + end + else + message_LV4_Cliente = []; + end + % --- Locali --- + if isempty(rLV4_Loc) ~= 1 || isempty(rLV4_Loc_S) ~= 1 % Criterio Real Time + if isempty(message_LV4_Cliente) == 1 + message_LV4_Cliente{1,1} = 'Gentile Cliente,'; + message_LV4_Cliente{2,1} = 'Il Software di elaborazione automatica Tilt ha rilevato un progressivo aumento delle accelerazioni degli spostamenti relativamente al versante monitorato: '; + message_LV4_Cliente{3,1} = ['- Sito: ' Sito]; + message_LV4_Cliente{4,1} = ['- Centralina: ' IDcentralina]; + message_LV4_Cliente{5,1} = ['- Catena: ' DTcatena]; + message_LV4_Cliente_ENG{1,1} = 'Dear Client,'; + message_LV4_Cliente_ENG{2,1} = 'The automatic software Tilt has detected an increment of the displacements acceleration recorded on the monitored slope: '; + message_LV4_Cliente_ENG{3,1} = ['- Site: ' Sito]; + message_LV4_Cliente_ENG{4,1} = ['- Data Logger: ' IDcentralina]; + message_LV4_Cliente_ENG{5,1} = ['- Array: ' DTcatena]; + end + [dim,~] = size(rLV4_Loc); + if dim ~= 0 + for I = 1:dim + NodeNum = num2str(cell2mat(NodoTilt(cLV4_Loc(I),2))); + Depth = num2str(cell2mat(NodoTilt(cLV4_Loc(I),3))); + data = datestr(DataFuK_local(rLV4_Loc(I),cLV4_Loc(I)),'dd-mm-yyyy HH:MM'); + Data_Crollo = Tr_Loc_mail(rLV4_Loc(I),cLV4_Loc(I))+Date(rLV4_Loc(I),1); + if Data_Crollo-now >= 0 % Il dato è significativo solo se nel futuro + Collasso_Inf = datestr(Tr_Inf_Loc(rLV4_Loc(I),cLV4_Loc(I)),'dd-mm-yyyy HH:MM'); + Collasso_Sup = datestr(Tr_Sup_Loc(rLV4_Loc(I),cLV4_Loc(I)),'dd-mm-yyyy HH:MM'); + message_LV4{nW,1} = ['Pre-Allarme sui dati locali del nodo numero ' NodeNum... + ' alla profondita'' di ' Depth ' della centralina ' IDcentralina... + ', catena ' DTcatena ' nel sito di ' Sito '. Possibile inizio dell''accelerazione in data ' ... + data '. Possibile collasso stimato nella finestra temporale tra ' Collasso_Inf... + ' e ' Collasso_Sup ' ! Analisi eseguita con Metodo dell''Inverso della Velocita''.']; + Data_Img = datestr(DataFuK_local(rLV4_Loc(I),cLV4_Loc(I)),'dd-mm-yyyy'); + Tempo_Img = datestr(DataFuK_local(rLV4_Loc(I),cLV4_Loc(I)),'HH-MM-SS'); + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'-Local.jpg'); + filename2 = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'-Local_Vel.jpg'); + attachments{nA,1} = filename; + attachments{nA+1,1} = filename2; + Data_Text(D,1) = DataFuK_local(rLV4_Loc(I),cLV4_Loc(I)); + D = D+1; + nW = nW+1; + nA = nA+2; + end + text = ['Alarm of Level #4 activated for local values of node ' NodeNum ' with acceleration date equal to ' data '.']; + fprintf(fileID,fmt,text); + end + end + [dim_S,~] = size(rLV4_Loc_S); + if dim_S ~= 0 % Criterio Storico + for I = 1:dim_S + NodeNum = num2str(cell2mat(NodoTilt(cLV4_Loc_S(I),2))); + Depth = num2str(cell2mat(NodoTilt(cLV4_Loc_S(I),3))); + data = datestr(DataFuK_local_S(rLV4_Loc_S(I),cLV4_Loc_S(I)),'dd-mm-yyyy HH:MM'); + Data_Crollo = Tr_Loc_S(rLV4_Loc_S(I),cLV4_Loc_S(I))+DateGiorno(rLV4_Loc_S(I),1); + if Data_Crollo-now >= 0 % Il dato è significativo solo se nel futuro + Collasso_Inf = datestr(Tr_Loc_Inf_S(rLV4_Loc_S(I),cLV4_Loc_S(I)),'dd-mm-yyyy HH:MM'); + Collasso_Sup = datestr(Tr_Loc_Sup_S(rLV4_Loc_S(I),cLV4_Loc_S(I)),'dd-mm-yyyy HH:MM'); + message_LV4{nW,1} = ['Pre-Allarme sui dati locali del nodo numero ' NodeNum... + ' alla profondita'' di ' Depth ' della centralina ' IDcentralina... + ', catena ' DTcatena ' nel sito di ' Sito '. Possibile inizio dell''accelerazione in data ' ... + data '. Possibile collasso stimato nella finestra temporale tra ' Collasso_Inf... + ' e ' Collasso_Sup ' ! Analisi eseguita con Metodo Storico dell''Inverso della Velocita''.']; + Data_Img = datestr(DataFuK_local_S(rLV4_Loc_S(I),cLV4_Loc_S(I)),'dd-mm-yyyy'); + Tempo_Img = datestr(DataFuK_local_S(rLV4_Loc_S(I),cLV4_Loc_S(I)),'HH-MM-SS'); + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'-Local_Storico.jpg'); + filename2 = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'-Local_Vel_Storico.jpg'); + attachments{nA,1} = filename; + attachments{nA+1,1} = filename2; + Data_Text(D,1) = DataFuK_local_S(rLV4_Loc_S(I),cLV4_Loc_S(I)); + D = D+1; + nW = nW+1; + nA = nA+2; + end + text = ['Alarm of Level #4 activated by Daily IVM analysis for local values of node ' NodeNum ' with acceleration date equal to ' data '.']; + fprintf(fileID,fmt,text); + end + end + end + + %% Mail di Livello 3 + [rLV3,cLV3] = find(Level==3); + [rLV3_S,cLV3_S] = find(Level_Storico==3); + [rLV3_Loc,cLV3_Loc] = find(Level_Local==3); + [rLV3_Loc_S,cLV3_Loc_S] = find(Level_Local_Storico==3); + message_LV3 = []; + nW = 1; + % --- Cumulati --- + if isempty(rLV3) ~= 1 || isempty(rLV3_S) ~= 1 + [dim,~] = size(rLV3); + [dim_S,~] = size(rLV3_S); + if dim ~= 0 % Criterio Real Time + for I = 1:dim + NodeNum = num2str(cell2mat(NodoTilt(cLV3(I),2))); + Depth = num2str(cell2mat(NodoTilt(cLV3(I),3))); + data = datestr(DataFuK(rLV3(I),cLV3(I)),'dd-mm-yyyy HH:MM'); + Data_Crollo = Tr_mail(rLV3(I),cLV3(I))+Date(rLV3(I),1); + if Data_Crollo-now >= 0 % Il dato è significativo solo se nel futuro + Collasso_Inf = datestr(Tr_Inf(rLV3(I),cLV3(I)),'dd-mm-yyyy HH:MM'); + Collasso_Sup = datestr(Tr_Sup(rLV3(I),cLV3(I)),'dd-mm-yyyy HH:MM'); + message_LV3{nW,1} = ['Allerta di Livello 3 sui dati cumulati del nodo numero ' NodeNum... + ' alla profondita'' di ' Depth ' della centralina ' IDcentralina... + ', catena ' DTcatena ' nel sito di ' Sito '. Possibile inizio dell''accelerazione in data ' ... + data '. Possibile collasso stimato nella finestra temporale tra ' Collasso_Inf... + ' e ' Collasso_Sup ' ! Analisi eseguita con Metodo dell''Inverso della Velocita''.''']; + Data_Img = datestr(DataFuK(rLV3(I),cLV3(I)),'dd-mm-yyyy'); + Tempo_Img = datestr(DataFuK(rLV3(I),cLV3(I)),'HH-MM-SS'); + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'.jpg'); + filename2 = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'_Vel.jpg'); + attachments{nA,1} = filename; + attachments{nA+1,1} = filename2; + Data_Text(D,1) = DataFuK(rLV3(I),cLV3(I)); + D = D+1; + nW = nW+1; + nA = nA+2; + end + text = ['Alarm of Level #3 activated by IVM analysis for cumulated values of node ' NodeNum ' with acceleration date equal to ' data '.']; + fprintf(fileID,fmt,text); + end + end + if dim_S ~= 0 % Criterio Storico + for I = 1:dim_S + NodeNum = num2str(cell2mat(NodoTilt(cLV3_S(I),2))); + Depth = num2str(cell2mat(NodoTilt(cLV3_S(I),3))); + data = datestr(DataFuK_S(rLV3_S(I),cLV3_S(I)),'dd-mm-yyyy HH:MM'); + Data_Crollo = Tr_S(rLV3_S(I),cLV3_S(I))+DateGiorno(rLV3_S(I),1); + if Data_Crollo-now >= 0 % Il dato è significativo solo se nel futuro + Collasso_Inf = datestr(Tr_Inf_S(rLV3_S(I),cLV3_S(I)),'dd-mm-yyyy HH:MM'); + Collasso_Sup = datestr(Tr_Sup_S(rLV3_S(I),cLV3_S(I)),'dd-mm-yyyy HH:MM'); + message_LV3{nW,1} = ['Allerta di Livello 3 sui dati cumulati del nodo numero ' NodeNum... + ' alla profondita'' di ' Depth ' della centralina ' IDcentralina... + ', catena ' DTcatena ' nel sito di ' Sito '. Possibile inizio dell''accelerazione in data ' ... + data '. Possibile collasso stimato nella finestra temporale tra ' Collasso_Inf... + ' e ' Collasso_Sup ' ! Analisi eseguita con Metodo Storico dell''Inverso della Velocita''.''']; + Data_Img = datestr(DataFuK_S(rLV3_S(I),cLV3_S(I)),'dd-mm-yyyy'); + Tempo_Img = datestr(DataFuK_S(rLV3_S(I),cLV3_S(I)),'HH-MM-SS'); + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'_Storico.jpg'); + filename2 = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'_Vel_Storico.jpg'); + attachments{nA,1} = filename; + attachments{nA+1,1} = filename2; + Data_Text(D,1) = DataFuK_S(rLV3_S(I),cLV3_S(I)); + D = D+1; + nW = nW+1; + nA = nA+2; + end + text = ['Alarm of Level #3 activated by Daily IVM analysis for cumulated values of node ' NodeNum ' with acceleration date equal to ' data '.']; + fprintf(fileID,fmt,text); + end + end + end + % --- Locali --- + if isempty(rLV3_Loc) ~= 1 || isempty(rLV3_Loc_S) ~= 1 + [dim,~] = size(rLV3_Loc); + if dim ~= 0 % Criterio Real Time + for I = 1:dim + NodeNum = num2str(cell2mat(NodoTilt(cLV3_Loc(I),2))); + Depth = num2str(cell2mat(NodoTilt(cLV3_Loc(I),3))); + data = datestr(DataFuK_local(rLV3_Loc(I),cLV3_Loc(I)),'dd-mm-yyyy HH:MM'); + Data_Crollo = Tr_Loc_mail(rLV3_Loc(I),cLV3_Loc(I))+Date(rLV3_Loc(I),1); + if Data_Crollo-now >= 0 % Il dato è significativo solo se nel futuro + Collasso_Inf = datestr(Tr_Inf_Loc(rLV3_Loc(I),cLV3_Loc(I)),'dd-mm-yyyy HH:MM'); + Collasso_Sup = datestr(Tr_Sup_Loc(rLV3_Loc(I),cLV3_Loc(I)),'dd-mm-yyyy HH:MM'); + message_LV3{nW,1} = ['Allerta di Livello 3 sui dati locali del nodo numero ' NodeNum... + ' alla profondita'' di ' Depth ' della centralina ' IDcentralina... + ', catena ' DTcatena ' nel sito di ' Sito '. Possibile inizio dell''accelerazione in data ' ... + data '. Possibile collasso stimato nella finestra temporale tra ' Collasso_Inf... + ' e ' Collasso_Sup ' ! Analisi eseguita con Metodo dell''Inverso della Velocita''.''']; + Data_Img = datestr(DataFuK_local(rLV3_Loc(I),cLV3_Loc(I)),'dd-mm-yyyy'); + Tempo_Img = datestr(DataFuK_local(rLV3_Loc(I),cLV3_Loc(I)),'HH-MM-SS'); + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'-Local.jpg'); + filename2 = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'-Local_Vel.jpg'); + attachments{nA,1} = filename; + attachments{nA+1,1} = filename2; + Data_Text(D,1) = DataFuK_local(rLV3_Loc(I),cLV3_Loc(I)); + D = D+1; + nW = nW+1; + nA = nA+2; + end + text = ['Alarm of Level #3 activated for local values of node ' NodeNum ' with acceleration date equal to ' data '.']; + fprintf(fileID,fmt,text); + end + end + [dim_S,~] = size(rLV3_Loc_S); % Criterio Storico + if dim_S ~= 0 + for I = 1:dim_S + NodeNum = num2str(cell2mat(NodoTilt(cLV3_Loc_S(I),2))); + Depth = num2str(cell2mat(NodoTilt(cLV3_Loc_S(I),3))); + data = datestr(DataFuK_local_S(rLV3_Loc_S(I),cLV3_Loc_S(I)),'dd-mm-yyyy HH:MM'); + Data_Crollo = Tr_Loc_S(rLV3_Loc_S(I),cLV3_Loc_S(I))+DateGiorno(rLV3_Loc_S(I),1); + if Data_Crollo-now >= 0 % Il dato è significativo solo se nel futuro + Collasso_Inf = datestr(Tr_Loc_Inf_S(rLV3_Loc_S(I),cLV3_Loc_S(I)),'dd-mm-yyyy HH:MM'); + Collasso_Sup = datestr(Tr_Loc_Sup_S(rLV3_Loc_S(I),cLV3_Loc_S(I)),'dd-mm-yyyy HH:MM'); + message_LV3{nW,1} = ['Allerta di Livello 3 sui dati locali del nodo numero ' NodeNum... + ' alla profondita'' di ' Depth ' della centralina ' IDcentralina... + ', catena ' DTcatena ' nel sito di ' Sito '. Possibile inizio dell''accelerazione in data ' ... + data '. Possibile collasso stimato nella finestra temporale tra ' Collasso_Inf... + ' e ' Collasso_Sup ' ! Analisi eseguita con Metodo Storico dell''Inverso della Velocita''. ''']; + Data_Img = datestr(DataFuK_local_S(rLV3_Loc_S(I),cLV3_Loc_S(I)),'dd-mm-yyyy'); + Tempo_Img = datestr(DataFuK_local_S(rLV3_Loc_S(I),cLV3_Loc_S(I)),'HH-MM-SS'); + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'-Local_Storico.jpg'); + filename2 = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'-Local_Vel_Storico.jpg'); + attachments{nA,1} = filename; + attachments{nA+1,1} = filename2; + Data_Text(D,1) = DataFuK_local_S(rLV3_Loc_S(I),cLV3_Loc_S(I)); + D = D+1; + nW = nW+1; + nA = nA+2; + end + text = ['Alarm of Level #3 activated by Daily IVM analysis for local values of node ' NodeNum ' with acceleration date equal to ' data '.']; + fprintf(fileID,fmt,text); + end + end + end + %% Mail di Livello 2 + [rLV2,cLV2] = find(Level==2); + [rLV2_S,cLV2_S] = find(Level_Storico==2); + [rLV2_Loc,cLV2_Loc] = find(Level_Local==2); + [rLV2_Loc_S,cLV2_Loc_S] = find(Level_Local_Storico==2); + message_LV2 = []; + nW = 1; + % --- Cumulati --- + if isempty(rLV2) ~= 1 || isempty(rLV2_S) ~= 1 + [dim,~] = size(rLV2); + [dim_S,~] = size(rLV2_S); + if dim ~= 0 % Criterio Real Time + for I = 1:dim + NodeNum = num2str(cell2mat(NodoTilt(cLV2(I),2))); + Depth = num2str(cell2mat(NodoTilt(cLV2(I),3))); + data = datestr(DataFuK(rLV2(I),cLV2(I)),'dd-mm-yyyy HH:MM'); + Data_Crollo = Tr_mail(rLV2(I),cLV2(I))+Date(rLV2(I),1); + if Data_Crollo-now >= 0 % Il dato è significativo solo se nel futuro + Collasso_Inf = datestr(Tr_Inf(rLV2(I),cLV2(I)),'dd-mm-yyyy HH:MM'); + Collasso_Sup = datestr(Tr_Sup(rLV2(I),cLV2(I)),'dd-mm-yyyy HH:MM'); + message_LV2{nW,1} = ['Allerta di Livello 2 sui dati cumulati del nodo numero ' NodeNum... + ' alla profondita'' di ' Depth ' della centralina ' IDcentralina... + ', catena ' DTcatena ' nel sito di ' Sito '. Possibile inizio dell''accelerazione in data ' ... + data '. Possibile collasso stimato nella finestra temporale tra ' Collasso_Inf... + ' e ' Collasso_Sup ' ! Analisi eseguita con Metodo dell''Inverso della Velocita''.''']; + Data_Img = datestr(DataFuK(rLV2(I),cLV2(I)),'dd-mm-yyyy'); + Tempo_Img = datestr(DataFuK(rLV2(I),cLV2(I)),'HH-MM-SS'); + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'.jpg'); + filename2 = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'_Vel.jpg'); + attachments{nA,1} = filename; + attachments{nA+1,1} = filename2; + Data_Text(D,1) = DataFuK(rLV2(I),cLV2(I)); + D = D+1; + nW = nW+1; + nA = nA+2; + end + text = ['Alarm of Level #2 activated by IVM analysis for cumulated values of node ' NodeNum ' with acceleration date equal to ' data '.']; + fprintf(fileID,fmt,text); + end + end + if dim_S ~= 0 % Criterio Storico + for I = 1:dim_S + NodeNum = num2str(cell2mat(NodoTilt(cLV2_S(I),2))); + Depth = num2str(cell2mat(NodoTilt(cLV2_S(I),3))); + data = datestr(DataFuK_S(rLV2_S(I),cLV2_S(I)),'dd-mm-yyyy HH:MM'); + Data_Crollo = Tr_S(rLV2_S(I),cLV2_S(I))+DateGiorno(rLV2_S(I),1); + if Data_Crollo-now >= 0 % Il dato è significativo solo se nel futuro + Collasso_Inf = datestr(Tr_Inf_S(rLV2_S(I),cLV2_S(I)),'dd-mm-yyyy HH:MM'); + Collasso_Sup = datestr(Tr_Sup_S(rLV2_S(I),cLV2_S(I)),'dd-mm-yyyy HH:MM'); + message_LV2{nW,1} = ['Allerta di Livello 2 sui dati cumulati del nodo numero ' NodeNum... + ' alla profondita'' di ' Depth ' della centralina ' IDcentralina... + ', catena ' DTcatena ' nel sito di ' Sito '. Possibile inizio dell''accelerazione in data ' ... + data '. Possibile collasso stimato nella finestra temporale tra ' Collasso_Inf... + ' e ' Collasso_Sup ' ! Analisi eseguita con Metodo Storico dell''Inverso della Velocita''.''']; + Data_Img = datestr(DataFuK_S(rLV2_S(I),cLV2_S(I)),'dd-mm-yyyy'); + Tempo_Img = datestr(DataFuK_S(rLV2_S(I),cLV2_S(I)),'HH-MM-SS'); + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'_Storico.jpg'); + filename2 = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'_Vel_Storico.jpg'); + attachments{nA,1} = filename; + attachments{nA+1,1} = filename2; + Data_Text(D,1) = DataFuK_S(rLV2_S(I),cLV2_S(I)); + D = D+1; + nW = nW+1; + nA = nA+2; + end + text = ['Alarm of Level #2 activated by Daily IVM analysis for cumulated values of node ' NodeNum ' with acceleration date equal to ' data '.']; + fprintf(fileID,fmt,text); + end + end + end + % --- Locali --- + if isempty(rLV2_Loc) ~= 1 || isempty(rLV2_Loc_S) ~= 1 + [dim,~] = size(rLV2_Loc); + if dim ~= 0 + for I = 1:dim + NodeNum = num2str(cell2mat(NodoTilt(cLV2_Loc(I),2))); + Depth = num2str(cell2mat(NodoTilt(cLV2_Loc(I),3))); + data = datestr(DataFuK_local(rLV2_Loc(I),cLV2_Loc(I)),'dd-mm-yyyy HH:MM'); + Data_Crollo = Tr_Loc_mail(rLV2_Loc(I),cLV2_Loc(I))+Date(rLV2_Loc(I),1); + if Data_Crollo-now >= 0 % Il dato è significativo solo se nel futuro + Collasso_Inf = datestr(Tr_Inf_Loc(rLV2_Loc(I),cLV2_Loc(I)),'dd-mm-yyyy HH:MM'); + Collasso_Sup = datestr(Tr_Sup_Loc(rLV2_Loc(I),cLV2_Loc(I)),'dd-mm-yyyy HH:MM'); + message_LV2{nW,1} = ['Allerta di Livello 2 sui dati locali del nodo numero ' NodeNum... + ' alla profondita'' di ' Depth ' della centralina ' IDcentralina... + ', catena ' DTcatena ' nel sito di ' Sito '. Possibile inizio dell''accelerazione in data ' ... + data '. Possibile collasso stimato nella finestra temporale tra ' Collasso_Inf... + ' e ' Collasso_Sup ' ! Analisi eseguita con Metodo dell''Inverso della Velocita''. ''']; + Data_Img = datestr(DataFuK_local(rLV2_Loc(I),cLV2_Loc(I)),'dd-mm-yyyy'); + Tempo_Img = datestr(DataFuK_local(rLV2_Loc(I),cLV2_Loc(I)),'HH-MM-SS'); + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'-Local.jpg'); + filename2 = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'-Local_Vel.jpg'); + attachments{nA,1} = filename; + attachments{nA+1,1} = filename2; + Data_Text(D,1) = DataFuK_local(rLV2_Loc(I),cLV2_Loc(I)); + D = D+1; + nW = nW+1; + nA = nA+2; + end + text = ['Alarm of Level #2 activated for local values of node ' NodeNum ' with acceleration date equal to ' data '.']; + fprintf(fileID,fmt,text); + end + end + [dim_S,~] = size(rLV2_Loc_S); + if dim_S ~= 0 + for I = 1:dim_S + NodeNum = num2str(cell2mat(NodoTilt(cLV2_Loc_S(I),2))); + Depth = num2str(cell2mat(NodoTilt(cLV2_Loc_S(I),3))); + data = datestr(DataFuK_local_S(rLV2_Loc_S(I),cLV2_Loc_S(I)),'dd-mm-yyyy HH:MM'); + Data_Crollo = Tr_Loc_S(rLV2_Loc_S(I),cLV2_Loc_S(I))+DateGiorno(rLV2_Loc_S(I),1); + if Data_Crollo-now >= 0 % Il dato è significativo solo se nel futuro + Collasso_Inf = datestr(Tr_Loc_Inf_S(rLV2_Loc_S(I),cLV2_Loc_S(I)),'dd-mm-yyyy HH:MM'); + Collasso_Sup = datestr(Tr_Loc_Sup_S(rLV2_Loc_S(I),cLV2_Loc_S(I)),'dd-mm-yyyy HH:MM'); + message_LV2{nW,1} = ['Allerta di Livello 2 sui dati locali del nodo numero ' NodeNum... + ' alla profondita'' di ' Depth ' della centralina ' IDcentralina... + ', catena ' DTcatena ' nel sito di ' Sito '. Possibile inizio dell''accelerazione in data ' ... + data '. Possibile collasso stimato nella finestra temporale tra ' Collasso_Inf... + ' e ' Collasso_Sup ' ! Analisi eseguita con Metodo Storico dell''Inverso della Velocita''. ''']; + Data_Img = datestr(DataFuK_local_S(rLV2_Loc_S(I),cLV2_Loc_S(I)),'dd-mm-yyyy'); + Tempo_Img = datestr(DataFuK_local_S(rLV2_Loc_S(I),cLV2_Loc_S(I)),'HH-MM-SS'); + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'-Local_Storico.jpg'); + filename2 = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'-Local_Vel_Storico.jpg'); + attachments{nA,1} = filename; + attachments{nA+1,1} = filename2; + Data_Text(D,1) = DataFuK_local_S(rLV2_Loc_S(I),cLV2_Loc_S(I)); + D = D+1; + nW = nW+1; + nA = nA+2; + end + text = ['Alarm of Level #2 activated by Daily IVM analysis for local values of node ' NodeNum ' with acceleration date equal to ' data '.']; + fprintf(fileID,fmt,text); + end + end + end + %% Mail di Livello 1.5 + [rLV15,cLV15] = find(Level==1.5); + [rLV15_S,cLV15_S] = find(Level_Storico==1.5); + [rLV15_Loc,cLV15_Loc] = find(Level_Local==1.5); + [rLV15_Loc_S,cLV15_Loc_S] = find(Level_Local_Storico==1.5); + message_LV15 = []; + nW = 1; + % --- Cumulati --- + if isempty(rLV15) ~= 1 || isempty(rLV15_S) ~= 1 + [dim,~] = size(rLV15); + [dim_S,~] = size(rLV15_S); + if dim ~= 0 % Criterio Real Time + for I = 1:dim + if DataFuK(rLV15(I),cLV15(I)) > A(1,1) || DataFuK(rLV15(I),cLV15(I)) > A(2,1) + NodeNum = num2str(cell2mat(NodoTilt(cLV15(I),2))); + Depth = num2str(cell2mat(NodoTilt(cLV15(I),3))); + data = datestr(DataFuK(rLV15(I),cLV15(I)),'dd-mm-yyyy HH:MM'); + Data_Crollo = Tr_mail(rLV15(I),cLV15(I))+Date(rLV15(I),1); + message_LV15{nW,1} = ['Falso Allarme per data di collasso nel passato sui dati cumulati del nodo numero ' NodeNum... + ' alla profondita'' di ' Depth ' della centralina ' IDcentralina... + ', catena ' DTcatena ' nel sito di ' Sito '. Possibile inizio dell''accelerazione in data ' ... + data '. Data di collasso stimata il ' datestr(Data_Crollo,'dd-mm-yyyy HH:MM')... + '. Analisi eseguita con Metodo dell''Inverso della Velocita''.''']; + Data_Img = datestr(DataFuK(rLV15(I),cLV15(I)),'dd-mm-yyyy'); + Tempo_Img = datestr(DataFuK(rLV15(I),cLV15(I)),'HH-MM-SS'); + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'.jpg'); + filename2 = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'_Vel.jpg'); + + %%% REPORT DI ALLERTAMENTO %%% + DataNum = Number(rLV15(I),cLV15(I)); % numero punti nel dataset + LVL = 1.5; % livello raggiunto + TipoDisp = 2; % spostamenti cumulati + [checkALRPT,nomeALRPT_PDF] = AlertReport(IDcentralina,DTcatena,Sito,... + NodeNum,Depth,data,DataNum,LVL,TipoDisp,conn,FileName); + + attachments{nA,1} = filename; + attachments{nA+1,1} = filename2; + Data_Text(D,1) = DataFuK(rLV15(I),cLV15(I)); + D = D+1; + nW = nW+1; + if checkALRPT == 1 + attachments{nA+2,1} = nomeALRPT_PDF; + nA = nA+3; + else + nA = nA+2; + end + + text = ['False Alarm for cumulated values of node ' NodeNum ' with acceleration date equal to ' data '.']; + fprintf(fileID,fmt,text); + end + end + end + if dim_S ~= 0 % Criterio Storico + for I = 1:dim_S + if DataFuK_S(rLV15_S(I),cLV15_S(I)) > A(1,1) || DataFuK_S(rLV15_S(I),cLV15_S(I)) > A(2,1) + NodeNum = num2str(cell2mat(NodoTilt(cLV15_S(I),2))); + Depth = num2str(cell2mat(NodoTilt(cLV15_S(I),3))); + data = datestr(DataFuK_S(rLV15_S(I),cLV15_S(I)),'dd-mm-yyyy HH:MM'); + Data_Crollo = Tr_S(rLV15_S(I),cLV15_S(I))+DateGiorno(rLV15_S(I),1); + message_LV15{nW,1} = ['Falso Allarme per data di collasso nel passato sui dati cumulati del nodo numero ' NodeNum... + ' alla profondita'' di ' Depth ' della centralina ' IDcentralina... + ', catena ' DTcatena ' nel sito di ' Sito '. Possibile inizio dell''accelerazione in data ' ... + data '. Data di collasso stimata il ' datestr(Data_Crollo,'dd-mm-yyyy HH:MM')... + '. Analisi eseguita con Metodo Storico dell''Inverso della Velocita''.''']; + Data_Img = datestr(DataFuK_S(rLV15_S(I),cLV15_S(I)),'dd-mm-yyyy'); + Tempo_Img = datestr(DataFuK_S(rLV15_S(I),cLV15_S(I)),'HH-MM-SS'); + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'_Storico.jpg'); + filename2 = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'_Vel_Storico.jpg'); + attachments{nA,1} = filename; + attachments{nA+1,1} = filename2; + Data_Text(D,1) = DataFuK_S(rLV15_S(I),cLV15_S(I)); + D = D+1; + nW = nW+1; + nA = nA+2; + text = ['False Alarm activated by Daily IVM analysis for cumulated values of node ' NodeNum ' with acceleration date equal to ' data '.']; + fprintf(fileID,fmt,text); + end + end + end + end + % --- Locali --- + if isempty(rLV15_Loc) ~= 1 || isempty(rLV15_Loc_S) ~= 1 + [dim,~] = size(rLV15_Loc); + if dim ~= 0 + for I = 1:dim + if DataFuK_local(rLV15_Loc(I),cLV15_Loc(I)) > A(1,1) || DataFuK_local(rLV15_Loc(I),cLV15_Loc(I)) > A(2,1) + NodeNum = num2str(cell2mat(NodoTilt(cLV15_Loc(I),2))); + Depth = num2str(cell2mat(NodoTilt(cLV15_Loc(I),3))); + data = datestr(DataFuK_local(rLV15_Loc(I),cLV15_Loc(I)),'dd-mm-yyyy HH:MM'); + Data_Crollo = Tr_Loc_mail(rLV15_Loc(I),cLV15_Loc(I))+Date(rLV15_Loc(I),1); + message_LV15{nW,1} = ['Falso Allarme per data di collasso nel passato sui dati locali del nodo numero ' NodeNum... + ' alla profondita'' di ' Depth ' della centralina ' IDcentralina... + ', catena ' DTcatena ' nel sito di ' Sito '. Possibile inizio dell''accelerazione in data ' ... + data '. Data di collasso stimata il ' datestr(Data_Crollo,'dd-mm-yyyy HH:MM')... + '. Analisi eseguita con Metodo dell''Inverso della Velocita''.''']; + Data_Img = datestr(DataFuK_local(rLV15_Loc(I),cLV15_Loc(I)),'dd-mm-yyyy'); + Tempo_Img = datestr(DataFuK_local(rLV15_Loc(I),cLV15_Loc(I)),'HH-MM-SS'); + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'-Local.jpg'); + filename2 = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'-Local_Vel.jpg'); + attachments{nA,1} = filename; + attachments{nA+1,1} = filename2; + Data_Text(D,1) = DataFuK_local(rLV15_Loc(I),cLV15_Loc(I)); + D = D+1; + nW = nW+1; + nA = nA+2; + text = ['False Alarm for local values of node ' NodeNum ' with acceleration date equal to ' data '.']; + fprintf(fileID,fmt,text); + end + end + end + [dim_S,~] = size(rLV15_Loc_S); + if dim_S ~= 0 + for I = 1:dim_S + if DataFuK_local_S(rLV15_Loc_S(I),cLV15_Loc_S(I)) > A(1,1) || DataFuK_local_S(rLV15_Loc_S(I),cLV15_Loc_S(I)) > A(2,1) + NodeNum = num2str(cell2mat(NodoTilt(cLV15_Loc_S(I),2))); + Depth = num2str(cell2mat(NodoTilt(cLV15_Loc_S(I),3))); + data = datestr(DataFuK_local_S(rLV15_Loc_S(I),cLV15_Loc_S(I)),'dd-mm-yyyy HH:MM'); + Data_Crollo = Tr_Loc_S(rLV15_Loc_S(I),cLV15_Loc_S(I))+DateGiorno(rLV15_Loc_S(I),1); + message_LV15{nW,1} = ['Falso Allarme per data di collasso nel passato sui dati locali del nodo numero ' NodeNum... + ' alla profondita'' di ' Depth ' della centralina ' IDcentralina... + ', catena ' DTcatena ' nel sito di ' Sito '. Possibile inizio dell''accelerazione in data ' ... + data '. Data di collasso stimata il ' datestr(Data_Crollo,'dd-mm-yyyy HH:MM')... + '. Analisi eseguita con Metodo Storico dell''Inverso della Velocita''. ''']; + Data_Img = datestr(DataFuK_local_S(rLV15_Loc_S(I),cLV15_Loc_S(I)),'dd-mm-yyyy'); + Tempo_Img = datestr(DataFuK_local_S(rLV15_Loc_S(I),cLV15_Loc_S(I)),'HH-MM-SS'); + filename = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'-Local_Storico.jpg'); + filename2 = strcat(IDcentralina,'-',DTcatena,'-Node_',NodeNum,'-',Data_Img,'_',Tempo_Img,'-Local_Vel_Storico.jpg'); + attachments{nA,1} = filename; + attachments{nA+1,1} = filename2; + nW = nW+1; + nA = nA+2; + Data_Text(D,1) = DataFuK_local_S(rLV15_Loc_S(I),cLV15_Loc_S(I)); + D = D+1; + text = ['False Alarm activated by Daily IVM analysis for local values of node ' NodeNum ' with acceleration date equal to ' data '.']; + fprintf(fileID,fmt,text); + end + end + end + end + %% Mail di Livello 1 + [rLV1,cLV1] = find(Level==1); + [rLV1_Loc,cLV1_Loc] = find(Level_Local==1); + nW = 1; + message_LV1 = []; + % --- Cumulati --- + if isempty(rLV1) ~= 1 + [dim,~] = size(rLV1); + for I = 1:dim + NodeNum = num2str(cell2mat(NodoTilt(cLV1(I),2))); + Depth = num2str(cell2mat(NodoTilt(cLV1(I),3))); + data = datestr(Date(rLV1(I)-3,1),'dd-mm-yyyy HH:MM'); + message_LV1{nW,1} = ['Allerta di Livello 1 sui dati cumulati del nodo numero ' NodeNum... + ' alla profondita'' di ' Depth ' della centralina ' IDcentralina... + ', catena ' DTcatena ' nel sito di ' Sito '. Possibile inizio dell''accelerazione in data ' ... + data '.''']; + nW = nW+1; + Data_Text(D,1) = Date(rLV1(I)-3,1); + D = D+1; + text = ['Alert of Level #1 activated for cumulated values of node ' NodeNum ' with acceleration date equal to ' data '.']; + fprintf(fileID,fmt,text); + end + end + % --- Locali --- + if isempty(rLV1_Loc) ~= 1 + [dim,~] = size(rLV1_Loc); + for I = 1:dim + NodeNum = num2str(cell2mat(NodoTilt(cLV1_Loc(I),2))); + Depth = num2str(cell2mat(NodoTilt(cLV1_Loc(I),3))); + data = datestr(Date(rLV1_Loc(I)-3,1),'dd-mm-yyyy HH:MM'); + message_LV1{nW,1} = ['Allerta di Livello 1 sui dati locali del nodo numero ' NodeNum... + ' alla profondita'' di ' Depth ' della centralina ' IDcentralina... + ', catena ' DTcatena ' nel sito di ' Sito '. Possibile inizio dell''accelerazione in data ' ... + data '.''']; + nW = nW+1; + Data_Text(D,1) = Date(rLV1_Loc(I)-3,1); + D = D+1; + text = ['Alert of Level #1 activated for local values of node ' NodeNum ' with acceleration date equal to ' data '.']; + fprintf(fileID,fmt,text); + end + end + %% Mail Celle Elettrolitiche + [rHR_Loc,cHR_Loc] = size(Tr_Loc_HR); + nW = 1; + message_HR = []; + if isempty(find(Tr_Loc_HR)) ~= 0 % Criterio Real Time + for i=1:rHR_Loc + for j=1:cHR_Loc + if Tr_Loc_HR(i,j) > 0 + NodeNum = num2str(cell2mat(NodoTiltHR(j,2))); + Depth = num2str(cell2mat(NodoTiltHR(j,3))); + data = datestr(DataFuK_local_HR(i,j,'dd-mm-yyyy HH:MM')); + message_HR{nW,1} = ['ALLARME sui dati locali del sensore elettrolitico del nodo numero ' NodeNum... + ' alla profondita'' di ' Depth ' della centralina ' IDcentralina... + ', catena ' DTcatena ' nel sito di ' Sito '. Possibile inizio dell''accelerazione in data ' ... + data '. Analisi eseguita con Metodo dell''Inverso della Velocita''.''']; + nW = nW+1; + text = ['Alert on Electrolytic Cell data activated for local values of node ' NodeNum ' with acceleration date equal to ' data '.']; + fprintf(fileID,fmt,text); + end + end + end + end + [rHR_Loc_S,cHR_Loc_S] = size(Tr_Loc_HR_S); + if isempty(find(Tr_Loc_HR_S)) ~= 0 % Criterio Storico + for i=1:rHR_Loc_S + for j=1:cHR_Loc_S + if Tr_Loc_HR_S(i,j) > 0 + NodeNum = num2str(cell2mat(NodoTiltHR(j,2))); + Depth = num2str(cell2mat(NodoTiltHR(j,3))); + data = datestr(DataFuK_local_HR_S(i,j,'dd-mm-yyyy HH:MM')); + message_HR{nW,1} = ['ALLARME sui dati locali del sensore elettrolitico del nodo numero ' NodeNum... + ' alla profondita'' di ' Depth ' della centralina ' IDcentralina... + ', catena ' DTcatena ' nel sito di ' Sito '. Possibile inizio dell''accelerazione in data ' ... + data '. Analisi eseguita con Metodo Storico dell''Inverso della Velocita''.''']; + nW = nW+1; + text = ['Alert on Electrolytic Cell data activated for Daily analysis of local values of node ' NodeNum ' with acceleration date equal to ' data '.']; + fprintf(fileID,fmt,text); + end + end + end + end + + %% 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 + + % --- Mail ASE --- + recipients = cell(5,1); + recipients{1,1} = 'andrea.carri@aseltd.eu'; + recipients{2,1} = 'alessandro.valletta@aseltd.eu'; + recipients{3,1} = 'roberto.savi@aseltd.eu'; + recipients{4,1} = 'andrea.segalini@aseltd.eu'; + recipients{5,1} = 'luca.chiapponi@aseltd.eu'; + + if isempty(message_LV5) == 0 + subject = 'ALLARME di Livello 5!'; + elseif isempty(message_LV4) == 0 + subject = 'Pre-Allarme di Livello 4!'; + elseif isempty(message_LV3) == 0 + subject = 'Allerta di Livello 3!'; + elseif isempty(message_LV2) == 0 + subject = 'Allerta di Livello 2!'; + elseif isempty(message_LV15) == 0 + subject = 'Falso Allarme'; + elseif isempty(message_LV1) == 0 + subject = 'Allerta di Livello 1'; + end + + message = []; + attiva = 0; + if isempty(message_LV5) == 0 + message = [message; message_LV5]; + attiva = 5; + end + if isempty(message_LV4) == 0 + message = [message; message_LV4]; + if attiva == 0 + attiva = 4; + end + end + if isempty(message_LV3) == 0 + message = [message; message_LV3]; + if attiva == 0 + attiva = 3; + end + end + if isempty(message_LV2) == 0 + message = [message; message_LV2]; + if attiva == 0 + attiva = 2; + end + end + if isempty(message_LV15) == 0 + message = [message; message_LV15]; + if attiva == 0 + attiva = 1.5; + end + end + if isempty(message_LV1) == 0 + message = [message; message_LV1]; + if attiva == 0 + attiva = 1; + end + end + if isempty(message_HR) == 0 + message = [message; message_HR]; + end + + % Parte di email ad ASE e SMS + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + Data_LV5 = []; + if attiva == 5 + sendmail(recipients(1:5), subject, message, attachments) + text = 'Email of Level 5 sent.'; + fprintf(fileID,fmt,text); + Criterio = 'Fukuzono'; + Data_LV5 = now; + if sms == 1 + if now > A(4,1)+1 % SMS se si è superato di 24 h la data di invio dell'ultimo SMS + fclose(fileID); + SMS(IDcentralina,DTcatena,Sito,Users_SMS,Criterio,FileName); + end + end + elseif attiva == 4 + sendmail(recipients(1:4), subject, message, attachments) + text = 'Email of Level 4 sent.'; + fprintf(fileID,fmt,text); + elseif attiva == 3 + sendmail(recipients(1:3), subject, message, attachments) + text = 'Email of Level 3 sent.'; + fprintf(fileID,fmt,text); + elseif attiva == 2 || attiva == 1.5 + sendmail(recipients(1:2), subject, message, attachments) + text = 'Email of Level 1.5 or 2 sent.'; + fprintf(fileID,fmt,text); + elseif attiva == 1 + sendmail(recipients(1:2), subject, message) + text = 'Email of Level 1 sent.'; + fprintf(fileID,fmt,text); + end + + % Parte di Email al cliente + if Mail == 1 + + recipients_ITA = cell(1); + recipients_ENG = cell(1); + + % A chi mando la mail + nI = 1; + nE = 1; + [rU,cU] = size(Users_Alert); + if ini_CoV <= rU + rU = ini_CoV; + end + if cU >1 % sono presenti utenti a cui inviare la mail + for i = 1:rU + if Users_Alert{i,4} == 2 + recipients_ITA{nI,1} = Users_Alert(i,3); + nI = nI+1; + else + recipients_ENG{nE,1} = Users_Alert(i,3); + nE = nE+1; + end + end + end + + % - Definisco la mail + if isempty(message_LV5_Cliente) ~= 1 + codice_mail = 5; + elseif isempty(message_LV4_Cliente) ~= 1 + codice_mail = 4; + else + codice_mail = 0; + end + if codice_mail >= 4 + if codice_mail == 4 + if activeIT == 1 + subject_ITA = 'Allerta - Incremento delle accelerazioni rilevato!'; + message_LV4_Cliente{8,1} = 'Si raccomanda di controllare con attenzione i prossimi dati in arrivo, consultabili nella nostra piattaforma web, in modo da seguire l''evoluzione del fenomeno in atto.'; + message_LV4_Cliente{9,1} = ''; + message_LV4_Cliente{10,1} = 'Cordiali saluti,'; + message_LV4_Cliente{11,1} = 'il Team di ASE S.r.l.'; + message_LV4_Cliente{12,1} = ''; + message_LV4_Cliente{13,1} = 'Messaggio inviato automaticamente dal sistema di allertamento di ASE S.r.l.'; + message_ITA = message_LV4_Cliente; + if now > A(1,1) + 1 && attiva == A(3,1) || attiva > A(3,1) % email a partire da 24 h dopo la precedente attivazione di uguale livello o solo se il livello è aumentato + sendmail(recipients_ITA, subject_ITA, message_ITA) + end + end + if activeEN == 1 + subject_ENG = 'Alert - Accelerations increase detected!'; + message_LV4_Cliente_ENG{8,1} = 'We recommend to carefully check the following monitoring data available through our web platform, in order to control the evolution of the ongoing event'; + message_LV4_Cliente_ENG{9,1} = ''; + message_LV4_Cliente_ENG{10,1} = 'Best regards,'; + message_LV4_Cliente_ENG{11,1} = 'ASE Ltd Team'; + message_LV4_Cliente_ENG{12,1} = ''; + message_LV4_Cliente_ENG{13,1} = 'This is an automatic message sent by ASE Ltd Alert System.'; + message_ENG = message_LV4_Cliente_ENG; + if now > A(1,1) + 1 && attiva == A(3,1) || attiva > A(3,1) + sendmail(recipients_ENG, subject_ENG, message_ENG) + end + end + elseif codice_mail == 5 + Criterio = 'Fukuzono'; + Data_LV5 = now; + if now > A(4,1)+1 % SMS se si è superato di 24 h la data di invio dell'ultimo SMS + fclose(fileID); + SMS(IDcentralina,DTcatena,Sito,Users_Alert,Criterio,FileName); + end + if activeIT == 1 + subject_ITA = 'Allarme - Rilevata accelerazione potenzialmente critica!'; + if isempty(char(message_LV5_Cliente{6,1})) == 1 % Ho solo il criterio storico + message_ITA = message_LV5_Cliente{:,2}; + [rM,~] = size(message_ITA); + message_ITA{rM+1,1} = ''; + message_ITA{rM+2,1} = ['Data di inizio accelerazione: ' datestr(min(Finestra_Storico(:,3)),'dd-mm-yyyy HH:MM')]; + message_ITA{rM+3,1} = ['Possibile collasso stimato nella finestra compresa tra ' datestr(min(Finestra_Storico(:,1)),'dd-mm-yyyy HH:MM') ' e ' datestr(max(Finestra_Storico(:,2)),'dd-mm-yyyy HH:MM') ' ']; + message_ITA{rM+4,1} = 'Stima eseguita con il Metodo dell''Inverso della Velocita'' - Dataset medio giornaliero'; + elseif isempty(char(message_LV5_Cliente{6,2})) == 1 % Ho solo il criterio real time + message_ITA = message_LV5_Cliente{:,1}; + [rM,~] = size(message_ITA); + message_ITA{rM+1,1} = ''; + message_ITA{rM+2,1} = ['Data di inizio accelerazione: ' datestr(min(Finestra_RealTime(:,3)),'dd-mm-yyyy HH:MM')]; + message_ITA{rM+3,1} = ['Possibile collasso stimato nella finestra compresa tra ' datestr(min(Finestra_RealTime(:,1)),'dd-mm-yyyy HH:MM') ' e ' datestr(max(Finestra_RealTime(:,2)),'dd-mm-yyyy HH:MM') ' ']; + message_ITA{rM+4,1} = 'Stima eseguita con il Metodo dell''Inverso della Velocita'' '; + else % Ho entrambi + [rM,~] = size(message_LV5_Cliente); + for m = 6:rM + if isempty(message_LV5_Cliente{m,1}) == 1 && isempty(message_LV5_Cliente{m-1,1}) == 1 + fine = m-2; + break + end + end + message_ITA{1:fine,1} = message_LV5_Cliente{m,1}; + message_ITA{fine+1,1} = ''; + message_ITA{fine+2,1} = ['Data di inizio accelerazione: ' datestr(min(Finestra_RealTime(:,3)),'dd-mm-yyyy HH:MM')]; + message_ITA{fine+3,1} = ['Possibile collasso stimato nella finestra compresa tra ' datestr(min(Finestra_RealTime(:,1)),'dd-mm-yyyy HH:MM') ' e ' datestr(max(Finestra_RealTime(:,2)),'dd-mm-yyyy HH:MM') ' ']; + message_ITA{fine+4,1} = 'Stima eseguita con il Metodo dell''Inverso della Velocita'' '; + message_ITA{fine+5,1} = ''; + + for m = 6:rM + if isempty(message_LV5_Cliente{m,2}) == 1 && isempty(message_LV5_Cliente{m-1,2}) == 1 + fine = m-2; + break + end + end + message_ITA{fine+1,1} = ['Data di inizio accelerazione: ' datestr(min(Finestra_Storico(:,3)),'dd-mm-yyyy HH:MM')]; + message_ITA{fine+2,1} = ['Possibile collasso stimato nella finestra compresa tra ' datestr(min(Finestra_Storico(:,1)),'dd-mm-yyyy HH:MM') ' e ' datestr(max(Finestra_Storico(:,2)),'dd-mm-yyyy HH:MM') ' ']; + message_ITA{fine+3,1} = 'Stima eseguita con il Metodo dell''Inverso della Velocita'' - Dataset medio giornaliero'; + message_ITA{fine+4,1} = ''; + end + [rM,~] = size(message_ITA); + message_ITA{rM+1,1} = 'Si consiglia di seguire con la massima attenzione l''evoluzione del fenomeno in atto e, laddove si ritenga necessario, predisporre un sopralluogo in sito per accertare le condizioni del versante.'; + message_ITA{rM+2,1} = 'Cordiali saluti, il Team di ASE S.r.l.'; + message_ITA{rM+3,1} = 'Messaggio inviato automaticamente dal sistema di allertamento di ASE S.r.l.'; + + if strcmp(char(Users_Alert{i,5}),'EWS') + sendmail(recipients_ITA, subject_ITA, message_ITA, allegati_cliente) + elseif now > A(4,1)+1 % email a partire da 24 h dopo la precedente attivazione e solo se il livello è aumentato + sendmail(recipients_ITA, subject_ITA, message_ITA, allegati_cliente) + end + end + if activeEN == 1 + subject_ENG = 'Alarm - potentially critical acceleration detected!'; + if isempty(char(message_LV5_Cliente_ENG{6,1})) == 1 % Ho solo il criterio storico + message_ENG = message_LV5_Cliente_ENG{:,2}; + [rM,~] = size(message_ENG); + message_ENG{rM+1,1} = ''; + message_ENG{rM+2,1} = ['Onset-of-acceleration date: ' datestr(min(Finestra_Storico(:,3)),'dd-mm-yyyy HH:MM')]; + message_ENG{rM+3,1} = ['Time of failure estimated in a time window between ' datestr(min(Finestra_Storico(:,1)),'dd-mm-yyyy HH:MM') ' and ' datestr(max(Finestra_Storico(:,2)),'dd-mm-yyyy HH:MM') ' ']; + message_ENG{rM+4,1} = 'Analisys performed with Inverse Velocity Method - Daily average dataset '; + elseif isempty(char(message_LV5_Cliente_ENG{6,2})) == 1 % Ho solo il criterio real time + message_ENG = message_LV5_Cliente_ENG{:,1}; + [rM,~] = size(message_ENG); + message_ENG{rM+1,1} = ''; + message_ENG{rM+2,1} = ['Onset-of-acceleration date: ' datestr(min(Finestra_RealTime(:,3)),'dd-mm-yyyy HH:MM')]; + message_ENG{rM+3,1} = ['Time of failure estimated in a time window between ' datestr(min(Finestra_RealTime(:,1)),'dd-mm-yyyy HH:MM') ' and ' datestr(max(Finestra_RealTime(:,2)),'dd-mm-yyyy HH:MM') ' ']; + message_ENG{rM+4,1} = 'Analisys performed with Inverse Velocity Method '; + else % Ho entrambi + [rM,~] = size(message_LV5_Cliente_ENG); + for m = 6:rM + if isempty(message_LV5_Cliente_ENG{m,1}) == 1 && isempty(message_LV5_Cliente_ENG{m-1,1}) == 1 + fine = m-2; + break + end + end + message_ENG{1:fine,1} = message_LV5_Cliente_ENG{m,1}; + message_ENG{fine+1,1} = ''; + message_ENG{fine+2,1} = ['Onset-of-acceleration date: ' datestr(min(Finestra_RealTime(:,3)),'dd-mm-yyyy HH:MM')]; + message_ENG{fine+3,1} = ['Time of failure estimated in a time window between ' datestr(min(Finestra_RealTime(:,1)),'dd-mm-yyyy HH:MM') ' and ' datestr(max(Finestra_RealTime(:,2)),'dd-mm-yyyy HH:MM') ' ']; + message_ENG{fine+4,1} = 'Analisys performed with Inverse Velocity Method '; + message_ENG{fine+5,1} = ''; + + for m = 6:rM + if isempty(message_LV5_Cliente_ENG{m,2}) == 1 && isempty(message_LV5_Cliente_ENG{m-1,2}) == 1 + fine = m-2; + break + end + end + message_ENG{fine+1,1} = ['Onset-of-acceleration date: ' datestr(min(Finestra_Storico(:,3)),'dd-mm-yyyy HH:MM')]; + message_ENG{fine+2,1} = ['Time of failure estimated in a time window between ' datestr(min(Finestra_Storico(:,1)),'dd-mm-yyyy HH:MM') ' and ' datestr(max(Finestra_Storico(:,2)),'dd-mm-yyyy HH:MM') ' ']; + message_ENG{fine+3,1} = 'Analisys performed with Inverse Velocity Method - Daily average dataset '; + message_ENG{fine+4,1} = ''; + end + [rM,~] = size(message_ENG); + message_ENG{rM+1,1} = 'We highly suggest to follow very closely the progressive evolution of the ongoing phenomenon and, if necessary, to arrange for an on-site investigation in order to assess the slope conditions. '; + message_ENG{rM+2,1} = 'Kind regards, the ASE Ltd Team'; + message_ENG{rM+3,1} = 'This is an automatic message sent by ASE Ltd Alert System. '; + + var = char(Users_Alert(i,5)); + [~,cV] = size(var); + if cV > 2 + if strcmp(var(1,1:3),'EWS') + sendmail(recipients_ENG, subject_ENG, message_ENG, allegati_cliente) + end + elseif now > A(4,1)+1 % email a partire da 24 h dopo la precedente attivazione e solo se il livello è aumentato + sendmail(recipients_ENG, subject_ENG, message_ENG, allegati_cliente) + end + end + end + end + end + + DATA = max(Data_Text); + check = isempty(DATA); + if check == 1 + DATA = A(1,1); + end + FileNameFuk = ['' IDcentralina '-' DTcatena '-Fuk.txt']; + outdat = fopen(FileNameFuk,'wt+'); + fileID = fopen(FileNameFuk,'a'); + fmt = '%.10f \r'; + fprintf(fileID,fmt,DATA); + fmt = '%.10f \r'; + if attiva > 1 + fprintf(fileID,fmt,now); + else + fprintf(fileID,fmt,A(2,1)); + end + fmt = '%.1f \r'; + fprintf(fileID,fmt,attiva); + if isempty(Data_LV5) == 0 + fmt = '%.10f \r'; + fprintf(fileID,fmt,Data_LV5); + end + fclose(fileID); +end + +fileID = fopen(FileName,'a'); +text = 'Time_Of_Failure function worked correctly'; +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/Untitled.m b/Tilt/Untitled.m new file mode 100755 index 0000000..f1bbc31 --- /dev/null +++ b/Tilt/Untitled.m @@ -0,0 +1,30 @@ +dsX(1,17237:17670) = 0; +dsY(1,17237:17670) = 0; +dsZ(1,17237:17670) = 0; +dsX(1,18200:end) = 0; +dsY(1,18200:end) = 0; +dsZ(1,18200:end) = 0; +dsX(15,11720:11760) = 0; +dsY(15,11720:11760) = 0; +dsZ(15,11720:11760) = 0; +dsX(15,13550:13670) = 0; +dsY(15,13550:13670) = 0; +dsZ(15,13550:13670) = 0; +dsX(17,11600:15000) = 0; +dsY(17,11600:15000) = 0; +dsZ(17,11600:15000) = 0; +dsX(18,11700:11800) = 0; +dsY(18,11700:11800) = 0; +dsZ(18,11700:11800) = 0; +dsX(18,13600:13800) = 0; +dsY(18,13600:13800) = 0; +dsZ(18,13600:13800) = 0; +dsX(19,11700:11800) = 0; +dsY(19,11700:11800) = 0; +dsZ(19,11700:11800) = 0; +dsX(19,13600:13800) = 0; +dsY(19,13600:13800) = 0; +dsZ(19,13600:13800) = 0; +dsX(20,7000:18000) = 0; +dsY(20,7000:18000) = 0; +dsZ(20,7000:18000) = 0; \ No newline at end of file diff --git a/Tilt/Untitled2.m b/Tilt/Untitled2.m new file mode 100755 index 0000000..a111030 --- /dev/null +++ b/Tilt/Untitled2.m @@ -0,0 +1,14 @@ +datainiTL = date; +datainiTLHR = date; +datainiPL = date; +datainiBL = date; +tempoiniTL = time; +tempoiniTLHR = time; +tempoiniPL = time; +tempoiniBL = time; +NuovoZeroTL = 0; +NuovoZeroTLHR = 0; +NuovoZeroBL = 0; +NuovoZeroPL = 0; +DatiElabTiltLink = []; +DatiElabTiltLinkHR = []; \ No newline at end of file diff --git a/Tilt/Untitled3.m b/Tilt/Untitled3.m new file mode 100755 index 0000000..86b28a6 --- /dev/null +++ b/Tilt/Untitled3.m @@ -0,0 +1,45 @@ +ini = 2249; +fin = 2669; + +accTL(ini:fin,58)= accTL(ini:fin,1); +accTL(ini:fin,59)= accTL(ini:fin,2); +accTL(ini:fin,60)= accTL(ini:fin,3); +accTL(ini:fin,1)= accTL(ini-1,1); +accTL(ini:fin,2)= accTL(ini-1,2); +accTL(ini:fin,3)= accTL(ini-1,3); +magTL(ini:fin,59)= magTL(ini:fin,2); +magTL(ini:fin,60)= magTL(ini:fin,3); +magTL(ini:fin,58)= magTL(ini:fin,1); +magTL(ini:fin,1)= magTL(ini-1,1); +magTL(ini:fin,2)= magTL(ini-1,2); +magTL(ini:fin,3)= magTL(ini-1,3); +tempTL(ini:fin,20)= tempTL(ini:fin,1); +tempTL(ini:fin,1)= tempTL(ini-1,1); + +accTL(18229:end,58)= accTL(18229:end,1); +accTL(18229:end,59)= accTL(18229:end,2); +accTL(18229:end,60)= accTL(18229:end,3); +accTL(18229:end,1)= accTL(18228,1); +accTL(18229:end,2)= accTL(18228,2); +accTL(18229:end,3)= accTL(18228,3); +magTL(18229:end,59)= magTL(18229:end,2); +magTL(18229:end,60)= magTL(18229:end,3); +magTL(18229:end,58)= magTL(18229:end,1); +magTL(18229:end,1)= magTL(18228,1); +magTL(18229:end,2)= magTL(18228,2); +magTL(18229:end,3)= magTL(18228,3); +tempTL(18229:end,20)= tempTL(18229:end,1); +tempTL(18229:end,1)= tempTL(18228,1); + +angTLHR(ini:fin,39)= angTLHR(ini:fin,1); +angTLHR(ini:fin,40)= angTLHR(ini:fin,2); +angTLHR(ini:fin,1)= angTLHR(ini-1,1); +angTLHR(ini:fin,2)= angTLHR(ini-1,2); +angTLHR(18229:end,39)= angTLHR(18229:end,1); +angTLHR(18229:end,40)= angTLHR(18229:end,2); +angTLHR(18229:end,1)= angTLHR(18228,1); +angTLHR(18229:end,2)= angTLHR(18228,2); +tempTLHR(ini:fin,20)= tempTLHR(ini:fin,1); +tempTLHR(ini:fin,1)= tempTLHR(ini-1,1); +tempTLHR(18229:end,20)= tempTLHR(18229:end,1); +tempTLHR(18229:end,1)= tempTLHR(18228,1); \ No newline at end of file diff --git a/Tilt/Untitled3bis.m b/Tilt/Untitled3bis.m new file mode 100755 index 0000000..4e1b7bc --- /dev/null +++ b/Tilt/Untitled3bis.m @@ -0,0 +1,46 @@ +ini = 2249; +fin = 2669; +ini2 = 3241; + +accTL(ini:fin,58)= accTL(ini:fin,1); +accTL(ini:fin,59)= accTL(ini:fin,2); +accTL(ini:fin,60)= accTL(ini:fin,3); +accTL(ini:fin,1)= accTL(ini-1,1); +accTL(ini:fin,2)= accTL(ini-1,2); +accTL(ini:fin,3)= accTL(ini-1,3); +magTL(ini:fin,59)= magTL(ini:fin,2); +magTL(ini:fin,60)= magTL(ini:fin,3); +magTL(ini:fin,58)= magTL(ini:fin,1); +magTL(ini:fin,1)= magTL(ini-1,1); +magTL(ini:fin,2)= magTL(ini-1,2); +magTL(ini:fin,3)= magTL(ini-1,3); +tempTL(ini:fin,20)= tempTL(ini:fin,1); +tempTL(ini:fin,1)= tempTL(ini-1,1); + +accTL(ini2:end,58)= accTL(ini2:end,1); +accTL(ini2:end,59)= accTL(ini2:end,2); +accTL(ini2:end,60)= accTL(ini2:end,3); +accTL(ini2:end,1)= accTL(ini2-1,1); +accTL(ini2:end,2)= accTL(ini2-1,2); +accTL(ini2:end,3)= accTL(ini2-1,3); +magTL(ini2:end,59)= magTL(ini2:end,2); +magTL(ini2:end,60)= magTL(ini2:end,3); +magTL(ini2:end,58)= magTL(ini2:end,1); +magTL(ini2:end,1)= magTL(ini2-1,1); +magTL(ini2:end,2)= magTL(ini2-1,2); +magTL(ini2:end,3)= magTL(ini2-1,3); +tempTL(ini2:end,20)= tempTL(ini2:end,1); +tempTL(ini2:end,1)= tempTL(ini2-1,1); + +angTLHR(ini:fin,39)= angTLHR(ini:fin,1); +angTLHR(ini:fin,40)= angTLHR(ini:fin,2); +angTLHR(ini:fin,1)= angTLHR(ini-1,1); +angTLHR(ini:fin,2)= angTLHR(ini-1,2); +angTLHR(ini2:end,39)= angTLHR(ini2:end,1); +angTLHR(ini2:end,40)= angTLHR(ini2:end,2); +angTLHR(ini2:end,1)= angTLHR(ini2-1,1); +angTLHR(ini2:end,2)= angTLHR(ini2-1,2); +tempTLHR(ini:fin,20)= tempTLHR(ini:fin,1); +tempTLHR(ini:fin,1)= tempTLHR(ini-1,1); +tempTLHR(ini2:end,20)= tempTLHR(ini2:end,1); +tempTLHR(ini2:end,1)= tempTLHR(ini2-1,1); \ No newline at end of file diff --git a/Tilt/Untitled_2.m b/Tilt/Untitled_2.m new file mode 100755 index 0000000..a01b35d --- /dev/null +++ b/Tilt/Untitled_2.m @@ -0,0 +1,54 @@ +ini =1; +N = 2250; +%15000 + +X = X(:,ini:N); +Y = Y(:,ini:N); +Z = Z(:,ini:N); +Xlocal = Xlocal(:,ini:N); +Ylocal = Ylocal(:,ini:N); +Zlocal = Zlocal(:,ini:N); +HShift = HShift(:,ini:N); +HShift_local = HShift_local(:,ini:N); +Acceleration = Acceleration(:,ini:N); +Acceleration_local = Acceleration_local(:,ini:N); +Speed = Speed(:,ini:N); +Speed_local = Speed_local(:,ini:N); +AlfaX = AlfaX(:,ini:N); +AlfaY = AlfaY(:,ini:N); +ARRAYdateTL = ARRAYdateTL(ini:N); +Azimuth = Azimuth(:,ini:N); +ErrTiltLink = ErrTiltLink(:,ini:N); +TempDef_TL = TempDef_TL(ini:N,:); + +X_HR = X_HR(:,ini:N); +Y_HR = Y_HR(:,ini:N); +Z_HR = Z_HR(:,ini:N); +Xlocal_HR = Xlocal_HR(:,ini:N); +Ylocal_HR = Ylocal_HR(:,ini:N); +Zlocal_HR = Zlocal_HR(:,ini:N); +HShift_HR = HShift_HR(:,ini:N); +HShift_local_HR = HShift_local_HR(:,ini:N); +Acceleration_HR = Acceleration_HR(:,ini:N); +Acceleration_local_HR = Acceleration_local_HR(:,ini:N); +Speed_HR = Speed_HR(:,ini:N); +Speed_local_HR = Speed_local_HR(:,ini:N); +AlfaX_HR = AlfaX_HR(:,ini:N); +AlfaY_HR = AlfaY_HR(:,ini:N); +ARRAYdateTLHR = ARRAYdateTLHR(ini:N); +Azimuth_HR = Azimuth_HR(:,ini:N); +ErrTiltLinkHR = ErrTiltLinkHR(:,ini:N); +TempDef_TLHR = TempDef_TLHR(ini:N,:); + +ARRAYdateBL = ARRAYdateBL(ini:N); +BaroDef = BaroDef(ini:N); +BaroDefT = BaroDefT(ini:N); +ErrBaroLink = ErrBaroLink(:,ini:N); + +ARRAYdatePL = ARRAYdatePL(ini:N); +ErrPiezoLink = ErrPiezoLink(:,ini:N); +Livello = Livello(ini:N,:); +PiezDef = PiezDef(ini:N); +PiezDefT = PiezDefT(ini:N); + + diff --git a/Tilt/Users_Def.m b/Tilt/Users_Def.m new file mode 100755 index 0000000..4cd6b28 --- /dev/null +++ b/Tilt/Users_Def.m @@ -0,0 +1,118 @@ +function [Mail,Users_Report,activeEN,siteID,NomeSito] = Users_Def(IDcentralina,conn,FileName) + +text = 'Users function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +% A partire dalla centralina, risalgo al site ID +comando = ['select site_id from units where name like ''' IDcentralina ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +siteID = num2str(cell2mat(curs.Data)); + +% --- Cerco gli utenti --- + +% - Definisco gli Users +% A partire dal site ID, risalgo al company ID +comando = ['select company_id, name, lat, lon, alarm_email from sites where id like ''' siteID ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +Site = curs.Data; +Company_id = num2str(cell2mat(Site(1,1))); +NomeSito = Site(1,2); + +% A partire dal company ID, mi scarico le info relative a Send Email Alarm +comando = ['select send_alarm from companies where id like ''' Company_id ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +Mail = cell2mat(curs.Data); + +% A partire dal company ID, risalgo agli utenti e alla loro mail di +% quella company che sono admin +comando = ['select fname, lname, email, language_id, report from users where '... + 'company_id like ''' Company_id ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +Users = curs.Data; + +% Elimino gli utenti che non devono ricevere il report +[rU,cU] = size(Users); +Users_Report = cell(1,1); +rpt = 1; +if cU > 1 + for u = 1:rU + if cell2mat(Users(u,5)) == 1 + [rUA,cUA] = size(Users_Report); + if rUA == 1 && cUA == 1 + clear Users_Report + end + Users_Report(rpt,:) = Users(u,1:4); + rpt = rpt+1; + end + end +end +ini_CoV = rpt; + +% Cone of vision +% A partire dal site ID, risalgo al USER ID degli utenti nel +% cone-of-vision per quel sito +comando = ['select user_id from coneofvisions where site_id like ''' siteID ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +CoV = cell2mat(curs.Data); + +comando = ['select report_cov from coneofvisions where site_id like ''' siteID ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +Auth_CoV = cell2mat(curs.Data); + +% A partire dal USER ID, risalgo agli utenti e alla loro email se sono company manager +[rC, ~] = size(CoV); +n = 1; +if strcmp(char(CoV(1,:)),'No Data') % almeno un utente da cercare nel database +else + for i=1:rC + if Auth_CoV(i) == 1 + Utente = num2str(CoV(i,1)); + comando = ['select fname, lname, email, language_id '... + 'from users where id = ''' Utente ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + COV = curs.Data; + Users_CoV(n,:) = COV; + n = n+1; + end + end +end +if n>1 % Esistono utenti CoV per il report + [~,cU] = size(Users_Report); + if cU == 1 + Users_Report = Users_CoV; + else + Users_Report(rpt:rpt+n-2,:) = Users_CoV; + end +end +[rU,cU] = size(Users_Report); +if rU == 0 + Mail = 0; +end + +% A chi mando la mail +activeEN = 0; +if cU >1 % sono presenti utenti a cui inviare la mail + for i = 1:rU + if Users_Report{i,4} == 2 + activeIT = 1; + else + activeEN = 1; + break + end + end +end + +text = 'Users function worked correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/Users_Def_old.m b/Tilt/Users_Def_old.m new file mode 100755 index 0000000..966370d --- /dev/null +++ b/Tilt/Users_Def_old.m @@ -0,0 +1,322 @@ +function [Mail,Users_Alert,Users_SMS,Users_Report,activeIT,activeEN,... + sms,siteID,NomeSito,ini_CoV] = Users_Def(IDcentralina,conn,FileName) + +text = 'Users function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +% A partire dalla centralina, risalgo al site ID +comando = ['select site_id from units where name like ''' IDcentralina ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +siteID = num2str(cell2mat(curs.Data)); + +% --- Cerco gli utenti --- + +% - Definisco gli Users +% A partire dal site ID, risalgo al company ID +comando = ['select company_id, name, lat, lon, alarm_email from sites where id like ''' siteID ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +Site = curs.Data; +Company_id = num2str(cell2mat(Site(1,1))); +Email_Alarm_Site = Site(1,5); +NomeSito = Site(1,2); + +% A partire dal company ID, mi scarico le info relative a Send Email Alarm +comando = ['select send_alarm from companies where id like ''' Company_id ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +Mail = cell2mat(curs.Data); + +if Mail == 1 % Significa che invio Mail alla Company del Sito + % La Mail la mando SOLO alla mail indicata nel campo del Sito (per quanto riguarda la company cliente) + if isempty(cell2mat(Email_Alarm_Site)) == 0 + if strcmp(char(Email_Alarm_Site),'null') == 0 + US = Email_Alarm_Site; + check = cell2mat(strfind(US,',')); + if isempty(check)==1 + % A partire dal company ID, risalgo agli utenti e alla loro mail di + % quella company che sono admin + comando = ['select fname, lname, language_id, info, phone, sms_alarm, report, report_cov, '... + 'allertamento from users where email like '''... + char(US) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Info = curs.Data; % Cerco la lingua dell'unico destinatario + [~,cC] = size(Info); + if cC > 1 + Users = Info(1:2); + Users(3) = US; + Users(4:5) = Info(3:4); + Users(6) = Info(5); + Users(7:10) = Info(6:9); + else + Users = []; + end + else + [~,cC] = size(check); + Users = cell(cC+1,6); + u = 1; + ini = 1; + for i=1:cC+1 + utente = char(US); + % A partire dal company ID, risalgo agli utenti e alla loro mail di + % quella company che sono admin + if i == cC+1 + comando = ['select fname, lname, language_id, info, phone, sms_alarm, report, report_cov, '... + 'allertamento, email from users where email like ''' utente(ini:end) ''' ']; + else + comando = ['select fname, lname, language_id, info, phone, sms_alarm, report, report_cov, '... + 'allertamento, email from users where email like ''' utente(ini:check(i)-1) ''' ']; + end + curs = exec(conn,comando); + curs = fetch(curs); + Info = curs.Data; % Cerco la lingua dell'unico destinatario + [~,cI] = size(Info); + if cI ~= 1 + Users(u,1:2) = Info(1:2); + Users(u,3) = Info(10); + Users(u,4:5) = Info(3:4); + Users(u,6) = Info(5); + Users(u,7:10) = Info(6:9); + u = u+1; + end + if i ~= cC+1 + ini = check(i)+1; + end + end + Users = Users(1:u-1,:); + end + else + % Company Manager + Role = ' 2 '; + % A partire dal company ID, risalgo agli utenti e alla loro mail di + % quella company che sono admin + comando = ['select fname, lname, email, language_id, info, phone, sms_alarm, report, report_cov, '... + 'allertamento from users where company_id like ''' Company_id ''' and role_id = ''' Role ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Users = curs.Data; + end + else + % Company Manager + Role = ' 2 '; + % A partire dal company ID, risalgo agli utenti e alla loro mail di + % quella company che sono admin + comando = ['select fname, lname, email, language_id, info, phone, sms_alarm, report, report_cov, '... + 'allertamento from users where company_id like ''' Company_id ''' and role_id = ''' Role ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Users = curs.Data; + end +else + Users = []; +end + +% Elimino gli utenti che non possono essere allertati +[rU,cU] = size(Users); +al = 1; +sms = 1; +rpt = 1; +Users_Alert = cell(1,1); +Users_SMS = cell(1,1); +Users_Report = cell(1,1); +if cU > 1 + for u = 1:rU + if cell2mat(Users(u,10)) == 1 + [rUA,cUA] = size(Users_Alert); + if rUA == 1 && cUA == 1 + clear Users_Alert + end + Users_Alert(al,:) = Users(u,:); + al = al+1; + if cell2mat(Users(u,7)) == 1 + [rUA,cUA] = size(Users_SMS); + if rUA == 1 && cUA == 1 + clear Users_SMS + end + Users_SMS(sms,:) = Users(u,:); + sms = sms+1; + end + end + if cell2mat(Users(u,8)) == 1 + [rUA,cUA] = size(Users_Report); + if rUA == 1 && cUA == 1 + clear Users_Report + end + Users_Report(rpt,:) = Users(u,:); + rpt = rpt+1; + end + end +end +ini_CoV = al; + +% Cerco se allertare o meno i Cone of Visions +comando = ['select conn_path from units where name like ''' IDcentralina ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +Auth = curs.Data; % Se pari a 1 autorizzo i Cone of Visions, altrimenti no + +if strcmp(char(Auth),'Yes') + Mail = 1; + % Cone of vision + % A partire dal site ID, risalgo al USER ID degli utenti nel + % cone-of-vision per quel sito + comando = ['select user_id from coneofvisions where site_id like ''' siteID ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + CoV = cell2mat(curs.Data); + + % A partire dal USER ID, risalgo agli utenti e alla loro email se sono company manager + [rC, ~] = size(CoV); + if strcmp(char(CoV(1,:)),'No Data') % almeno un utente da cercare nel database + Users_CoV = []; + else + ii = 1; + for i=1:rC + Utente = num2str(CoV(i,1)); + Role = ' 2 '; % Company Manager + comando = ['select fname, lname, email, language_id, info, phone, sms_alarm, report, report_cov, '... + 'allertamento from users where id = ''' Utente ''' and role_id = ''' Role ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + UC = curs.Data; + [~,cUC] = size(UC); + Role = ' 5 '; % Super Company Manager + comando = ['select fname, lname, email, language_id, info, phone, sms_alarm, report, report_cov, '... + 'allertamento from users where id = ''' Utente ''' and role_id = ''' Role ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + UC2 = curs.Data; + [~,cUC2] = size(UC2); + if cUC ~= 1 + Users_CoV(ii,:) = UC; + ii = ii+1; + elseif cUC2 ~= 1 + Users_CoV(ii,:) = UC2; + ii = ii+1; + end + end + end + [rUC,cUC] = size(Users_CoV); + [rUA,cUA] = size(Users_Alert); + if cUC > 1 + for u = 1:rUC + if cell2mat(Users_CoV(u,10)) == 1 && cell2mat(Users_CoV(u,9)) == 1 + salta = 0; + for cov = 1:rUA + if cUA > 1 + A = strfind(char(Users_CoV(u,3)),char(Users_Alert(cov,3))); + if A == 1 + salta = 1; + break + end + end + end + if salta == 0 + if cUA > 1 + Users_Alert(al,:) = Users_CoV(u,:); + else + Users_Alert = Users_CoV(u,:); + end + al = al+1; + if cell2mat(Users_CoV(u,7)) == 1 + [rSMS,cSMS] = size(Users_SMS); + if rSMS == 1 && cSMS == 1 + clear Users_SMS + end + Users_SMS(sms,:) = Users_CoV(u,:); + sms = sms+1; + end + end + end + if cell2mat(Users_CoV(u,9)) == 1 + salta = 0; + for cov = 1:rUA + if cUA > 1 + A = strfind(char(Users_CoV(u,3)),char(Users_Alert(cov,3))); + if A == 1 + salta = 1; + break + end + end + end + if salta == 0 + [rUA,cUA] = size(Users_Report); + if rUA == 1 && cUA == 1 + clear Users_Report + end + Users_Report(rpt,:) = Users_CoV(u,:); + rpt = rpt+1; + end + end + end + end +else + Users_CoV = []; +end + +[rU,cU] = size(Users); +[rC,cC] = size(Users_CoV); +if cC > 1 && rC > 0 && cU > 1 % comando ha trovato informazioni e le ha scritte in Users + Users(rU+1:rU+rC,1:10) = Users_CoV; +elseif cC > 1 && rC > 0 && cU == 0 + Users = Users_CoV; +end + +[rU,~] = size(Users); +if rU == 0 + Mail = 0; +end +% Controllo che la centralina non sia scaduta +comando = ['select duedate from units where name = ''' IDcentralina ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +Date = curs.Data; +Check = cell2mat(Date); +if strcmp(Check,'null') || strcmp(Check,'No Data') + % La data di scadenza centralina non è impostata + sms = 1; +else + if datenum(Date) < now % Centralina scaduta + sms = 0; + Users_Alert = []; + Users_SMS = []; + Users_Report = []; + else + sms = 1; + end +end + +% A chi mando la mail +activeIT = 0; +activeEN = 0; +[~,c1] = size(Users_Alert); +[~,c2] = size(Users_Report); +if c1 == 1 && c2 == 1 + Users_Lang = []; +elseif c1 == 1 + Users_Lang = Users_Report; +elseif c2 == 1 + Users_Lang = Users_Alert; +else + Users_Lang = [Users_Alert; Users_Report]; +end +[rU,cU] = size(Users_Lang); +if cU >1 % sono presenti utenti a cui inviare la mail + for i = 1:rU + if Users_Lang{i,4} == 2 + activeIT = 1; + else + activeEN = 1; + end + end +end + +text = 'Users function worked correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/YesNo.m b/Tilt/YesNo.m new file mode 100755 index 0000000..90e512a --- /dev/null +++ b/Tilt/YesNo.m @@ -0,0 +1,223 @@ +%% funzione che attiva/disattiva l'elaborazione per una determinata tipologia di nodo +% Ad esempio se la matrice Tilt Link è vuota i Tilt Link non sono presenti +% e si scrive yesTL = 0, altrimenti se ci sono dei dati, yesTL = 1 e ne +% viene attivata l'elaborazione nelle fasi successive + +function [yesTL,yesTLHR,yesTLHR3D,yesTLH,yesTLHRH,yesTLHR3DH,yesPL,yesBL,... + yesThL,yesAL,yesLL,yesKL,yesKLHR,yesRL,yesPT100,yesIPL,yesIPLHR,yesIPLHR3D,... + yesWL,yesPE,NodoPiezoLink,yesWI,yesHD,yesHDVR,yesSPP,yesSL] = YesNo(NodoTiltLink,NodoTiltLinkHR,... + NodoTiltLinkHR3D,NodoTiltLinkH,NodoTiltLinkHRH,NodoTiltLinkHR3DH,NodoPiezoLink,... + NodoBaroLink,NodoThermLink,NodoAnalogLink,NodoLoadLink,NodoKlinoLink,NodoKlinoLinkHR,... + NodoRainLink,NodoPT100Link,NodoInPlaceLink,NodoInPlaceLinkHR,NodoInPlaceLinkHR3D,... + NodoWeirLink,NodoPendulum,NodoWind,NodoTiltLinkHD,NodoTiltLinkHDVR,NodoSPPLink,NodoSnowLink,FileName) + +text = 'YesNo function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +%% Tilt Link V +[rTL,cTL] = size(NodoTiltLink); +if rTL==0 && cTL==0 + yesTL = 0; % Non elaboro i Tilt Link +else + yesTL = 1; % attiva l'elaborazione dei Tilt Link +end + +%% Tilt Link HR V +[rTLHR,cTLHR] = size(NodoTiltLinkHR); +if rTLHR==0 && cTLHR==0 + yesTLHR = 0; % Non elaboro i Tilt Link HR +else + yesTLHR = 1; % attiva l'elaborazione dei Tilt Link HR +end + +%% Tilt Link H +[rTLH,cTLH] = size(NodoTiltLinkH); +if rTLH==0 && cTLH==0 + yesTLH = 0; % Non elaboro i Tilt Link H +else + yesTLH = 1; % attiva l'elaborazione dei Tilt Link H +end + +%% Tilt Link HR H +[rTLHRH,cTLHRH] = size(NodoTiltLinkHRH); +if rTLHRH==0 && cTLHRH==0 + yesTLHRH = 0; % Non elaboro i Tilt Link HR H +else + yesTLHRH = 1; % attiva l'elaborazione dei Tilt Link HR H +end + +%% Piezo Link +[rPL,cPL] = size(NodoPiezoLink); +if rPL==0 && cPL==0 + yesPL = 0; % Non elaboro i Piezo Link + NodoPiezoLink = zeros(1,4); +else + yesPL = 1; % attiva l'elaborazione dei Piezo Link +end + +%% Baro Link +[rBL,cBL] = size(NodoBaroLink); +if rBL==0 && cBL==0 + yesBL = 0; % Non elaboro i Baro Link +else + yesBL = 1; % attiva l'elaborazione dei Baro Link +end + +%% Analog Link +[rAL,cAL] = size(NodoAnalogLink); +if rAL==0 && cAL==0 + yesAL = 0; % Non elaboro gli Analog Link +else + yesAL = 1; % attiva l'elaborazione degli Analog Link +end + +%% Therm Link +[rThL,cThL] = size(NodoThermLink); +if rThL==0 && cThL==0 + yesThL = 0; % Non elaboro i Settle Link +else + yesThL = 1; % attiva l'elaborazione dei Settle Link +end + +%% Load Link +[rLL,cLL] = size(NodoLoadLink); +if rLL==0 && cLL==0 + yesLL = 0; % Non elaboro i Load Link +else + yesLL = 1; % attiva l'elaborazione dei Load Link +end + +%% Tilt Link HR3D +[rTLHR3D,cTLHR3D] = size(NodoTiltLinkHR3D); +if rTLHR3D==0 && cTLHR3D==0 + yesTLHR3D = 0; % Non elaboro i Tilt Link HR +else + yesTLHR3D = 1; % attiva l'elaborazione dei Tilt Link HR +end + +%% Tilt Link HR3D H +[rTLHR3DH,cTLHR3DH] = size(NodoTiltLinkHR3DH); +if rTLHR3DH==0 && cTLHR3DH==0 + yesTLHR3DH = 0; % Non elaboro i Tilt Link HR H +else + yesTLHR3DH = 1; % attiva l'elaborazione dei Tilt Link HR H +end + +%% Klino Link +[rKL,cKL] = size(NodoKlinoLink); +if rKL==0 && cKL==0 + yesKL = 0; % Non elaboro i Klino Link +else + yesKL = 1; % attiva l'elaborazione dei Klino Link +end + +%% Klino Link HR +[rKLHR,cKLHR] = size(NodoKlinoLinkHR); +if rKLHR==0 && cKLHR==0 + yesKLHR = 0; % Non elaboro i Klino Link HR +else + yesKLHR = 1; % attiva l'elaborazione dei Klino Link HR +end + +%% Rain Link +[rRL,cRL] = size(NodoRainLink); +if rRL==0 && cRL==0 + yesRL = 0; % Non elaboro i Rain Link +else + yesRL = 1; % attiva l'elaborazione dei Rain Link +end + +%% PT100 Link +[rPT100,cPT100] = size(NodoPT100Link); +if rPT100==0 && cPT100==0 + yesPT100 = 0; % Non elaboro i PT100 Link +else + yesPT100 = 1; % attiva l'elaborazione dei PT100 Link +end + +%% In Place Link +[rIPL,cIPL] = size(NodoInPlaceLink); +if rIPL==0 && cIPL==0 + yesIPL = 0; % Non elaboro In Place Link +else + yesIPL = 1; % attiva l'elaborazione dei In Place Link +end + +%% In Place Link HR +[rIPLHR,cIPLHR] = size(NodoInPlaceLinkHR); +if rIPLHR==0 && cIPLHR==0 + yesIPLHR = 0; % Non elaboro In Place Link HR +else + yesIPLHR = 1; % attiva l'elaborazione dei In Place Link HR +end + +%% In Place Link HR 3D +[rIPLHR3D,cIPLHR3D] = size(NodoInPlaceLinkHR3D); +if rIPLHR3D==0 && cIPLHR3D==0 + yesIPLHR3D = 0; % Non elaboro In Place Link HR +else + yesIPLHR3D = 1; % attiva l'elaborazione dei In Place Link HR +end + +%% Weir Link +[rWL,cWL] = size(NodoWeirLink); +if rWL==0 && cWL==0 + yesWL = 0; % Non elaboro Weir Link +else + yesWL = 1; % attiva l'elaborazione dei Weir Link +end + +%% Pendulum +[rPE,cPE] = size(NodoPendulum); +if rPE==0 && cPE==0 + yesPE = 0; % Non elaboro Pendulum +else + yesPE = 1; % attiva l'elaborazione dei Pendulum +end + +%% Wind Link +[rWI,cWI] = size(NodoWind); +if rWI==0 && cWI==0 + yesWI = 0; % Non elaboro Wind Link +else + yesWI = 1; % attiva l'elaborazione +end + +%% Tilt Link HD +[rHD,cHD] = size(NodoTiltLinkHD); +if rHD==0 && cHD==0 + yesHD = 0; % Non elaboro +else + yesHD = 1; % attiva l'elaborazione +end + +%% Tilt Link HD VR +[rHDVR,cHDVR] = size(NodoTiltLinkHDVR); +if rHDVR==0 && cHDVR==0 + yesHDVR = 0; % Non elaboro +else + yesHDVR = 1; % attiva l'elaborazione +end + +%% SPP Link +[rSP,cSP] = size(NodoSPPLink); +if rSP==0 && cSP==0 + yesSPP = 0; % Non elaboro gli SPP Link +else + yesSPP = 1; % attiva l'elaborazione degli SPP Link +end + +%% Snow Link +[rSL,cSL] = size(NodoSnowLink); +if rSL==0 && cSL==0 + yesSL = 0; % Non elaboro +else + yesSL = 1; % attiva l'elaborazione +end + +text = 'Activation parameters for the elaboration defined correctly. YesNo function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); +end \ No newline at end of file diff --git a/Tilt/alert_Levels.m b/Tilt/alert_Levels.m new file mode 100755 index 0000000..fc14810 --- /dev/null +++ b/Tilt/alert_Levels.m @@ -0,0 +1,476 @@ +function alert_Levels(ARRAYdateRL,IDcentralina,DTcatena,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'alert_Levels function started'; +fprintf(fileID,fmt,text); +fclose(fileID); + +alarm1h = 0; +alarm24h = 0; +alert1h = 0; +alert24h = 0; +alarm = 0; +alert = 0; +if strcmp(IDcentralina,'ID0102') && strcmp(DTcatena,'LOC0102') == 1 || strcmp(IDcentralina,'ID0153') && strcmp(DTcatena,'DT0050') == 1 % Pluviometri A27 Cave Est e Fadalto + DataScarico = ARRAYdateRL(1)-1.1; + % Scarico di dati di pioggia + NodeType = 'Rain Link'; + comando = ['select EventDate, EventTime, Z, calcerr from ElabDataView where EventDate = ''' ... + datestr(DataScarico,'yyyy-mm-dd') ''' and EventTime >= ''' datestr(DataScarico,'HH:MM:SS') ''' and UnitName = ''' ... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRLd = curs.Data; + % Scarico di dati di pioggia + comando = ['select EventDate, EventTime, Z, calcerr from ElabDataView where EventDate > ''' ... + datestr(DataScarico,'yyyy-mm-dd') ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRL = curs.Data; + [~,c1] = size(DATnodoRL); + [~,c2] = size(DATnodoRLd); + if c1 == c2 + DATnodoRL = [DATnodoRLd; DATnodoRL]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoRL = DATnodoRLd; + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATnodoRL); + if rD ~=1 && cD ~=1 + T = [cell2mat(DATnodoRL(:,1)) repmat(' ', [rD,1]) cell2mat(DATnodoRL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + ARRAYdateRL = T; + end + RainCum = cell2mat(DATnodoRL(:,3)); + ErrRainLink = cell2mat(DATnodoRL(:,4)); + + [numDate,~] = size(ARRAYdateRL); + % 24H + d = 1; + p = 1; + diffDate = 0; + n = 1; + period = 1; % calcolo giornaliero + ContSUP = []; + Pioggia24h = zeros(numDate,1); + for dd = 1:numDate + while diffDate < period + d = d+1; + if d > numDate % Se d supera le date disponibili, esco dal ciclo while + break + end + diffDate = ARRAYdateRL(d) - ARRAYdateRL(p); + end + if d >numDate + break + end + ContSUP(n,1) = d; %#ok<*AGROW> % Creo matrice indici dell'estremo superiore della differenza + ContINF(n,1) = p; % Creo matrice indici dell'estremo inferiore della differenza + p = p+1; % passo alla data di partenza successiva + d = p; % resetto il conto di d + n = n+1; + diffDate = 0; + end + check = isempty(ContSUP); + if check == 0 + [nDate,~] = size(ContSUP); + for dd = 1:nDate + Pioggia24h(ContSUP(dd,1),1) = RainCum(ContSUP(dd,1))-RainCum(ContINF(dd,1)); + end + end + % 1H + d = 1; + p = 1; + diffDate = 0; + n = 1; + period = 1/24; % calcolo orario + ContSUP = []; + Pioggia1h = zeros(numDate,1); + for dd = 1:numDate + while diffDate < period + d = d+1; + if d > numDate % Se d supera le date disponibili, esco dal ciclo while + break + end + diffDate = ARRAYdateRL(d) - ARRAYdateRL(p); + end + if d >numDate + break + end + ContSUP(n,1) = d; %#ok<*AGROW> % Creo matrice indici dell'estremo superiore della differenza + ContINF(n,1) = p; % Creo matrice indici dell'estremo inferiore della differenza + p = p+1; % passo alla data di partenza successiva + d = p; % resetto il conto di d + n = n+1; + diffDate = 0; + end + check = isempty(ContSUP); + if check == 0 + [nDate,~] = size(ContSUP); + for dd = 1:nDate + Pioggia1h(ContSUP(dd,1),1) = RainCum(ContSUP(dd,1))-RainCum(ContINF(dd,1)); + end + end + % Allerta + indexALE1h = zeros(1,2); + indexALE24h = zeros(1,2); + indexALA1h = zeros(1,2); + indexALA24h = zeros(1,2); + c1h_ALE = 1; + c24h_ALE = 1; + c1h_ALA = 1; + c24h_ALA = 1; + + % ---SOGLIE--- + if strcmp(IDcentralina,'ID0102') && strcmp(DTcatena,'LOC0102') == 1 + soglia1h_ALE = 25; % mm + soglia24h_ALE = 90; % mm + soglia1h_ALA = 40; % mm + soglia24h_ALA = 120; % mm + Search_ALE = 1; + Search_ALA = 1; + elseif strcmp(IDcentralina,'ID0153') && strcmp(DTcatena,'DT0050') + soglia1h_ALE = 20; % mm + soglia24h_ALE = 80; % mm + soglia1h_ALA = 30; % mm + soglia24h_ALA = 110; % mm + Search_ALE = 1; + Search_ALA = 1; + end + + for n = 1:numDate + %% ALLARMI + if Search_ALA == 1 + if Pioggia1h(n,1) > soglia1h_ALA % mm + if ErrRainLink(n,1) == 0 || ErrRainLink(n,1) == 0.5 % Il nodo non è in errore + alarm1h = 1; + alarm = 1; + indexALA1h(c1h_ALA,1) = n; % Data + indexALA1h(c1h_ALA,2) = Pioggia1h(n,1); % valore + c1h_ALA = c1h_ALA+1; + end + end + if Pioggia24h(n,1) > soglia24h_ALA % mm + if ErrRainLink(n,1) == 0 || ErrRainLink(n,1) == 0.5 % Il nodo non è in errore + alarm24h = 1; + alarm = 1; + indexALA24h(c24h_ALA,1) = n; % Data + indexALA24h(c24h_ALA,2) = Pioggia24h(n,1); % valore + c24h_ALA = c24h_ALA+1; + end + end + end + %% ALLERTE + if Search_ALE == 1 + % Oraria + if Search_ALA == 1 + if Pioggia1h(n,1) > soglia1h_ALE && Pioggia1h(n,1) <= soglia1h_ALA % mm + continua = 1; + else + continua = 0; + end + else + if Pioggia1h(n,1) > soglia1h_ALE % mm + continua = 1; + else + continua = 0; + end + end + if continua == 1 + if ErrRainLink(n,1) == 0 || ErrRainLink(n,1) == 0.5 % Il nodo non è in errore + alert1h = 1; + alert = 1; + indexALE1h(c1h_ALE,1) = n; % Data + indexALE1h(c1h_ALE,2) = Pioggia1h(n,1); % valore + c1h_ALE = c1h_ALE+1; + end + end + + % Giornaliera + if Search_ALA == 1 + if Pioggia24h(n,1) > soglia24h_ALE && Pioggia24h(n,1) <= soglia24h_ALA % mm + continua = 1; + else + continua = 0; + end + else + if Pioggia24h(n,1) > soglia24h_ALE % mm + continua = 1; + else + continua = 0; + end + end + if continua == 1 + if ErrRainLink(n,1) == 0 || ErrRainLink(n,1) == 0.5 % Il nodo non è in errore + alert24h = 1; + alert = 1; + indexALE24h(c24h_ALE,1) = n; % Data + indexALE24h(c24h_ALE,2) = Pioggia24h(n,1); % valore + c24h_ALE = c24h_ALE+1; + end + end + end + end +end + +if alarm == 1 || alert == 1 + + %% Controllo la data + if strcmp(IDcentralina,'ID0102') == 1 && strcmp(DTcatena,'LOC0102') == 1 || ... + strcmp(IDcentralina,'ID0153') == 1 && strcmp(DTcatena,'DT0050') == 1 % Pluviometri A27 Cave Est e Fadalto + if alarm1h == 1 && alert1h == 1 + date1h_ALA = ARRAYdateRL(indexALA1h(:,1)); + date1h_ALE = ARRAYdateRL(indexALE1h(:,1)); + elseif alarm1h == 1 + date1h_ALE = 0; + date1h_ALA = ARRAYdateRL(indexALA1h(:,1)); + elseif alert1h == 1 + date1h_ALE = ARRAYdateRL(indexALE1h(:,1)); + date1h_ALA = 0; + else + date1h_ALA = 0; + date1h_ALE = 0; + end + if alarm24h == 1 && alert24h == 1 + date24h_ALA = ARRAYdateRL(indexALA24h(:,1)); + date24h_ALE = ARRAYdateRL(indexALE24h(:,1)); + elseif alarm24h == 1 + date24h_ALA = ARRAYdateRL(indexALA24h(:,1)); + date24h_ALE = 0; + elseif alert24h == 1 + date24h_ALA = 0; + date24h_ALE = ARRAYdateRL(indexALE24h(:,1)); + else + date24h_ALA = 0; + date24h_ALE = 0; + end + end + DataALE = max(date1h_ALE(end),date24h_ALE(end)); + DataALA = max(date1h_ALA(end),date24h_ALA(end)); + + FileNameALA = ['' IDcentralina '-' DTcatena '-Alarm.txt']; + if isfile(FileNameALA) == 1 + A = importdata(FileNameALA); + [rA,~] = size(A); + if rA == 0 + DataRif_ALE = 0; + DataRif_ALA = 0; + elseif rA == 1 + DataRif_ALE = A(1,1); + DataRif_ALA = 0; + else + DataRif_ALE = A(1,1); + DataRif_ALA = A(2,1); + end + else + DataRif_ALE = 0; + DataRif_ALA = 0; + end + + if alert == 1 || alarm == 1 + if alert == 1 && alarm == 1 + DATA = max(DataALA,DataALE); + DataWrite_ALA = DataALA; + DataWrite_ALE = DataALE; + elseif alert == 1 + DATA = DataALE; + DataWrite_ALE = DataALE; + DataWrite_ALA = DataRif_ALA; + elseif alarm == 1 + DATA = DataALA; + DataWrite_ALE = DataRif_ALE; + DataWrite_ALA = DataALA; + end + + % Allerta + if alert == 1 + if date1h_ALE(end) > DataRif_ALE+1 + mail1h_ALE = 1; + else + mail1h_ALE = 0; + end + if date24h_ALE(end) > DataRif_ALE+1 + mail24h_ALE = 1; + else + mail24h_ALE = 0; + end + else + mail1h_ALE = 0; + mail24h_ALE = 0; + end + % Allarme + if alarm == 1 + if date1h_ALA(end) > DataRif_ALA+1 + mail1h_ALA = 1; + else + mail1h_ALA = 0; + end + if date24h_ALA(end) > DataRif_ALA+1 + mail24h_ALA = 1; + else + mail24h_ALA = 0; + end + else + mail1h_ALA = 0; + mail24h_ALA = 0; + end + else + DataWrite_ALE = DataRif_ALE; + DataWrite_ALA = DataRif_ALA; + fileID = fopen(FileNameALA,'a'); + outdat = fopen(FileNameALA,'wt+'); + fmt = '%.10f \r'; + fprintf(fileID,fmt,DataWrite_ALE); + fmt = '%.10f \r'; + fprintf(fileID,fmt,DataWrite_ALA); + fclose(fileID); + end + + if mail24h_ALA == 1 || mail24h_ALE == 1 || mail1h_ALA == 1 || mail1h_ALE == 1 + allarme = 0; + allerta = 0; + AL = 1; + DATAinsert = cell(1,9); + if strcmp(IDcentralina,'ID0102') && strcmp(DTcatena,'LOC0102') % Pluviometro A27 + sms = 1; + NodeNum = 2; + elseif strcmp(IDcentralina,'ID0153') && strcmp(DTcatena,'DT0050') == 1 + NodeNum = 1; + sms = 1; + end + %% ALLARMI + for ii = 1:c1h_ALA-1 % numero di allarmi orari + if mail1h_ALA == 1 && ARRAYdateRL(indexALA1h(ii,1)) > DataRif_ALA+1 + Level = 3; + sms = 1; + desc = 'Soglia oraria'; + Data = datestr(ARRAYdateRL(indexALA1h(ii,1),1),'yyyy-mm-dd HH:MM:SS'); + Valore = Pioggia1h(indexALA1h(ii,1)); + DATAinsert{AL,1} = 3; % Allarme tipologia Soglie tradizionali + DATAinsert{AL,2} = IDcentralina; + DATAinsert{AL,3} = DTcatena; + DATAinsert{AL,4} = NodeNum; + DATAinsert{AL,5} = Data; + DATAinsert{AL,6} = Valore; + DATAinsert{AL,7} = Level; + DATAinsert{AL,8} = sms; + DATAinsert{AL,9} = desc; + allarme = 1; + AL = AL+1; + end + end + for ii = 1:c24h_ALA-1 % numero di allarmi giornalieri + if mail24h_ALA == 1 && ARRAYdateRL(indexALA24h(ii,1)) > DataRif_ALA+1 + Level = 4; + sms = 1; + desc = 'Soglia giornaliera'; + Data = datestr(ARRAYdateRL(indexALA24h(ii,1),1),'yyyy-mm-dd HH:MM:SS'); + Valore = Pioggia24h(indexALA24h(ii,1)); + DATAinsert{AL,1} = 3; % Allarme tipologia Soglie tradizionali + DATAinsert{AL,2} = IDcentralina; + DATAinsert{AL,3} = DTcatena; + DATAinsert{AL,4} = NodeNum; + DATAinsert{AL,5} = Data; + DATAinsert{AL,6} = Valore; + DATAinsert{AL,7} = Level; + DATAinsert{AL,8} = sms; + DATAinsert{AL,9} = desc; + allarme = 1; + AL = AL+1; + end + end + %% Allerte + for ii = 1:c1h_ALE-1 % numero di allerte orarie + if mail1h_ALE == 1 && ARRAYdateRL(indexALE1h(ii,1)) > DataRif_ALE+1 + Level = 1; + desc = 'Soglia oraria'; + Data = datestr(ARRAYdateRL(indexALE1h(ii,1),1),'yyyy-mm-dd HH:MM:SS'); + Valore = Pioggia1h(indexALE1h(ii,1)); + DATAinsert{AL,1} = 3; % Allarme tipologia Soglie tradizionali + DATAinsert{AL,2} = IDcentralina; + DATAinsert{AL,3} = DTcatena; + DATAinsert{AL,4} = NodeNum; + DATAinsert{AL,5} = Data; + DATAinsert{AL,6} = Valore; + DATAinsert{AL,7} = Level; + DATAinsert{AL,8} = sms; + DATAinsert{AL,9} = desc; + allerta = 1; + AL = AL+1; + end + end + for ii = 1:c24h_ALE-1 % numero di alerte giornaliere + if mail24h_ALE == 1 && ARRAYdateRL(indexALE24h(ii,1)) > DataRif_ALE+1 + Level = 2; + desc = 'Soglia giornaliera'; + Data = datestr(ARRAYdateRL(indexALE24h(ii,1),1),'yyyy-mm-dd HH:MM:SS'); + Valore = Pioggia24h(indexALE24h(ii,1)); + DATAinsert{AL,1} = 3; % Allarme tipologia Soglie tradizionali + DATAinsert{AL,2} = IDcentralina; + DATAinsert{AL,3} = DTcatena; + DATAinsert{AL,4} = NodeNum; + DATAinsert{AL,5} = Data; + DATAinsert{AL,6} = Valore; + DATAinsert{AL,7} = Level; + DATAinsert{AL,8} = sms; + DATAinsert{AL,9} = desc; + allerta = 1; + AL = AL+1; + end + end + + if allarme == 1 || allerta == 1 + AL = AL-1; % Numero totale di allarmi + for a = 1:AL + % Cerco se il dato è già presente + Data = DATAinsert{a,5}; + nNodo = num2str(DATAinsert{a,4}); % Numero nodo + type = num2str(DATAinsert{a,1}); % tipologia + level = num2str(DATAinsert{a,7}); % livello allarme + value = num2str(DATAinsert{a,6}); % Valore + desc = DATAinsert{a,9}; % Descrizione + comando = ['select id, type_id, date_time from alarms where unit_name = ''' ... + IDcentralina ''' and tool_name = ''' DTcatena ''' and node_num = ''' ... + nNodo ''' and date_time = ''' Data ''' and type_id = ''' type ... + ''' and alarm_level = ''' level ''' and registered_value = ''' value ... + ''' and description like ''' desc ''' order by date_time']; + curs = exec(conn,comando); + curs = fetch(curs); + idDate = curs.Data; + [~,cI] = size(idDate); + if cI == 1 + idElabData = 0; % 0 indica che il dato non è presente su DB + else + idElabData = cell2mat(idDate(:,1)); + end + tablename = 'alarms'; + colnames = {'type_id','unit_name','tool_name','node_num','date_time',... + 'registered_value','alarm_level','send_sms','description'}; + data = [DATAinsert(a,1),DATAinsert(a,2),DATAinsert(a,3),DATAinsert(a,4),... + DATAinsert(a,5),DATAinsert(a,6),DATAinsert(a,7),DATAinsert(a,8),DATAinsert(a,9)]; + if idElabData == 0 % Scrivo + fastinsert(conn,tablename,colnames,data); + end + end + end + + fileID = fopen(FileNameALA,'a'); + outdat = fopen(FileNameALA,'wt+'); + fmt = '%.10f \r'; + fprintf(fileID,fmt,DataWrite_ALE); + fmt = '%.10f \r'; + fprintf(fileID,fmt,DataWrite_ALA); + fclose(fileID); + end +end + +text = ('alert_Levels function worked correctly'); +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/Tilt/approx.m b/Tilt/approx.m new file mode 100755 index 0000000..6ab5d72 --- /dev/null +++ b/Tilt/approx.m @@ -0,0 +1,73 @@ +% Funzione che approssima il dato alla quarta cifra decimale (decimi di +% millimetri) +function [X,Y,Z,Xlocal,Ylocal,Zlocal,HShift,HShift_local,Azimuth,Speed,... + Speed_local,Acceleration,Acceleration_local,TempDef_TL] = approx(X,Y,Z,... + Xlocal,Ylocal,Zlocal,HShift,HShift_local,Azimuth,Speed,Speed_local,... + Acceleration,Acceleration_local,TempDef_TL,FileName) + +text = 'approx function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +conv = X*10000; +conv = round(conv); +X = conv/10000; + +conv = Y*10000; +conv = round(conv); +Y = conv/10000; + +conv = Z*10000; +conv = round(conv); +Z = conv/10000; + +conv = Xlocal*10000; +conv = round(conv); +Xlocal = conv/10000; + +conv = Ylocal*10000; +conv = round(conv); +Ylocal = conv/10000; + +conv = Zlocal*1000000; +conv = round(conv); +Zlocal = conv/1000000; + +conv = HShift*10000; +conv = round(conv); +HShift = conv/10000; + +conv = HShift_local*10000; +conv = round(conv); +HShift_local = conv/10000; + +conv = Azimuth*10; +conv = round(conv); +Azimuth = conv/10; + +conv = Acceleration_local*10000; +conv = round(conv); +Acceleration_local = conv/10000; + +conv = Speed*10000; +conv = round(conv); +Speed = conv/10000; + +conv = Speed_local*10000; +conv = round(conv); +Speed_local = conv/10000; + +conv = Acceleration*10000; +conv = round(conv); +Acceleration = conv/10000; + +conv = TempDef_TL*10; +conv = round(conv); +TempDef_TL = conv/10; + +text = 'approx function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/approx_HD.m b/Tilt/approx_HD.m new file mode 100755 index 0000000..2fdea10 --- /dev/null +++ b/Tilt/approx_HD.m @@ -0,0 +1,73 @@ +% Funzione che approssima il dato alla quarta cifra decimale (decimi di +% millimetri) +function [X_HD,Y_HD,Z_HD,Xlocal_HD,Ylocal_HD,Zlocal_HD,HShift_HD,HShift_local_HD,Azimuth_HD,Speed_HD,... + Speed_local_HD,Acceleration_HD,Acceleration_local_HD,TempDef_HD] = approx_HD(X_HD,Y_HD,Z_HD,... + Xlocal_HD,Ylocal_HD,Zlocal_HD,HShift_HD,HShift_local_HD,Azimuth_HD,Speed_HD,Speed_local_HD,... + Acceleration_HD,Acceleration_local_HD,TempDef_HD,FileName) + +text = 'approx function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +conv = X_HD*100000; +conv = round(conv); +X_HD = conv/100000; + +conv = Y_HD*100000; +conv = round(conv); +Y_HD = conv/100000; + +conv = Z_HD*100000; +conv = round(conv); +Z_HD = conv/100000; + +conv = Xlocal_HD*100000; +conv = round(conv); +Xlocal_HD = conv/100000; + +conv = Ylocal_HD*100000; +conv = round(conv); +Ylocal_HD = conv/100000; + +conv = Zlocal_HD*10000000; +conv = round(conv); +Zlocal_HD = conv/10000000; + +conv = HShift_HD*100000; +conv = round(conv); +HShift_HD = conv/100000; + +conv = HShift_local_HD*100000; +conv = round(conv); +HShift_local_HD = conv/100000; + +conv = Azimuth_HD*10; +conv = round(conv); +Azimuth_HD = conv/10; + +conv = Acceleration_local_HD*10000; +conv = round(conv); +Acceleration_local_HD = conv/10000; + +conv = Speed_HD*10000; +conv = round(conv); +Speed_HD = conv/10000; + +conv = Speed_local_HD*10000; +conv = round(conv); +Speed_local_HD = conv/10000; + +conv = Acceleration_HD*10000; +conv = round(conv); +Acceleration_HD = conv/10000; + +conv = TempDef_HD*10; +conv = round(conv); +TempDef_HD = conv/10; + +text = 'approx function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/approx_IPLHR.m b/Tilt/approx_IPLHR.m new file mode 100755 index 0000000..8e14508 --- /dev/null +++ b/Tilt/approx_IPLHR.m @@ -0,0 +1,71 @@ +% Funzione che approssima il dato alla quarta cifra decimale (decimi di +% millimetri) +function [X_IPLHR,Y_IPLHR,Z_IPLHR,Xlocal_IPLHR,Ylocal_IPLHR,Zlocal_IPLHR,HShift_IPLHR,... + HShift_local_IPLHR,Azimuth_IPLHR,Speed_IPLHR,Speed_local_IPLHR,Acceleration_IPLHR,... + Acceleration_local_IPLHR,TempDef_IPLHR] = approx_IPLHR(X_IPLHR,Y_IPLHR,Z_IPLHR,... + Xlocal_IPLHR,Ylocal_IPLHR,Zlocal_IPLHR,HShift_IPLHR,HShift_local_IPLHR,Azimuth_IPLHR,... + Speed_IPLHR,Speed_local_IPLHR,Acceleration_IPLHR,Acceleration_local_IPLHR,TempDef_IPLHR,FileName) + +conv = X_IPLHR*1000000; +conv = round(conv); +X_IPLHR = conv/1000000; + +conv = Y_IPLHR*1000000; +conv = round(conv); +Y_IPLHR = conv/1000000; + +conv = Z_IPLHR*1000000; +conv = round(conv); +Z_IPLHR = conv/1000000; + +conv = Xlocal_IPLHR*1000000; +conv = round(conv); +Xlocal_IPLHR = conv/1000000; + +conv = Ylocal_IPLHR*1000000; +conv = round(conv); +Ylocal_IPLHR = conv/1000000; + +conv = Zlocal_IPLHR*1000000; +conv = round(conv); +Zlocal_IPLHR = conv/1000000; + +conv = HShift_IPLHR*1000000; +conv = round(conv); +HShift_IPLHR = conv/1000000; + +conv = HShift_local_IPLHR*1000000; +conv = round(conv); +HShift_local_IPLHR = conv/1000000; + +conv = Azimuth_IPLHR*10; +conv = round(conv); +Azimuth_IPLHR = conv/10; + +conv = Acceleration_local_IPLHR*1000000; +conv = round(conv); +Acceleration_local_IPLHR = conv/1000000; + +conv = Speed_IPLHR*1000000; +conv = round(conv); +Speed_IPLHR = conv/1000000; + +conv = Speed_local_IPLHR*1000000; +conv = round(conv); +Speed_local_IPLHR = conv/1000000; + +conv = Acceleration_IPLHR*1000000; +conv = round(conv); +Acceleration_IPLHR = conv/1000000; + +conv = TempDef_IPLHR*10; +conv = round(conv); +TempDef_IPLHR = conv/10; + +text = 'approx_TLHR function executed correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/approx_TLH.m b/Tilt/approx_TLH.m new file mode 100755 index 0000000..dd999c5 --- /dev/null +++ b/Tilt/approx_TLH.m @@ -0,0 +1,59 @@ +% Funzione che approssima il dato alla quarta cifra decimale (decimi di +% millimetri) +function [Y_TLH,Z_TLH,Ylocal_TLH,Zlocal_TLH,speed_TLH,speed_local_TLH,... + acceleration_TLH,acceleration_local_TLH,TempDef_TLH] = approx_TLH(... + Y_TLH,Z_TLH,Ylocal_TLH,Zlocal_TLH,speed_TLH,speed_local_TLH,... + acceleration_TLH,acceleration_local_TLH,TempDef_TLH,FileName) + +% Y +conv = Y_TLH*100000; +conv = round(conv); +Y_TLH = conv/100000; + +% Y local +conv = Ylocal_TLH*100000; +conv = round(conv); +Ylocal_TLH = conv/100000; + +% Z +conv = Z_TLH*100000; +conv = round(conv); +Z_TLH = conv/100000; + +% Z local +conv = Zlocal_TLH*100000; +conv = round(conv); +Zlocal_TLH = conv/100000; + +% Velocità +conv = speed_TLH*100000; +conv = round(conv); +speed_TLH = conv/100000; + +% Velocità locale +conv = speed_local_TLH*100000; +conv = round(conv); +speed_local_TLH = conv/100000; + +% Accelerazione +conv = acceleration_TLH*100000; +conv = round(conv); +acceleration_TLH = conv/100000; + +% Accelerazione locale +conv = acceleration_local_TLH*100000; +conv = round(conv); +acceleration_local_TLH = conv/100000; + +% TempDef +conv = TempDef_TLH*10; +conv = round(conv); +TempDef_TLH = conv/10; + +text = 'approx_TLH function executed correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/approx_TLHR.m b/Tilt/approx_TLHR.m new file mode 100755 index 0000000..e75d85e --- /dev/null +++ b/Tilt/approx_TLHR.m @@ -0,0 +1,71 @@ +% Funzione che approssima il dato alla quarta cifra decimale (decimi di +% millimetri) +function [X_HR,Y_HR,Z_HR,Xlocal_HR,Ylocal_HR,Zlocal_HR,HShift_HR,... + HShift_local_HR,Azimuth_HR,Speed_HR,Speed_local_HR,Acceleration_HR,... + Acceleration_local_HR,TempDef_TLHR] = approx_TLHR(X_HR,Y_HR,Z_HR,... + Xlocal_HR,Ylocal_HR,Zlocal_HR,HShift_HR,HShift_local_HR,Azimuth_HR,... + Speed_HR,Speed_local_HR,Acceleration_HR,Acceleration_local_HR,TempDef_TLHR,FileName) + +conv = X_HR*1000000; +conv = round(conv); +X_HR = conv/1000000; + +conv = Y_HR*1000000; +conv = round(conv); +Y_HR = conv/1000000; + +conv = Z_HR*1000000; +conv = round(conv); +Z_HR = conv/1000000; + +conv = Xlocal_HR*1000000; +conv = round(conv); +Xlocal_HR = conv/1000000; + +conv = Ylocal_HR*1000000; +conv = round(conv); +Ylocal_HR = conv/1000000; + +conv = Zlocal_HR*1000000; +conv = round(conv); +Zlocal_HR = conv/1000000; + +conv = HShift_HR*1000000; +conv = round(conv); +HShift_HR = conv/1000000; + +conv = HShift_local_HR*1000000; +conv = round(conv); +HShift_local_HR = conv/1000000; + +conv = Azimuth_HR*10; +conv = round(conv); +Azimuth_HR = conv/10; + +conv = Acceleration_local_HR*1000000; +conv = round(conv); +Acceleration_local_HR = conv/1000000; + +conv = Speed_HR*1000000; +conv = round(conv); +Speed_HR = conv/1000000; + +conv = Speed_local_HR*1000000; +conv = round(conv); +Speed_local_HR = conv/1000000; + +conv = Acceleration_HR*1000000; +conv = round(conv); +Acceleration_HR = conv/1000000; + +conv = TempDef_TLHR*10; +conv = round(conv); +TempDef_TLHR = conv/10; + +text = 'approx_TLHR function executed correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/approx_TLHRH.m b/Tilt/approx_TLHRH.m new file mode 100755 index 0000000..4efaf8b --- /dev/null +++ b/Tilt/approx_TLHRH.m @@ -0,0 +1,59 @@ +% Funzione che approssima il dato alla quarta cifra decimale (decimi di +% millimetri) +function [Y_TLHRH,Z_TLHRH,Ylocal_TLHRH,Zlocal_TLHRH,speed_TLHRH,speed_local_TLHRH,... + acceleration_TLHRH,acceleration_local_TLHRH,TempDef_TLHRH] = approx_TLHRH(... + Y_TLHRH,Z_TLHRH,Ylocal_TLHRH,Zlocal_TLHRH,speed_TLHRH,speed_local_TLHRH,... + acceleration_TLHRH,acceleration_local_TLHRH,TempDef_TLHRH,FileName) + +% Y +conv = Y_TLHRH*10000; +conv = round(conv); +Y_TLHRH = conv/10000; + +% Y local +conv = Ylocal_TLHRH*10000; +conv = round(conv); +Ylocal_TLHRH = conv/10000; + +% Z +conv = Z_TLHRH*10000; +conv = round(conv); +Z_TLHRH = conv/10000; + +% Z local +conv = Zlocal_TLHRH*10000; +conv = round(conv); +Zlocal_TLHRH = conv/10000; + +% Velocità +conv = speed_TLHRH*10000; +conv = round(conv); +speed_TLHRH = conv/10000; + +% Velocità locale +conv = speed_local_TLHRH*10000; +conv = round(conv); +speed_local_TLHRH = conv/10000; + +% Accelerazione +conv = acceleration_TLHRH*10000; +conv = round(conv); +acceleration_TLHRH = conv/10000; + +% Accelerazione locale +conv = acceleration_local_TLHRH*10000; +conv = round(conv); +acceleration_local_TLHRH = conv/10000; + +% TempDef +conv = TempDef_TLHRH*10; +conv = round(conv); +TempDef_TLHRH = conv/10; + +text = 'approx_TLHRH function executed correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/arot.m b/Tilt/arot.m new file mode 100755 index 0000000..a4c0c4d --- /dev/null +++ b/Tilt/arot.m @@ -0,0 +1,13 @@ +function angle = arot(mx,my,j,i) %Unit vectors + +if my(i,j)>0 + angle = 90-(atan(mx(i,j)/my(i,j)))*180/pi; +elseif my(i,j)<0 + angle = 270-(atan(mx(i,j)/my(i,j)))*180/pi; +elseif (my(i,j)==0)&&(mx(i,j)<0) + angle = 180.0; +elseif (my(i,j)==0)&&(mx(i,j)>0) + angle = 0.0; +end + +end \ No newline at end of file diff --git a/Tilt/arotHR.m b/Tilt/arotHR.m new file mode 100755 index 0000000..967475b --- /dev/null +++ b/Tilt/arotHR.m @@ -0,0 +1,15 @@ +function angle = arotHR(mx,my,j) %Unit vectors + +i = 1; +% j è la data +if my(i,j)>0 + angle = 90-(atan(mx(i,j)/my(i,j)))*180/pi; +elseif my(i,j)<0 + angle = 270-(atan(mx(i,j)/my(i,j)))*180/pi; +elseif (my(i,j)==0)&&(mx(i,j)<0) + angle = 180.0; +elseif (my(i,j)==0)&&(mx(i,j)>0) + angle = 0.0; +end + +end diff --git a/Tilt/azzeramenti.m b/Tilt/azzeramenti.m new file mode 100755 index 0000000..98d0fa8 --- /dev/null +++ b/Tilt/azzeramenti.m @@ -0,0 +1,51 @@ +%% Funzione che mette a zero gli spostamenti di alcuni nodi specifici +function [dNS,dEO,dZ] = azzeramenti(IDcentralina,DTcatena,dNS,dEO,dZ,NodoTiltLink,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'azzeramenti function started'; +fprintf(fileID,fmt,text); + +NomeFile = strcat(IDcentralina,'-',DTcatena,'-','Azzeramenti.txt'); +if isfile(NomeFile) == 1 + Dati = importdata(NomeFile); + if Dati(1,1) == 99999 + else + [r,~] = size(Dati); + for i = 1:r + if Dati(i,1) == 99999 + break + else + nodo = Dati(i); + dNS(nodo,:) = 0; + dEO(nodo,:) = 0; + dZ(nodo,:) = 0; + num = cell2mat(NodoTiltLink(nodo,2)); + text = ['---Node Tilt Link V number ' num2str(num) ' has not been elaborated due to forced reset.---']; + fprintf(fileID,fmt,text); + end + end + end +else + fclose(fileID); + Parametro1 = 99999; + Parametro2 = 9999999999; + outdat = fopen(NomeFile,'wt+'); + fopen(NomeFile,'wt'); + fmt = '%d \r'; + fileA = fopen(NomeFile,'a'); + fprintf(fileA,fmt,Parametro1); + fprintf(fileA,fmt,Parametro2); + fclose(fileA); + + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'azzeramenti function created the reference file correctly'; + fprintf(fileID,fmt,text); +end + +text = 'azzeramenti function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/azzeramenti_TLH.m b/Tilt/azzeramenti_TLH.m new file mode 100755 index 0000000..e77bc8c --- /dev/null +++ b/Tilt/azzeramenti_TLH.m @@ -0,0 +1,54 @@ +%% Funzione che mette a zero gli spostamenti di alcuni nodi specifici +function [dX_TLH,dY_TLH,dZ_TLH] = azzeramenti_TLH(IDcentralina,DTcatena,dX_TLH,... + dY_TLH,dZ_TLH,NodoTiltLinkH,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'azzeramenti_TLH function started'; +fprintf(fileID,fmt,text); + +NomeFile = strcat(IDcentralina,'-',DTcatena,'-','Azzeramenti.txt'); +if isfile(NomeFile) == 1 + Dati = importdata(NomeFile); + if Dati(1,1) == 99999 + else + [r,~] = size(Dati); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + for i = 1:r + if Dati(i,1) == 99999 + break + else + nodo = Dati(i); + dX_TLH(nodo,:) = 0; + dY_TLH(nodo,:) = 0; + dZ_TLH(nodo,:) = 0; + num = cell2mat(NodoTiltLinkH(nodo,2)); + text = ['---Node Tilt Link H number ' num2str(num) ' has not been elaborated due to forced reset.---']; + fprintf(fileID,fmt,text); + end + end + end +else + fclose(fileID); + Parametro1 = 99999; + Parametro2 = 9999999999; + outdat = fopen(NomeFile,'wt+'); + fopen(NomeFile,'wt'); + fmt = '%d \r'; + fileA = fopen(NomeFile,'a'); + fprintf(fileA,fmt,Parametro1); + fprintf(fileA,fmt,Parametro2); + fclose(fileA); + + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'azzeramenti_TLH function created the reference file correctly'; + fprintf(fileID,fmt,text); +end + +text = 'azzeramenti_TLH function worked correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/azzeramenti_TLHR.m b/Tilt/azzeramenti_TLHR.m new file mode 100755 index 0000000..2675338 --- /dev/null +++ b/Tilt/azzeramenti_TLHR.m @@ -0,0 +1,56 @@ +%% Funzione che mette a zero gli spostamenti di alcuni nodi specifici +function [dsX,dsY,dsZ] = azzeramenti_TLHR(IDcentralina,DTcatena,dsX,dsY,dsZ,NodoTiltLinkHR,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'azzeramenti_TLHR function started'; +fprintf(fileID,fmt,text); + +NomeFile = strcat(IDcentralina,'-',DTcatena,'-','Azzeramenti.txt'); +if isfile(NomeFile) == 1 + Dati = importdata(NomeFile); + i = 1; + while Dati(i,1) ~= 99999 + i = i+1; + end + i = i+1; % aggiusto contatore nella prima colonna per le ampolle + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + END = 0; + while END == 0 + if Dati(i,1) == 9999999999 + END = 1; + else + nodo = Dati(i); + dsX(nodo,:) = 0; + dsY(nodo,:) = 0; + dsZ(nodo,:) = 0; + num = cell2mat(NodoTiltLinkHR(nodo,2)); + text = ['---Node Tilt Link HR V number ' num2str(num) ' has not been elaborated due to forced reset---']; + fprintf(fileID,fmt,text); + i = i+1; + end + end +else + fclose(fileID); + Parametro1 = 99999; + Parametro2 = 9999999999; + outdat = fopen(NomeFile,'wt+'); + fopen(NomeFile,'wt'); + fmt = '%d \r'; + fileA = fopen(NomeFile,'a'); + fprintf(fileA,fmt,Parametro1); + fprintf(fileA,fmt,Parametro2); + fclose(fileA); + + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'azzeramenti_TLHR function created the reference file correctly'; + fprintf(fileID,fmt,text); +end + +text = 'azzeramenti_TLHR function worked correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/azzeramenti_TLHRH.m b/Tilt/azzeramenti_TLHRH.m new file mode 100755 index 0000000..e314823 --- /dev/null +++ b/Tilt/azzeramenti_TLHRH.m @@ -0,0 +1,55 @@ +%% Funzione che mette a zero gli spostamenti di alcuni nodi specifici +function [dsY,dsZ] = azzeramenti_TLHRH(IDcentralina,DTcatena,dsY,dsZ,NodoTiltLinkHRH,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'azzeramenti_TLHRH function started'; +fprintf(fileID,fmt,text); + +NomeFile = strcat(IDcentralina,'-',DTcatena,'-','Azzeramenti.txt'); +if isfile(NomeFile) == 1 + Dati = importdata(NomeFile); + i = 1; + while Dati(i,1) ~= 99999 + i = i+1; + end + i = i+1; % aggiusto contatore nella prima colonna per le ampolle + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + END = 0; + while END == 0 + if Dati(i,1) == 9999999999 + END = 1; + else + nodo = Dati(i); + dsY(nodo,:) = 0; + dsZ(nodo,:) = 0; + num = cell2mat(NodoTiltLinkHRH(nodo,2)); + text = ['---Node Tilt Link HR H number ' num2str(num) ' has not been elaborated due to forced reset---']; + fprintf(fileID,fmt,text); + i = i+1; + end + end +else + fclose(fileID); + Parametro1 = 99999; + Parametro2 = 9999999999; + outdat = fopen(NomeFile,'wt+'); + fopen(NomeFile,'wt'); + fmt = '%d \r'; + fileA = fopen(NomeFile,'a'); + fprintf(fileA,fmt,Parametro1); + fprintf(fileA,fmt,Parametro2); + fclose(fileA); + + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + text = 'azzeramenti_TLHRH function created the reference file correctly'; + fprintf(fileID,fmt,text); +end + +text = 'azzeramenti_TLHRH function worked correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/biax_HD.m b/Tilt/biax_HD.m new file mode 100755 index 0000000..9ad17c0 --- /dev/null +++ b/Tilt/biax_HD.m @@ -0,0 +1,477 @@ +%% Funzione che calcola gli spostamenti in modalità biassiale per i Tilt Link HD privi di magnetometro +function [X_HD,Y_HD,Z_HD,Xlocal_HD,Ylocal_HD,Zlocal_HD,HShift_HD,HShift_local_HD,... + AlfaX_HD,AlfaY_HD,Azimuth_HD,Speed_local_HD,Speed_HD,Acceleration_local_HD,... + Acceleration_HD,tempHD,ARRAYdateHD,ErrTiltLinkHD] = biax_HD(rHD,... + ACCdef_HD,ANGdef_HD,ACCdefRisHD,tempHD,SpeHD,PsHD,NodoTiltLinkHD,tolleranzaAcc,... + DatiElabTiltLinkHD,Ndevst,Wdevst,ARRAYdateHD,Tmax,Tmin,NuovoZeroHD,... + NdatiMedia,Ndatidespike,ErrTiltLinkHD,margine,Corr_Azimuth,datainiHD,IDcentralina,DTcatena,FileName) + +%% Inizializzazione +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'biax_HD function started'; +fprintf(fileID,fmt,text); + +if NuovoZeroHD == 1 + if NdatiMedia > Ndatidespike + Ndati = NdatiMedia; + else + Ndati = Ndatidespike; + end + ini = round(Ndati/2)+1; + if rem(Ndati,2) == 0 + ini = ini+1; + end + clear NDati + ini = ini + margine; + if ini < 6 + ini = 6; + end + [letture,~]=size(DatiElabTiltLinkHD); + if ini > letture + ini = letture-1; + end + if Ndevst ~= 0 % Allora prendo tutti i dati e solo in seguito considero i nuovi, a valle della funzione filtro + ini = 1; + end + ACCdefRisHD = ACCdefRisHD(ini:end,:); + ACCdef_HD = ACCdef_HD(ini:end,:); + tempHD = tempHD(ini:end,:); + DatiElabTiltLinkHD = DatiElabTiltLinkHD(ini:end,:); + ARRAYdateHD = ARRAYdateHD(ini:end,1); + ErrTiltLinkHD = ErrTiltLinkHD(ini:end,:); +end + +%% Definisco i dati +Nnodi = rHD; +[r,~] = size(ACCdef_HD); % Numero di dati +[Ndati,~] = size(ARRAYdateHD); +ax = zeros(r,Nnodi); +ay = zeros(r,Nnodi); +az = zeros(r,Nnodi); +for i=1:Nnodi + ax(:,i) = ACCdef_HD(:,(i-1)*3+1); % ax + ay(:,i) = ACCdef_HD(:,(i-1)*3+2:(i-1)*3+2); % ay + az(:,i) = ACCdef_HD(:,(i-1)*3+3:(i-1)*3+3); % az + angx(:,i) = ANGdef_HD(:,(i-1)*3+1); + angy(:,i) = ANGdef_HD(:,(i-1)*3+2:(i-1)*3+2); +end + +%% Costruzione delle matrici spostamento e rotazione +GuidaA = zeros(Nnodi,Ndati); % in riga i nodi, in colonna le date +GuidaB = zeros(Nnodi,Ndati); % in riga i nodi, in colonna le date +Zlocal_HD = zeros(Nnodi,Ndati); + +% parametri per il calcolo +SpeHD = SpeHD(2:end,1); % salto il segmento di pertinenza dell'ancora + +% Inizio del ciclo di elaborazione +text = 'Biaxial Elaboration of Tilt Link HD started'; +fprintf(fileID,fmt,text); + +% Inizializzo le matrici +xAcc = ax'; +yAcc = ay'; +xAng = angx'; +yAng = angy'; +for d = 1:Ndati + for n = 1:rHD + % calcolo spostamenti lungo x e y + GuidaA(n,d) = SpeHD(n)*xAcc(n,d); + GuidaB(n,d) = SpeHD(n)*yAcc(n,d); + % Calcolo l'abbassamento + sZx(n,d) = SpeHD(n)*cos(deg2rad(xAng(n,d))); + Zx = SpeHD(n) - sZx(n,d); + sZy(n,d) = SpeHD(n)*cos(deg2rad(yAng(n,d))); + Zy = SpeHD(n) - sZy(n,d); + Zlocal_HD(n,d) = max(Zx,Zy); + end +end + +text = 'Biaxial calculation executed'; +fprintf(fileID,fmt,text); + +% dNS e dEO raccolgono i dati del singolo nodo nella singola data +dA = diff(GuidaA,1,2); +dB = diff(GuidaB,1,2); +dZ = diff(Zlocal_HD,1,2); + +%% Controllo delle risultanti di accelerazione +clear rr +clear c +clear cc +ACCdefRisHD = ACCdefRisHD'; % Nodi in riga, date in colonna +[r,c] = size(ACCdefRisHD); +[rr,cc] = size(GuidaA); + +% controllo che le matrici con le risultanti delle accelerazioni e +% le matrici con i dati di spostamento abbiano le stesse dimensioni +if r~=rr + text = '---Warning! Number of row of displacement data do not correspond to the number of acceleration cosine vector!---'; + fprintf(fileID,fmt,text); +end +if c~=cc + text = '---Warning! Number of column of displacement data do not correspond to the number of acceleration cosine vector!---'; + fprintf(fileID,fmt,text); +end +clear i +clear j +cont = 1; % contatore +cont2 = 1; % contatore +cont3 = 1; % contatore +tempHD = tempHD'; +textA = 'There are not correction of Tilt Link HD based on acceleration vectors filter'; +textA2 = 'There are not correction of Tilt Link HD based on uncalibrated acceleration vectors'; +textT = 'There are not correction of Tilt Link HD based on temperature filter'; +for j = 2:c % Data + for i = 1:r % Nodo + % se il valore assoluto della differenza è maggiore della + % tolleranza, pongo gli spostamenti giornalieri pari a 0 + if abs(ACCdefRisHD(i,j)-ACCdefRisHD(i,j-1)) > tolleranzaAcc + dA(i,j-1) = 0; + dB(i,j-1) = 0; + dZ(i,j-1) = 0; + textA = ['' num2str(cont) ' correction executed for Tilt Link HD - Acceleration vector filter!']; + cont = cont+1; + end + if ACCdefRisHD(i,j) < 0.9 || ACCdefRisHD(i,j) > 1.1 % Il nodo è fuori taratura! + dA(i,j-1) = 0; + dB(i,j-1) = 0; + dZ(i,j-1) = 0; + tempHD(i,j) = tempHD(i,j-1); + textA2 = ['' num2str(cont) ' correction executed for Tilt Link HD - uncalibrated Acceleration vector!']; + cont3 = cont3+1; + end + end +end + +FileTemperature = ['' IDcentralina '-' DTcatena '-HD-Therm.csv']; +if isfile(FileTemperature) == 1 + DatiRaw = csvread(FileTemperature); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; +else + rDR = 1; + cDR = 1; +end +for b = 1:c % Data + for a = 1:r % Nodo + % NON considero i dati al di sopra dei 80 °C o al di sotto dei -30 °C! + if tempHD(a,b) > Tmax || tempHD(a,b) < Tmin + cont2 = cont2+1; + if b == 1 + if isfile(FileTemperature) == 1 + RawDate = find(DatiRaw(:,1)<=datenum(datainiHD)); + if isempty(RawDate) == 1 + cc = 2; + while cc <= c + if tempHD(a,cc) > Tmax || tempHD(a,cc) < Tmin + cc = cc+1; + else + break + end + end + tempHD(a,b) = tempHD(a,cc); + else + if isnan(DatiRaw(RawDate(end),a+1)) == 0 + tempHD(a,b) = DatiRaw(RawDate(end),a+1); + ErrTiltLinkHD(b,a) = 0.5; + wardat = 'Temperature data of Tilt Link HD nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + else + cc = 2; + while cc <= c + if tempHD(a,cc) > Tmax || tempHD(a,cc) < Tmin + cc = cc+1; + else + break + end + end + tempHD(a,b) = tempHD(a,cc); + end + end + else + cc = 2; + while cc <= c + if tempHD(a,cc) > Tmax || tempHD(a,cc) < Tmin + cc = cc+1; + else + break + end + end + tempHD(a,b) = tempHD(a,cc); + end + else + tempHD(a,b) = tempHD(a,b-1); + dA(a,b-1) = 0; + dB(a,b-1) = 0; + dZ(a,b-1) = 0; + ErrTiltLinkHD(b,a) = 0.5; + end + textT = ['' num2str(cont2) ' correction executed for Tilt Link HD - Temperature filter!']; + end + end +end + +if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=ARRAYdateHD(1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(ARRAYdateHD(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(ARRAYdateHD(:,1)>DatiRaw(RawDate1(end)+1,1)); + end +else + RawDate1 = []; + RawDate2 = 1; +end +if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:); ARRAYdateHD(RawDate2(1):end) tempHD(:,RawDate2(1):end)']; +elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = [ARRAYdateHD tempHD']; +else + Dati = DatiRaw; +end +% Elimino appoggio più vecchio di un mese +RawDate3 = find(Dati(:,1) Ndatidespike + NdatiF = NdatiMedia; + else + NdatiF = Ndatidespike; + end + ini = round(NdatiF/2)+1; + if rem(NdatiF,2) == 0 + ini = ini+1; + end + clear NDatiF + iniST = round(Wdevst/2); + if rem(Wdevst,2) == 0 + iniST = iniST+1; + end + iniST = iniST + margine; + if iniST > ini + ini = iniST; + end + if ini < 6 + ini = 6; + end + dA = dA(:,ini:end); + dB = dB(:,ini:end); + dZ = dZ(:,ini:end); + tempHD = tempHD(ini:end,:); + DatiElabTiltLinkHD = DatiElabTiltLinkHD(ini:end,:); + ARRAYdateHD = ARRAYdateHD(ini:end,1); + ErrTiltLinkHD = ErrTiltLinkHD(ini:end,:); +end + +%% Finalizzo i calcoli +[rNS,cNS] = size(dA); +sommaX = zeros(rHD,1); +Xlocal_HD = zeros(rNS,cNS+1); % locale nello spazio, cumulato nel tempo +AlfaX_HD = zeros(rNS,cNS+1); % Angoli +sommaY = zeros(rHD,1); +Ylocal_HD = zeros(rNS,cNS+1); +AlfaY_HD = zeros(rNS,cNS+1); % Angoli +sommaZ = zeros(rNS,cNS); +Zlocal_HD = zeros(rNS,cNS+1); +X_HD = zeros(rNS,cNS+1); % cumulato nel tempo e nello spazio +Y_HD = zeros(rNS,cNS+1); +Z_HD = zeros(rNS,cNS+1); +HShift_HD = zeros(rNS,cNS+1); % massima pendenza cumulato nel tempo e nello spazio +HShift_local_HD = zeros(rNS,cNS+1); % massima pendenza locale +Azimuth_HD = zeros(rNS,cNS+1); % azimut +azim = zeros(rNS,cNS+1); % matrice di appoggio per il calcolo dell'azimuth +Speed_HD = zeros(rHD,cNS+1); % Velocità 2D Cumulata +Speed_local_HD = zeros(rHD,cNS+1); % Velocità 2D locale +Acceleration_HD = zeros(rHD,cNS+1); % Accelerazione 2D Cumulata +Acceleration_local_HD = zeros(rHD,cNS+1); % Accelerazione 2D Locale + +% Recupero i dati già elaborati +if NuovoZeroHD == 1 + [rE,cE] = size(DatiElabTiltLinkHD); + cont = 3; + n = 1; + while cont<=cE + sommaX(n,1) = cell2mat(DatiElabTiltLinkHD(1,cont))'; + Xlocal_HD(n,1) = sommaX(n,1); + X_HD(n,1) = cell2mat(DatiElabTiltLinkHD(1,cont+3))'; + sommaY(n,1) = cell2mat(DatiElabTiltLinkHD(1,cont+1))'; + Ylocal_HD(n,1) = sommaY(n,1); + Y_HD(n,1) = cell2mat(DatiElabTiltLinkHD(1,cont+4))'; + for j = 1:rHD + AlfaX_HD(j,1) = asind(Xlocal_HD(j,1)/SpeHD(j)); + AlfaY_HD(j,1) = asind(Ylocal_HD(j,1)/SpeHD(j)); + end + Zlocal_HD(n,1) = cell2mat(DatiElabTiltLinkHD(1,cont+2))'; + Z_HD(n,1) = cell2mat(DatiElabTiltLinkHD(1,cont+5))'; + HShift_HD(n,1) = cell2mat(DatiElabTiltLinkHD(1,cont+6))'; + HShift_local_HD(n,1) = cell2mat(DatiElabTiltLinkHD(1,cont+7))'; + Azimuth_HD(n,1) = cell2mat(DatiElabTiltLinkHD(1,cont+8))'; + Speed_HD(n,1:rE) = cell2mat(DatiElabTiltLinkHD(:,cont+10))'; + Speed_local_HD(n,1:rE) = cell2mat(DatiElabTiltLinkHD(:,cont+11))'; + Acceleration_HD(n,1:rE) = cell2mat(DatiElabTiltLinkHD(:,cont+12))'; + Acceleration_local_HD(n,1:rE) = cell2mat(DatiElabTiltLinkHD(:,cont+13))'; + cont=cont+16; + n = n+1; + end +else + Zlocal_HD(:,1) = SpeHD; + Z_HD(:,1) = PsHD(2:end); +end + +% elaboro i dati nuovi +for iii = 1:cNS + Xlocal_HD(:,iii+1) = sum(dA(:,1:iii),2)+sommaX(:,1); + Ylocal_HD(:,iii+1) = sum(dB(:,1:iii),2)+sommaY(:,1); + for j = 1:rHD + AlfaX_HD(j,iii+1) = asind(Xlocal_HD(j,iii+1)/SpeHD(j)); + AlfaY_HD(j,iii+1) = asind(Ylocal_HD(j,iii+1)/SpeHD(j)); + end + sommaZ(:,iii+1) = sum(dZ(:,1:iii),2); + X_HD(:,iii+1) = cumsum(Xlocal_HD(:,iii+1)); + Y_HD(:,iii+1) = cumsum(Ylocal_HD(:,iii+1)); + Z_HD(:,iii+1) = cumsum(sommaZ(:,iii+1))+ Z_HD(:,1); + HShift_HD(:,iii+1) = (X_HD(:,iii+1).^2+Y_HD(:,iii+1).^2).^0.5; + HShift_local_HD(:,iii+1) = (Xlocal_HD(:,iii+1).^2+Ylocal_HD(:,iii+1).^2).^0.5; + Zlocal_HD(:,iii+1) = sommaZ(:,iii+1) + SpeHD; % Zeta è il singolo abbassamento di quel nodo + for rr = 1:rHD + azim(rr,iii) = (acos(abs(X_HD(rr,iii))/HShift_HD(rr,iii)))*180/3.141592654; % Angolo Teta in gradi 0° - 90° + segnoNS = sign(X_HD(rr,iii)); + segnoEO = sign(Y_HD(rr,iii)); + % L'azimuth si calcola con NS = 0, positivo in senso orario + % (90° = Est) + if segnoNS == 1 && segnoEO == 1 % quadrante 1 + Azimuth_HD(rr,iii+1) = azim(rr,iii); % Teta lo tengo come è (1 quadrante) + elseif segnoNS == -1 && segnoEO == 1 % quadrante 2 + Azimuth_HD(rr,iii+1) = 180 - azim(rr,iii); % 180-teta + elseif segnoNS == -1 && segnoEO == -1 % quadrante 3 + Azimuth_HD(rr,iii+1) = 180 + azim(rr,iii); % 180+teta + elseif segnoNS == 1 && segnoEO == -1 % quadrante 4 + Azimuth_HD(rr,iii+1) = 360 - azim(rr,iii); % 360-teta + elseif segnoNS == 0 && segnoEO == -1 % 270° + Azimuth_HD(rr,iii+1) = 270; + elseif segnoNS == -1 && segnoEO == 0 % 180° + Azimuth_HD(rr,iii+1) = 180; + end + end +end +[rAz,cAz] = size(Azimuth_HD); +for n=1:rAz + for c=2:cAz + Azimuth_HD(n,c) = real(Azimuth_HD(n,c))+Corr_Azimuth; + if Azimuth_HD(n,c)>=360 + Azimuth_HD(n,c)=Azimuth_HD(n,c)-360; + end + end +end + +%% Calcolo velocità di spostamento giornaliera +[numDate,~] = size(ARRAYdateHD); % numero di date +d = 1; +p = 1; +diffDate = 0; +n = 1; +period = 1; % calcolo giornaliero +ContSUP = []; +for dd = 1:numDate + while diffDate < period + d = d+1; + if d > numDate % Se d supera le date disponibili, esco dal ciclo while + break + end + diffDate = ARRAYdateHD(d) - ARRAYdateHD(p); + end + if d >numDate + break + end + ContSUP(n,1) = d; %#ok<*AGROW> % Creo matrice indici dell'estremo superiore della differenza + ContINF(n,1) = p; % Creo matrice indici dell'estremo inferiore della differenza + p = p+1; % passo alla data di partenza successiva + d = p; % resetto il conto di d + n = n+1; + diffDate = 0; +end + +check = isempty(ContSUP); +if check == 0 + [nDate,~] = size(ContSUP); + for s = 1:rHD + N = 1; + for dd = 1:nDate + Speed_HD(s,ContSUP(N,1)) = (HShift_HD(s,ContSUP(N,1))-HShift_HD(s,ContINF(N,1)))/(ARRAYdateHD(ContSUP(N,1))-ARRAYdateHD(ContINF(N,1))); + Speed_local_HD(s,ContSUP(N,1)) = (HShift_local_HD(s,ContSUP(N,1))-HShift_local_HD(s,ContINF(N,1)))/(ARRAYdateHD(ContSUP(N,1))-ARRAYdateHD(ContINF(N,1))); + Acceleration_HD(s,ContSUP(N,1)) = (Speed_HD(s,ContSUP(N,1))-Speed_HD(s,ContINF(N,1)))/(ARRAYdateHD(ContSUP(N,1))-ARRAYdateHD(ContINF(N,1))); + Acceleration_local_HD(s,ContSUP(N,1)) = (Speed_local_HD(s,ContSUP(N,1))-Speed_local_HD(s,ContINF(N,1)))/(ARRAYdateHD(ContSUP(N,1))-ARRAYdateHD(ContINF(N,1))); + N = N+1; + end + end +end + +% Approssimo i dati con il corretto numero di cifre decimali +[X_HD,Y_HD,Z_HD,Xlocal_HD,Ylocal_HD,Zlocal_HD,HShift_HD,HShift_local_HD,Azimuth_HD,Speed_HD,... + Speed_local_HD,Acceleration_HD,Acceleration_local_HD,tempHD] = approx_HD(X_HD,Y_HD,Z_HD,... + Xlocal_HD,Ylocal_HD,Zlocal_HD,HShift_HD,HShift_local_HD,Azimuth_HD,Speed_HD,Speed_local_HD,... + Acceleration_HD,Acceleration_local_HD,tempHD,FileName); + +% Riordino matrice errori +[r,~] = size(ErrTiltLinkHD); +Matrice_err = zeros(r,rHD); +if cell2mat(NodoTiltLinkHD(1,5)) == 1 % è presente il magnetometro + col = 7; +else + col = 4; +end +for i = 1:r % date + d = 1; + for n = 1:rHD % nodi + j = 1; + err = ErrTiltLinkHD(i,d:d+col-1); + while j <= col + if err(1,j) == 1 + Matrice_err(i,n) = 1; + break + end + if err(1,j) == 0.5 + Matrice_err(i,n) = 0.5; + end + j = j+1; + end + d = d+col; + end +end +ErrTiltLinkHD = Matrice_err'; + +text = 'Tilt Link HD biaxial calculation executed correctly. biax_HD function ended'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/biax_HDVR.m b/Tilt/biax_HDVR.m new file mode 100755 index 0000000..2f2e534 --- /dev/null +++ b/Tilt/biax_HDVR.m @@ -0,0 +1,477 @@ +%% Funzione che calcola gli spostamenti in modalità biassiale per i Tilt Link HD privi di magnetometro +function [X_HDVR,Y_HDVR,Z_HDVR,Xlocal_HDVR,Ylocal_HDVR,Zlocal_HDVR,HShift_HDVR,HShift_local_HDVR,... + AlfaX_HDVR,AlfaY_HDVR,Azimuth_HDVR,Speed_local_HDVR,Speed_HDVR,Acceleration_local_HDVR,... + Acceleration_HDVR,tempHDVR,ARRAYdateHDVR,ErrTiltLinkHDVR] = biax_HDVR(rHDVR,... + ACCdef_HDVR,ANGdef_HDVR,ACCdefRisHDVR,tempHDVR,SpeHDVR,PsHDVR,NodoTiltLinkHDVR,tolleranzaAcc,... + DatiElabTiltLinkHDVR,Ndevst,Wdevst,ARRAYdateHDVR,Tmax,Tmin,NuovoZeroHDVR,... + NdatiMedia,Ndatidespike,ErrTiltLinkHDVR,margine,Corr_Azimuth,datainiHDVR,IDcentralina,DTcatena,FileName) + +%% Inizializzazione +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'biax_HD function started'; +fprintf(fileID,fmt,text); + +if NuovoZeroHDVR == 1 + if NdatiMedia > Ndatidespike + Ndati = NdatiMedia; + else + Ndati = Ndatidespike; + end + ini = round(Ndati/2)+1; + if rem(Ndati,2) == 0 + ini = ini+1; + end + clear NDati + ini = ini + margine; + if ini < 6 + ini = 6; + end + [letture,~]=size(DatiElabTiltLinkHDVR); + if ini > letture + ini = letture-1; + end + if Ndevst ~= 0 % Allora prendo tutti i dati e solo in seguito considero i nuovi, a valle della funzione filtro + ini = 1; + end + ACCdefRisHDVR = ACCdefRisHDVR(ini:end,:); + ACCdef_HDVR = ACCdef_HDVR(ini:end,:); + tempHDVR = tempHDVR(ini:end,:); + DatiElabTiltLinkHDVR = DatiElabTiltLinkHDVR(ini:end,:); + ARRAYdateHDVR = ARRAYdateHDVR(ini:end,1); + ErrTiltLinkHDVR = ErrTiltLinkHDVR(ini:end,:); +end + +%% Definisco i dati +Nnodi = rHDVR; +[r,~] = size(ACCdef_HDVR); % Numero di dati +[Ndati,~] = size(ARRAYdateHDVR); +ax = zeros(r,Nnodi); +ay = zeros(r,Nnodi); +az = zeros(r,Nnodi); +for i=1:Nnodi + ax(:,i) = ACCdef_HDVR(:,(i-1)*3+1); % ax + ay(:,i) = ACCdef_HDVR(:,(i-1)*3+2:(i-1)*3+2); % ay + az(:,i) = ACCdef_HDVR(:,(i-1)*3+3:(i-1)*3+3); % az + angx(:,i) = ANGdef_HDVR(:,(i-1)*3+1); + angy(:,i) = ANGdef_HDVR(:,(i-1)*3+2:(i-1)*3+2); +end + +%% Costruzione delle matrici spostamento e rotazione +GuidaA = zeros(Nnodi,Ndati); % in riga i nodi, in colonna le date +GuidaB = zeros(Nnodi,Ndati); % in riga i nodi, in colonna le date +Zlocal_HDVR = zeros(Nnodi,Ndati); + +% parametri per il calcolo +SpeHDVR = SpeHDVR(2:end,1); % salto il segmento di pertinenza dell'ancora + +% Inizio del ciclo di elaborazione +text = 'Biaxial Elaboration of Tilt Link HD VR started'; +fprintf(fileID,fmt,text); + +% Inizializzo le matrici +xAcc = ax'; +yAcc = ay'; +xAng = angx'; +yAng = angy'; +for d = 1:Ndati + for n = 1:rHDVR + % calcolo spostamenti lungo x e y + GuidaA(n,d) = SpeHDVR(n)*xAcc(n,d); + GuidaB(n,d) = SpeHDVR(n)*yAcc(n,d); + % Calcolo l'abbassamento + sZx(n,d) = SpeHDVR(n)*cos(deg2rad(xAng(n,d))); + Zx = SpeHDVR(n) - sZx(n,d); + sZy(n,d) = SpeHDVR(n)*cos(deg2rad(yAng(n,d))); + Zy = SpeHDVR(n) - sZy(n,d); + Zlocal_HDVR(n,d) = max(Zx,Zy); + end +end + +text = 'Biaxial calculation executed'; +fprintf(fileID,fmt,text); + +% dNS e dEO raccolgono i dati del singolo nodo nella singola data +dA = diff(GuidaA,1,2); +dB = diff(GuidaB,1,2); +dZ = diff(Zlocal_HDVR,1,2); + +%% Controllo delle risultanti di accelerazione +clear rr +clear c +clear cc +ACCdefRisHDVR = ACCdefRisHDVR'; % Nodi in riga, date in colonna +[r,c] = size(ACCdefRisHDVR); +[rr,cc] = size(GuidaA); + +% controllo che le matrici con le risultanti delle accelerazioni e +% le matrici con i dati di spostamento abbiano le stesse dimensioni +if r~=rr + text = '---Warning! Number of row of displacement data do not correspond to the number of acceleration cosine vector!---'; + fprintf(fileID,fmt,text); +end +if c~=cc + text = '---Warning! Number of column of displacement data do not correspond to the number of acceleration cosine vector!---'; + fprintf(fileID,fmt,text); +end +clear i +clear j +cont = 1; % contatore +cont2 = 1; % contatore +cont3 = 1; % contatore +tempHDVR = tempHDVR'; +textA = 'There are not correction of Tilt Link HD VR based on acceleration vectors filter'; +textA2 = 'There are not correction of Tilt Link HD VR based on uncalibrated acceleration vectors'; +textT = 'There are not correction of Tilt Link HD VR based on temperature filter'; +for j = 2:c % Data + for i = 1:r % Nodo + % se il valore assoluto della differenza è maggiore della + % tolleranza, pongo gli spostamenti giornalieri pari a 0 + if abs(ACCdefRisHDVR(i,j)-ACCdefRisHDVR(i,j-1)) > tolleranzaAcc + dA(i,j-1) = 0; + dB(i,j-1) = 0; + dZ(i,j-1) = 0; + textA = ['' num2str(cont) ' correction executed for Tilt Link HD VR - Acceleration vector filter!']; + cont = cont+1; + end + if ACCdefRisHDVR(i,j) < 0.9 || ACCdefRisHDVR(i,j) > 1.1 % Il nodo è fuori taratura! + dA(i,j-1) = 0; + dB(i,j-1) = 0; + dZ(i,j-1) = 0; + tempHDVR(i,j) = tempHDVR(i,j-1); + textA2 = ['' num2str(cont) ' correction executed for Tilt Link HD VR - uncalibrated Acceleration vector!']; + cont3 = cont3+1; + end + end +end + +FileTemperature = ['' IDcentralina '-' DTcatena '-HDVR-Therm.csv']; +if isfile(FileTemperature) == 1 + DatiRaw = csvread(FileTemperature); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; +else + rDR = 1; + cDR = 1; +end +for b = 1:c % Data + for a = 1:r % Nodo + % NON considero i dati al di sopra dei 80 °C o al di sotto dei -30 °C! + if tempHDVR(a,b) > Tmax || tempHDVR(a,b) < Tmin + cont2 = cont2+1; + if b == 1 + if isfile(FileTemperature) == 1 + RawDate = find(DatiRaw(:,1)<=datenum(datainiHDVR)); + if isempty(RawDate) == 1 + cc = 2; + while cc <= c + if tempHDVR(a,cc) > Tmax || tempHDVR(a,cc) < Tmin + cc = cc+1; + else + break + end + end + tempHDVR(a,b) = tempHDVR(a,cc); + else + if isnan(DatiRaw(RawDate(end),a+1)) == 0 + tempHDVR(a,b) = DatiRaw(RawDate(end),a+1); + ErrTiltLinkHDVR(b,a) = 0.5; + wardat = 'Temperature data of Tilt Link HD VR nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + else + cc = 2; + while cc <= c + if tempHDVR(a,cc) > Tmax || tempHDVR(a,cc) < Tmin + cc = cc+1; + else + break + end + end + tempHDVR(a,b) = tempHDVR(a,cc); + end + end + else + cc = 2; + while cc <= c + if tempHDVR(a,cc) > Tmax || tempHDVR(a,cc) < Tmin + cc = cc+1; + else + break + end + end + tempHDVR(a,b) = tempHDVR(a,cc); + end + else + tempHDVR(a,b) = tempHDVR(a,b-1); + dA(a,b-1) = 0; + dB(a,b-1) = 0; + dZ(a,b-1) = 0; + ErrTiltLinkHDVR(b,a) = 0.5; + end + textT = ['' num2str(cont2) ' correction executed for Tilt Link HD VR - Temperature filter!']; + end + end +end + +if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=ARRAYdateHDVR(1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(ARRAYdateHDVR(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(ARRAYdateHDVR(:,1)>DatiRaw(RawDate1(end)+1,1)); + end +else + RawDate1 = []; + RawDate2 = 1; +end +if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:); ARRAYdateHDVR(RawDate2(1):end) tempHDVR(:,RawDate2(1):end)']; +elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = [ARRAYdateHDVR tempHDVR']; +else + Dati = DatiRaw; +end +% Elimino appoggio più vecchio di un mese +RawDate3 = find(Dati(:,1) Ndatidespike + NdatiF = NdatiMedia; + else + NdatiF = Ndatidespike; + end + ini = round(NdatiF/2)+1; + if rem(NdatiF,2) == 0 + ini = ini+1; + end + clear NDatiF + iniST = round(Wdevst/2); + if rem(Wdevst,2) == 0 + iniST = iniST+1; + end + iniST = iniST + margine; + if iniST > ini + ini = iniST; + end + if ini < 6 + ini = 6; + end + dA = dA(:,ini:end); + dB = dB(:,ini:end); + dZ = dZ(:,ini:end); + tempHDVR = tempHDVR(ini:end,:); + DatiElabTiltLinkHDVR = DatiElabTiltLinkHDVR(ini:end,:); + ARRAYdateHDVR = ARRAYdateHDVR(ini:end,1); + ErrTiltLinkHDVR = ErrTiltLinkHDVR(ini:end,:); +end + +%% Finalizzo i calcoli +[rNS,cNS] = size(dA); +sommaX = zeros(rHDVR,1); +Xlocal_HDVR = zeros(rNS,cNS+1); % locale nello spazio, cumulato nel tempo +AlfaX_HDVR = zeros(rNS,cNS+1); % Angoli +sommaY = zeros(rHDVR,1); +Ylocal_HDVR = zeros(rNS,cNS+1); +AlfaY_HDVR = zeros(rNS,cNS+1); % Angoli +sommaZ = zeros(rNS,cNS); +Zlocal_HDVR = zeros(rNS,cNS+1); +X_HDVR = zeros(rNS,cNS+1); % cumulato nel tempo e nello spazio +Y_HDVR = zeros(rNS,cNS+1); +Z_HDVR = zeros(rNS,cNS+1); +HShift_HDVR = zeros(rNS,cNS+1); % massima pendenza cumulato nel tempo e nello spazio +HShift_local_HDVR = zeros(rNS,cNS+1); % massima pendenza locale +Azimuth_HDVR = zeros(rNS,cNS+1); % azimut +azim = zeros(rNS,cNS+1); % matrice di appoggio per il calcolo dell'azimuth +Speed_HDVR = zeros(rHDVR,cNS+1); % Velocità 2D Cumulata +Speed_local_HDVR = zeros(rHDVR,cNS+1); % Velocità 2D locale +Acceleration_HDVR = zeros(rHDVR,cNS+1); % Accelerazione 2D Cumulata +Acceleration_local_HDVR = zeros(rHDVR,cNS+1); % Accelerazione 2D Locale + +% Recupero i dati già elaborati +if NuovoZeroHDVR == 1 + [rE,cE] = size(DatiElabTiltLinkHDVR); + cont = 3; + n = 1; + while cont<=cE + sommaX(n,1) = cell2mat(DatiElabTiltLinkHDVR(1,cont))'; + Xlocal_HDVR(n,1) = sommaX(n,1); + X_HDVR(n,1) = cell2mat(DatiElabTiltLinkHDVR(1,cont+3))'; + sommaY(n,1) = cell2mat(DatiElabTiltLinkHDVR(1,cont+1))'; + Ylocal_HDVR(n,1) = sommaY(n,1); + Y_HDVR(n,1) = cell2mat(DatiElabTiltLinkHDVR(1,cont+4))'; + for j = 1:rHDVR + AlfaX_HDVR(j,1) = asind(Xlocal_HDVR(j,1)/SpeHDVR(j)); + AlfaY_HDVR(j,1) = asind(Ylocal_HDVR(j,1)/SpeHDVR(j)); + end + Zlocal_HDVR(n,1) = cell2mat(DatiElabTiltLinkHDVR(1,cont+2))'; + Z_HDVR(n,1) = cell2mat(DatiElabTiltLinkHDVR(1,cont+5))'; + HShift_HDVR(n,1) = cell2mat(DatiElabTiltLinkHDVR(1,cont+6))'; + HShift_local_HDVR(n,1) = cell2mat(DatiElabTiltLinkHDVR(1,cont+7))'; + Azimuth_HDVR(n,1) = cell2mat(DatiElabTiltLinkHDVR(1,cont+8))'; + Speed_HDVR(n,1:rE) = cell2mat(DatiElabTiltLinkHDVR(:,cont+10))'; + Speed_local_HDVR(n,1:rE) = cell2mat(DatiElabTiltLinkHDVR(:,cont+11))'; + Acceleration_HDVR(n,1:rE) = cell2mat(DatiElabTiltLinkHDVR(:,cont+12))'; + Acceleration_local_HDVR(n,1:rE) = cell2mat(DatiElabTiltLinkHDVR(:,cont+13))'; + cont=cont+16; + n = n+1; + end +else + Zlocal_HDVR(:,1) = SpeHDVR; + Z_HDVR(:,1) = PsHDVR(2:end); +end + +% elaboro i dati nuovi +for iii = 1:cNS + Xlocal_HDVR(:,iii+1) = sum(dA(:,1:iii),2)+sommaX(:,1); + Ylocal_HDVR(:,iii+1) = sum(dB(:,1:iii),2)+sommaY(:,1); + for j = 1:rHDVR + AlfaX_HDVR(j,iii+1) = asind(Xlocal_HDVR(j,iii+1)/SpeHDVR(j)); + AlfaY_HDVR(j,iii+1) = asind(Ylocal_HDVR(j,iii+1)/SpeHDVR(j)); + end + sommaZ(:,iii+1) = sum(dZ(:,1:iii),2); + X_HDVR(:,iii+1) = cumsum(Xlocal_HDVR(:,iii+1)); + Y_HDVR(:,iii+1) = cumsum(Ylocal_HDVR(:,iii+1)); + Z_HDVR(:,iii+1) = cumsum(sommaZ(:,iii+1))+ Z_HDVR(:,1); + HShift_HDVR(:,iii+1) = (X_HDVR(:,iii+1).^2+Y_HDVR(:,iii+1).^2).^0.5; + HShift_local_HDVR(:,iii+1) = (Xlocal_HDVR(:,iii+1).^2+Ylocal_HDVR(:,iii+1).^2).^0.5; + Zlocal_HDVR(:,iii+1) = sommaZ(:,iii+1) + SpeHDVR; % Zeta è il singolo abbassamento di quel nodo + for rr = 1:rHDVR + azim(rr,iii) = (acos(abs(X_HDVR(rr,iii))/HShift_HDVR(rr,iii)))*180/3.141592654; % Angolo Teta in gradi 0° - 90° + segnoNS = sign(X_HDVR(rr,iii)); + segnoEO = sign(Y_HDVR(rr,iii)); + % L'azimuth si calcola con NS = 0, positivo in senso orario + % (90° = Est) + if segnoNS == 1 && segnoEO == 1 % quadrante 1 + Azimuth_HDVR(rr,iii+1) = azim(rr,iii); % Teta lo tengo come è (1 quadrante) + elseif segnoNS == -1 && segnoEO == 1 % quadrante 2 + Azimuth_HDVR(rr,iii+1) = 180 - azim(rr,iii); % 180-teta + elseif segnoNS == -1 && segnoEO == -1 % quadrante 3 + Azimuth_HDVR(rr,iii+1) = 180 + azim(rr,iii); % 180+teta + elseif segnoNS == 1 && segnoEO == -1 % quadrante 4 + Azimuth_HDVR(rr,iii+1) = 360 - azim(rr,iii); % 360-teta + elseif segnoNS == 0 && segnoEO == -1 % 270° + Azimuth_HDVR(rr,iii+1) = 270; + elseif segnoNS == -1 && segnoEO == 0 % 180° + Azimuth_HDVR(rr,iii+1) = 180; + end + end +end +[rAz,cAz] = size(Azimuth_HDVR); +for n=1:rAz + for c=2:cAz + Azimuth_HDVR(n,c) = real(Azimuth_HDVR(n,c))+Corr_Azimuth; + if Azimuth_HDVR(n,c)>=360 + Azimuth_HDVR(n,c)=Azimuth_HDVR(n,c)-360; + end + end +end + +%% Calcolo velocità di spostamento giornaliera +[numDate,~] = size(ARRAYdateHDVR); % numero di date +d = 1; +p = 1; +diffDate = 0; +n = 1; +period = 1; % calcolo giornaliero +ContSUP = []; +for dd = 1:numDate + while diffDate < period + d = d+1; + if d > numDate % Se d supera le date disponibili, esco dal ciclo while + break + end + diffDate = ARRAYdateHDVR(d) - ARRAYdateHDVR(p); + end + if d >numDate + break + end + ContSUP(n,1) = d; %#ok<*AGROW> % Creo matrice indici dell'estremo superiore della differenza + ContINF(n,1) = p; % Creo matrice indici dell'estremo inferiore della differenza + p = p+1; % passo alla data di partenza successiva + d = p; % resetto il conto di d + n = n+1; + diffDate = 0; +end + +check = isempty(ContSUP); +if check == 0 + [nDate,~] = size(ContSUP); + for s = 1:rHDVR + N = 1; + for dd = 1:nDate + Speed_HDVR(s,ContSUP(N,1)) = (HShift_HDVR(s,ContSUP(N,1))-HShift_HDVR(s,ContINF(N,1)))/(ARRAYdateHDVR(ContSUP(N,1))-ARRAYdateHDVR(ContINF(N,1))); + Speed_local_HDVR(s,ContSUP(N,1)) = (HShift_local_HDVR(s,ContSUP(N,1))-HShift_local_HDVR(s,ContINF(N,1)))/(ARRAYdateHDVR(ContSUP(N,1))-ARRAYdateHDVR(ContINF(N,1))); + Acceleration_HDVR(s,ContSUP(N,1)) = (Speed_HDVR(s,ContSUP(N,1))-Speed_HDVR(s,ContINF(N,1)))/(ARRAYdateHDVR(ContSUP(N,1))-ARRAYdateHDVR(ContINF(N,1))); + Acceleration_local_HDVR(s,ContSUP(N,1)) = (Speed_local_HDVR(s,ContSUP(N,1))-Speed_local_HDVR(s,ContINF(N,1)))/(ARRAYdateHDVR(ContSUP(N,1))-ARRAYdateHDVR(ContINF(N,1))); + N = N+1; + end + end +end + +% Approssimo i dati con il corretto numero di cifre decimali +[X_HDVR,Y_HDVR,Z_HDVR,Xlocal_HDVR,Ylocal_HDVR,Zlocal_HDVR,HShift_HDVR,HShift_local_HDVR,Azimuth_HDVR,Speed_HDVR,... + Speed_local_HDVR,Acceleration_HDVR,Acceleration_local_HDVR,tempHDVR] = approx_HD(X_HDVR,Y_HDVR,Z_HDVR,... + Xlocal_HDVR,Ylocal_HDVR,Zlocal_HDVR,HShift_HDVR,HShift_local_HDVR,Azimuth_HDVR,Speed_HDVR,Speed_local_HDVR,... + Acceleration_HDVR,Acceleration_local_HDVR,tempHDVR,FileName); + +% Riordino matrice errori +[r,~] = size(ErrTiltLinkHDVR); +Matrice_err = zeros(r,rHDVR); +if cell2mat(NodoTiltLinkHDVR(1,5)) == 1 % è presente il magnetometro + col = 7; +else + col = 4; +end +for i = 1:r % date + d = 1; + for n = 1:rHDVR % nodi + j = 1; + err = ErrTiltLinkHDVR(i,d:d+col-1); + while j <= col + if err(1,j) == 1 + Matrice_err(i,n) = 1; + break + end + if err(1,j) == 0.5 + Matrice_err(i,n) = 0.5; + end + j = j+1; + end + d = d+col; + end +end +ErrTiltLinkHDVR = Matrice_err'; + +text = 'Tilt Link HD VR biaxial calculation executed correctly. biax_HDVR function ended'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/biax_IPL.m b/Tilt/biax_IPL.m new file mode 100755 index 0000000..84becf0 --- /dev/null +++ b/Tilt/biax_IPL.m @@ -0,0 +1,487 @@ +%% Funzione che calcola gli spostamenti in modalità biassiale per i +% Tilt Link HR (ampolle) + +function [X_IPL,Y_IPL,Z_IPL,Xlocal_IPL,Ylocal_IPL,Zlocal_IPL,HShift_IPL,HShift_local_IPL,... + AlfaX_IPL,AlfaY_IPL,Azimuth_IPL,Speed_local_IPL,Speed_IPL,Acceleration_local_IPL,... + Acceleration_IPL,TempDef_IPL,ARRAYdateIPL,ErrInPlaceLink] = biax_IPL(IDcentralina,... + DTcatena,rIPL,ACCdef_IPL,TempDef_IPL,SpeIPL,PsIPL,NodoInPlaceLink,tolleranzaAcc,... + DatiElabInPlaceLink,segnoNS,segnoEO,MEMS,Ndevst,Wdevst,ARRAYdateIPL,NuovoZeroIPL,... + Tmax,Tmin,NdatiMedia,Ndatidespike,ErrInPlaceLink,Corr_Azimuth,Inverti,margine,datainiIPL,FileName) + +%% Inizializzazione +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'biax_IPL function started'; +fprintf(fileID,fmt,text); + +if NuovoZeroIPL == 1 + if NdatiMedia > Ndatidespike + Ndati = NdatiMedia; + else + Ndati = Ndatidespike; + end + ini = round(Ndati/2)+1; + if rem(Ndati,2) == 0 + ini = ini+1; + end + clear NDati + ini = ini + margine; + if ini < 6 + ini = 6; + end + if Ndevst ~= 0 % Allora prendo tutti i dati e solo in seguito considero i nuovi, a valle della funzione filtro + ini = 1; + end + ACCdef_IPL = ACCdef_IPL(ini:end,:); + TempDef_IPL = TempDef_IPL(ini:end,:); + DatiElabInPlaceLink = DatiElabInPlaceLink(ini:end,:); + ARRAYdateIPL = ARRAYdateIPL(ini:end,1); + ErrInPlaceLink = ErrInPlaceLink(ini:end,:); +end + +% Definisco i dati +[Ndate,~] = size(ARRAYdateIPL); +Nnodi = rIPL; +AngoloX = zeros(Ndate,Nnodi); % angoli di inclinazione asse X +AngoloY = zeros(Ndate,Nnodi); % angoli di inclinazione asse Y +defZ = zeros(Ndate,Nnodi); % posizione del sensore all'interno del suo metro +SpeIPL = SpeIPL(2:end,1); % salto il segmento di pertinenza dell'ancora + +if Inverti == 0 + ii = 1; +else + ii = 3*rIPL; +end +for i=1:Nnodi + if Inverti == 1 + AngoloX(:,i) = ACCdef_IPL(:,ii-2); % ax + AngoloY(:,i) = ACCdef_IPL(:,ii-1);% ay + defZ(:,i) = ACCdef_IPL(:,ii);% ay + SpeIPL = flipud(SpeIPL); + PsIPL(2:end) = flipud(PsIPL(2:end)); + TempDef_IPL = flipud(TempDef_IPL'); + ii = ii-3; + else + AngoloX(:,i) = ACCdef_IPL(:,ii); % ax + AngoloY(:,i) = ACCdef_IPL(:,ii+1);% ay + defZ(:,i) = ACCdef_IPL(:,ii+2);% ay + TempDef_IPL = TempDef_IPL'; + ii = ii+3; + end +end + +AngoloX = AngoloX'; +AngoloY = AngoloY'; +defZ = defZ'; + +%% Costruzione delle matrici spostamento e rotazione +sX = zeros(rIPL,Ndate); % in riga i nodi, in colonna le date +sY = zeros(rIPL,Ndate); +sZ = zeros(rIPL,Ndate); + +% Inizio del ciclo di elaborazione +text = 'Elaboration of In Place Link started'; +fprintf(fileID,fmt,text); + +for d = 1:Ndate % date + for n=1:Nnodi % nodi + if strcmp(NodoInPlaceLink(1,4),'0-10 V') == 1 + % angolo di inclinazione rispetto all'orizzontale registrato da asse x + xAng = AngoloX(n,d); + % angolo di inclinazione rispetto all'orizzontale registrato da asse y + yAng = AngoloY(n,d); + % converto gli angoli in radianti (matlab ragiona così) + xAng = deg2rad(xAng); + yAng = deg2rad(yAng); + % calcolo spostamenti lungo x e y + sX(n,d) = SpeIPL(n)*sin(xAng); + sY(n,d) = SpeIPL(n)*sin(yAng); + % Calcolo l'abbassamento + sZ(n,d) = defZ(n,d)/1000; % m + end + end +end + +% dsX, dsY e dsZ raccolgono i dati del singolo nodo nella singola data +dsX = diff(sX,1,2); +dsY = diff(sY,1,2); +dsZ = diff(sZ,1,2); + +%% Cambio di segno le direzioni! +if segnoNS == 0 + dsX= -1*dsX; +end +if segnoEO == 0 + dsY = -1*dsY; +end + +%% Filtro su temperatura +clear i +clear j +cont2 = 1; % contatore +textT = 'There are not correction of Tilt Link HR V based on temperature filter'; + +FileTemperature = ['' IDcentralina '-' DTcatena '-TLHR-Therm.csv']; +if isfile(FileTemperature) == 1 + DatiRaw = csvread(FileTemperature); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; +else + rDR = 1; + cDR = 1; +end +for j = 1:Ndate % Data + for i = 1:Nnodi % Nodo + % NON considero i dati al di sopra di Tmax o al di sotto di Tmin + if TempDef_IPL(i,j) > Tmax || TempDef_IPL(i,j) < Tmin + cont2 = cont2+1; + if j == 1 + if isfile(FileTemperature) == 1 + RawDate = find(DatiRaw(:,1)<=datenum(datainiIPL)); + if isempty(RawDate) == 1 + cc = 2; + while cc <= Ndate + if TempDef_IPL(i,cc) > Tmax || TempDef_IPL(i,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_IPL(i,j) = TempDef_IPL(i,cc); + else + if isnan(DatiRaw(RawDate(end),i+1)) == 0 + TempDef_IPL(i,j) = DatiRaw(RawDate(end),i+1); + ErrInPlaceLink(j,i) = 0.5; + wardat = 'Temperature data of In Place Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + else + cc = 2; + while cc <= c + if TempDef_IPL(i,cc) > Tmax || TempDef_IPL(i,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_IPL(i,j) = TempDef_IPL(i,cc); + end + end + else + cc = 2; + while cc <= c + if TempDef_IPL(i,cc) > Tmax || TempDef_IPL(i,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_IPL(i,j) = TempDef_IPL(i,cc); + end + else + dsX(i,j-1) = 0; + dsY(i,j-1) = 0; + dsZ(i,j-1) = 0; + TempDef_IPL(i,j) = TempDef_IPL(i,j-1); + ErrInPlaceLink(j,i) = 0.5; + end + end + textT = ['' num2str(cont2) ' correction executed for In Place Link - Temperature filter!']; + end +end + +if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=ARRAYdateIPL(1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(ARRAYdateIPL(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(ARRAYdateIPL(:,1)>DatiRaw(RawDate1(end)+1,1)); + end +else + RawDate1 = []; + RawDate2 = 1; +end +if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:); ARRAYdateIPL(RawDate2(1):end) TempDef_IPL(:,RawDate2(1):end)']; +elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = [ARRAYdateIPL TempDef_IPL']; +else + Dati = DatiRaw; +end +% Elimino appoggio più vecchio di un mese +RawDate3 = find(Dati(:,1) Ndatidespike + NdatiF = NdatiMedia; + else + NdatiF = Ndatidespike; + end + ini = round(NdatiF/2)+1; + if rem(NdatiF,2) == 0 + ini = ini+1; + end + clear NDatiF + iniST = round(Wdevst/2); + if rem(Wdevst,2) == 0 + iniST = iniST+1; + end + iniST = iniST + margine; + if iniST > ini + ini = iniST; + end + if ini < 6 + ini = 6; + end + dsX = dsX(:,ini:end); + dsY = dsY(:,ini:end); + dsZ = dsZ(:,ini:end); + TempDef_IPL = TempDef_IPL(ini:end,:); + DatiElabInPlaceLink = DatiElabInPlaceLink(ini:end,:); + ARRAYdateIPL = ARRAYdateIPL(ini:end,1); + ErrInPlaceLink = ErrInPlaceLink(ini:end,:); +end + +%% Finalizzo i calcoli +[rX,cX] = size(dsX); +sommaX = zeros(rIPL,1); +Xlocal_IPL = zeros(rX,cX+1); % totale del singolo nodo data per data +AlfaX_IPL = zeros(rX,cX+1); % Angoli +sommaY = zeros(rIPL,1); +Ylocal_IPL = zeros(rX,cX+1); +AlfaY_IPL = zeros(rX,cX+1); % Angoli +sommaZ = zeros(rX,cX+1); +Zlocal_IPL = zeros(rX,cX+1); +X_IPL = zeros(rX,cX+1); % cumulata del singolo nodo data per data +Y_IPL = zeros(rX,cX+1); % il primo valore è 0 +Z_IPL = zeros(rX,cX+1); +HShift_IPL = zeros(rX,cX+1); +HShift_local_IPL = zeros(rX,cX+1); +Azimuth_IPL = zeros(rX,cX+1); +azim_HR = zeros(rX,cX+1); % matrice di appoggio per il calcolo dell'azimuth +Speed_IPL = zeros(rIPL,cX+1); % Velocità 2D Cumulata +Speed_local_IPL = zeros(rIPL,cX+1); % Velocità 2D locale +Acceleration_IPL = zeros(rIPL,cX+1); % Accelerazione 2D Cumulata +Acceleration_local_IPL = zeros(rIPL,cX+1); % Accelerazione 2D Locale +% Recupero i dati già elaborati +if NuovoZeroIPL == 1 + [rE,cE] = size(DatiElabInPlaceLink); + cont = 3; + n = 1; + while cont<=cE + if Inverti == 1 + sommaX(n,1) = cell2mat(DatiElabInPlaceLink(1,end-cont-10))'; + X_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,end-cont-7))'; + sommaY(n,1) = cell2mat(DatiElabInPlaceLink(1,end-cont-9))'; + Y_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,end-cont-6))'; + Zlocal_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,end-cont-8))'; + Z_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,end-cont-5))'; + HShift_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,end-cont-4))'; + HShift_local_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,end-cont-3))'; + Azimuth_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,end-cont-2))'; + Speed_IPL(n,1:rE) = cell2mat(DatiElabInPlaceLink(:,end-cont))'; + Speed_local_IPL(n,1:rE) = cell2mat(DatiElabInPlaceLink(:,end-cont+1))'; + Acceleration_IPL(n,1:rE) = cell2mat(DatiElabInPlaceLink(:,end-cont+2))'; + Acceleration_local_IPL(n,1:rE) = cell2mat(DatiElabInPlaceLink(:,end-cont+3))'; + else + sommaX(n,1) = cell2mat(DatiElabInPlaceLink(1,cont))'; + X_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,cont+3))'; + sommaY(n,1) = cell2mat(DatiElabInPlaceLink(1,cont+1))'; + Y_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,cont+4))'; + Zlocal_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,cont+2))'; + Z_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,cont+5))'; + HShift_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,cont+6))'; + HShift_local_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,cont+7))'; + Azimuth_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,cont+8))'; + Speed_IPL(n,1:rE) = cell2mat(DatiElabInPlaceLink(:,cont+10))'; + Speed_local_IPL(n,1:rE) = cell2mat(DatiElabInPlaceLink(:,cont+11))'; + Acceleration_IPL(n,1:rE) = cell2mat(DatiElabInPlaceLink(:,cont+12))'; + Acceleration_local_IPL(n,1:rE) = cell2mat(DatiElabInPlaceLink(:,cont+13))'; + end + Xlocal_IPL(n,1) = sommaX(n,1); + Ylocal_IPL(n,1) = sommaY(n,1); + for j = 1:rIPL + AlfaX_IPL(j,1) = asind(Xlocal_IPL(j,1)/SpeIPL(j)); + AlfaY_IPL(j,1) = asind(Ylocal_IPL(j,1)/SpeIPL(j)); + end + sommaZ(n,1) = SpeIPL(n,1)-Zlocal_IPL(n,1); % Verifica + cont=cont+16; + n = n+1; + end +else + Zlocal_IPL(:,1) = SpeIPL; + Z_IPL(:,1) = PsIPL(2:end); +end + +% elaboro i dati nuovi +for iii = 1:cX + Xlocal_IPL(:,iii+1) = sum(dsX(:,1:iii),2)+sommaX(:,1); + Ylocal_IPL(:,iii+1) = sum(dsY(:,1:iii),2)+sommaY(:,1); + for j = 1:rIPL + AlfaX_IPL(j,iii+1) = asind(Xlocal_IPL(j,iii+1)/SpeIPL(j)); + AlfaY_IPL(j,iii+1) = asind(Ylocal_IPL(j,iii+1)/SpeIPL(j)); + end + sommaZ(:,iii+1) = sum(dsZ(:,1:iii),2); + X_IPL(:,iii+1) = cumsum(Xlocal_IPL(:,iii+1)); + Y_IPL(:,iii+1) = cumsum(Ylocal_IPL(:,iii+1)); + Z_IPL(:,iii+1) = Z_IPL(:,1) + cumsum(sommaZ(:,iii+1)); % Calcolo con gli anelli magnetici + HShift_IPL(:,iii+1) = (X_IPL(:,iii+1).^2+Y_IPL(:,iii+1).^2).^0.5; + HShift_local_IPL(:,iii+1) = (Xlocal_IPL(:,iii+1).^2+Ylocal_IPL(:,iii+1).^2).^0.5; + Zlocal_IPL(:,iii+1) = SpeIPL(:,1)+sommaZ(:,iii+1); % Zeta è il singolo abbassamento di quel nodo + for rr = 1:rIPL + azim_HR(rr,iii) = (acos(abs(X_IPL(rr,iii))/HShift_IPL(rr,iii)))*180/3.141592654; % Angolo Teta in gradi 0° - 90° + segnoNS = sign(X_IPL(rr,iii)); + segnoEO = sign(Y_IPL(rr,iii)); + % L'azimuth si calcola con NS = 0, positivo in senso orario + % (90° = Est) + if segnoNS == 1 && segnoEO == 1 % quadrante 1 + Azimuth_IPL(rr,iii+1) = azim_HR(rr,iii); % Teta lo tengo come è (1 quadrante) + elseif segnoNS == -1 && segnoEO == 1 % quadrante 2 + Azimuth_IPL(rr,iii+1) = 180 - azim_HR(rr,iii); % 180-teta + elseif segnoNS == -1 && segnoEO == -1 % quadrante 3 + Azimuth_IPL(rr,iii+1) = 180 + azim_HR(rr,iii); % 180+teta + elseif segnoNS == 1 && segnoEO == -1 % quadrante 4 + Azimuth_IPL(rr,iii+1) = 360 - azim_HR(rr,iii); % 360-teta + elseif segnoNS == 0 && segnoEO == -1 % 270° + Azimuth_IPL(rr,iii+1) = 270; + elseif segnoNS == -1 && segnoEO == 0 % 180° + Azimuth_IPL(rr,iii+1) = 180; + end + end +end +[rAz,cAz] = size(Azimuth_IPL); +for n=1:rAz + for c=2:cAz + Azimuth_IPL(n,c) = real(Azimuth_IPL(n,c))+Corr_Azimuth; + if Azimuth_IPL(n,c)>=360 + Azimuth_IPL(n,c)=Azimuth_IPL(n,c)-360; + end + end +end + +%% Calcolo velocità di spostamento giornaliera +[numDate,~] = size(ARRAYdateIPL); % numero di date +d = 1; +p = 1; +diffDate = 0; +n = 1; +period = 1; % calcolo giornaliero +ContSUP = []; +for dd = 1:numDate + while diffDate < period + d = d+1; + if d > numDate % Se d supera le date disponibili, esco dal ciclo while + break + end + diffDate = ARRAYdateIPL(d) - ARRAYdateIPL(p); + end + if d >numDate + break + end + ContSUP(n,1) = d; % Creo matrice indici dell'estremo superiore della differenza + ContINF(n,1) = p; % Creo matrice indici dell'estremo inferiore della differenza + p = p+1; % passo alla data di partenza successiva + d = p; % resetto il conto di d + n = n+1; + diffDate = 0; +end + +check = isempty(ContSUP); +if check == 0 + [nDate,~] = size(ContSUP); + for s = 1:rIPL + N = 1; + for dd = 1:nDate + Speed_IPL(s,ContSUP(N,1)) = (HShift_IPL(s,ContSUP(N,1))-HShift_IPL(s,ContINF(N,1)))/(ARRAYdateIPL(ContSUP(N,1))-ARRAYdateIPL(ContINF(N,1))); + Speed_local_IPL(s,ContSUP(N,1)) = (HShift_local_IPL(s,ContSUP(N,1))-HShift_local_IPL(s,ContINF(N,1)))/(ARRAYdateIPL(ContSUP(N,1))-ARRAYdateIPL(ContINF(N,1))); + Acceleration_IPL(s,ContSUP(N,1)) = (Speed_IPL(s,ContSUP(N,1))-Speed_IPL(s,ContINF(N,1)))/(ARRAYdateIPL(ContSUP(N,1))-ARRAYdateIPL(ContINF(N,1))); + Acceleration_local_IPL(s,ContSUP(N,1)) = (Speed_local_IPL(s,ContSUP(N,1))-Speed_local_IPL(s,ContINF(N,1)))/(ARRAYdateIPL(ContSUP(N,1))-ARRAYdateIPL(ContINF(N,1))); + N = N+1; + end + end +end + +% Approssimo i dati con il corretto numero di cifre decimali +[X_IPL,Y_IPL,Z_IPL,Xlocal_IPL,Ylocal_IPL,Zlocal_IPL,HShift_IPL,... + HShift_local_IPL,Azimuth_IPL,Speed_IPL,Speed_local_IPL,Acceleration_IPL,... + Acceleration_local_IPL,TempDef_IPL] = approx(X_IPL,Y_IPL,Z_IPL,... + Xlocal_IPL,Ylocal_IPL,Zlocal_IPL,HShift_IPL,HShift_local_IPL,Azimuth_IPL,... + Speed_IPL,Speed_local_IPL,Acceleration_IPL,Acceleration_local_IPL,TempDef_IPL,FileName); + +% Riordino matrice errori +[r,~] = size(ErrInPlaceLink); +Matrice_err = zeros(r,rIPL); +if strcmp(NodoInPlaceLink(1,4),'0-10 V') == 1 + par = 3; +else + par = 7; +end +for i = 1:r % date + d = 1; + for n = 1:rIPL % nodi + j = 1; + err = ErrInPlaceLink(i,d:d+par-1); + while j <= par + if err(1,j) == 1 + Matrice_err(i,n) = 1; + break + end + if err(1,j) == 0.5 + Matrice_err(i,n) = 0.5; + end + j = j+1; + end + d = d+par; + end +end +ErrInPlaceLink = Matrice_err'; + +if Inverti == 1 + X_IPL = flipud(X_IPL); + Y_IPL = flipud(Y_IPL); + Z_IPL = flipud(Z_IPL); + Xlocal_IPL = flipud(Xlocal_IPL); + Ylocal_IPL = flipud(Ylocal_IPL); + Zlocal_IPL = flipud(Zlocal_IPL); + HShift_IPL = flipud(HShift_IPL); + HShift_local_IPL = flipud(HShift_local_IPL); + Azimuth_IPL = flipud(Azimuth_IPL); + Speed_local_IPL = flipud(Speed_local_IPL); + Speed_IPL = flipud(Speed_IPL); + Acceleration_local_IPL = flipud(Acceleration_local_IPL); + Acceleration_IPL = flipud(Acceleration_IPL); + AlfaX_IPL = flipud(AlfaX_IPL); + AlfaY_IPL = flipud(AlfaY_IPL); + TempDef_IPL = flipud(TempDef_IPL); +end + +text = 'In Place Link calculation executed correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/biax_IPLHR.m b/Tilt/biax_IPLHR.m new file mode 100755 index 0000000..d458f0c --- /dev/null +++ b/Tilt/biax_IPLHR.m @@ -0,0 +1,534 @@ +%% Funzione che calcola gli spostamenti in modalità biassiale per i +% Tilt Link HR (ampolle) + +function [X_IPLHR,Y_IPLHR,Z_IPLHR,Xlocal_IPLHR,Ylocal_IPLHR,Zlocal_IPLHR,... + HShift_IPLHR,HShift_local_IPLHR,AlfaX_IPLHR,AlfaY_IPLHR,Azimuth_IPLHR,... + Speed_local_IPLHR,Speed_IPLHR,Acceleration_local_IPLHR,Acceleration_IPLHR,... + TempDef_IPLHR,ARRAYdateIPLHR,ErrInPlaceLinkHR] = biax_IPLHR(IDcentralina,... + DTcatena,rIPLHR,rIPL,ANGdef_IPLHR,ACCdef_IPL,MAGdef_IPL,TempDef_IPLHR,... + SpeIPLHR,PsIPLHR,yesIPL,yesIPLHR3D,NodoInPlaceLinkHR,NodoInPlaceLink,... + NodoInPlaceLinkHR3D,DatiElabInPlaceLinkHR,segnoNS_HR,segnoEO_HR,Ndevst_HR,... + Wdevst_HR,ARRAYdateIPLHR,NuovoZeroIPLHR,NdatiMedia,Ndatidespike,allineato,... + Tmax,Tmin,datainiIPLHR,ErrInPlaceLinkHR,Corr_Azimuth,margine,FileName) + +%% Inizializzazione +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'biax_IPLHR function started'; +fprintf(fileID,fmt,text); + +if NuovoZeroIPLHR == 1 + if NdatiMedia > Ndatidespike + Ndati = NdatiMedia; + else + Ndati = Ndatidespike; + end + ini = round(Ndati/2)+1; + if rem(Ndati,2) == 0 + ini = ini+1; + end + clear NDati + ini = ini + margine; + if ini < 6 + ini = 6; + end + if Ndevst_HR ~= 0 % Allora prendo tutti i dati e solo in seguito considero i nuovi, a valle della funzione filtro + ini = 1; + end + if strcmp(NodoInPlaceLinkHR(1,4),'ADC') || strcmp(NodoInPlaceLinkHR{1,4} ,'null') || isempty(NodoInPlaceLinkHR{1,4}) == 1 + [rA,~] = size(ANGdef_IPLHR); % Numero di dati delle ampolle + [rM,~] = size(ACCdef_IPL); % Numero di dati dei MEMS + if rA~=rM + if rM > rA + ini_MEMS = rM-rA+ini; + ini_Ampolle = ini; + elseif rM < rA + ini_Ampolle = rA-rM+ini; % Si presume che la data finale sia identica per entrambi + ini_MEMS = ini; + end + else + ini_MEMS = ini; + ini_Ampolle = ini; + end + MAGdef_IPL = MAGdef_IPL(ini_MEMS:end,:); + elseif strcmp(NodoInPlaceLinkHR{1,4} ,'digit') + ini_Ampolle = ini; + end + ANGdef_IPLHR = ANGdef_IPLHR(ini_Ampolle:end,:); + TempDef_IPLHR = TempDef_IPLHR(ini_Ampolle:end,:); + DatiElabInPlaceLinkHR = DatiElabInPlaceLinkHR(ini_Ampolle:end,:); + ARRAYdateIPLHR = ARRAYdateIPLHR(ini_Ampolle:end,1); + ErrInPlaceLinkHR = ErrInPlaceLinkHR(ini_Ampolle:end,:); +end + +%% Elaborazione sfruttando il magnetometro del MEMS +if allineato == 0 && yesIPLHR3D == 1 + % Definisco i dati MEMS + [r,~] = size(MAGdef_IPL); + Nnodi = rIPL; + mx = zeros(r,Nnodi); + my = zeros(r,Nnodi); + for i=1:Nnodi + mx(:,i)= -1*MAGdef_IPL(:,(i-1)*3+1); % mx + my(:,i) = -1*MAGdef_IPL(:,(i-1)*3+2:(i-1)*3+2); % my + end + + mx = mx'; % riga nodi, colonna date + my = my'; % riga nodi, colonna date + + NodoInPlaceLink = cell2mat(NodoInPlaceLink(:,2)); + NodoDoppio = cell2mat(NodoInPlaceLinkHR3D(:,2)); + [S] = size(NodoDoppio); + Nodes = zeros(S(1),1); + for s = 1:S(1) + Nodes(s,1) = find(NodoInPlaceLink == NodoDoppio(s,1)); + end +end + +% Definisco i dati della cella elettrolitica +[Ndate,~] = size(ARRAYdateIPLHR); +Nnodi = rIPLHR; +AngoloX = zeros(Ndate,Nnodi); % angoli di inclinazione asse X +AngoloY = zeros(Ndate,Nnodi); % angoli di inclinazione asse Y +ii = 1; +for i=1:Nnodi + AngoloX(:,i) = ANGdef_IPLHR(:,ii); % ax + AngoloY(:,i) = ANGdef_IPLHR(:,ii+1);% ay + ii = ii+2; +end + +AngoloX = AngoloX'; +AngoloY = AngoloY'; + +%% Costruzione delle matrici spostamento e rotazione +sX = zeros(rIPLHR,Ndate); % in riga i nodi, in colonna le date +sY = zeros(rIPLHR,Ndate); +sZ = zeros(rIPLHR,Ndate); + +% Inizio del ciclo di elaborazione +text = 'Elaboration of In Place Link HR started'; +fprintf(fileID,fmt,text); + +for Imis = 1:Ndate % date + for jjj=1:Nnodi % nodi + %% Uso magnetometro MEMS + if allineato == 0 && yesIPLHR3D == 1 % uso il magnetometro del MEMS + Mx = mx(Nodes(jjj,1),:); + My = my(Nodes(jjj,1),:); + angle = arotHR(Mx,My,Imis); + % angolo di inclinazione rispetto all'orizzontale registrato da asse x + xAngTLHR = AngoloX(jjj,Imis); + % angolo di inclinazione rispetto all'orizzontale registrato da asse y + yAngTLHR = AngoloY(jjj,Imis); + % converto gli angoli in radianti (matlab ragiona così) + xAngTLHR = 0.01745329251994329576923690768489*xAngTLHR; + yAngTLHR = 0.01745329251994329576923690768489*yAngTLHR; + % Segmento di pertinenza + if yesIPLHR3D == 1 + SpIPLHR = SpeIPLHR(jjj+1); % correzione che salta l'ancora + else + % Correzione che salta l'ancora e il primo nodo Tilt Link (se + % presente) + SpIPLHR = SpeIPLHR(jjj+2); + end + % Finalizzo + [Na,Ea,Za] = ASSEa_HR(xAngTLHR,angle,SpIPLHR); + [Nb,Eb,Zb] = ASSEb_HR(yAngTLHR,angle,SpIPLHR); + sX(jjj,Imis) = Na+Nb; + sY(jjj,Imis) = Ea+Eb; + % Calcolo l'abbassamento (positivo) considerando il MAGGIORE dei due calcolati sui due assi + sZ(jjj,Imis) = max(Za,Zb); + else + %% NON uso magnetometro MEMS o IPTM + + % angolo di inclinazione rispetto all'orizzontale registrato da asse x + xAngTLHR = AngoloX(jjj,Imis); + % angolo di inclinazione rispetto all'orizzontale registrato da asse y + yAngTLHR = AngoloY(jjj,Imis); + % converto gli angoli in radianti (matlab ragiona così) + xAngTLHR = 0.01745329251994329576923690768489*xAngTLHR; + yAngTLHR = 0.01745329251994329576923690768489*yAngTLHR; + % Segmento di pertinenza + if yesIPL == 1 + if yesIPLHR3D == 1 + SpIPLHR = SpeIPLHR(jjj+1); % correzione che salta l'ancora + else + % Correzione che salta l'ancora e il primo nodo Tilt Link (se + % presente) + SpIPLHR = SpeIPLHR(jjj+2); + end + else + SpIPLHR = SpeIPLHR(jjj+1); % correzione che salta l'ancora + end + % calcolo spostamenti lungo x e y + sX(jjj,Imis) = SpIPLHR*sin(xAngTLHR); + sY(jjj,Imis) = SpIPLHR*sin(yAngTLHR); + % Abbassamento registrato dai due assi + sXZ = SpIPLHR - SpIPLHR*cos(xAngTLHR); + sYZ = SpIPLHR - SpIPLHR*cos(yAngTLHR); + % Calcolo l'abbassamento considerando il maggiore dei due calcolati sui due assi + sZ(jjj,Imis) = max(sXZ,sYZ); + end + end +end + +% dsX, dsY e dsZ raccolgono i dati del singolo nodo nella singola data +dsX = diff(sX,1,2); +dsY = diff(sY,1,2); +dsZ = diff(sZ,1,2); + +%% Cambio di segno le direzioni! +if segnoNS_HR == 0 + dsX= -1*dsX; +end +if segnoEO_HR == 0 + dsY = -1*dsY; +end + +%% Filtro su temperatura +clear i +clear j +cont2 = 1; % contatore +TempDef_IPLHR = TempDef_IPLHR'; +textT = 'There are not correction of In Place Link HR based on temperature filter'; + +FileTemperature = ['' IDcentralina '-' DTcatena '-IPLHR-Therm.csv']; +if isfile(FileTemperature) == 1 + DatiRaw = csvread(FileTemperature); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; +else + rDR = 1; + cDR = 1; +end +for j = 1:Ndate % Data + for i = 1:Nnodi % Nodo + % NON considero i dati al di sopra di Tmax o al di sotto di Tmin + if TempDef_IPLHR(i,j) > Tmax || TempDef_IPLHR(i,j) < Tmin + cont2 = cont2+1; + if j == 1 + if isfile(FileTemperature) == 1 + RawDate = find(DatiRaw(:,1)<=datenum(datainiIPLHR)); + if isempty(RawDate) == 1 + cc = 2; + while cc <= Ndate + if TempDef_IPLHR(i,cc) > Tmax || TempDef_IPLHR(i,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_IPLHR(i,j) = TempDef_IPLHR(i,cc); + else + if isnan(DatiRaw(RawDate(end),i+1)) == 0 + TempDef_IPLHR(i,j) = DatiRaw(RawDate(end),i+1); + ErrInPlaceLinkHR(j,i) = 0.5; + wardat = 'Temperature data of In Place Link HR nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + else + cc = 2; + while cc <= c + if TempDef_IPLHR(i,cc) > Tmax || TempDef_IPLHR(i,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_IPLHR(i,j) = TempDef_IPLHR(i,cc); + end + end + else + cc = 2; + while cc <= c + if TempDef_IPLHR(i,cc) > Tmax || TempDef_IPLHR(i,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_IPLHR(i,j) = TempDef_IPLHR(i,cc); + end + else + dsX(i,j-1) = 0; + dsY(i,j-1) = 0; + dsZ(i,j-1) = 0; + TempDef_IPLHR(i,j) = TempDef_IPLHR(i,j-1); + ErrInPlaceLinkHR(j,i) = 0.5; + end + end + textT = ['' num2str(cont2) ' correction executed for In Place Link HR - Temperature filter!']; + end +end + +if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=ARRAYdateIPLHR(1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(ARRAYdateIPLHR(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(ARRAYdateIPLHR(:,1)>DatiRaw(RawDate1(end)+1,1)); + end +else + RawDate1 = []; + RawDate2 = 1; +end +if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:); ARRAYdateIPLHR(RawDate2(1):end) TempDef_IPLHR(:,RawDate2(1):end)']; +elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = [ARRAYdateIPLHR TempDef_IPLHR']; +else + Dati = DatiRaw; +end +% Elimino appoggio più vecchio di un mese +RawDate3 = find(Dati(:,1) Ndatidespike + NdatiF = NdatiMedia; + else + NdatiF = Ndatidespike; + end + ini = round(NdatiF/2)+1; + if rem(NdatiF,2) == 0 + ini = ini+1; + end + clear NDatiF + iniST = round(Wdevst_HR/2); + if rem(Wdevst_HR,2) == 0 + iniST = iniST+1; + end + iniST = iniST + margine; + if iniST > ini + ini = iniST; + end + if ini < 6 + ini = 6; + end + dsX = dsX(:,ini:end); + dsY = dsY(:,ini:end); + dsZ = dsZ(:,ini:end); + TempDef_IPLHR = TempDef_IPLHR(ini:end,:); + DatiElabInPlaceLinkHR = DatiElabInPlaceLinkHR(ini:end,:); + ARRAYdateIPLHR = ARRAYdateIPLHR(ini:end,1); + ErrInPlaceLinkHR = ErrInPlaceLinkHR(ini:end,:); +end + +%% Finalizzo i calcoli +[rX,cX] = size(dsX); +sommaX_IPLHR = zeros(rIPLHR,1); +Xlocal_IPLHR = zeros(rX,cX+1); % totale del singolo nodo data per data +AlfaX_IPLHR = zeros(rX,cX+1); % Angoli +sommaY_IPLHR = zeros(rIPLHR,1); +Ylocal_IPLHR = zeros(rX,cX+1); +AlfaY_IPLHR = zeros(rX,cX+1); % Angoli +sommaZ_IPLHR = zeros(rX,cX+1); +Zlocal_IPLHR = zeros(rX,cX+1); +X_IPLHR = zeros(rX,cX+1); % cumulata del singolo nodo data per data +Y_IPLHR = zeros(rX,cX+1); % il primo valore è 0 +Z_IPLHR = zeros(rX,cX+1); +HShift_IPLHR = zeros(rX,cX+1); +HShift_local_IPLHR = zeros(rX,cX+1); +Azimuth_IPLHR = zeros(rX,cX+1); +azim_IPLHR = zeros(rX,cX+1); % matrice di appoggio per il calcolo dell'azimuth +Speed_IPLHR = zeros(rIPLHR,cX+1); % Velocità 2D Cumulata +Speed_local_IPLHR = zeros(rIPLHR,cX+1); % Velocità 2D locale +Acceleration_IPLHR = zeros(rIPLHR,cX+1); % Accelerazione 2D Cumulata +Acceleration_local_IPLHR = zeros(rIPLHR,cX+1); % Accelerazione 2D Locale +if yesIPL == 1 + if yesIPLHR3D == 1 + SpeIPLHR = SpeIPLHR(2:end); % correzione che salta l'ancora + else + % Correzione che salta l'ancora e il primo nodo Tilt Link (se + % presente) + SpeIPLHR = SpeIPLHR(3:end); + end +else + SpeIPLHR = SpeIPLHR(2:end); % correzione che salta l'ancora +end +% Recupero i dati già elaborati +if NuovoZeroIPLHR == 1 + [rE,cE] = size(DatiElabInPlaceLinkHR); + cont = 3; + n = 1; + while cont<=cE + sommaX_IPLHR(n,1) = cell2mat(DatiElabInPlaceLinkHR(1,cont))'; + Xlocal_IPLHR(n,1) = sommaX_IPLHR(n,1); + X_IPLHR(n,1) = cell2mat(DatiElabInPlaceLinkHR(1,cont+3))'; + sommaY_IPLHR(n,1) = cell2mat(DatiElabInPlaceLinkHR(1,cont+1))'; + Ylocal_IPLHR(n,1) = sommaY_IPLHR(n,1); + Y_IPLHR(n,1) = cell2mat(DatiElabInPlaceLinkHR(1,cont+4))'; + for j = 1:rIPLHR + AlfaX_IPLHR(j,1) = asind(Xlocal_IPLHR(j,1)/SpeIPLHR(j)); + AlfaY_IPLHR(j,1) = asind(Ylocal_IPLHR(j,1)/SpeIPLHR(j)); + end + Zlocal_IPLHR(n,1) = cell2mat(DatiElabInPlaceLinkHR(1,cont+2))'; + Z_IPLHR(n,1) = cell2mat(DatiElabInPlaceLinkHR(1,cont+5))'; + HShift_IPLHR(n,1) = cell2mat(DatiElabInPlaceLinkHR(1,cont+6))'; + HShift_local_IPLHR(n,1) = cell2mat(DatiElabInPlaceLinkHR(1,cont+7))'; + Azimuth_IPLHR(n,1) = cell2mat(DatiElabInPlaceLinkHR(1,cont+8))'; + Speed_IPLHR(n,1:rE) = cell2mat(DatiElabInPlaceLinkHR(:,cont+10))'; + Speed_local_IPLHR(n,1:rE) = cell2mat(DatiElabInPlaceLinkHR(:,cont+11))'; + Acceleration_IPLHR(n,1:rE) = cell2mat(DatiElabInPlaceLinkHR(:,cont+12))'; + Acceleration_local_IPLHR(n,1:rE) = cell2mat(DatiElabInPlaceLinkHR(:,cont+13))'; + cont=cont+16; + n = n+1; + end +else + Zlocal_IPLHR(:,1) = SpeIPLHR; + Z_IPLHR(:,1) = PsIPLHR(2:end); +end + +% elaboro i dati nuovi +for iii = 1:cX + Xlocal_IPLHR(:,iii+1) = sum(dsX(:,1:iii),2)+sommaX_IPLHR(:,1); + Ylocal_IPLHR(:,iii+1) = sum(dsY(:,1:iii),2)+sommaY_IPLHR(:,1); + for j = 1:rIPLHR + AlfaX_IPLHR(j,iii+1) = asind(Xlocal_IPLHR(j,iii+1)/SpeIPLHR(j)); + AlfaY_IPLHR(j,iii+1) = asind(Ylocal_IPLHR(j,iii+1)/SpeIPLHR(j)); + end + sommaZ_IPLHR(:,iii+1) = sum(dsZ(:,1:iii),2); + X_IPLHR(:,iii+1) = cumsum(Xlocal_IPLHR(:,iii+1)); + Y_IPLHR(:,iii+1) = cumsum(Ylocal_IPLHR(:,iii+1)); + Z_IPLHR(:,iii+1) = Z_IPLHR(:,1) - cumsum(sommaZ_IPLHR(:,iii+1)); + HShift_IPLHR(:,iii+1) = (X_IPLHR(:,iii+1).^2+Y_IPLHR(:,iii+1).^2).^0.5; + HShift_local_IPLHR(:,iii+1) = (Xlocal_IPLHR(:,iii+1).^2+Ylocal_IPLHR(:,iii+1).^2).^0.5; + Zlocal_IPLHR(:,iii+1) = SpeIPLHR - sommaZ_IPLHR(:,iii+1); % Zeta è il singolo abbassamento di quel nodo + for rr = 1:rIPLHR + azim_IPLHR(rr,iii) = (acos(abs(X_IPLHR(rr,iii))/HShift_IPLHR(rr,iii)))*180/3.141592654; % Angolo Teta in gradi 0° - 90° + segnoNS = sign(X_IPLHR(rr,iii)); + segnoEO = sign(Y_IPLHR(rr,iii)); + % L'azimuth si calcola con NS = 0, positivo in senso orario + % (90° = Est) + if segnoNS == 1 && segnoEO == 1 % quadrante 1 + Azimuth_IPLHR(rr,iii+1) = azim_IPLHR(rr,iii); % Teta lo tengo come è (1 quadrante) + elseif segnoNS == -1 && segnoEO == 1 % quadrante 2 + Azimuth_IPLHR(rr,iii+1) = 180 - azim_IPLHR(rr,iii); % 180-teta + elseif segnoNS == -1 && segnoEO == -1 % quadrante 3 + Azimuth_IPLHR(rr,iii+1) = 180 + azim_IPLHR(rr,iii); % 180+teta + elseif segnoNS == 1 && segnoEO == -1 % quadrante 4 + Azimuth_IPLHR(rr,iii+1) = 360 - azim_IPLHR(rr,iii); % 360-teta + elseif segnoNS == 0 && segnoEO == -1 % 270° + Azimuth_IPLHR(rr,iii+1) = 270; + elseif segnoNS == -1 && segnoEO == 0 % 180° + Azimuth_IPLHR(rr,iii+1) = 180; + end + end +end +Azimuth_IPLHR = real(Azimuth_IPLHR); +Azimuth_IPLHR = Azimuth_IPLHR+Corr_Azimuth; +[rAz,cAz] = size(Azimuth_IPLHR); +for a = 1:rAz + for b = 1:cAz + if Azimuth_IPLHR(a,b) >= 360 + Azimuth_IPLHR(a,b) = Azimuth_IPLHR(a,b)-360; + end + end +end + +%% Calcolo velocità di spostamento giornaliera +[numDate,~] = size(ARRAYdateIPLHR); % numero di date +d = 1; +p = 1; +diffDate = 0; +n = 1; +period = 1; % calcolo giornaliero +ContSUP = []; +for dd = 1:numDate + while diffDate < period + d = d+1; + if d > numDate % Se d supera le date disponibili, esco dal ciclo while + break + end + diffDate = ARRAYdateIPLHR(d) - ARRAYdateIPLHR(p); + end + if d >numDate + break + end + ContSUP(n,1) = d; % Creo matrice indici dell'estremo superiore della differenza + ContINF(n,1) = p; % Creo matrice indici dell'estremo inferiore della differenza + p = p+1; % passo alla data di partenza successiva + d = p; % resetto il conto di d + n = n+1; + diffDate = 0; +end + +check = isempty(ContSUP); +if check == 0 + [nDate,~] = size(ContSUP); + for s = 1:rIPLHR + N = 1; + for dd = 1:nDate + Speed_IPLHR(s,ContSUP(N,1)) = (HShift_IPLHR(s,ContSUP(N,1))-HShift_IPLHR(s,ContINF(N,1)))/(ARRAYdateIPLHR(ContSUP(N,1))-ARRAYdateIPLHR(ContINF(N,1))); + Speed_local_IPLHR(s,ContSUP(N,1)) = (HShift_local_IPLHR(s,ContSUP(N,1))-HShift_local_IPLHR(s,ContINF(N,1)))/(ARRAYdateIPLHR(ContSUP(N,1))-ARRAYdateIPLHR(ContINF(N,1))); + Acceleration_IPLHR(s,ContSUP(N,1)) = (Speed_IPLHR(s,ContSUP(N,1))-Speed_IPLHR(s,ContINF(N,1)))/(ARRAYdateIPLHR(ContSUP(N,1))-ARRAYdateIPLHR(ContINF(N,1))); + Acceleration_local_IPLHR(s,ContSUP(N,1)) = (Speed_local_IPLHR(s,ContSUP(N,1))-Speed_local_IPLHR(s,ContINF(N,1)))/(ARRAYdateIPLHR(ContSUP(N,1))-ARRAYdateIPLHR(ContINF(N,1))); + N = N+1; + end + end +end + +% Approssimo i dati con il corretto numero di cifre decimali +[X_IPLHR,Y_IPLHR,Z_IPLHR,Xlocal_IPLHR,Ylocal_IPLHR,Zlocal_IPLHR,HShift_IPLHR,... + HShift_local_IPLHR,Azimuth_IPLHR,Speed_IPLHR,Speed_local_IPLHR,Acceleration_IPLHR,... + Acceleration_local_IPLHR,TempDef_IPLHR] = approx_TLHR(X_IPLHR,Y_IPLHR,Z_IPLHR,... + Xlocal_IPLHR,Ylocal_IPLHR,Zlocal_IPLHR,HShift_IPLHR,HShift_local_IPLHR,Azimuth_IPLHR,... + Speed_IPLHR,Speed_local_IPLHR,Acceleration_IPLHR,Acceleration_local_IPLHR,TempDef_IPLHR,FileName); + +% Matrice errori +[r,~] = size(ErrInPlaceLinkHR); +Matrice_err = zeros(r,rIPLHR); +if strcmp(NodoInPlaceLinkHR(1,4),'ADC') || strcmp(NodoInPlaceLinkHR{1,4},'null') || isempty(NodoInPlaceLinkHR{1,4}) == 1 + col = 6; +elseif strcmp(NodoInPlaceLinkHR{1,4} ,'digit') + col = 3; +end +for i = 1:r % date + d = 1; + for n = 1:rIPLHR % nodi + j = 1; + err = ErrInPlaceLinkHR(i,d:d+col-1); + while j <= col + if err(1,j) == 1 + Matrice_err(i,n) = 1; + break + end + if err(1,j) == 0.5 + Matrice_err(i,n) = 0.5; + end + j = j+1; + end + d = d+col; + end +end +ErrInPlaceLinkHR = Matrice_err'; + +text = 'In Place Link HR calculation executed correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/biax_TL.m b/Tilt/biax_TL.m new file mode 100755 index 0000000..3dd9f6c --- /dev/null +++ b/Tilt/biax_TL.m @@ -0,0 +1,501 @@ +function [X,Y,Z,Xlocal,Ylocal,Zlocal,HShift,HShift_local,AlfaX,AlfaY,Azimuth,... + Speed_local,Speed,Acceleration_local,Acceleration,TempDef_TL,... + ARRAYdateTL,ErrTiltLink,MAGdef_TL] = biax_TL(IDcentralina,DTcatena,rTL,... + ACCdef_TL,ACCdefRis_TL,MAGdef_TL,TempDef_TL,SpeTL,PsTL,... + NodoTiltLink,tolleranzaAcc,tolleranzaMag,DatiElabTiltLink,segnoNS,segnoEO,... + Ndevst,Wdevst,ARRAYdateTL,Tmax,Tmin,NuovoZeroTL,NdatiMedia,Ndatidespike,... + ErrTiltLink,margine,date,datainiTL,FileName) + +%% Inizializzazione +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'biax_TL function started'; +fprintf(fileID,fmt,text); + +if NuovoZeroTL == 1 + if NdatiMedia > Ndatidespike + Ndati = NdatiMedia; + else + Ndati = Ndatidespike; + end + ini = round(Ndati/2)+1; + if rem(Ndati,2) == 0 + ini = ini+1; + end + clear NDati + ini = ini + margine; + if ini < 6 + ini = 6; + end + if Ndevst ~= 0 % Allora prendo tutti i dati e solo in seguito considero i nuovi, a valle della funzione filtro + ini = 1; + end + ACCdef_TL = ACCdef_TL(ini:end,:); + ACCdefRis_TL = ACCdefRis_TL(ini:end,:); + MAGdef_TL = MAGdef_TL(ini:end,:); + TempDef_TL = TempDef_TL(ini:end,:); + DatiElabTiltLink = DatiElabTiltLink(ini:end,:); + ARRAYdateTL = ARRAYdateTL(ini:end,1); + ErrTiltLink = ErrTiltLink(ini:end,:); +end + +%% Controllo e correzione dei campi magnetici +[rA,cA] = size(ACCdef_TL); % righe -> date, colonna -> nodi +conf_acc = zeros(rA,cA); +contM = 0; % contatore correzioni campi magnetici +contT = rA*cA; + +% Se le accelerazioni variano meno della confidenza, NON cambio i valori di +% cambio magnetico e prendo quelli della lettura precedente +for d = 2:rA + % seconda lettura e successive, confronto i risultati dei magnetometri + % e degli accelerometri + conf_acc(d,:) = abs(ACCdef_TL(d,:) - ACCdef_TL(d-1,:)); + for dd = 1:cA + if abs(conf_acc(d,dd)) < tolleranzaMag % SOGLIA ACCELERAZIONE + MAGdef_TL(d,dd) = MAGdef_TL(d-1,dd); + contM = contM+1; + end + end +end + +text = ['' num2str(contM) ' corrections of magnetometers executed on a total amount of ' num2str(contT)... + ' data, which represent the ' num2str(contM*100/contT) '% for Tilt Link V']; +fprintf(fileID,fmt,text); + +%% Definisco i dati +Nnodi = rTL; +[r,~] = size(ACCdef_TL); +[Ndati,~] = size(ARRAYdateTL); +ax = zeros(r,Nnodi); +ay = zeros(r,Nnodi); +mx = zeros(r,Nnodi); +my = zeros(r,Nnodi); +% i -1* ristabiliscono la coerenza fra mx e ax +for i=1:Nnodi + ax(:,i) = ACCdef_TL(:,(i-1)*3+1); % ax + ay(:,i) = ACCdef_TL(:,(i-1)*3+2:(i-1)*3+2); % ay + mx(:,i) = MAGdef_TL(:,(i-1)*3+1); % mx + my(:,i) = MAGdef_TL(:,(i-1)*3+2:(i-1)*3+2); % my +end + +%% Costruzione delle matrici spostamento e rotazione +NordSud = zeros(Nnodi,Ndati); +EstOvest = zeros(Nnodi,Ndati); +Zlocal = zeros(Nnodi,Ndati); + +% Parametri per il calcolo +SpeTL = SpeTL(2:end,1); + +% Inizio del ciclo di elaborazione +text = 'Biaxial Elaboration of Tilt Link V started'; +fprintf(fileID,fmt,text); + +ax = ax'; % riga nodi, colonna date +ay = ay'; % riga nodi, colonna date +if datenum(date) > 737643 % Codice post Correzione + mx = -mx'; % riga nodi, colonna date + my = -my'; % riga nodi, colonna date +else + mx = mx'; % riga nodi, colonna date + my = my'; % riga nodi, colonna date +end + +for j = 1:Ndati + for i = 1:Nnodi + angle = arot(mx,my,j,i); + [Na,Ea,Za]=ASSEa(ax,angle,SpeTL,i,j); + [Nb,Eb,Zb]=ASSEb(ay,angle,SpeTL,i,j); + NordSud(i,j) = Na+Nb; + EstOvest(i,j) = Ea+Eb; + % Calcolo l'abbassamento (positivo) considerando il MAGGIORE dei due calcolati sui due assi + Zlocal(i,j) = max(Za,Zb); + end +end + +% dNS e dEO raccolgono i dati del singolo nodo nella singola data +dNS = diff(NordSud,1,2); +dEO = diff(EstOvest,1,2); +dZ = diff(Zlocal,1,2); + +%% Cambio di segno le direzioni! +if segnoNS == 0 + dNS = -1*dNS; +end +if segnoEO == 0 + dEO = -1*dEO; +end + +%% Controllo delle risultanti di accelerazione e campo magnetico +clear r +clear rr +clear c +clear cc +ACCdefRis_TL = ACCdefRis_TL'; % Nodi in riga, date in colonna +[r,c] = size(ACCdefRis_TL); +[rr,cc] = size(NordSud); + +% controllo che le matrici con le risultanti delle accelerazioni e +% le matrici con i dati di spostamento abbiano le stesse dimensioni +if r~=rr + text = '---Warning! Number of row of displacement data do not correspond to the number of acceleration cosine vector!---'; + fprintf(fileID,fmt,text); +end +if c~=cc + text = '---Warning! Number of column of displacement data do not correspond to the number of acceleration cosine vector!---'; + fprintf(fileID,fmt,text); +end +clear i +clear j +cont = 1; % contatore +cont2 = 1; % contatore +cont3 = 1; % contatore +TempDef_TL = TempDef_TL'; +textA = 'There are not correction of Tilt Link V based on acceleration vectors filter'; +textA2 = 'There are not correction of Tilt Link V based on uncalibrated acceleration vectors'; +textT = 'There are not correction of Tilt Link V based on temperature filter'; +for j = 2:c % Data + for i = 1:r % Nodo + % se il valore assoluto della differenza è maggiore della + % tolleranza, pongo gli spostamenti giornalieri pari a 0 + if abs(ACCdefRis_TL(i,j)-ACCdefRis_TL(i,j-1)) > tolleranzaAcc + dNS(i,j-1) = 0; + dEO(i,j-1) = 0; + dZ(i,j-1) = 0; + textA = ['' num2str(cont) ' correction executed for Tilt Link V - Acceleration vector filter!']; + cont = cont+1; + end + if ACCdefRis_TL(i,j) < 0.9 || ACCdefRis_TL(i,j) > 1.1 % Il nodo è fuori taratura! + dNS(i,j-1) = 0; + dEO(i,j-1) = 0; + dZ(i,j-1) = 0; + TempDef_TL(i,j) = TempDef_TL(i,j-1); + textA2 = ['' num2str(cont) ' correction executed for Tilt Link V - uncalibrated Acceleration vector!']; + cont3 = cont3+1; + end + end +end + +FileTemperature = ['' IDcentralina '-' DTcatena '-TLV-Therm.csv']; +if isfile(FileTemperature) == 1 + DatiRaw = csvread(FileTemperature); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; +else + rDR = 1; + cDR = 1; +end +for b = 1:c % Data + jj = 1; + for a = 1:r % Nodo + % NON considero i dati al di sopra dei 80 °C o al di sotto dei -30 °C! + if TempDef_TL(a,b) > Tmax || TempDef_TL(a,b) < Tmin + cont2 = cont2+1; + if b == 1 + if isfile(FileTemperature) == 1 + RawDate = find(DatiRaw(:,1)<=datenum(datainiTL)); + if isempty(RawDate) == 1 + cc = 2; + while cc <= c + if TempDef_TL(a,cc) > Tmax || TempDef_TL(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_TL(a,b) = TempDef_TL(a,cc); + else + if isnan(DatiRaw(RawDate(end),a+1)) == 0 + TempDef_TL(a,b) = DatiRaw(RawDate(end),a+1); + ErrTiltLink(b,a) = 0.5; + wardat = 'Temperature data of Tilt Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + else + cc = 2; + while cc <= c + if TempDef_TL(a,cc) > Tmax || TempDef_TL(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_TL(a,b) = TempDef_TL(a,cc); + end + end + else + cc = 2; + while cc <= c + if TempDef_TL(a,cc) > Tmax || TempDef_TL(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_TL(a,b) = TempDef_TL(a,cc); + end + else + TempDef_TL(a,b) = TempDef_TL(a,b-1); + dNS(a,b-1) = 0; + dEO(a,b-1) = 0; + dZ(a,b-1) = 0; + ErrTiltLink(b,a) = 0.5; + end + textT = ['' num2str(cont2) ' correction executed for Tilt Link V - Temperature filter!']; + end + jj = jj+1; + end +end + +if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=ARRAYdateTL(1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(ARRAYdateTL(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(ARRAYdateTL(:,1)>DatiRaw(RawDate1(end)+1,1)); + end +else + RawDate1 = []; + RawDate2 = 1; +end +if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:); ARRAYdateTL(RawDate2(1):end) TempDef_TL(:,RawDate2(1):end)']; +elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = [ARRAYdateTL TempDef_TL']; +else + Dati = DatiRaw; +end +% Elimino appoggio più vecchio di un mese +RawDate3 = find(Dati(:,1) Ndatidespike + NdatiF = NdatiMedia; + else + NdatiF = Ndatidespike; + end + ini = round(NdatiF/2)+1; + if rem(NdatiF,2) == 0 + ini = ini+1; + end + clear NDatiF + iniST = round(Wdevst/2); + if rem(Wdevst,2) == 0 + iniST = iniST+1; + end + iniST = iniST + margine; + if iniST > ini + ini = iniST; + end + if ini < 6 + ini = 6; + end + dNS = dNS(:,ini:end); + dEO = dEO(:,ini:end); + dZ = dZ(:,ini:end); + TempDef_TL = TempDef_TL(ini:end,:); + DatiElabTiltLink = DatiElabTiltLink(ini:end,:); + ARRAYdateTL = ARRAYdateTL(ini:end,1); + ErrTiltLink = ErrTiltLink(ini:end,:); +end + +%% Finalizzo i calcoli +[rNS,cNS] = size(dNS); +sommaX = zeros(rTL,1); +Xlocal = zeros(rNS,cNS+1); % totale del singolo nodo data per data +AlfaX = zeros(rNS,cNS+1); % Angoli +sommaY = zeros(rTL,1); +Ylocal = zeros(rNS,cNS+1); +AlfaY = zeros(rNS,cNS+1); % Angoli +sommaZ = zeros(rNS,cNS); +Zlocal = zeros(rNS,cNS+1); +X = zeros(rNS,cNS+1); % cumulata del singolo nodo data per data +Y = zeros(rNS,cNS+1); % il primo valore è 0 +Z = zeros(rNS,cNS+1); +HShift = zeros(rNS,cNS+1); +HShift_local = zeros(rNS,cNS+1); +Azimuth = zeros(rNS,cNS+1); +azim = zeros(rNS,cNS+1); % matrice di appoggio per il calcolo dell'azimuth +Speed = zeros(rTL,cNS+1); % Velocità 2D Cumulata +Speed_local = zeros(rTL,cNS+1); % Velocità 2D locale +Acceleration = zeros(rTL,cNS+1); % Accelerazione 2D Cumulata +Acceleration_local = zeros(rTL,cNS+1); % Accelerazione 2D Locale + +% Recupero i dati già elaborati +if NuovoZeroTL == 1 + [rE,cE] = size(DatiElabTiltLink); + cont = 3; + n = 1; + while cont<=cE + sommaX(n,1) = cell2mat(DatiElabTiltLink(1,cont))'; + Xlocal(n,1) = sommaX(n,1); + X(n,1) = cell2mat(DatiElabTiltLink(1,cont+3))'; + sommaY(n,1) = cell2mat(DatiElabTiltLink(1,cont+1))'; + Ylocal(n,1) = sommaY(n,1); + Y(n,1) = cell2mat(DatiElabTiltLink(1,cont+4))'; + for j = 1:rTL + AlfaX(j,1) = asind(Xlocal(j,1)/SpeTL(j)); + AlfaY(j,1) = asind(Ylocal(j,1)/SpeTL(j)); + end + Zlocal(n,1) = cell2mat(DatiElabTiltLink(1,cont+2))'; + Z(n,1) = cell2mat(DatiElabTiltLink(1,cont+5))'; + HShift(n,1) = cell2mat(DatiElabTiltLink(1,cont+6))'; + HShift_local(n,1) = cell2mat(DatiElabTiltLink(1,cont+7))'; + Azimuth(n,1) = cell2mat(DatiElabTiltLink(1,cont+8))'; + Speed(n,1:rE) = cell2mat(DatiElabTiltLink(:,cont+10))'; + Speed_local(n,1:rE) = cell2mat(DatiElabTiltLink(:,cont+11))'; + Acceleration(n,1:rE) = cell2mat(DatiElabTiltLink(:,cont+12))'; + Acceleration_local(n,1:rE) = cell2mat(DatiElabTiltLink(:,cont+13))'; + cont=cont+16; + n = n+1; + end +else + Zlocal(:,1) = SpeTL; + Z(:,1) = PsTL(2:end); +end + +% elaboro i dati nuovi +for iii = 1:cNS + Xlocal(:,iii+1) = sum(dNS(:,1:iii),2)+sommaX(:,1); + Ylocal(:,iii+1) = sum(dEO(:,1:iii),2)+sommaY(:,1); + for j = 1:rTL + AlfaX(j,iii+1) = asind(Xlocal(j,iii+1)/SpeTL(j)); + AlfaY(j,iii+1) = asind(Ylocal(j,iii+1)/SpeTL(j)); + end + sommaZ(:,iii+1) = sum(dZ(:,1:iii),2); + X(:,iii+1) = cumsum(Xlocal(:,iii+1)); + Y(:,iii+1) = cumsum(Ylocal(:,iii+1)); + Z(:,iii+1) = Z(:,1) - cumsum(sommaZ(:,iii+1)); + HShift(:,iii+1) = (X(:,iii+1).^2+Y(:,iii+1).^2).^0.5; + HShift_local(:,iii+1) = (Xlocal(:,iii+1).^2+Ylocal(:,iii+1).^2).^0.5; + Zlocal(:,iii+1) = SpeTL - sommaZ(:,iii+1); % Zeta è il singolo abbassamento di quel nodo + for rr = 1:rTL + azim(rr,iii) = (acos(abs(X(rr,iii))/HShift(rr,iii)))*180/3.141592654; % Angolo Teta in gradi 0° - 90° + segnoNS = sign(X(rr,iii)); + segnoEO = sign(Y(rr,iii)); + % L'azimuth si calcola con NS = 0, positivo in senso orario + % (90° = Est) + if segnoNS == 1 && segnoEO == 1 % quadrante 1 + Azimuth(rr,iii+1) = azim(rr,iii); % Teta lo tengo come è (1 quadrante) + elseif segnoNS == -1 && segnoEO == 1 % quadrante 2 + Azimuth(rr,iii+1) = 180 - azim(rr,iii); % 180-teta + elseif segnoNS == -1 && segnoEO == -1 % quadrante 3 + Azimuth(rr,iii+1) = 180 + azim(rr,iii); % 180+teta + elseif segnoNS == 1 && segnoEO == -1 % quadrante 4 + Azimuth(rr,iii+1) = 360 - azim(rr,iii); % 360-teta + elseif segnoNS == 0 && segnoEO == -1 % 270° + Azimuth(rr,iii+1) = 270; + elseif segnoNS == -1 && segnoEO == 0 % 180° + Azimuth(rr,iii+1) = 180; + end + end +end +Azimuth = real(Azimuth); + +%% Calcolo velocità di spostamento giornaliera +[numDate,~] = size(ARRAYdateTL); % numero di date +d = 1; +p = 1; +diffDate = 0; +n = 1; +period = 1; % calcolo giornaliero +ContSUP = []; +for dd = 1:numDate + while diffDate < period + d = d+1; + if d > numDate % Se d supera le date disponibili, esco dal ciclo while + break + end + diffDate = ARRAYdateTL(d) - ARRAYdateTL(p); + end + if d >numDate + break + end + ContSUP(n,1) = d; %#ok<*AGROW> % Creo matrice indici dell'estremo superiore della differenza + ContINF(n,1) = p; % Creo matrice indici dell'estremo inferiore della differenza + p = p+1; % passo alla data di partenza successiva + d = p; % resetto il conto di d + n = n+1; + diffDate = 0; +end + +check = isempty(ContSUP); +if check == 0 + [nDate,~] = size(ContSUP); + for s = 1:rTL + N = 1; + for dd = 1:nDate + Speed(s,ContSUP(N,1)) = (HShift(s,ContSUP(N,1))-HShift(s,ContINF(N,1)))... + /(ARRAYdateTL(ContSUP(N,1))-ARRAYdateTL(ContINF(N,1))); + Speed_local(s,ContSUP(N,1)) = (HShift_local(s,ContSUP(N,1))-HShift_local(s,ContINF(N,1)))... + /(ARRAYdateTL(ContSUP(N,1))-ARRAYdateTL(ContINF(N,1))); + Acceleration(s,ContSUP(N,1)) = (Speed(s,ContSUP(N,1))-Speed(s,ContINF(N,1)))... + /(ARRAYdateTL(ContSUP(N,1))-ARRAYdateTL(ContINF(N,1))); + Acceleration_local(s,ContSUP(N,1)) = (Speed_local(s,ContSUP(N,1))-Speed_local(s,ContINF(N,1)))... + /(ARRAYdateTL(ContSUP(N,1))-ARRAYdateTL(ContINF(N,1))); + N = N+1; + end + end +end + +% Approssimo i dati con il corretto numero di cifre decimali +[X,Y,Z,Xlocal,Ylocal,Zlocal,HShift,HShift_local,Azimuth,Speed,... + Speed_local,Acceleration,Acceleration_local,TempDef_TL] = approx(X,Y,Z,... + Xlocal,Ylocal,Zlocal,HShift,HShift_local,Azimuth,Speed,Speed_local,... + Acceleration,Acceleration_local,TempDef_TL,FileName); + +% Riordino matrice errori +[r,~] = size(ErrTiltLink); +Matrice_err = zeros(r,rTL); +for i = 1:r % date + d = 1; + for n = 1:rTL % nodi + j = 1; + err = ErrTiltLink(i,d:d+6); + while j <= 7 + if err(1,j) == 1 + Matrice_err(i,n) = 1; + break + end + if err(1,j) == 0.5 + Matrice_err(i,n) = 0.5; + end + j = j+1; + end + d = d+7; + end +end +ErrTiltLink = Matrice_err'; + +text = 'Tilt Link V biaxial calculation executed correctly. biax_TL function ended'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/biax_TLH.m b/Tilt/biax_TLH.m new file mode 100755 index 0000000..9e3a723 --- /dev/null +++ b/Tilt/biax_TLH.m @@ -0,0 +1,425 @@ +% Questa elaborazione semplificata NON usa i quaternioni e i dati di campo +% magnetico + +function [Y_TLH,Z_TLH,Xlocal_TLH,Ylocal_TLH,Zlocal_TLH,AlfaX_TLH,AlfaY_TLH,TempDef_TLH,... + Speed_TLH,Speed_local_TLH,Acceleration_TLH,Acceleration_local_TLH,ARRAYdateTLH,... + ErrTiltLinkH] = biax_TLH(IDcentralina,DTcatena,rTLH,ACCdef_TLH,ACCdefRis_TLH,... + TempDef_TLH,SpeTLH,PsTLH,tolleranzaAcc,DatiElabTiltLinkH,Ndevst,Wdevst,ARRAYdateTLH,... + NuovoZeroTLH,Tmax,Tmin,NodoTiltLinkH,NdatiMedia,Ndatidespike,Traversine,ErrTiltLinkH,... + margine,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'biax_TLH function started'; +fprintf(fileID,fmt,text); + +if NuovoZeroTLH == 1 + if NdatiMedia > Ndatidespike + Ndati = NdatiMedia; + else + Ndati = Ndatidespike; + end + ini = round(Ndati/2)+1; + if rem(Ndati,2) == 0 + ini = ini+1; + end + clear NDati + ini = ini + margine; + if ini < 6 + ini = 6; + end + if Ndevst ~= 0 % Allora prendo tutti i dati e solo in seguito considero i nuovi, a valle della funzione filtro + ini = 1; + end + ACCdef_TLH = ACCdef_TLH(ini:end,:); + ACCdefRis_TLH = ACCdefRis_TLH(ini:end,:); + TempDef_TLH = TempDef_TLH(ini:end,:); + DatiElabTiltLinkH = DatiElabTiltLinkH(ini:end,:); + ARRAYdateTLH = ARRAYdateTLH(ini:end,1); + ErrTiltLinkH = ErrTiltLinkH(ini:end,:); +end + +%% Definisco i dati +Nnodi = rTLH; + +% Spacchetto +[r,~] = size(ACCdefRis_TLH); % Numero di dati +[Ndati,~] = size(ARRAYdateTLH); +ax = zeros(r,Nnodi); +ay = zeros(r,Nnodi); +for i=1:Nnodi + ax(:,i) = ACCdef_TLH(:,(i-1)*3+1); % ax + ay(:,i) = ACCdef_TLH(:,(i-1)*3+2); % ay +end +ax = ax'; % riga nodi, colonna date +ay = ay'; % riga nodi, colonna date + +% Dati locali +asseX_TLH = zeros(Nnodi,Ndati); % Raccoglie i dati planari locali nella direzione perpendicolare allo sviluppo della catena +asseY_TLH = zeros(Nnodi,Ndati); % Raccoglie i dati planari locali nella direzione di sviluppo della catena +asseZ_TLH = zeros(Nnodi,Ndati); % Raccoglie i dati planari locali nella direzione di sviluppo della catena, basso->alto + +% Dati cumulati +Y_TLH = zeros(Nnodi,Ndati); % Raccoglie i dati cumulati nella direzione di sviluppo della catena +Z_TLH = zeros(Nnodi,Ndati); % Raccoglie i dati cumulati nella direzione di sviluppo della catena, basso->alto + +% Angoli +AlfaX_TLH = zeros(Nnodi,Ndati); +AlfaY_TLH = zeros(Nnodi,Ndati); + +% parametri per il calcolo +SpeTLH = SpeTLH(2:end,1); % valori segmenti di pertinenza +PsTLH = PsTLH(2:end,1); % valori posizioni punti di calcolo + +% Inizio del ciclo di elaborazione +text = 'Elaboration of Tilt Link H started'; +fprintf(fileID,fmt,text); + +% Nodi nuovi (lo devo sapere per le convenzioni) +% I due assi sono a 90° di cui asse Y a 90° verso sinistra rispetto allo +% sviluppo della catena, asse X a 0° coincidente con lo sviluppo della catena. +% L'asse Z è verso il basso. +for jj = 1:Ndati + for ii = 1:Nnodi + [Y_TLH,Z_TLH,asseX_TLH,asseY_TLH,asseZ_TLH,AlfaX_TLH,AlfaY_TLH] = CalcoloBiax_TLH(... + SpeTLH,PsTLH,ii,jj,ax,ay,asseX_TLH,asseY_TLH,asseZ_TLH,Y_TLH,Z_TLH,AlfaX_TLH,... + AlfaY_TLH,Traversine); + end +end +dX_TLH = diff(asseX_TLH,1,2); +dY_TLH = diff(asseY_TLH,1,2); +dZ_TLH = diff(asseZ_TLH,1,2); + +%% Controllo delle risultanti di accelerazione e campo magnetico +clear r +clear rr +clear c +clear cc +ACCdefRis_TLH = ACCdefRis_TLH'; % Nodi in riga, date in colonna +[r,c] = size(ACCdefRis_TLH); +[rr,cc] = size(asseZ_TLH); + +% controllo che le matrici con le risultanti delle accelerazioni e +% le matrici con i dati di spostamento abbiano le stesse dimensioni +if r~=rr + text = '---Warning! Number of row of displacement data do not correspond to the number of acceleration cosine vector!---'; + fprintf(fileID,fmt,text); +end +if c~=cc + text = '---Warning! Number of column of displacement data do not correspond to the number of acceleration cosine vector!---'; + fprintf(fileID,fmt,text); +end +clear i +clear j +cont = 1; % contatore +cont2 = 1; % contatore +cont3 = 1; % contatore +TempDef_TLH = TempDef_TLH'; +textA = 'There are not correction of Tilt Link H based on acceleration vectors filter'; +textA2 = 'There are not correction of Tilt Link H based on uncalibrated acceleration vectors'; +textT = 'There are not correction of Tilt Link H based on temperature filter'; +for j = 2:c % data + for i = 1:r % nodo + % se il valore assoluto della differenza è maggiore della + % tolleranza, pongo gli spostamenti giornalieri pari a 0 + if abs(ACCdefRis_TLH(i,j)-ACCdefRis_TLH(i,j-1)) > tolleranzaAcc + dX_TLH(i,j-1) = 0; + dY_TLH(i,j-1) = 0; + dZ_TLH(i,j-1) = 0; + textA = ['' num2str(cont) ' correction executed for Tilt Link H - Acceleration vector filter!']; + cont = cont+1; + end + if ACCdefRis_TLH(i,j) < 0.9 || ACCdefRis_TLH(i,j) > 1.1 % Il nodo è fuori taratura! + dX_TLH(i,j-1) = 0; + dY_TLH(i,j-1) = 0; + dZ_TLH(i,j-1) = 0; + TempDef_TLH(i,j) = TempDef_TLH(i,j-1); + textA2 = ['' num2str(cont3) ' correction executed for Tilt Link H - uncalibrated Acceleration vector!']; + cont3 = cont3+1; + end + end +end + +FileTemperature = ['' IDcentralina '-' DTcatena '-TLH-Therm.csv']; +if isfile(FileTemperature) == 1 + DatiRaw = csvread(FileTemperature); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; +else + rDR = 1; + cDR = 1; +end +for b = 1:c % Data + for a = 1:r % Nodo + % NON considero i dati al di sopra dei 80 °C o al di sotto dei -30 °C! + if TempDef_TLH(a,b) > Tmax || TempDef_TLH(a,b) < Tmin + cont2 = cont2+1; + if b == 1 + if isfile(FileTemperature) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + RawDate = find(DatiRaw(:,1)<=datenum(datainiTLH)); + if isempty(RawDate) == 1 + cc = 2; + while cc <= c + if TempDef_TLH(a,cc) > Tmax || TempDef_TLH(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_TLH(a,b) = TempDef_TLH(a,cc); + else + if isnan(DatiRaw(RawDate(end),a+1)) == 0 + TempDef_TLH(a,b) = DatiRaw(RawDate(end),a+1); + ErrTiltLinkH(1,a) = 0.5; + wardat = 'Temperature data of Tilt Link H nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + else + cc = 2; + while cc <= c + if TempDef_TLH(a,cc) > Tmax || TempDef_TLH(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_TLH(a,b) = TempDef_TLH(a,cc); + end + end + else + cc = 2; + while cc <= c + if TempDef_TLH(a,cc) > Tmax || TempDef_TLH(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_TLH(a,b) = TempDef_TLH(a,cc); + end + else + TempDef_TLH(a,b) = TempDef_TLH(a,b-1); + dY_TLH(i,j-1) = 0; + dZ_TLH(i,j-1) = 0; + ErrTiltLinkH(1,a) = 0.5; + end + textT = ['' num2str(cont2) ' correction executed for Tilt Link H - Temperature filter!']; + end + end +end + +if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=ARRAYdateTLH(1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(ARRAYdateTLH(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(ARRAYdateTLH(:,1)>DatiRaw(RawDate1(end)+1,1)); + end +else + RawDate1 = []; + RawDate2 = 1; +end +if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:); ARRAYdateTLH(RawDate2(1):end) TempDef_TLH(:,RawDate2(1):end)']; +elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = [ARRAYdateTLH TempDef_TLH']; +else + Dati = DatiRaw; +end +% Elimino appoggio più vecchio di un mese +RawDate3 = find(Dati(:,1) Ndatidespike + NdatiF = NdatiMedia; + else + NdatiF = Ndatidespike; + end + ini = round(NdatiF/2)+1; + if rem(NdatiF,2) == 0 + ini = ini+1; + end + clear NDatiF + iniST = round(Wdevst/2); + if rem(Wdevst,2) == 0 + iniST = iniST+1; + end + iniST = iniST + margine; + if iniST > ini + ini = iniST; + end + if ini < 6 + ini = 6; + end + dX_TLH = dX_TLH(:,ini:end); + dY_TLH = dY_TLH(:,ini:end); + dZ_TLH = dZ_TLH(:,ini:end); + TempDef_TLH = TempDef_TLH(ini:end,:); + DatiElabTiltLinkH = DatiElabTiltLinkH(ini:end,:); + ARRAYdateTLH = ARRAYdateTLH(ini:end,1); + ErrTiltLinkH = ErrTiltLinkH(ini:end,:); +end + +%% Finalizzo i calcoli +[rx,cx] = size(dZ_TLH); +% totale del singolo nodo data per data +sommaX_TLH = zeros(rx,cx+1); +sommaY_TLH = zeros(rx,cx+1); +sommaZ_TLH = zeros(rx,cx+1); +% cumulata del singolo nodo data per data in posizione assoluta +% il primo valore è quello di posizione assoluta iniziale +Y_TLH = zeros(rx,cx+1); +Z_TLH = zeros(rx,cx+1); +% cumulata del singolo nodo data per data in posizione relativa +% il primo valore è quello di posizione assoluta iniziale +Xlocal_TLH = zeros(Nnodi,Ndati); +Ylocal_TLH = zeros(Nnodi,Ndati); +Zlocal_TLH = zeros(Nnodi,Ndati); +Speed_TLH = zeros(Nnodi,Ndati); +Speed_local_TLH = zeros(Nnodi,Ndati); +Acceleration_TLH = zeros(Nnodi,Ndati); +Acceleration_local_TLH = zeros(Nnodi,Ndati); + +if NuovoZeroTLH == 1 + [rE,cE] = size(DatiElabTiltLinkH); + cont = 4; + n = 1; + while cont<=cE + sommaX_TLH(n,1) = cell2mat(DatiElabTiltLinkH(1,cont-1))'; + Xlocal_TLH(n,1) = sommaX_TLH(n,1); + sommaY_TLH(n,1) = cell2mat(DatiElabTiltLinkH(1,cont))'; + Ylocal_TLH(n,1) = sommaY_TLH(n,1); + sommaZ_TLH(n,1) = cell2mat(DatiElabTiltLinkH(1,cont+1))'; + Zlocal_TLH(n,1) = sommaZ_TLH(n,1); + Y_TLH(n,1) = cell2mat(DatiElabTiltLinkH(1,cont+3))'; + Z_TLH(n,1) = cell2mat(DatiElabTiltLinkH(1,cont+4))'; + Speed_local_TLH(n,1:rE) = cell2mat(DatiElabTiltLinkH(:,cont+7))'; + Speed_TLH(n,1:rE) = cell2mat(DatiElabTiltLinkH(:,cont+6))'; + Acceleration_local_TLH(n,1:rE) = cell2mat(DatiElabTiltLinkH(:,cont+9))'; + Acceleration_TLH(n,1:rE) = cell2mat(DatiElabTiltLinkH(:,cont+8))'; + cont = cont+13; + n = n+1; + end +else + % Primo dato + Y_TLH(:,1) = PsTLH; + Z_TLH(:,1) = 0; +end +for iii = 1:cx % date + % somma singoli spostamenti del singolo nodo + sommaX_TLH(:,iii+1) = sum(dX_TLH(:,1:iii),2)+sommaX_TLH(:,1); + sommaY_TLH(:,iii+1) = sum(dY_TLH(:,1:iii),2)+sommaY_TLH(:,1); + sommaZ_TLH(:,iii+1) = sum(dZ_TLH(:,1:iii),2)+sommaZ_TLH(:,1); + % spostamenti locali riferiti allo 0 + Xlocal_TLH(:,iii+1) = sommaX_TLH(:,iii+1); + Ylocal_TLH(:,iii+1) = sommaY_TLH(:,iii+1); + Zlocal_TLH(:,iii+1) = sommaZ_TLH(:,iii+1); + % cumulata spostamenti + Y_TLH(:,iii+1) = Y_TLH(:,1) + cumsum(sommaY_TLH(:,iii+1)) - cumsum(sommaY_TLH(:,1)); + Z_TLH(:,iii+1) = Z_TLH(:,1) + cumsum(sommaZ_TLH(:,iii+1)) - cumsum(sommaZ_TLH(:,1)); +end + +%% Calcolo velocità di spostamento giornaliera +[numDate,~] = size(ARRAYdateTLH); % numero di date +d = 1; +p = 1; +diffDate = 0; +n = 1; +period = 1; % calcolo giornaliero +ContSUP = []; +for dd = 1:numDate + while diffDate < period + d = d+1; + if d > numDate % Se d supera le date disponibili, esco dal ciclo while + break + end + diffDate = ARRAYdateTLH(d) - ARRAYdateTLH(p); + end + if d >numDate + break + end + ContSUP(n,1) = d; %#ok<*AGROW> % Creo matrice indici dell'estremo superiore della differenza + ContINF(n,1) = p; % Creo matrice indici dell'estremo inferiore della differenza + p = p+1; % passo alla data di partenza successiva + d = p; % resetto il conto di d + n = n+1; + diffDate = 0; +end + +check = isempty(ContSUP); +if check == 0 + [nDate,~] = size(ContSUP); + for s = 1:rTLH + N = 1; + for dd = 1:nDate + Speed_TLH(s,ContSUP(N,1)) = (Z_TLH(s,ContSUP(N,1))-Z_TLH(s,ContINF(N,1)))/(ARRAYdateTLH(ContSUP(N,1))-ARRAYdateTLH(ContINF(N,1))); + Speed_local_TLH(s,ContSUP(N,1)) = (Zlocal_TLH(s,ContSUP(N,1))-Zlocal_TLH(s,ContINF(N,1)))/(ARRAYdateTLH(ContSUP(N,1))-ARRAYdateTLH(ContINF(N,1))); + Acceleration_TLH(s,ContSUP(N,1)) = (Speed_TLH(s,ContSUP(N,1))-Speed_TLH(s,ContINF(N,1)))/(ARRAYdateTLH(ContSUP(N,1))-ARRAYdateTLH(ContINF(N,1))); + Acceleration_local_TLH(s,ContSUP(N,1)) = (Speed_local_TLH(s,ContSUP(N,1))-Speed_local_TLH(s,ContINF(N,1)))/(ARRAYdateTLH(ContSUP(N,1))-ARRAYdateTLH(ContINF(N,1))); + N = N+1; + end + end +end + +fclose(fileID); +% Approssimo i dati con il corretto numero di cifre decimali +[Y_TLH,Z_TLH,Ylocal_TLH,Zlocal_TLH,Speed_TLH,Speed_local_TLH,... + Acceleration_TLH,Acceleration_local_TLH,TempDef_TLH] = approx_TLH(... + Y_TLH,Z_TLH,Ylocal_TLH,Zlocal_TLH,Speed_TLH,Speed_local_TLH,... + Acceleration_TLH,Acceleration_local_TLH,TempDef_TLH,FileName); + +% Riordino matrice errori +[r,~] = size(ErrTiltLinkH); +Matrice_err = zeros(r,rTLH); +for i = 1:r % date + d = 1; + for n = 1:rTLH % nodi + j = 1; + err = ErrTiltLinkH(i,d:d+3); + while j <= 4 + if err(1,j) == 1 + Matrice_err(i,n) = 1; + end + j = j+1; + end + d = d+4; + end +end +ErrTiltLinkH = Matrice_err'; + +text = 'Tilt Link H calculation executed correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/Tilt/biax_TLHR.m b/Tilt/biax_TLHR.m new file mode 100755 index 0000000..b840250 --- /dev/null +++ b/Tilt/biax_TLHR.m @@ -0,0 +1,523 @@ +%% Funzione che calcola gli spostamenti in modalità biassiale per i +% Tilt Link HR (ampolle) + +function [X_HR,Y_HR,Z_HR,Xlocal_HR,Ylocal_HR,Zlocal_HR,HShift_HR,HShift_local_HR,... + AlfaX_HR,AlfaY_HR,Azimuth_HR,Speed_local_HR,Speed_HR,Acceleration_local_HR,... + Acceleration_HR,TempDef_TLHR,ARRAYdateTLHR,ErrTiltLinkHR] = biax_TLHR(IDcentralina,... + DTcatena,rTLHR,rTL,ANGdef_TLHR,ACCdef_TL,MAGdef_TL,TempDef_TLHR,SpeTLHR,... + PsTLHR,yesTL,yesTLHR3D,NodoTiltLinkHR,NodoTiltLink,NodoTiltLinkHR3D,... + DatiElabTiltLinkHR,segnoNS_HR,segnoEO_HR,Ndevst_HR,Wdevst_HR,ARRAYdateTLHR,... + NuovoZeroTLHR,NdatiMedia,Ndatidespike,allineato,ErrTiltLinkHR,Tmax,Tmin,datainiTLHR,... + margine,date,FileName) + +%% Inizializzazione +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'biax_TLHR function started'; +fprintf(fileID,fmt,text); + +if NuovoZeroTLHR == 1 + if NdatiMedia > Ndatidespike + Ndati = NdatiMedia; + else + Ndati = Ndatidespike; + end + ini = round(Ndati/2)+1; + if rem(Ndati,2) == 0 + ini = ini+1; + end + clear NDati + ini = ini + margine; + if ini < 6 + ini = 6; + end + if Ndevst_HR ~= 0 % Allora prendo tutti i dati e solo in seguito considero i nuovi, a valle della funzione filtro + ini = 1; + end + [rA,~] = size(ANGdef_TLHR); % Numero di dati delle ampolle + [rM,~] = size(ACCdef_TL); % Numero di dati dei MEMS + if rA~=rM + if rM > rA + ini_MEMS = rM-rA+ini; + ini_Ampolle = ini; + elseif rM < rA + ini_Ampolle = rA-rM+ini; % Si presume che la data finale sia identica per entrambi + ini_MEMS = ini; + end + else + ini_MEMS = ini; + ini_Ampolle = ini; + end + ANGdef_TLHR = ANGdef_TLHR(ini_Ampolle:end,:); + MAGdef_TL = MAGdef_TL(ini_MEMS:end,:); + TempDef_TLHR = TempDef_TLHR(ini_Ampolle:end,:); + DatiElabTiltLinkHR = DatiElabTiltLinkHR(ini_Ampolle:end,:); + ARRAYdateTLHR = ARRAYdateTLHR(ini_Ampolle:end,1); + ErrTiltLinkHR = ErrTiltLinkHR(ini_Ampolle:end,:); +end + +%% Elaborazione sfruttando il magnetometro del MEMS +if allineato == 0 && yesTLHR3D == 1 + + % Definisco i dati MEMS + [r,~] = size(MAGdef_TL); + Nnodi = rTL; + mx = zeros(r,Nnodi); + my = zeros(r,Nnodi); + for i=1:Nnodi + mx(:,i)= -1*MAGdef_TL(:,(i-1)*3+1); % mx + my(:,i) = -1*MAGdef_TL(:,(i-1)*3+2:(i-1)*3+2); % my + end + + mx = mx'; % riga nodi, colonna date + my = my'; % riga nodi, colonna date + + NodoTiltLink = cell2mat(NodoTiltLink(:,2)); + NodoDoppio = cell2mat(NodoTiltLinkHR3D(:,2)); + [S] = size(NodoDoppio); + Nodes = zeros(S(1),1); + for s = 1:S(1) + Nodes(s,1) = find(NodoTiltLink == NodoDoppio(s,1)); + end +end + +% Definisco i dati della cella elettrolitica +[Ndate,~] = size(ARRAYdateTLHR); +Nnodi = rTLHR; +AngoloX = zeros(Ndate,Nnodi); % angoli di inclinazione asse X +AngoloY = zeros(Ndate,Nnodi); % angoli di inclinazione asse Y +ii = 1; +for i=1:Nnodi + AngoloX(:,i) = ANGdef_TLHR(:,ii); % ax + AngoloY(:,i) = ANGdef_TLHR(:,ii+1);% ay + ii = ii+2; +end + +AngoloX = AngoloX'; +AngoloY = AngoloY'; + +%% Costruzione delle matrici spostamento e rotazione +sX = zeros(rTLHR,Ndate); % in riga i nodi, in colonna le date +sY = zeros(rTLHR,Ndate); +sZ = zeros(rTLHR,Ndate); + +% Inizio del ciclo di elaborazione +text = 'Elaboration of Tilt Link HR V started'; +fprintf(fileID,fmt,text); + +for Imis = 1:Ndate % date + for jjj=1:Nnodi % nodi + %% Uso magnetometro MEMS + if allineato == 0 && yesTLHR3D == 1 % uso il magnetometro del MEMS + Mx = mx(Nodes(jjj,1),:); + My = my(Nodes(jjj,1),:); + angle = arotHR(Mx,My,Imis); + % angolo di inclinazione rispetto all'orizzontale registrato da asse x + xAngTLHR = AngoloX(jjj,Imis); + % angolo di inclinazione rispetto all'orizzontale registrato da asse y + yAngTLHR = AngoloY(jjj,Imis); + % converto gli angoli in radianti (matlab ragiona così) + xAngTLHR = 0.01745329251994329576923690768489*xAngTLHR; + yAngTLHR = 0.01745329251994329576923690768489*yAngTLHR; + % Segmento di pertinenza + if yesTLHR3D == 1 + SpTLHR = SpeTLHR(jjj+1); % correzione che salta l'ancora + else + % Correzione che salta l'ancora e il primo nodo Tilt Link (se + % presente) + SpTLHR = SpeTLHR(jjj+2); + end + % Finalizzo + if datenum(date) > 737643 % Codice post Correzione + [Na,Ea,Za] = ASSEa_HR(xAngTLHR,angle,SpTLHR); + [Nb,Eb,Zb] = ASSEb_HR(yAngTLHR,angle,SpTLHR); + else % Codice pre-correzione + [Na,Ea,Za] = ASSEa_HR(xAngTLHR,angle,SpTLHR); + [Nb,Eb,Zb] = ASSEb_HR_OLD(yAngTLHR,angle,SpTLHR); + end + sX(jjj,Imis) = Na+Nb; + sY(jjj,Imis) = Ea+Eb; + % Calcolo l'abbassamento (positivo) considerando il MAGGIORE dei due calcolati sui due assi + sZ(jjj,Imis) = max(Za,Zb); + else + %% NON uso magnetometro MEMS + + % angolo di inclinazione rispetto all'orizzontale registrato da asse x + xAngTLHR = AngoloX(jjj,Imis); + % angolo di inclinazione rispetto all'orizzontale registrato da asse y + yAngTLHR = AngoloY(jjj,Imis); + % converto gli angoli in radianti (matlab ragiona così) + xAngTLHR = 0.01745329251994329576923690768489*xAngTLHR; + yAngTLHR = 0.01745329251994329576923690768489*yAngTLHR; + % Segmento di pertinenza + if yesTL == 1 + if yesTLHR3D == 1 + SpTLHR = SpeTLHR(jjj+1); % correzione che salta l'ancora + else + % Correzione che salta l'ancora e il primo nodo Tilt Link (se + % presente) + SpTLHR = SpeTLHR(jjj+2); + end + else + SpTLHR = SpeTLHR(jjj+1); % correzione che salta l'ancora + end + % calcolo spostamenti lungo x e y + sX(jjj,Imis) = SpTLHR*sin(xAngTLHR); + sY(jjj,Imis) = SpTLHR*sin(yAngTLHR); + % Abbassamento registrato dai due assi + sXZ = SpTLHR - SpTLHR*cos(xAngTLHR); + sYZ = SpTLHR - SpTLHR*cos(yAngTLHR); + % Calcolo l'abbassamento considerando il maggiore dei due calcolati sui due assi + sZ(jjj,Imis) = max(sXZ,sYZ); + + end + end +end + +% dsX, dsY e dsZ raccolgono i dati del singolo nodo nella singola data +dsX = diff(sX,1,2); +dsY = diff(sY,1,2); +dsZ = diff(sZ,1,2); + +%% Cambio di segno le direzioni! +if segnoNS_HR == 0 + dsX= -1*dsX; +end +if segnoEO_HR == 0 + dsY = -1*dsY; +end + +%% Filtro su temperatura +clear i +clear j +cont2 = 1; % contatore +TempDef_TLHR = TempDef_TLHR'; +textT = 'There are not correction of Tilt Link HR V based on temperature filter'; + +FileTemperature = ['' IDcentralina '-' DTcatena '-TLHR-Therm.csv']; +if isfile(FileTemperature) == 1 + DatiRaw = csvread(FileTemperature); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; +else + rDR = 1; + cDR = 1; +end +for j = 1:Ndate % Data + for i = 1:Nnodi % Nodo + % NON considero i dati al di sopra di Tmax o al di sotto di Tmin + if TempDef_TLHR(i,j) > Tmax || TempDef_TLHR(i,j) < Tmin + cont2 = cont2+1; + if j == 1 + if isfile(FileTemperature) == 1 + RawDate = find(DatiRaw(:,1)<=datenum(datainiTLHR)); + if isempty(RawDate) == 1 + cc = 2; + while cc <= Ndate + if TempDef_TLHR(i,cc) > Tmax || TempDef_TLHR(i,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_TLHR(i,j) = TempDef_TLHR(i,cc); + else + if isnan(DatiRaw(RawDate(end),i+1)) == 0 + TempDef_TLHR(i,j) = DatiRaw(RawDate(end),i+1); + ErrTiltLinkHR(j,i) = 0.5; + wardat = 'Temperature data of Tilt Link HR nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + else + cc = 2; + while cc <= c + if TempDef_TLHR(i,cc) > Tmax || TempDef_TLHR(i,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_TLHR(i,j) = TempDef_TLHR(i,cc); + end + end + else + cc = 2; + while cc <= c + if TempDef_TLHR(i,cc) > Tmax || TempDef_TLHR(i,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_TLHR(i,j) = TempDef_TLHR(i,cc); + end + else + dsX(i,j-1) = 0; + dsY(i,j-1) = 0; + dsZ(i,j-1) = 0; + TempDef_TLHR(i,j) = TempDef_TLHR(i,j-1); + ErrTiltLinkHR(j,i) = 0.5; + end + end + textT = ['' num2str(cont2) ' correction executed for Tilt Link HR V - Temperature filter!']; + end +end + +if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=ARRAYdateTLHR(1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(ARRAYdateTLHR(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(ARRAYdateTLHR(:,1)>DatiRaw(RawDate1(end)+1,1)); + end +else + RawDate1 = []; + RawDate2 = 1; +end +if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:); ARRAYdateTLHR(RawDate2(1):end) TempDef_TLHR(:,RawDate2(1):end)']; +elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = [ARRAYdateTLHR TempDef_TLHR']; +else + Dati = DatiRaw; +end +% Elimino appoggio più vecchio di un mese +RawDate3 = find(Dati(:,1) Ndatidespike + NdatiF = NdatiMedia; + else + NdatiF = Ndatidespike; + end + ini = round(NdatiF/2)+1; + if rem(NdatiF,2) == 0 + ini = ini+1; + end + clear NDatiF + iniST = round(Wdevst_HR/2); + if rem(Wdevst_HR,2) == 0 + iniST = iniST+1; + end + iniST = iniST + margine; + if iniST > ini + ini = iniST; + end + if ini < 6 + ini = 6; + end + dsX = dsX(:,ini:end); + dsY = dsY(:,ini:end); + dsZ = dsZ(:,ini:end); + TempDef_TLHR = TempDef_TLHR(ini:end,:); + DatiElabTiltLinkHR = DatiElabTiltLinkHR(ini:end,:); + ARRAYdateTLHR = ARRAYdateTLHR(ini:end,1); + ErrTiltLinkHR = ErrTiltLinkHR(ini:end,:); +end + +%% Finalizzo i calcoli +[rX,cX] = size(dsX); +sommaX_HR = zeros(rTLHR,1); +Xlocal_HR = zeros(rX,cX+1); % totale del singolo nodo data per data +AlfaX_HR = zeros(rX,cX+1); % Angoli +sommaY_HR = zeros(rTLHR,1); +Ylocal_HR = zeros(rX,cX+1); +AlfaY_HR = zeros(rX,cX+1); % Angoli +sommaZ_HR = zeros(rX,cX+1); +Zlocal_HR = zeros(rX,cX+1); +X_HR = zeros(rX,cX+1); % cumulata del singolo nodo data per data +Y_HR = zeros(rX,cX+1); % il primo valore è 0 +Z_HR = zeros(rX,cX+1); +HShift_HR = zeros(rX,cX+1); +HShift_local_HR = zeros(rX,cX+1); +Azimuth_HR = zeros(rX,cX+1); +azim_HR = zeros(rX,cX+1); % matrice di appoggio per il calcolo dell'azimuth +Speed_HR = zeros(rTLHR,cX+1); % Velocità 2D Cumulata +Speed_local_HR = zeros(rTLHR,cX+1); % Velocità 2D locale +Acceleration_HR = zeros(rTLHR,cX+1); % Accelerazione 2D Cumulata +Acceleration_local_HR = zeros(rTLHR,cX+1); % Accelerazione 2D Locale +if yesTL == 1 + if yesTLHR3D == 1 + SpeTLHR = SpeTLHR(2:end); % correzione che salta l'ancora + else + % Correzione che salta l'ancora e il primo nodo Tilt Link (se + % presente) + SpeTLHR = SpeTLHR(3:end); + end +else + SpeTLHR = SpeTLHR(2:end); % correzione che salta l'ancora +end +% Recupero i dati già elaborati +if NuovoZeroTLHR == 1 + [rE,cE] = size(DatiElabTiltLinkHR); + cont = 3; + n = 1; + while cont<=cE + sommaX_HR(n,1) = cell2mat(DatiElabTiltLinkHR(1,cont))'; + Xlocal_HR(n,1) = sommaX_HR(n,1); + X_HR(n,1) = cell2mat(DatiElabTiltLinkHR(1,cont+3))'; + sommaY_HR(n,1) = cell2mat(DatiElabTiltLinkHR(1,cont+1))'; + Ylocal_HR(n,1) = sommaY_HR(n,1); + Y_HR(n,1) = cell2mat(DatiElabTiltLinkHR(1,cont+4))'; + for j = 1:rTLHR + AlfaX_HR(j,1) = asind(Xlocal_HR(j,1)/SpeTLHR(j)); + AlfaY_HR(j,1) = asind(Ylocal_HR(j,1)/SpeTLHR(j)); + end + Zlocal_HR(n,1) = cell2mat(DatiElabTiltLinkHR(1,cont+2))'; + sommaZ_HR(n,1) = SpeTLHR(n,1)-Zlocal_HR(n,1); + Z_HR(n,1) = cell2mat(DatiElabTiltLinkHR(1,cont+5))'; + HShift_HR(n,1) = cell2mat(DatiElabTiltLinkHR(1,cont+6))'; + HShift_local_HR(n,1) = cell2mat(DatiElabTiltLinkHR(1,cont+7))'; + Azimuth_HR(n,1) = cell2mat(DatiElabTiltLinkHR(1,cont+8))'; + Speed_HR(n,1:rE) = cell2mat(DatiElabTiltLinkHR(:,cont+10))'; + Speed_local_HR(n,1:rE) = cell2mat(DatiElabTiltLinkHR(:,cont+11))'; + Acceleration_HR(n,1:rE) = cell2mat(DatiElabTiltLinkHR(:,cont+12))'; + Acceleration_local_HR(n,1:rE) = cell2mat(DatiElabTiltLinkHR(:,cont+13))'; + cont=cont+16; + n = n+1; + end +else + Zlocal_HR(:,1) = SpeTLHR; + Z_HR(:,1) = PsTLHR(2:end); +end + +% elaboro i dati nuovi +for iii = 1:cX + Xlocal_HR(:,iii+1) = sum(dsX(:,1:iii),2)+sommaX_HR(:,1); + Ylocal_HR(:,iii+1) = sum(dsY(:,1:iii),2)+sommaY_HR(:,1); + for j = 1:rTLHR + AlfaX_HR(j,iii+1) = asind(Xlocal_HR(j,iii+1)/SpeTLHR(j)); + AlfaY_HR(j,iii+1) = asind(Ylocal_HR(j,iii+1)/SpeTLHR(j)); + end + sommaZ_HR(:,iii+1) = sum(dsZ(:,1:iii),2); + X_HR(:,iii+1) = cumsum(Xlocal_HR(:,iii+1)); + Y_HR(:,iii+1) = cumsum(Ylocal_HR(:,iii+1)); + Z_HR(:,iii+1) = Z_HR(:,1) - cumsum(sommaZ_HR(:,iii+1)); + HShift_HR(:,iii+1) = (X_HR(:,iii+1).^2+Y_HR(:,iii+1).^2).^0.5; + HShift_local_HR(:,iii+1) = (Xlocal_HR(:,iii+1).^2+Ylocal_HR(:,iii+1).^2).^0.5; + Zlocal_HR(:,iii+1) = SpeTLHR - sommaZ_HR(:,iii+1); % Zeta è il singolo abbassamento di quel nodo + for rr = 1:rTLHR + azim_HR(rr,iii) = (acos(abs(X_HR(rr,iii))/HShift_HR(rr,iii)))*180/3.141592654; % Angolo Teta in gradi 0° - 90° + segnoNS = sign(X_HR(rr,iii)); + segnoEO = sign(Y_HR(rr,iii)); + % L'azimuth si calcola con NS = 0, positivo in senso orario + % (90° = Est) + if segnoNS == 1 && segnoEO == 1 % quadrante 1 + Azimuth_HR(rr,iii+1) = azim_HR(rr,iii); % Teta lo tengo come è (1 quadrante) + elseif segnoNS == -1 && segnoEO == 1 % quadrante 2 + Azimuth_HR(rr,iii+1) = 180 - azim_HR(rr,iii); % 180-teta + elseif segnoNS == -1 && segnoEO == -1 % quadrante 3 + Azimuth_HR(rr,iii+1) = 180 + azim_HR(rr,iii); % 180+teta + elseif segnoNS == 1 && segnoEO == -1 % quadrante 4 + Azimuth_HR(rr,iii+1) = 360 - azim_HR(rr,iii); % 360-teta + elseif segnoNS == 0 && segnoEO == -1 % 270° + Azimuth_HR(rr,iii+1) = 270; + elseif segnoNS == -1 && segnoEO == 0 % 180° + Azimuth_HR(rr,iii+1) = 180; + end + end +end +Azimuth_HR = real(Azimuth_HR); + +%% Calcolo velocità di spostamento giornaliera +[numDate,~] = size(ARRAYdateTLHR); % numero di date +d = 1; +p = 1; +diffDate = 0; +n = 1; +period = 1; % calcolo giornaliero +ContSUP = []; +for dd = 1:numDate + while diffDate < period + d = d+1; + if d > numDate % Se d supera le date disponibili, esco dal ciclo while + break + end + diffDate = ARRAYdateTLHR(d) - ARRAYdateTLHR(p); + end + if d >numDate + break + end + ContSUP(n,1) = d; % Creo matrice indici dell'estremo superiore della differenza + ContINF(n,1) = p; % Creo matrice indici dell'estremo inferiore della differenza + p = p+1; % passo alla data di partenza successiva + d = p; % resetto il conto di d + n = n+1; + diffDate = 0; +end + +check = isempty(ContSUP); +if check == 0 + [nDate,~] = size(ContSUP); + for s = 1:rTLHR + N = 1; + for dd = 1:nDate + Speed_HR(s,ContSUP(N,1)) = (HShift_HR(s,ContSUP(N,1))-HShift_HR(s,ContINF(N,1)))/(ARRAYdateTLHR(ContSUP(N,1))-ARRAYdateTLHR(ContINF(N,1))); + Speed_local_HR(s,ContSUP(N,1)) = (HShift_local_HR(s,ContSUP(N,1))-HShift_local_HR(s,ContINF(N,1)))/(ARRAYdateTLHR(ContSUP(N,1))-ARRAYdateTLHR(ContINF(N,1))); + Acceleration_HR(s,ContSUP(N,1)) = (Speed_HR(s,ContSUP(N,1))-Speed_HR(s,ContINF(N,1)))/(ARRAYdateTLHR(ContSUP(N,1))-ARRAYdateTLHR(ContINF(N,1))); + Acceleration_local_HR(s,ContSUP(N,1)) = (Speed_local_HR(s,ContSUP(N,1))-Speed_local_HR(s,ContINF(N,1)))/(ARRAYdateTLHR(ContSUP(N,1))-ARRAYdateTLHR(ContINF(N,1))); + N = N+1; + end + end +end + +% Approssimo i dati con il corretto numero di cifre decimali +[X_HR,Y_HR,Z_HR,Xlocal_HR,Ylocal_HR,Zlocal_HR,HShift_HR,... + HShift_local_HR,Azimuth_HR,Speed_HR,Speed_local_HR,Acceleration_HR,... + Acceleration_local_HR,TempDef_TLHR] = approx_TLHR(X_HR,Y_HR,Z_HR,... + Xlocal_HR,Ylocal_HR,Zlocal_HR,HShift_HR,HShift_local_HR,Azimuth_HR,... + Speed_HR,Speed_local_HR,Acceleration_HR,Acceleration_local_HR,TempDef_TLHR,FileName); + +% Matrice errori +[r,~] = size(ErrTiltLinkHR); +Matrice_err = zeros(r,rTLHR); +for i = 1:r % date + d = 1; + for n = 1:rTLHR % nodi + j = 1; + err = ErrTiltLinkHR(i,d:d+5); + while j <= 6 + if err(1,j) == 1 + Matrice_err(i,n) = 1; + break + end + if err(1,j) == 0.5 + Matrice_err(i,n) = 0.5; + end + j = j+1; + end + d = d+6; + end +end +ErrTiltLinkHR = Matrice_err'; + +text = 'Tilt Link HR V calculation executed correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/biax_TLHRH.m b/Tilt/biax_TLHRH.m new file mode 100755 index 0000000..9104143 --- /dev/null +++ b/Tilt/biax_TLHRH.m @@ -0,0 +1,390 @@ +%% Funzione che calcola gli spostamenti in modalità biassiale per i +% Tilt Link HR H (ampolle) +% Gli output sono: +% X_TLHRH, Y_TLHRH, Z_TLHRH - dati cumulati di ogni singolo nodo per ogni singola data, +% nelle tre direzioni, riferiti al primo dato +% Xlocal_TLHRH, Ylocal_TLHRH, Zlocal_TLHRH - dati cumulati di ogni singolo nodo per ogni singola data, +% nelle tre direzioni, riferiti al primo dato +% HShift_local_TLHRH rappresenta lo stesso dato di Z_TLHRH +% I week shift sono i maggiori spostamenti settimanali + +function [Y_TLHRH,Z_TLHRH,Ylocal_TLHRH,Zlocal_TLHRH,AlfaX_TLHRH,AlfaY_TLHRH,... + TempDef_TLHRH,Speed_TLHRH,Speed_local_TLHRH,Acceleration_TLHRH,... + Acceleration_local_TLHRH,ARRAYdateTLHRH,ErrTiltLinkHRH] = biax_TLHRH(... + IDcentralina,DTcatena,NodoTiltLinkHRH,rTLHRH,ANGdef_TLHRH,TempDef_TLHRH,SpeTLHRH,PsTLHRH,... + DatiElabTiltLinkHRH,Ndevst_HR,Wdevst_HR,ARRAYdateTLHRH,NuovoZeroTLHRH,NdatiMedia,... + Ndatidespike,ErrTiltLinkHRH,Tmax,Tmin,datainiTLHRH,margine,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'biax_TLHRH function started'; +fprintf(fileID,fmt,text); + +if NuovoZeroTLHRH == 1 + if NdatiMedia > Ndatidespike + Ndati = NdatiMedia; + else + Ndati = Ndatidespike; + end + ini = round(Ndati/2)+1; + if rem(Ndati,2) == 0 + ini = ini+1; + end + clear NDati + ini = ini + margine; + if ini < 6 + ini = 6; + end + if Ndevst_HR ~= 0 % Allora prendo tutti i dati e solo in seguito considero i nuovi, a valle della funzione filtro + ini = 1; + end + ANGdef_TLHRH = ANGdef_TLHRH(ini:end,:); + TempDef_TLHRH = TempDef_TLHRH(ini:end,:); + DatiElabTiltLinkHRH = DatiElabTiltLinkHRH(ini:end,:); + ARRAYdateTLHRH = ARRAYdateTLHRH(ini:end,1); + ErrTiltLinkHRH = ErrTiltLinkHRH(ini:end,:); +end + +%% Definisco i dati +Nnodi = rTLHRH; + +% Spacchetto +[r,~] = size(ANGdef_TLHRH); % Numero di dati +[Ndati,~] = size(ARRAYdateTLHRH); +ax = zeros(r,Nnodi); +ay = zeros(r,Nnodi); +for i=1:Nnodi + ax(:,i) = ANGdef_TLHRH(:,(i-1)*2+1); % ax + ay(:,i) = ANGdef_TLHRH(:,(i-1)*2+2); % ay +end +ax = ax'; % riga nodi, colonna date +ay = ay'; % riga nodi, colonna date + +% Dati locali +asseY_TLHRH = zeros(Nnodi,Ndati); % Raccoglie i dati planari locali nella direzione di sviluppo della catena +asseZ_TLHRH = zeros(Nnodi,Ndati); % Raccoglie i dati planari locali nella direzione di sviluppo della catena, basso->alto + +% Dati cumulati +Y_TLHRH = zeros(Nnodi,Ndati); % Raccoglie i dati cumulati nella direzione di sviluppo della catena +Z_TLHRH = zeros(Nnodi,Ndati); % Raccoglie i dati cumulati nella direzione di sviluppo della catena, basso->alto + +% Angoli +AlfaX_TLHRH = zeros(Nnodi,Ndati); +AlfaY_TLHRH = zeros(Nnodi,Ndati); + +% parametri per il calcolo +SpeTLHRH = SpeTLHRH(2:end,1); % valori segmenti di pertinenza +PsTLHRH = PsTLHRH(2:end,1); % valori posizioni punti di calcolo + +% Inizio del ciclo di elaborazione +text = 'Elaboration of Tilt Link HR H started'; +fprintf(fileID,fmt,text); + +% Nodi nuovi (lo devo sapere per le convenzioni) +% I due assi sono a 90° di cui asse Y a 90° verso sinistra rispetto allo +% sviluppo della catena, asse X a 0° coincidente con lo sviluppo della catena. +% L'asse Z è verso il basso. +ax = 0.01745329251994329576923690768489.*ax; +ay = 0.01745329251994329576923690768489.*ay; +for jj = 1:Ndati + for ii = 1:Nnodi + % converto gli angoli in radianti (matlab ragiona così) + [Y_TLHRH,Z_TLHRH,asseY_TLHRH,asseZ_TLHRH,AlfaX_TLHRH,AlfaY_TLHRH]... + = CalcoloBiax_TLHRH(SpeTLHRH,PsTLHRH,ii,jj,ax,ay,asseY_TLHRH,asseZ_TLHRH,... + Y_TLHRH,Z_TLHRH,AlfaX_TLHRH,AlfaY_TLHRH); + end +end +dsY = diff(asseY_TLHRH,1,2); +dsZ = diff(asseZ_TLHRH,1,2); + +%% Controllo della temperatura +ANGdef_TLHRH = ANGdef_TLHRH'; +[r,c] = size(ANGdef_TLHRH); +r = r/2; +clear i +clear j +contT = 1; % contatore +TempDef_TLHRH = TempDef_TLHRH'; +textT = 'There are not correction of Tilt Link HR H based on temperature filter'; + +FileTemperature = ['' IDcentralina '-' DTcatena '-TLHRH-Therm.csv']; +if isfile(FileTemperature) == 1 + DatiRaw = csvread(FileTemperature); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; +else + rDR = 1; + cDR = 1; +end + +for j = 1:c % Data + for i = 1:r % Nodo + % NON considero i dati al di sopra di Tmax o al di sotto di Tmin + if TempDef_TLHRH(i,j) > Tmax || TempDef_TLHRH(i,j) < Tmin + cont2 = cont2+1; + if j == 1 + if isfile(FileTemperature) == 1 + RawDate = find(DatiRaw(:,1)<=datenum(datainiTLHRH)); + if isempty(RawDate) == 1 + cc = 2; + while cc <= Ndate + if TempDef_TLHRH(i,cc) > Tmax || TempDef_TLHRH(i,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_TLHRH(i,j) = TempDef_TLHRH(i,cc); + else + if isnan(DatiRaw(RawDate(end),i+1)) == 0 + TempDef_TLHRH(i,j) = DatiRaw(RawDate(end),i+1); + ErrTiltLinkHRH(j,i) = 0.5; + wardat = 'Temperature data of Tilt Link HR H nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + else + cc = 2; + while cc <= c + if TempDef_TLHRH(i,cc) > Tmax || TempDef_TLHRH(i,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_TLHRH(i,j) = TempDef_TLHRH(i,cc); + end + end + else + cc = 2; + while cc <= c + if TempDef_TLHRH(i,cc) > Tmax || TempDef_TLHRH(i,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_TLHRH(i,j) = TempDef_TLHRH(i,cc); + end + else + dsY(i,j-1) = 0; + dsZ(i,j-1) = 0; + TempDef_TLHRH(i,j) = TempDef_TLHRH(i,j-1); + ErrTiltLinkHRH(j,i) = 0.5; + end + end + textT = ['' num2str(contT) ' correction executed for Tilt Link HR H - Temperature filter!']; + end +end + +if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=ARRAYdateTLHRH(1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(ARRAYdateTLHRH(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(ARRAYdateTLHRH(:,1)>DatiRaw(RawDate1(end)+1,1)); + end +else + RawDate1 = []; + RawDate2 = 1; +end +if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:); ARRAYdateTLHRH(RawDate2(1):end) TempDef_TLHRH(:,RawDate2(1):end)']; +elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = [ARRAYdateTLHRH TempDef_TLHRH']; +else + Dati = DatiRaw; +end +% Elimino appoggio più vecchio di un mese +RawDate3 = find(Dati(:,1) Ndatidespike + NdatiF = NdatiMedia; + else + NdatiF = Ndatidespike; + end + ini = round(NdatiF/2)+1; + if rem(NdatiF,2) == 0 + ini = ini+1; + end + clear NDatiF + iniST = round(Wdevst_HR/2); + if rem(Wdevst_HR,2) == 0 + iniST = iniST+1; + end + iniST = iniST + margine; + if iniST > ini + ini = iniST; + end + if ini < 6 + ini = 6; + end + dsY = dsY(:,ini:end); + dsZ = dsZ(:,ini:end); + TempDef_TLHRH = TempDef_TLHRH(ini:end,:); + DatiElabTiltLinkHRH = DatiElabTiltLinkHRH(ini:end,:); + ARRAYdateTLHRH = ARRAYdateTLHRH(ini:end,1); + ErrTiltLinkHRH = ErrTiltLinkHRH(ini:end,:); +end + +%% Finalizzo i calcoli +[rx,cx] = size(dsZ); +% totale del singolo nodo data per data +sommaY_TLHRH = zeros(rx,cx+1); +sommaZ_TLHRH = zeros(rx,cx+1); +% cumulata del singolo nodo data per data in posizione assoluta +% il primo valore è quello di posizione assoluta iniziale +Y_TLHRH = zeros(rx,cx+1); +Z_TLHRH = zeros(rx,cx+1); +% cumulata del singolo nodo data per data in posizione relativa +% il primo valore è quello di posizione assoluta iniziale +Ylocal_TLHRH = zeros(Nnodi,Ndati); +Zlocal_TLHRH = zeros(Nnodi,Ndati); +Speed_TLHRH = zeros(Nnodi,Ndati); +Speed_local_TLHRH = zeros(Nnodi,Ndati); +Acceleration_TLHRH = zeros(Nnodi,Ndati); +Acceleration_local_TLHRH = zeros(Nnodi,Ndati); + +if NuovoZeroTLHRH == 1 + [rE,cE] = size(DatiElabTiltLinkHRH); + cont = 4; + n = 1; + while cont<=cE + sommaY_TLHRH(n,1) = cell2mat(DatiElabTiltLinkHRH(1,cont))'; + Ylocal_TLHRH(n,1) = sommaY_TLHRH(n,1); + sommaZ_TLHRH(n,1) = cell2mat(DatiElabTiltLinkHRH(1,cont+1))'; + Zlocal_TLHRH(n,1) = sommaZ_TLHRH(n,1); + Y_TLHRH(n,1) = cell2mat(DatiElabTiltLinkHRH(1,cont+3))'; + Z_TLHRH(n,1) = cell2mat(DatiElabTiltLinkHRH(1,cont+4))'; + Speed_local_TLHRH(n,1:rE) = cell2mat(DatiElabTiltLinkHRH(:,cont+7))'; + Speed_TLHRH(n,1:rE) = cell2mat(DatiElabTiltLinkHRH(:,cont+6))'; + Acceleration_local_TLHRH(n,1:rE) = cell2mat(DatiElabTiltLinkHRH(:,cont+9))'; + Acceleration_TLHRH(n,1:rE) = cell2mat(DatiElabTiltLinkHRH(:,cont+8))'; + cont = cont+13; + n = n+1; + end +else + % Primo dato + Y_TLHRH(:,1) = PsTLHRH; + Z_TLHRH(:,1) = 0; +end +for iii = 1:cx % date + % somma singoli spostamenti del singolo nodo + sommaY_TLHRH(:,iii+1) = sum(dsY(:,1:iii),2)+sommaY_TLHRH(:,1); + sommaZ_TLHRH(:,iii+1) = sum(dsZ(:,1:iii),2)+sommaZ_TLHRH(:,1); + % spostamenti locali riferiti allo 0 + Ylocal_TLHRH(:,iii+1) = sommaY_TLHRH(:,iii+1); + Zlocal_TLHRH(:,iii+1) = sommaZ_TLHRH(:,iii+1); + % cumulata spostamenti + Y_TLHRH(:,iii+1) = Y_TLHRH(:,1) + cumsum(sommaY_TLHRH(:,iii+1)) - cumsum(sommaY_TLHRH(:,1)); + Z_TLHRH(:,iii+1) = Z_TLHRH(:,1) + cumsum(sommaZ_TLHRH(:,iii+1)) - cumsum(sommaZ_TLHRH(:,1)); +end + +%% Calcolo velocità di spostamento giornaliera +[numDate,~] = size(ARRAYdateTLHRH); % numero di date +d = 1; +p = 1; +diffDate = 0; +n = 1; +period = 1; % calcolo giornaliero +ContSUP = []; +for dd = 1:numDate + while diffDate < period + d = d+1; + if d > numDate % Se d supera le date disponibili, esco dal ciclo while + break + end + diffDate = ARRAYdateTLHRH(d) - ARRAYdateTLHRH(p); + end + if d >numDate + break + end + ContSUP(n,1) = d; %#ok<*AGROW> % Creo matrice indici dell'estremo superiore della differenza + ContINF(n,1) = p; % Creo matrice indici dell'estremo inferiore della differenza + p = p+1; % passo alla data di partenza successiva + d = p; % resetto il conto di d + n = n+1; + diffDate = 0; +end + +check = isempty(ContSUP); +if check == 0 + [nDate,~] = size(ContSUP); + for s = 1:rTLHRH + N = 1; + for dd = 1:nDate + Speed_TLHRH(s,ContSUP(N,1)) = (Z_TLHRH(s,ContSUP(N,1))-Z_TLHRH(s,ContINF(N,1)))/... + (ARRAYdateTLHRH(ContSUP(N,1))-ARRAYdateTLHRH(ContINF(N,1))); + Speed_local_TLHRH(s,ContSUP(N,1)) = (Zlocal_TLHRH(s,ContSUP(N,1))-Zlocal_TLHRH(s,ContINF(N,1)))/... + (ARRAYdateTLHRH(ContSUP(N,1))-ARRAYdateTLHRH(ContINF(N,1))); + Acceleration_TLHRH(s,ContSUP(N,1)) = (Speed_TLHRH(s,ContSUP(N,1))-Speed_TLHRH(s,ContINF(N,1)))/... + (ARRAYdateTLHRH(ContSUP(N,1))-ARRAYdateTLHRH(ContINF(N,1))); + Acceleration_local_TLHRH(s,ContSUP(N,1)) = (Speed_local_TLHRH(s,ContSUP(N,1))-Speed_local_TLHRH(s,ContINF(N,1)))/... + (ARRAYdateTLHRH(ContSUP(N,1))-ARRAYdateTLHRH(ContINF(N,1))); + N = N+1; + end + end +end + +fclose(fileID); +% Approssimo i dati con il corretto numero di cifre decimali +[Y_TLHRH,Z_TLHRH,Ylocal_TLHRH,Zlocal_TLHRH,Speed_TLHRH,Speed_local_TLHRH,... + Acceleration_TLHRH,Acceleration_local_TLHRH,TempDef_TLHRH] = approx_TLHRH(... + Y_TLHRH,Z_TLHRH,Ylocal_TLHRH,Zlocal_TLHRH,Speed_TLHRH,Speed_local_TLHRH,... + Acceleration_TLHRH,Acceleration_local_TLHRH,TempDef_TLHRH,FileName); + +% Riordino matrice errori +[r,~] = size(ErrTiltLinkHRH); +Matrice_err = zeros(r,rTLHRH); +for i = 1:r % date + d = 1; + for n = 1:rTLHRH % nodi + j = 1; + err = ErrTiltLinkHRH(i,d:d+5); + while j <= 6 + if err(1,j) == 1 + Matrice_err(i,n) = 1; + break + end + if err(1,j) == 0.5 + Matrice_err(i,n) = 0.5; + end + j = j+1; + end + d = d+6; + end +end +ErrTiltLinkHRH = Matrice_err'; + +text = 'Tilt Link HR H calculation executed correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/Tilt/cancellaDB.m b/Tilt/cancellaDB.m new file mode 100755 index 0000000..ac074be --- /dev/null +++ b/Tilt/cancellaDB.m @@ -0,0 +1,14 @@ +function cancellaDB(IDcentralina,DTcatena,Data_scarico,FileName,conn) + +comando = ['delete from ELABDATADISP where UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and EventDate >= ''' Data_scarico ''' ']; + +curs = exec(conn,comando); + +text = strcat('---Elaborated Data of Chain: ',DTcatena,' deleted starting from date: ',Data_scarico,' during the execution of LastElab function.---'); +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/cellMakerBL.m b/Tilt/cellMakerBL.m new file mode 100755 index 0000000..3d80c63 --- /dev/null +++ b/Tilt/cellMakerBL.m @@ -0,0 +1,18 @@ +function DATAinsert = cellMakerBL(IDcentralina,DTcatena,NodeNum,ListaDate,... + ARRAYdateBL,BaroDef,BaroDefT,ErrBaroLink) + +l = ListaDate; +DATAinsert = cell(l,8); + +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdateBL(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdateBL(ii),'HH:MM:SS'); + DATAinsert{ii,6} = BaroDef(ii,1); + DATAinsert{ii,7} = BaroDefT(ii,1); + DATAinsert{ii,8} = ErrBaroLink(1,ii); +end + +end \ No newline at end of file diff --git a/Tilt/cellMakerHD.m b/Tilt/cellMakerHD.m new file mode 100755 index 0000000..9aebc0c --- /dev/null +++ b/Tilt/cellMakerHD.m @@ -0,0 +1,39 @@ +function DATAinsert = cellMakerHD(IDcentralina,DTcatena,NodeNum,cHD,ListaDate,... + ErrTiltLinkHD,ARRAYdateHD,X_HD,Y_HD,Z_HD,Xlocal_HD,Ylocal_HD,Zlocal_HD,... + HShift_HD,HShift_local_HD,AlfaX_HD,AlfaY_HD,Azimuth_HD,tempHD,Speed_HD,... + Speed_local_HD,Acceleration_HD,Acceleration_local_HD,ACCdefRisHD,MAGdefRisHD) + +tempHD = tempHD'; +l = ListaDate; +DATAinsert = cell(l,25); +ACCdefRisHD = ACCdefRisHD'; +MAGdefRisHD = MAGdefRisHD'; +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdateHD(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdateHD(ii),'HH:MM:SS'); + DATAinsert{ii,6} = X_HD(cHD,ii); + DATAinsert{ii,7} = Y_HD(cHD,ii); + DATAinsert{ii,8} = Z_HD(cHD,ii); + DATAinsert{ii,9} = Xlocal_HD(cHD,ii); + DATAinsert{ii,10} = Ylocal_HD(cHD,ii); + DATAinsert{ii,11} = Zlocal_HD(cHD,ii); + DATAinsert{ii,12} = HShift_HD(cHD,ii); + DATAinsert{ii,13} = HShift_local_HD(cHD,ii); + DATAinsert{ii,14} = Azimuth_HD(cHD,ii); + DATAinsert{ii,15} = tempHD(cHD,ii); + DATAinsert{ii,16} = Speed_HD(cHD,ii); + DATAinsert{ii,17} = Speed_local_HD(cHD,ii); + DATAinsert{ii,18} = Acceleration_HD(cHD,ii); + DATAinsert{ii,19} = Acceleration_local_HD(cHD,ii); + DATAinsert{ii,20} = ErrTiltLinkHD(cHD,ii); + DATAinsert{ii,21} = AlfaX_HD(cHD,ii); + DATAinsert{ii,22} = AlfaY_HD(cHD,ii); + DATAinsert{ii,23} = ACCdefRisHD(cHD,ii); + DATAinsert{ii,24} = MAGdefRisHD(cHD,ii); + DATAinsert{ii,25} = datestr(ARRAYdateHD(ii),'yyyy-mm-dd HH:MM:SS'); +end + +end \ No newline at end of file diff --git a/Tilt/cellMakerHDVR.m b/Tilt/cellMakerHDVR.m new file mode 100755 index 0000000..99b25b4 --- /dev/null +++ b/Tilt/cellMakerHDVR.m @@ -0,0 +1,39 @@ +function DATAinsert = cellMakerHDVR(IDcentralina,DTcatena,NodeNum,cHDVR,ListaDate,... + ErrTiltLinkHDVR,ARRAYdateHDVR,X_HDVR,Y_HDVR,Z_HDVR,Xlocal_HDVR,Ylocal_HDVR,Zlocal_HDVR,... + HShift_HDVR,HShift_local_HDVR,AlfaX_HDVR,AlfaY_HDVR,Azimuth_HDVR,tempHDVR,Speed_HDVR,... + Speed_local_HDVR,Acceleration_HDVR,Acceleration_local_HDVR,ACCdefRisHDVR,MAGdefRisHDVR) + +tempHDVR = tempHDVR'; +l = ListaDate; +DATAinsert = cell(l,25); +ACCdefRisHDVR = ACCdefRisHDVR'; +MAGdefRisHDVR = MAGdefRisHDVR'; +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdateHDVR(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdateHDVR(ii),'HH:MM:SS'); + DATAinsert{ii,6} = X_HDVR(cHDVR,ii); + DATAinsert{ii,7} = Y_HDVR(cHDVR,ii); + DATAinsert{ii,8} = Z_HDVR(cHDVR,ii); + DATAinsert{ii,9} = Xlocal_HDVR(cHDVR,ii); + DATAinsert{ii,10} = Ylocal_HDVR(cHDVR,ii); + DATAinsert{ii,11} = Zlocal_HDVR(cHDVR,ii); + DATAinsert{ii,12} = HShift_HDVR(cHDVR,ii); + DATAinsert{ii,13} = HShift_local_HDVR(cHDVR,ii); + DATAinsert{ii,14} = Azimuth_HDVR(cHDVR,ii); + DATAinsert{ii,15} = tempHDVR(cHDVR,ii); + DATAinsert{ii,16} = Speed_HDVR(cHDVR,ii); + DATAinsert{ii,17} = Speed_local_HDVR(cHDVR,ii); + DATAinsert{ii,18} = Acceleration_HDVR(cHDVR,ii); + DATAinsert{ii,19} = Acceleration_local_HDVR(cHDVR,ii); + DATAinsert{ii,20} = ErrTiltLinkHDVR(cHDVR,ii); + DATAinsert{ii,21} = AlfaX_HDVR(cHDVR,ii); + DATAinsert{ii,22} = AlfaY_HDVR(cHDVR,ii); + DATAinsert{ii,23} = ACCdefRisHDVR(cHDVR,ii); + DATAinsert{ii,24} = MAGdefRisHDVR(cHDVR,ii); + DATAinsert{ii,25} = datestr(ARRAYdateHDVR(ii),'yyyy-mm-dd HH:MM:SS'); +end + +end \ No newline at end of file diff --git a/Tilt/cellMakerIPL.m b/Tilt/cellMakerIPL.m new file mode 100755 index 0000000..559a700 --- /dev/null +++ b/Tilt/cellMakerIPL.m @@ -0,0 +1,36 @@ +function DATAinsert = cellMakerIPL(IDcentralina,DTcatena,NodeNum,cIPL,ListaDate,... + ErrInPlaceLink,ARRAYdateIPL,X_IPL,Y_IPL,Z_IPL,Xlocal_IPL,... + Ylocal_IPL,Zlocal_IPL,HShift_IPL,HShift_local_IPL,... + AlfaX_IPL,AlfaY_IPL,Azimuth_IPL,TempDef_IPL,Speed_IPL,... + Speed_local_IPL,Acceleration_IPL,Acceleration_local_IPL) + +TempDef_IPL = TempDef_IPL'; +l = ListaDate; +DATAinsert = cell(l,22); + +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdateIPL(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdateIPL(ii),'HH:MM:SS'); + DATAinsert{ii,6} = X_IPL(cIPL,ii); + DATAinsert{ii,7} = Y_IPL(cIPL,ii); + DATAinsert{ii,8} = Z_IPL(cIPL,ii); + DATAinsert{ii,9} = Xlocal_IPL(cIPL,ii); + DATAinsert{ii,10} = Ylocal_IPL(cIPL,ii); + DATAinsert{ii,11} = Zlocal_IPL(cIPL,ii); + DATAinsert{ii,12} = HShift_IPL(cIPL,ii); + DATAinsert{ii,13} = HShift_local_IPL(cIPL,ii); + DATAinsert{ii,14} = Azimuth_IPL(cIPL,ii); + DATAinsert{ii,15} = TempDef_IPL(cIPL,ii); + DATAinsert{ii,16} = Speed_IPL(cIPL,ii); + DATAinsert{ii,17} = Speed_local_IPL(cIPL,ii); + DATAinsert{ii,18} = Acceleration_IPL(cIPL,ii); + DATAinsert{ii,19} = Acceleration_local_IPL(cIPL,ii); + DATAinsert{ii,20} = ErrInPlaceLink(cIPL,ii); + DATAinsert{ii,21} = AlfaX_IPL(cIPL,ii); + DATAinsert{ii,22} = AlfaY_IPL(cIPL,ii); +end + +end \ No newline at end of file diff --git a/Tilt/cellMakerIPLHR.m b/Tilt/cellMakerIPLHR.m new file mode 100755 index 0000000..2ca9d73 --- /dev/null +++ b/Tilt/cellMakerIPLHR.m @@ -0,0 +1,35 @@ +function DATAinsert = cellMakerIPLHR(IDcentralina,DTcatena,NodeNum,cIPLHR,ListaDate,... + ErrInPlaceLinkHR,ARRAYdateIPLHR,X_IPLHR,Y_IPLHR,Z_IPLHR,Xlocal_IPLHR,Ylocal_IPLHR,... + Zlocal_IPLHR,HShift_IPLHR,HShift_local_IPLHR,AlfaX_IPLHR,AlfaY_IPLHR,Azimuth_IPLHR,... + TempDef_IPLHR,Speed_IPLHR,Speed_local_IPLHR,Acceleration_IPLHR,Acceleration_local_IPLHR) + +TempDef_IPLHR = TempDef_IPLHR'; +l = ListaDate; +DATAinsert = cell(l,22); + +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdateIPLHR(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdateIPLHR(ii),'HH:MM:SS'); + DATAinsert{ii,6} = X_IPLHR(cIPLHR,ii); + DATAinsert{ii,7} = Y_IPLHR(cIPLHR,ii); + DATAinsert{ii,8} = Z_IPLHR(cIPLHR,ii); + DATAinsert{ii,9} = Xlocal_IPLHR(cIPLHR,ii); + DATAinsert{ii,10} = Ylocal_IPLHR(cIPLHR,ii); + DATAinsert{ii,11} = Zlocal_IPLHR(cIPLHR,ii); + DATAinsert{ii,12} = HShift_IPLHR(cIPLHR,ii); + DATAinsert{ii,13} = HShift_local_IPLHR(cIPLHR,ii); + DATAinsert{ii,14} = Azimuth_IPLHR(cIPLHR,ii); + DATAinsert{ii,15} = TempDef_IPLHR(cIPLHR,ii); + DATAinsert{ii,16} = Speed_IPLHR(cIPLHR,ii); + DATAinsert{ii,17} = Speed_local_IPLHR(cIPLHR,ii); + DATAinsert{ii,18} = Acceleration_IPLHR(cIPLHR,ii); + DATAinsert{ii,19} = Acceleration_local_IPLHR(cIPLHR,ii); + DATAinsert{ii,20} = ErrInPlaceLinkHR(cIPLHR,ii); + DATAinsert{ii,21} = AlfaX_IPLHR(cIPLHR,ii); + DATAinsert{ii,22} = AlfaY_IPLHR(cIPLHR,ii); +end + +end \ No newline at end of file diff --git a/Tilt/cellMakerKL.m b/Tilt/cellMakerKL.m new file mode 100755 index 0000000..299d668 --- /dev/null +++ b/Tilt/cellMakerKL.m @@ -0,0 +1,26 @@ +function DATAinsert = cellMakerKL(IDcentralina,DTcatena,NodeNum,cKL,ListaDate,... + ARRAYdateKL,ANGdefKL,TdefKL,ErrKlinoLink,NodoKlinoLink) + +l = ListaDate; +DATAinsert = cell(l,10); + +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdateKL(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdateKL(ii),'HH:MM:SS'); + if strcmp(NodoKlinoLink(1,4),'ADC') || strcmp(NodoKlinoLink{1,4} ,'null') ... + || isempty(NodoKlinoLink{1,4}) == 1 || strcmp(NodoKlinoLink{1,4} ,'g') + DATAinsert{ii,6} = ANGdefKL(ii,3*cKL-2); + DATAinsert{ii,7} = ANGdefKL(ii,3*cKL-1); + DATAinsert{ii,8} = ANGdefKL(ii,3*cKL); + elseif strcmp(NodoKlinoLink{1,4} ,'Gradi') + DATAinsert{ii,6} = ANGdefKL(ii,2*cKL-1); + DATAinsert{ii,7} = ANGdefKL(ii,2*cKL); + end + DATAinsert{ii,9} = TdefKL(ii,cKL); + DATAinsert{ii,10} = ErrKlinoLink(cKL,ii); +end + +end \ No newline at end of file diff --git a/Tilt/cellMakerKLHR.m b/Tilt/cellMakerKLHR.m new file mode 100755 index 0000000..6cfd704 --- /dev/null +++ b/Tilt/cellMakerKLHR.m @@ -0,0 +1,19 @@ +function DATAinsert = cellMakerKLHR(IDcentralina,DTcatena,NodeNum,cKLHR,... + ListaDate,ARRAYdateKLHR,ANGdefKLHR,TdefKLHR,ErrKlinoLinkHR) + +l = ListaDate; +DATAinsert = cell(l,9); + +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdateKLHR(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdateKLHR(ii),'HH:MM:SS'); + DATAinsert{ii,6} = ANGdefKLHR(ii,2*cKLHR-1); + DATAinsert{ii,7} = ANGdefKLHR(ii,2*cKLHR); + DATAinsert{ii,8} = TdefKLHR(ii,cKLHR); + DATAinsert{ii,9} = ErrKlinoLinkHR(cKLHR,ii); +end + +end \ No newline at end of file diff --git a/Tilt/cellMakerLL.m b/Tilt/cellMakerLL.m new file mode 100755 index 0000000..2004ddc --- /dev/null +++ b/Tilt/cellMakerLL.m @@ -0,0 +1,16 @@ +function DATAinsert = cellMakerLL(IDcentralina,DTcatena,NodeNum,cLL,... + ListaDate,ARRAYdateLL,DatiLoad,ErrLoadLink) + +l = ListaDate; +DATAinsert = cell(l,7); +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdateLL(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdateLL(ii),'HH:MM:SS'); + DATAinsert{ii,6} = DatiLoad(ii,cLL); + DATAinsert{ii,7} = ErrLoadLink(cLL,ii); +end + +end \ No newline at end of file diff --git a/Tilt/cellMakerPE.m b/Tilt/cellMakerPE.m new file mode 100755 index 0000000..ffc7fde --- /dev/null +++ b/Tilt/cellMakerPE.m @@ -0,0 +1,17 @@ +function DATAinsert = cellMakerPE(IDcentralina,DTcatena,NodeNum,cPE,contPE,ListaDate,... + ARRAYdatePE,Dati_PE,ErrPendulum) + +l = ListaDate; +DATAinsert = cell(l,8); +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdatePE(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdatePE(ii),'HH:MM:SS'); + DATAinsert{ii,6} = Dati_PE(ii,contPE); % X + DATAinsert{ii,7} = Dati_PE(ii,contPE+1); % Y + DATAinsert{ii,8} = ErrPendulum(ii,cPE); +end + +end diff --git a/Tilt/cellMakerPL.m b/Tilt/cellMakerPL.m new file mode 100755 index 0000000..d692c3a --- /dev/null +++ b/Tilt/cellMakerPL.m @@ -0,0 +1,17 @@ +function DATAinsert = cellMakerPL(IDcentralina,DTcatena,NodeNum,cPL,ListaDate,... + ARRAYdatePL,Livello,PiezDef,PiezDefT,ErrPiezoLink) +l = ListaDate; +DATAinsert = cell(l,9); +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdatePL(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdatePL(ii),'HH:MM:SS'); + DATAinsert{ii,6} = Livello(ii,cPL); + DATAinsert{ii,7} = PiezDef(ii,cPL); + DATAinsert{ii,8} = PiezDefT(ii,cPL); + DATAinsert{ii,9} = ErrPiezoLink(cPL,ii); +end + +end diff --git a/Tilt/cellMakerPT100.m b/Tilt/cellMakerPT100.m new file mode 100755 index 0000000..304c972 --- /dev/null +++ b/Tilt/cellMakerPT100.m @@ -0,0 +1,17 @@ +function DATAinsert = cellMakerPT100(IDcentralina,DTcatena,NodeNum,ListaDate,... + ARRAYdatePT100,Dati_PT100,cPT100,ErrPT100Link) + +l = ListaDate; +DATAinsert = cell(l,7); + +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdatePT100(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdatePT100(ii),'HH:MM:SS'); + DATAinsert{ii,6} = Dati_PT100(ii,cPT100); + DATAinsert{ii,7} = ErrPT100Link(cPT100,ii); +end + +end \ No newline at end of file diff --git a/Tilt/cellMakerRL.m b/Tilt/cellMakerRL.m new file mode 100755 index 0000000..ed29367 --- /dev/null +++ b/Tilt/cellMakerRL.m @@ -0,0 +1,18 @@ +function DATAinsert = cellMakerRL(IDcentralina,DTcatena,NodeNum,ListaDate,... + ARRAYdateRL,Rain,RainCum,cRL,ErrRainLink) + +l = ListaDate; +DATAinsert = cell(l,8); + +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdateRL(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdateRL(ii),'HH:MM:SS'); + DATAinsert{ii,6} = Rain(ii,cRL); + DATAinsert{ii,7} = RainCum(ii,cRL); + DATAinsert{ii,8} = ErrRainLink(cRL,ii); +end + +end \ No newline at end of file diff --git a/Tilt/cellMakerSL.m b/Tilt/cellMakerSL.m new file mode 100755 index 0000000..4394760 --- /dev/null +++ b/Tilt/cellMakerSL.m @@ -0,0 +1,18 @@ +function DATAinsert = cellMakerSL(IDcentralina,DTcatena,NodeNum,ListaDate,... + ARRAYdateSL,Snow,SnowCum,cSL,ErrSnowLink) + +l = ListaDate; +DATAinsert = cell(l,8); + +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdateSL(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdateSL(ii),'HH:MM:SS'); + DATAinsert{ii,6} = Snow(ii,cSL); + DATAinsert{ii,7} = SnowCum(ii,cSL); + DATAinsert{ii,8} = ErrSnowLink(cSL,ii); +end + +end \ No newline at end of file diff --git a/Tilt/cellMakerSPP.m b/Tilt/cellMakerSPP.m new file mode 100755 index 0000000..79cbadb --- /dev/null +++ b/Tilt/cellMakerSPP.m @@ -0,0 +1,16 @@ +function DATAinsert = cellMakerSPP(IDcentralina,DTcatena,NodeNum,ListaDate,... + ARRAYdateSPP,SPP,cSPP) + +l = ListaDate; +DATAinsert = cell(l,6); + +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdateSPP(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdateSPP(ii),'HH:MM:SS'); + DATAinsert{ii,6} = SPP(ii,cSPP); +end + +end \ No newline at end of file diff --git a/Tilt/cellMakerTL.m b/Tilt/cellMakerTL.m new file mode 100755 index 0000000..282cce0 --- /dev/null +++ b/Tilt/cellMakerTL.m @@ -0,0 +1,34 @@ +function DATAinsert = cellMakerTL(IDcentralina,DTcatena,NodeNum,cTL,ListaDate,... + ErrTiltLink,ARRAYdateTL,X,Y,Z,Xlocal,Ylocal,Zlocal,HShift,HShift_local,... + AlfaX,AlfaY,Azimuth,TempDef,Speed,Speed_local,Acceleration,Acceleration_local) + +TempDef = TempDef'; +l = ListaDate; +DATAinsert = cell(l,22); + +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdateTL(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdateTL(ii),'HH:MM:SS'); + DATAinsert{ii,6} = X(cTL,ii); + DATAinsert{ii,7} = Y(cTL,ii); + DATAinsert{ii,8} = Z(cTL,ii); + DATAinsert{ii,9} = Xlocal(cTL,ii); + DATAinsert{ii,10} = Ylocal(cTL,ii); + DATAinsert{ii,11} = Zlocal(cTL,ii); + DATAinsert{ii,12} = HShift(cTL,ii); + DATAinsert{ii,13} = HShift_local(cTL,ii); + DATAinsert{ii,14} = Azimuth(cTL,ii); + DATAinsert{ii,15} = TempDef(cTL,ii); + DATAinsert{ii,16} = Speed(cTL,ii); + DATAinsert{ii,17} = Speed_local(cTL,ii); + DATAinsert{ii,18} = Acceleration(cTL,ii); + DATAinsert{ii,19} = Acceleration_local(cTL,ii); + DATAinsert{ii,20} = ErrTiltLink(cTL,ii); + DATAinsert{ii,21} = AlfaX(cTL,ii); + DATAinsert{ii,22} = AlfaY(cTL,ii); +end + +end \ No newline at end of file diff --git a/Tilt/cellMakerTLH.m b/Tilt/cellMakerTLH.m new file mode 100755 index 0000000..dc63537 --- /dev/null +++ b/Tilt/cellMakerTLH.m @@ -0,0 +1,31 @@ +function DATAinsert = cellMakerTLH(IDcentralina,DTcatena,NodeNum,cTLH,ListaDate,... + ErrTiltLinkH,ARRAYdateTLH,Y_TLH,Z_TLH,Xlocal_TLH,Ylocal_TLH,Zlocal_TLH,... + AlfaX_TLH,AlfaY_TLH,TempDef_TLH,Speed_TLH,Speed_local_TLH,... + Acceleration_TLH,Acceleration_local_TLH) + +TempDef_TLH = TempDef_TLH'; +l = ListaDate; +DATAinsert = cell(l,18); + +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdateTLH(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdateTLH(ii),'HH:MM:SS'); + DATAinsert{ii,6} = Y_TLH(cTLH,ii); + DATAinsert{ii,7} = Z_TLH(cTLH,ii); + DATAinsert{ii,18} = Xlocal_TLH(cTLH,ii); + DATAinsert{ii,8} = Ylocal_TLH(cTLH,ii); + DATAinsert{ii,9} = Zlocal_TLH(cTLH,ii); + DATAinsert{ii,10} = TempDef_TLH(cTLH,ii); + DATAinsert{ii,11} = Speed_TLH(cTLH,ii); + DATAinsert{ii,12} = Speed_local_TLH(cTLH,ii); + DATAinsert{ii,13} = Acceleration_TLH(cTLH,ii); + DATAinsert{ii,14} = Acceleration_local_TLH(cTLH,ii); + DATAinsert{ii,15} = ErrTiltLinkH(cTLH,ii); + DATAinsert{ii,16} = AlfaX_TLH(cTLH,ii); + DATAinsert{ii,17} = AlfaY_TLH(cTLH,ii); +end + +end \ No newline at end of file diff --git a/Tilt/cellMakerTLHR.m b/Tilt/cellMakerTLHR.m new file mode 100755 index 0000000..bcbc59a --- /dev/null +++ b/Tilt/cellMakerTLHR.m @@ -0,0 +1,35 @@ +function DATAinsert = cellMakerTLHR(IDcentralina,DTcatena,NodeNum,cTLHR,ListaDate,... + ErrTiltLinkHR,ARRAYdateTLHR,X_HR,Y_HR,Z_HR,Xlocal_HR,Ylocal_HR,Zlocal_HR,... + HShift_HR,HShift_local_HR,AlfaX_HR,AlfaY_HR,Azimuth_HR,TempDef_TLHR,Speed_HR,... + Speed_local_HR,Acceleration_HR,Acceleration_local_HR) + +TempDef_TLHR = TempDef_TLHR'; +l = ListaDate; +DATAinsert = cell(l,22); + +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdateTLHR(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdateTLHR(ii),'HH:MM:SS'); + DATAinsert{ii,6} = X_HR(cTLHR,ii); + DATAinsert{ii,7} = Y_HR(cTLHR,ii); + DATAinsert{ii,8} = Z_HR(cTLHR,ii); + DATAinsert{ii,9} = Xlocal_HR(cTLHR,ii); + DATAinsert{ii,10} = Ylocal_HR(cTLHR,ii); + DATAinsert{ii,11} = Zlocal_HR(cTLHR,ii); + DATAinsert{ii,12} = HShift_HR(cTLHR,ii); + DATAinsert{ii,13} = HShift_local_HR(cTLHR,ii); + DATAinsert{ii,14} = Azimuth_HR(cTLHR,ii); + DATAinsert{ii,15} = TempDef_TLHR(cTLHR,ii); + DATAinsert{ii,16} = Speed_HR(cTLHR,ii); + DATAinsert{ii,17} = Speed_local_HR(cTLHR,ii); + DATAinsert{ii,18} = Acceleration_HR(cTLHR,ii); + DATAinsert{ii,19} = Acceleration_local_HR(cTLHR,ii); + DATAinsert{ii,20} = ErrTiltLinkHR(cTLHR,ii); + DATAinsert{ii,21} = AlfaX_HR(cTLHR,ii); + DATAinsert{ii,22} = AlfaY_HR(cTLHR,ii); +end + +end \ No newline at end of file diff --git a/Tilt/cellMakerTLHRH.m b/Tilt/cellMakerTLHRH.m new file mode 100755 index 0000000..d1d3dec --- /dev/null +++ b/Tilt/cellMakerTLHRH.m @@ -0,0 +1,30 @@ +function DATAinsert = cellMakerTLHRH(IDcentralina,DTcatena,NodeNum,cTLHRH,ListaDate,... + ErrTiltLinkHRH,ARRAYdateTLHRH,Y_TLHRH,Z_TLHRH,Ylocal_TLHRH,Zlocal_TLHRH,... + AlfaX_TLHRH,AlfaY_TLHRH,TempDef_TLHRH,Speed_TLHRH,Speed_local_TLHRH,... + Acceleration_TLHRH,Acceleration_local_TLHRH) + +TempDef_TLHRH = TempDef_TLHRH'; +l = ListaDate; +DATAinsert = cell(l,17); + +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdateTLHRH(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdateTLHRH(ii),'HH:MM:SS'); + DATAinsert{ii,6} = Y_TLHRH(cTLHRH,ii); + DATAinsert{ii,7} = Z_TLHRH(cTLHRH,ii); + DATAinsert{ii,8} = Ylocal_TLHRH(cTLHRH,ii); + DATAinsert{ii,9} = Zlocal_TLHRH(cTLHRH,ii); + DATAinsert{ii,10} = TempDef_TLHRH(cTLHRH,ii); + DATAinsert{ii,11} = Speed_TLHRH(cTLHRH,ii); + DATAinsert{ii,12} = Speed_local_TLHRH(cTLHRH,ii); + DATAinsert{ii,13} = Acceleration_TLHRH(cTLHRH,ii); + DATAinsert{ii,14} = Acceleration_local_TLHRH(cTLHRH,ii); + DATAinsert{ii,15} = ErrTiltLinkHRH(cTLHRH,ii); + DATAinsert{ii,16} = AlfaX_TLHRH(cTLHRH,ii); + DATAinsert{ii,17} = AlfaY_TLHRH(cTLHRH,ii); +end + +end \ No newline at end of file diff --git a/Tilt/cellMakerThL.m b/Tilt/cellMakerThL.m new file mode 100755 index 0000000..5773366 --- /dev/null +++ b/Tilt/cellMakerThL.m @@ -0,0 +1,17 @@ +function DATAinsert = cellMakerThL(IDcentralina,DTcatena,NodeNum,ListaDate,... + ARRAYdateThL,Dati_ThL,cThL,ErrThermLink) + +l = ListaDate; +DATAinsert = cell(l,7); + +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdateThL(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdateThL(ii),'HH:MM:SS'); + DATAinsert{ii,6} = Dati_ThL(ii,cThL); + DATAinsert{ii,7} = ErrThermLink(cThL,ii); +end + +end \ No newline at end of file diff --git a/Tilt/cellMakerWL.m b/Tilt/cellMakerWL.m new file mode 100755 index 0000000..6e3414f --- /dev/null +++ b/Tilt/cellMakerWL.m @@ -0,0 +1,20 @@ +function DATAinsert = cellMakerWL(IDcentralina,DTcatena,NodeNum,cWL,ListaDate,ARRAYdateWL,... + Dati_WL,Portata,TdefWL,ErrWeirLink,Therm) + +l = ListaDate; +DATAinsert = cell(l,9); +for ii=1:l + DATAinsert{ii,1} = IDcentralina; + DATAinsert{ii,2} = DTcatena; + DATAinsert{ii,3} = NodeNum; + DATAinsert{ii,4} = datestr(ARRAYdateWL(ii),'yyyy-mm-dd'); + DATAinsert{ii,5} = datestr(ARRAYdateWL(ii),'HH:MM:SS'); + DATAinsert{ii,6} = Dati_WL(ii,cWL); + DATAinsert{ii,7} = Portata(ii,cWL); + if Therm(cWL) == 1 + DATAinsert{ii,8} = TdefWL(ii,cWL); + end + DATAinsert{ii,9} = ErrWeirLink(ii,cWL); +end + +end diff --git a/Tilt/centralina.m b/Tilt/centralina.m new file mode 100755 index 0000000..e247ee7 --- /dev/null +++ b/Tilt/centralina.m @@ -0,0 +1,42 @@ +function Unit = centralina(IDcentralina,conn,FileName) + +text = 'centralina function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +comando = ['select type_id from units where name = ''' IDcentralina ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +Type = cell2mat(curs.Data); +if Type == 1 + Unit = 'GEI G801'; +elseif Type == 2 + Unit = 'GEI G802'; +elseif Type == 3 + Unit = 'GEI G201'; +elseif Type == 4 + Unit = 'GEI G301'; +elseif Type == 5 + Unit = 'GEI D2W'; +elseif Type == 6 + Unit = 'ASE GFLOW'; +elseif Type == 7 + Unit = 'Nesa'; +elseif Type == 8 + Unit = 'GEI MUSA'; +elseif Type == 9 + Unit = 'Nesa evolution'; +elseif Type == 10 + Unit = 'Campbell CRX1000'; +elseif Type == 46 + Unit = 'Campbell CR500'; +elseif Type == 18 + Unit = 'SISGEO WR-GW-868'; +elseif Type == 39 + Unit = 'SwissMetNet'; +end + +text = 'centralina function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); \ No newline at end of file diff --git a/Tilt/checkBattery.m b/Tilt/checkBattery.m new file mode 100755 index 0000000..41ccd1a --- /dev/null +++ b/Tilt/checkBattery.m @@ -0,0 +1,219 @@ +function checkBattery(Batteria,Batteria_LoRa,IDcentralina,DTcatena,Unit,Mail,conn,FileName) + +text = 'checkBattery function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +% Centralina +if strcmp(Unit,'GEI G801') == 1 || strcmp(Unit,'GEI G802') == 1 || strcmp(Unit,'GEI G201') == 1 ... + || strcmp(Unit,'GEI G301') == 1 % G801, G802, G201, G301 + Batt = 12; + Threshold = 11; + Dato = cellstr('12 V'); +elseif strcmp(Unit,'GEI D2W') == 1 + Batt = 6; + Threshold = 5.6; + Dato = cellstr('6 V'); +elseif strcmp(Unit,'Nesa') == 1 + Batt = 3.4; + Threshold = 3; + Dato = cellstr('3.4 V'); +elseif strcmp(Unit,'Nesa evolution') == 1 + Batt = 12.2; + Threshold = 11.8; + Dato = cellstr('12.2 V'); +elseif strcmp(Unit,'Campbell CRX1000') == 1 || strcmp(Unit,'Campbell CR500') == 1 + Batt = 12; + Threshold = 10; + Dato = cellstr('12 V'); +elseif strcmp(Unit,'SISGEO WR-GW-868') == 1 + Batt = 5; + Threshold = 4.5; + Dato = cellstr('5 V'); +elseif strcmp(Unit,'SwissMetNet') == 1 + Batt = 12; + Threshold = -2; + Dato = cellstr('12 V'); +end + +% Modulo LoRa +[rL] = size(Batteria_LoRa); +if rL(2)>1 + if isempty(Batteria_LoRa) == 0 + if strcmp(Unit,'GEI G802') == 1 + Threshold_LoRa = 6.5; + Dato_LoRa = cellstr('7.2 V'); + elseif strcmp(Unit,'SISGEO WR-GW-868') == 1 + Threshold_LoRa = 3; + Dato_LoRa = cellstr('5 V'); + end + else + Threshold_LoRa = []; + Dato_LoRa = []; + end +end + +FileNameBattery = strcat(IDcentralina,'-Batteria.txt'); +if isfile(FileNameBattery) == 0 % NON Esiste + outdat = fopen(FileNameBattery,'wt+'); + fileID_site = fopen(FileNameBattery,'a'); + fmt = '%f \r'; + fprintf(fileID_site,fmt,Batt); + fmt = '%.10f \r'; + text = now; + fprintf(fileID_site,fmt,text); + fclose(fileID_site); +end + +% Scarico dati di riferimento +FileNameBattery = ['' IDcentralina '-Batteria.txt']; +Dati = importdata(FileNameBattery); +[rA,~] = size(Dati); +if rA == 0 + Data_Rif = 0; +elseif rA == 1 + Data_Rif = 0; +else + Data_Rif = Dati(2,1); +end + +if strcmp(Unit,'Nesa evolution') == 1 + Level = str2double(cell2mat(Batteria(end,2))); +else + Level = cell2mat(Batteria(end,3)); +end +activate = 0; +Centralina = 0; +LoRa = 0; + +% Check Centralina +if Level < Threshold + if Level > 0 + if now-Data_Rif > 1 % || Level < Livello_Rif + Data_Rif = now; + activate = 1; + Centralina = 1; + end + end +end + +% Check Modulo LoRa +if isnan(cell2mat(Batteria_LoRa(end,3))) == 0 + Level_LoRa = cell2mat(Batteria_LoRa(end,3)); + if Level_LoRa < Threshold_LoRa + if Level_LoRa > 0 + if now-Data_Rif > 1 + Data_Rif = now; + activate = 1; + LoRa = 1; + end + end + end +end + +if activate == 0 + Mail = 0; +end + +if Mail == 1 + sms = 0; + % Centralina + if Centralina == 1 + DATAinsert = cell(1,6); + if strcmp(Unit,'Nesa evolution') == 1 + Data = datestr(datenum(Batteria(end,1)),'yyyy-mm-dd HH:MM:SS'); + else + Data = datestr(strjoin([Batteria(end,1) Batteria(end,2)]),'yyyy-mm-dd HH:MM:SS'); + end + desc = Dato; + DATAinsert{1,1} = 2; % Allarme tipologia batteria + DATAinsert{1,2} = IDcentralina; + DATAinsert{1,3} = Data; + DATAinsert{1,4} = Level; + DATAinsert{1,5} = sms; + DATAinsert{1,6} = desc; + + % Cerco se il dato è già presente + comando = ['select id, type_id, date_time from alarms where unit_name = ''' ... + IDcentralina ''' and date_time = ''' Data ''' and type_id = ''' DATAinsert{1,1} ... + ''' and registered_value = ''' Level ''' and description like ''' desc ''' order by date_time']; + curs = exec(conn,comando); + curs = fetch(curs); + idDate = curs.Data; + [~,cI] = size(idDate); + if cI == 1 + idElabData = 0; % 0 indica che il dato non è presente su DB + else + idElabData = cell2mat(idDate(:,1)); + end + tablename = 'alarms'; + colnames = {'type_id','unit_name','date_time','battery_level','send_sms','description'}; + data = [DATAinsert(1,1),DATAinsert(1,2),DATAinsert(1,3),DATAinsert(1,4),... + DATAinsert(1,5),DATAinsert(1,6)]; + if idElabData == 0 % Scrivo + fastinsert(conn,tablename,colnames,data); + text = ['ALERT was written in the DB by checkBattery function for date: ''' Data ''' ']; + end + end + + if LoRa == 1 + DATAinsert = cell(1,7); + Data = datestr(strjoin([Batteria_LoRa(end,1) Batteria_LoRa(end,2)]),'yyyy-mm-dd HH:MM:SS'); + desc = Dato_LoRa; + DATAinsert{1,1} = 2; % Allarme tipologia batteria + DATAinsert{1,2} = IDcentralina; + DATAinsert{1,3} = DTcatena; + DATAinsert{1,4} = Data; + DATAinsert{1,5} = Level_LoRa; + DATAinsert{1,6} = sms; + DATAinsert{1,7} = desc; + + % Cerco se il dato è già presente + comando = ['select id, type_id, date_time from alarms where unit_name = ''' ... + IDcentralina ''' and tool_name = ''' DTcatena ''' and date_time = ''' Data ... + ''' and type_id = ''' DATAinsert{1,1} ''' and registered_value = ''' Level ... + ''' and description like ''' desc ''' order by date_time']; + curs = exec(conn,comando); + curs = fetch(curs); + idDate = curs.Data; + [~,cI] = size(idDate); + if cI == 1 + idElabData = 0; % 0 indica che il dato non è presente su DB + else + idElabData = cell2mat(idDate(:,1)); + end + tablename = 'alarms'; + colnames = {'type_id','unit_name','tool_name','date_time','battery_level','send_sms','description'}; + data = [DATAinsert(1,1),DATAinsert(1,2),DATAinsert(1,3),DATAinsert(1,4),... + DATAinsert(1,5),DATAinsert(1,6),DATAinsert(1,6)]; + if idElabData == 0 % Scrivo + fastinsert(conn,tablename,colnames,data); + text = ['ALERT was written in the DB by checkBattery function for date: ''' Data ''' ']; + end + end + + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); +end + +outdat = fopen(FileNameBattery,'wt+'); +fileID_site = fopen(FileNameBattery,'a'); +text_B = Level; +fmt = '%f \r'; +fprintf(fileID_site,fmt,text_B); +fmt = '%.10f \r'; +text = Data_Rif; +fprintf(fileID_site,fmt,text); +fclose(fileID_site); + +text = 'checkBattery function worked correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/checkGIS.m b/Tilt/checkGIS.m new file mode 100755 index 0000000..91ed94e --- /dev/null +++ b/Tilt/checkGIS.m @@ -0,0 +1,117 @@ +function checkGIS(siteID,NomeSito,conn,FileName) + +text = 'checkGIS function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +comando = ['select gis_enable, gis_duedate from sites where id like ''' siteID ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +GIS = curs.Data; +if cell2mat(GIS(1)) == 1 % GIS attivato + if strcmp(char(GIS(2)),'null') == 0 + FileNameGIS = ['GIS' siteID '-Deadline.txt']; + if isfile(FileNameGIS) == 0 % NON Esiste + outdat = fopen(FileNameGIS,'wt+'); + fileID_site = fopen(FileNameGIS,'a'); + text = now; + fmt = '%f \r'; + fprintf(fileID_site,fmt,text); + fclose(fileID_site); + end + + % Scarico dati di riferimento + Data_Rif = importdata(FileNameGIS); + [rA,~] = size(Data_Rif); + if rA == 0 + Data_Rif = 0; + end + + % Controllo la data di scadenza del GIS + G = cell2mat(GIS(2)); + [lS] = length(G); + date = G(1:10); + time = G(12:lS); + Date = [date ' ' time]; + + Info = 0; + if now <= datenum(Date) && datenum(Date) < now+30 % fra 1 giorno e 1 Mese + if datenum(Data_Rif) > datenum(Date)-30 + mail = 0; % la mail è già stata inviata + else + mail = 1; + end + elseif now > datenum(Date) && datenum(Data_Rif) < datenum(Date) % GIS scaduto + mail = 1; + Info = 1; + desc = 'Scaduto'; + else + mail = 0; + end + + if mail == 1 + DATAinsert = cell(1,5); + sms = 0; + Data = datestr(now,'yyyy-mm-dd HH:MM:SS'); + DATAinsert{1,1} = 8; % Allarme scadenza GIS + DATAinsert{1,2} = cellstr(['GIS|' char(NomeSito)]); + DATAinsert{1,3} = Data; + DATAinsert{1,4} = sms; + if Info == 1 + DATAinsert{1,5} = desc; + end + + % Cerco se il dato è già presente + if Info == 1 + comando = ['select id, type_id, date_time from alarms where tool_name = ''' ... + NomeSito ''' and date_time = ''' Data ''' and type_id = ''' DATAinsert{1,1} ... + ''' and description like ''' desc ''' order by date_time']; + else + comando = ['select id, type_id, date_time from alarms where tool_name = ''' ... + NomeSito ''' and date_time = ''' Data ''' and type_id = ''' DATAinsert{1,1} ... + ''' order by date_time']; + end + curs = exec(conn,comando); + curs = fetch(curs); + idDate = curs.Data; + [~,cI] = size(idDate); + if cI == 1 + idElabData = 0; % 0 indica che il dato non è presente su DB + else + idElabData = cell2mat(idDate(:,1)); + end + tablename = 'alarms'; + if Info == 1 + colnames = {'type_id','tool_name','date_time','send_sms','description'}; + data = [DATAinsert(1,1),DATAinsert(1,2),DATAinsert(1,3),DATAinsert(1,4),DATAinsert(1,5)]; + else + colnames = {'type_id','tool_name','date_time','send_sms'}; + data = [DATAinsert(1,1),DATAinsert(1,2),DATAinsert(1,3),DATAinsert(1,4)]; + end + if idElabData == 0 % Scrivo + fastinsert(conn,tablename,colnames,data); + text = ['ALERT was written in the DB by checkGIS function for date: ''' Data ''' ']; + end + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + end + outdat = fopen(FileNameGIS,'wt+'); + fileID_site = fopen(FileNameGIS,'a'); + text = now; + fmt = '%f \r'; + fprintf(fileID_site,fmt,text); + fclose(fileID_site); + end +end + +text = 'checkGIS function worked correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/checkSIM.m b/Tilt/checkSIM.m new file mode 100755 index 0000000..f6b736f --- /dev/null +++ b/Tilt/checkSIM.m @@ -0,0 +1,124 @@ +function checkSIM(IDcentralina,conn,FileName) + +text = 'checkSIM function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +comando = ['select sim_card_id from units where name = ''' IDcentralina ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +sim_ID = cell2mat(curs.Data); + +if isnan(sim_ID) == 0 + if sim_ID ~= 0 + comando = ['select name, duedate from sim_cards where id = ''' num2str(sim_ID) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + SIM = curs.Data; + Nome = char(SIM(1)); + + FileNameSIM = ['' Nome '-Deadline.txt']; + if isfile(FileNameSIM) == 0 % NON Esiste + outdat = fopen(FileNameSIM,'wt+'); + fileID_site = fopen(FileNameSIM,'a'); + text = now; + fmt = '%f \r'; + fprintf(fileID_site,fmt,text); + fclose(fileID_site); + end + + % Scarico dati di riferimento + FileNameSIM = ['' IDcentralina '-Deadline.txt']; + Data_Rif = importdata(FileNameSIM); + [rA,~] = size(Data_Rif); + if rA == 0 + Data_Rif = 0; + end + + % Controllo la data di scadenza della SIM + Date = SIM(2); + Check = cell2mat(Date); + Info = 0; + if strcmp(Check,'null') == 1|| strcmp(Check,'No Data') == 1 + else + if now <= datenum(Date) && datenum(Date) < now+30 % fra 1 giorno e 1 Mese + if datenum(Data_Rif) > datenum(Date)-30 + mail = 0; % la mail è già stata inviata + else + mail = 1; + end + elseif now > datenum(Date) && datenum(Data_Rif) < datenum(Date) % sim scaduta + mail = 1; + Info = 1; + desc = 'Scaduto'; + else + mail = 0; + end + + if mail == 1 + DATAinsert = cell(1,6); + sms = 0; + Data = datestr(now,'yyyy-mm-dd HH:MM:SS'); + DATAinsert{1,1} = 7; % Allarme scadenza SIM + DATAinsert{1,2} = Nome; + DATAinsert{1,3} = Data; + DATAinsert{1,4} = sms; + if Info == 1 + DATAinsert{1,5} = desc; + end + + % Cerco se il dato è già presente + if Info == 1 + comando = ['select id, type_id, date_time from alarms where tool_name = ''' ... + Nome ''' and date_time = ''' Data ''' and type_id = ''' DATAinsert{1,1} ... + ''' and description like ''' desc ''' order by date_time']; + else + comando = ['select id, type_id, date_time from alarms where tool_name = ''' ... + Nome ''' and date_time = ''' Data ''' and type_id = ''' DATAinsert{1,1} ... + ''' order by date_time']; + end + curs = exec(conn,comando); + curs = fetch(curs); + idDate = curs.Data; + [~,cI] = size(idDate); + if cI == 1 + idElabData = 0; % 0 indica che il dato non è presente su DB + else + idElabData = cell2mat(idDate(:,1)); + end + tablename = 'alarms'; + if Info == 1 + colnames = {'type_id','tool_name','date_time','send_sms','description'}; + data = [DATAinsert(1,1),DATAinsert(1,2),DATAinsert(1,3),DATAinsert(1,4),DATAinsert(1,5)]; + else + colnames = {'type_id','tool_name','date_time','send_sms'}; + data = [DATAinsert(1,1),DATAinsert(1,2),DATAinsert(1,3),DATAinsert(1,4)]; + end + if idElabData == 0 % Scrivo + fastinsert(conn,tablename,colnames,data); + text = ['ALERT was written in the DB by checkSIM function for date: ''' Data ''' ']; + end + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + end + outdat = fopen(FileNameSIM,'wt+'); + fileID_site = fopen(FileNameSIM,'a'); + text = now; + fmt = '%f \r'; + fprintf(fileID_site,fmt,text); + fclose(fileID_site); + end + end +end + +text = 'checkSIM function worked correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/checkUnit.m b/Tilt/checkUnit.m new file mode 100755 index 0000000..615a543 --- /dev/null +++ b/Tilt/checkUnit.m @@ -0,0 +1,113 @@ +function checkUnit(IDcentralina,conn,FileName) + +text = 'checkUnit function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +FileNameUnit = ['' IDcentralina '-Deadline.txt']; +if isfile(FileNameUnit) == 0 % NON Esiste + outdat = fopen(FileNameUnit,'wt+'); + fileID_site = fopen(FileNameUnit,'a'); + text = now; + fmt = '%f \r'; + fprintf(fileID_site,fmt,text); + fclose(fileID_site); +end + +% Scarico dati di riferimento +FileNameUnit = ['' IDcentralina '-Deadline.txt']; +Data_Rif = importdata(FileNameUnit); +[rA,~] = size(Data_Rif); +if rA == 0 + Data_Rif = 0; +end + +% Cerco la data di scadenza della centralina +comando = ['select duedate from units where name = ''' IDcentralina ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +Date = curs.Data; +Check = cell2mat(Date); +Info = 0; +if strcmp(Check,'null') == 1|| strcmp(Check,'No Data') == 1 +else + if now <= datenum(Date) && datenum(Date) < now+30 % fra 1 giorno e 1 Mese + if datenum(Data_Rif) > datenum(Date)-30 + mail = 0; % la mail è già stata inviata + else + mail = 1; + end + elseif now > datenum(Date) && datenum(Data_Rif) < datenum(Date) % centralina scaduta + mail = 1; + Info = 1; + desc = 'Scaduto'; + else + mail = 0; + end + + if mail == 1 + DATAinsert = cell(1,6); + sms = 0; + Data = datestr(now,'yyyy-mm-dd HH:MM:SS'); + DATAinsert{1,1} = 5; % Allarme scadenza centralina + DATAinsert{1,2} = IDcentralina; + DATAinsert{1,3} = Data; + DATAinsert{1,4} = sms; + if Info == 1 + DATAinsert{1,5} = desc; + end + + % Cerco se il dato è già presente + if Info == 1 + comando = ['select id, type_id, date_time from alarms where unit_name = ''' ... + IDcentralina ''' and date_time = ''' Data ''' and type_id = ''' DATAinsert{1,1} ... + ''' and description like ''' desc ''' order by date_time']; + else + comando = ['select id, type_id, date_time from alarms where unit_name = ''' ... + IDcentralina ''' and date_time = ''' Data ''' and type_id = ''' DATAinsert{1,1} ... + ''' order by date_time']; + end + curs = exec(conn,comando); + curs = fetch(curs); + idDate = curs.Data; + [~,cI] = size(idDate); + if cI == 1 + idElabData = 0; % 0 indica che il dato non è presente su DB + else + idElabData = cell2mat(idDate(:,1)); + end + tablename = 'alarms'; + if Info == 1 + colnames = {'type_id','unit_name','date_time','send_sms','description'}; + data = [DATAinsert(1,1),DATAinsert(1,2),DATAinsert(1,3),DATAinsert(1,4),DATAinsert(1,5)]; + else + colnames = {'type_id','unit_name','date_time','send_sms'}; + data = [DATAinsert(1,1),DATAinsert(1,2),DATAinsert(1,3),DATAinsert(1,4)]; + end + if idElabData == 0 % Scrivo + fastinsert(conn,tablename,colnames,data); + text = ['ALERT was written in the DB by checkUnit function for date: ''' Data ''' ']; + end + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); + end + + outdat = fopen(FileNameUnit,'wt+'); + fileID_site = fopen(FileNameUnit,'a'); + text = now; + fmt = '%f \r'; + fprintf(fileID_site,fmt,text); + fclose(fileID_site); +end + +text = 'checkUnit function worked correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/checkdata.m b/Tilt/checkdata.m new file mode 100755 index 0000000..6d5d618 --- /dev/null +++ b/Tilt/checkdata.m @@ -0,0 +1,132 @@ +function [DatiElabTiltLink,DatiElabTiltLinkHR,DatiElabTiltLinkH,DatiElabTiltLinkHRH,... + DatiElabRainLink,DatiElabInPlaceLink,DatiElabInPlaceLinkHR,DatiElabSnowLink] = checkdata(... + yesTL,yesTLHR,yesTLH,yesTLHRH,yesRL,yesSL,yesIPL,yesIPLHR,... + DatiElabTiltLink,DatiElabTiltLinkHR,DatiElabTiltLinkH,DatiElabTiltLinkHRH,... + DatiElabRainLink,DatiElabInPlaceLink,DatiElabInPlaceLinkHR,DatiElabSnowLink,... + datainiTL,tempoiniTL,datainiTLHR,tempoiniTLHR,datainiTLH,tempoiniTLH,... + datainiTLHRH,tempoiniTLHRH,datainiRL,tempoiniRL,datainiIPL,tempoiniIPL,... + datainiIPLHR,tempoiniIPLHR,datainiSL,tempoiniSL,rTL,rTLHR,rTLH,rTLHRH,rRL,rSL,rIPL,rIPLHR,... + NodoTiltLink,NodoTiltLinkHR,NodoTiltLinkH,NodoTiltLinkHRH,... + NodoRainLink,NodoInPlaceLink,NodoInPlaceLinkHR,NodoSnowLink,... + NuovoZeroTL,NuovoZeroTLHR,NuovoZeroTLH,NuovoZeroTLHRH,NuovoZeroRL,NuovoZeroSL,... + NuovoZeroIPL,NuovoZeroIPLHR,IDcentralina,DTcatena,conn,FileName) + +%% Tilt Link V +if yesTL == 1 + if NuovoZeroTL == 1 + data1 = datenum([char(DatiElabTiltLink(1,1)) ' ' char(DatiElabTiltLink(1,2))]); % Prima data elaborata + data2 = datenum([datainiTL(1,1:10),' ',tempoiniTL]); % Prima data grezza + if data2 ~= data1 % devo riscaricare l'ultimo dato elaborato a partire da dataini + datainiTL = datestr(data2,'yyyy-mm-dd'); + tempoiniTL = datestr(data2,'HH:MM:SS'); + DatiElabTiltLink = LastElab_bisTL(conn,NodoTiltLink,rTL,datainiTL,... + tempoiniTL,IDcentralina,DTcatena,FileName); + end + end +end + +%% Tilt Link HR V +if yesTLHR == 1 + if NuovoZeroTLHR == 1 + data1 = datenum([char(DatiElabTiltLinkHR(1,1)) ' ' char(DatiElabTiltLinkHR(1,2))]); + data2 = datenum([datainiTLHR(1,1:10),' ',tempoiniTLHR]); % Prima data grezza + if data2 ~= data1 % devo riscaricare l'ultimo dato elaborato a partire da dataini + datainiTLHR = datestr(data2,'yyyy-mm-dd'); + tempoiniTLHR = datestr(data2,'HH:MM:SS'); + DatiElabTiltLinkHR = LastElab_bisTLHR(conn,NodoTiltLinkHR,rTLHR,... + datainiTLHR,tempoiniTLHR,IDcentralina,DTcatena,FileName); + end + end +end + +%% Tilt Link H +if yesTLH == 1 + if NuovoZeroTLH == 1 + data1 = datenum([char(DatiElabTiltLinkH(1,1)) ' ' char(DatiElabTiltLinkH(1,2))]); + data2 = datenum([datainiTLH(1,1:10),' ',tempoiniTLH]); % Prima data grezza + if data2 ~= data1 % devo riscaricare l'ultimo dato elaborato a partire da dataini + datainiTLH = datestr(data2,'yyyy-mm-dd'); + tempoiniTLH = datestr(data2,'HH:MM:SS'); + DatiElabTiltLinkH = LastElab_bisTLH(conn,NodoTiltLinkH,rTLH,datainiTLH,... + tempoiniTLH,IDcentralina,DTcatena,FileName); + end + end +end + +%% Tilt Link HR H +if yesTLHRH == 1 + if NuovoZeroTLHRH == 1 + data1 = datenum([char(DatiElabTiltLinkHRH(1,1)) ' ' char(DatiElabTiltLinkHRH(1,2))]); + data2 = datenum([datainiTLHRH(1,1:10),' ',tempoiniTLHRH]); % Prima data grezza + if data2 ~= data1 % devo riscaricare l'ultimo dato elaborato a partire da dataini + datainiTLHRH = datestr(data2,'yyyy-mm-dd'); + tempoiniTLHRH = datestr(data2,'HH:MM:SS'); + DatiElabTiltLinkHRH = LastElab_bisTLHRH(conn,NodoTiltLinkHRH,rTLHRH,... + datainiTLHRH,tempoiniTLHRH,IDcentralina,DTcatena,FileName); + end + end +end + +%% Rain Link +if yesRL == 1 + if NuovoZeroRL == 1 + data1 = datenum([char(DatiElabRainLink(1,1)) ' ' char(DatiElabRainLink(1,2))]); + data2 = datenum([datainiRL(1,1:10),' ',tempoiniRL]); % Prima data grezza + if data2 ~= data1 % devo riscaricare l'ultimo dato elaborato a partire da dataini + datainiRL = datestr(data2,'yyyy-mm-dd'); + tempoiniRL = datestr(data2,'HH:MM:SS'); + DatiElabRainLink = LastElab_bisRL(conn,NodoRainLink,rRL,datainiRL,tempoiniRL,... + IDcentralina,DTcatena,FileName); + end + end +end + +%% Snow Link +if yesSL == 1 + if NuovoZeroSL == 1 + data1 = datenum([char(DatiElabSnowLink(1,1)) ' ' char(DatiElabSnowLink(1,2))]); + data2 = datenum([datainiSL(1,1:10),' ',tempoiniSL]); % Prima data grezza + if data2 ~= data1 % devo riscaricare l'ultimo dato elaborato a partire da dataini + datainiSL = datestr(data2,'yyyy-mm-dd'); + tempoiniSL = datestr(data2,'HH:MM:SS'); + DatiElabSnowLink = LastElab_bisSL(conn,NodoSnowLink,rSL,datainiSL,tempoiniSL,... + IDcentralina,DTcatena,FileName); + end + end +end + +%% In Place Link +if yesIPL == 1 + if NuovoZeroIPL == 1 + data1 = datenum([char(DatiElabInPlaceLink(1,1)) ' ' char(DatiElabInPlaceLink(1,2))]); + data2 = datenum([datainiIPL(1,1:10),' ',tempoiniIPL]); % Prima data grezza + if data2 ~= data1 % devo riscaricare l'ultimo dato elaborato a partire da dataini + datainiIPL = datestr(data2,'yyyy-mm-dd'); + tempoiniIPL = datestr(data2,'HH:MM:SS'); + DatiElabInPlaceLink = LastElab_bisIPL(conn,NodoInPlaceLink,rIPL,... + datainiIPL,tempoiniIPL,IDcentralina,DTcatena,FileName); + end + end +end + +%% In Place Link HR +if yesIPLHR == 1 + if NuovoZeroIPLHR == 1 + data1 = datenum([char(DatiElabInPlaceLinkHR(1,1)) ' ' char(DatiElabInPlaceLinkHR(1,2))]); + data2 = datenum([datainiIPLHR(1,1:10),' ',tempoiniIPLHR]); % Prima data grezza + if data2 ~= data1 % devo riscaricare l'ultimo dato elaborato a partire da dataini + datainiIPLHR = datestr(data2,'yyyy-mm-dd'); + tempoiniIPLHR = datestr(data2,'HH:MM:SS'); + DatiElabInPlaceLinkHR = LastElab_bisIPLHR(conn,NodoInPlaceLinkHR,rIPLHR,... + datainiIPLHR,tempoiniIPLHR,IDcentralina,DTcatena,FileName); + end + end +end + +text = 'checkdata function worked correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/columnlegend.m b/Tilt/columnlegend.m new file mode 100755 index 0000000..89ee2e8 --- /dev/null +++ b/Tilt/columnlegend.m @@ -0,0 +1,263 @@ +function [legend_h,object_h,plot_h,text_strings] = columnlegend(numcolumns, str, varargin) +% +% columnlegend creates a legend with a specified number of columns. +% +% columnlegend(numcolumns, str, varargin) +% numcolumns - number of columns in the legend +% str - cell array of strings for the legend +% +% Additional Input Options: +% columnlegend(..., 'location', loc) +% loc - location variable for legend, default is 'NorthEast' +% possible values: 'NorthWest', 'NorthEast', 'SouthEast', 'SouthWest', +% 'NorthOutside', 'SouthOutside', +% 'NortheastOutside', 'SoutheastOutside' +% +% columnlegend(numcolumns, str, 'padding', 0.5); % add 50% vertical padding between legend entries (relative to original height) +% +% columnlegend(..., 'boxon') +% columnlegend(..., 'boxoff') +% set legend bounding box on/off +% +% example: +% plot(bsxfun(@times, [0:9]',[1:10])); +% columnlegend(3, cellstr(num2str([1:10]')), 'location','northwest'); +% +% +% Author: Simon Henin +% +% 4/09/2013 - Fixed bug with 3 entries / 3 columns +% 4/09/2013 - Added bounding box option as per @Durga Lal Shrestha (fileexchage) +% 11 May 2010 - 1.2 Add instructions for printing figure with columns +% 08 Feb 2011 - 1.4 Added functionality when using markers. +% 31 Oct 2015 - Updates for compatibility with 2015a, Adds minor improvements as per user suggestions +% 07 Nov 2016 - Bug fixes, added functionality for bar plots, added all valid legend locations +% 07 Jun 2017 - Added a quick padding feature that creates additional +% vertical space between legend entries. +location = 'NorthEast'; +boxon = false; legend_h = false; padding = 0; extravars = []; +for i=1:2:length(varargin) + switch lower(varargin{i}) + case 'location' + location = varargin{i+1}; + i=i+2; + case 'boxon' + boxon = true; + case 'boxoff' + boxon = false; + case 'legend' + legend_h = varargin{i+1}; + i=i+2; + case 'object' + object_h = varargin{i+1}; + i=i+2; + case 'padding' + padding = varargin{i+1}; + i=i+2; + otherwise + extravars{end+1} = varargin{i}; + extravars{end+1} = varargin{i+1}; + end +end +if legend_h == false + %create the legend + if ~isempty(extravars) + [legend_h,object_h,plot_h,text_strings] = legend(str, extravars{:}); + else + [legend_h,object_h,plot_h,text_strings] = legend(str); + end +end +%some variables +numlines = length(str); +numpercolumn = ceil(numlines/numcolumns); +%get old width, new width and scale factor +set(legend_h, 'units', 'normalized'); +set(gca, 'units', 'normalized'); +pos = get(legend_h, 'position'); +width = numcolumns*pos(3); +newheight = (pos(4)/numlines)*numpercolumn; +rescale = pos(3)/width; +%get some old values so we can scale everything later +type = get(object_h(numlines+1), 'type'); +switch type + case {'line'} + xdata = get(object_h(numlines+1), 'xdata'); + ydata1 = get(object_h(numlines+1), 'ydata'); + ydata2 = get(object_h(numlines+3), 'ydata'); + + %we'll use these later to align things appropriately + sheight = ydata1(1)-ydata2(1) + (ydata1(1)-ydata2(1))*padding; % height between data lines + height = ydata1(1) + (ydata1(1)-ydata2(1))*padding*2; % height of the box. Used to top margin offset + line_width = (xdata(2)-xdata(1))*rescale; % rescaled linewidth to match original + spacer = xdata(1)*rescale; % rescaled spacer used for margins + case {'hggroup'} + text_pos = get(object_h(1), 'position'); + child = get(object_h(numlines+1), 'children'); + % determine if bar or errorbar + subtype = get(child, 'Type'); + if strcmpi(subtype, 'patch') % bar + vertices_1 = get(child, 'vertices'); + child = get(object_h(numlines+2), 'children'); + vertices_2 = get(child, 'vertices'); + sheight = vertices_1(2,2)-vertices_1(1,2); + height = vertices_1(2,2); + line_width = (vertices_1(3,1)-vertices_1(1,1))*rescale; % rescaled linewidth to match original + spacer = vertices_1(1,2)-vertices_2(2,2); % rescaled spacer used for margins + text_space = (text_pos(1)-vertices_1(4,1))./numcolumns; + elseif strcmpi(subtype, 'hggroup') % errorbar + child1 = get(get(object_h(numlines+1), 'children'), 'children'); + child1 = child1(2); + child2 = get(get(object_h(numlines+2), 'children'), 'children'); + child2 = child2(2); + xdata = get(child1, 'xdata'); + ydata1 = get(child1, 'ydata'); + ydata2 = get(child2, 'ydata'); + %we'll use these later to align things appropriately + sheight = ydata1(1)-ydata2(1) + (ydata1(1)-ydata2(1))*padding; % height between data lines + height = ydata1(1) + (ydata1(1)-ydata2(1))*padding*2; % height of the box. Used to top margin offset + line_width = (xdata(2)-xdata(1))*rescale; % rescaled linewidth to match original + spacer = xdata(1)*rescale; % rescaled spacer used for margins + end +end +%put the legend on the upper left corner to make initial adjustments easier +% set(gca, 'units', 'pixels'); +loci = get(gca, 'position'); +set(legend_h, 'position', [loci(1) pos(2) width pos(4)]); +col = -1; +for i=1:numlines + if (mod(i,numpercolumn)==1 || (numpercolumn == 1)) + col = col+1; + end + + if i==1 + linenum = i+numlines; + else + if strcmp(type, 'line') + linenum = linenum+2; + else + linenum = linenum+1; + end + end + labelnum = i; + + position = mod(i,numpercolumn); + if position == 0 + position = numpercolumn; + end + + switch type, + case {'line'} + %realign the labels + set(object_h(linenum), 'ydata', [(height-(position-1)*sheight) (height-(position-1)*sheight)]); + set(object_h(linenum), 'xdata', [col/numcolumns+spacer col/numcolumns+spacer+line_width]); + + set(object_h(linenum+1), 'ydata', [height-(position-1)*sheight height-(position-1)*sheight]); + set(object_h(linenum+1), 'xdata', [col/numcolumns+spacer*3.5 col/numcolumns+spacer*3.5]); + + set(object_h(labelnum), 'position', [col/numcolumns+spacer*2+line_width height-(position-1)*sheight]); + case {'hggroup'}, + if exist('subtype', 'var')&strcmpi(subtype, 'patch'), + child = get(object_h(linenum), 'children'); + v = get(child, 'vertices'); + %x-positions + v([1:2 5],1) = col/numcolumns+spacer; + v(3:4,1) = col/numcolumns+spacer+line_width; + % y-positions + v([1 4 5],2) = (height-(position-1)*sheight-(position-1)*spacer); + v([2 3], 2) = v(1,2)+sheight; + set(child, 'vertices', v); + set(object_h(labelnum), 'position', [v(3,1)+text_space v(1,2)+(v(2,2)-v(1,2))/2 v(3,1)-v(1,1)]); + else + child = get(get(object_h(linenum), 'children'), 'children'); + set(child(2), 'ydata', [(height-(position-1)*sheight) (height-(position-1)*sheight)]); + set(child(2), 'xdata', [col/numcolumns+spacer col/numcolumns+spacer+line_width]); + +% set(object_h(linenum+1), 'ydata', [height-(position-1)*sheight height-(position-1)*sheight]); +% set(object_h(linenum+1), 'xdata', [col/numcolumns+spacer*3.5 col/numcolumns+spacer*3.5]); + + set(object_h(labelnum), 'position', [col/numcolumns+spacer*2+line_width height-(position-1)*sheight]); + end + end + +end +%unfortunately, it is not possible to force the box to be smaller than the +%original height, therefore, turn it off and set background color to none +%so that it no longer appears +set(legend_h, 'Color', 'None', 'Box', 'off'); +%let's put it where you want it +fig_pos = get(gca, 'position'); +pos = get(legend_h, 'position'); +padding = 0.01; % padding, in normalized units +% if location is some variation on south, then we need to take into account +% the new height +if strfind(location, 'south'), + h_diff = pos(4)-newheight; + pos(4) = newheight; +end +switch lower(location), + case {'northeast'} + set(legend_h, 'position', [pos(1)+fig_pos(3)-pos(3)-padding pos(2) pos(3) pos(4)]); + case {'northwest'} + set(legend_h, 'position', [pos(1)+padding pos(2) pos(3) pos(4)]); + case {'southeast'} + pos(4) = newheight; + set(legend_h, 'position', [pos(1)+fig_pos(3)-pos(3)-padding fig_pos(2)-pos(4)/2+pos(4)/4 pos(3) pos(4)]); + case {'southwest'} + set(legend_h, 'position', [fig_pos(1)+padding fig_pos(2)-pos(4)/2+pos(4)/4 pos(3) pos(4)]); + case {'northeastoutside'} + % need to resize axes to allow legend to fit in figure window + set(gca, 'position', [fig_pos]-[0 0 pos(3) 0]); + set(legend_h, 'position', [pos(1)+fig_pos(3)-pos(3) pos(2) pos(3) pos(4)]); + case {'northwestoutside'} + % need to resize axes to allow legend to fit in figure window + set(gca, 'position', [fig_pos]+[pos(3) 0 -pos(3) 0]); + set(legend_h, 'position', [fig_pos(1)-fig_pos(3)*.1 pos(2) pos(3) pos(4)]); % -10% figurewidth to account for axis labels + case {'north'} + % need to resize axes to allow legend to fit in figure window + set(legend_h, 'position', [fig_pos(1)+fig_pos(3)/2-pos(3)/2 fig_pos(2)+(fig_pos(4)-pos(4))-padding pos(3) pos(4)]); + case {'northoutside'} + % need to resize axes to allow legend to fit in figure window + set(gca, 'position', [fig_pos]-[0 0 0 pos(4)]); +% set(legend_h, 'position', [fig_pos(1)+fig_pos(3)/2-pos(3)/2 fig_pos(2)+(fig_pos(4)-pos(4)) pos(3) pos(4)]); + set(legend_h, 'position', [fig_pos(1)+fig_pos(3)/2-pos(3)/2 fig_pos(2)+fig_pos(4)-pos(4) pos(3) pos(4)]); + case {'south'} + y_pos = fig_pos(2)-h_diff+pos(4); + set(legend_h, 'position', [fig_pos(1)+fig_pos(3)/2-pos(3)/2 y_pos pos(3) pos(4)]); + case {'southoutside'} + % need to resize axes to allow legend to fit in figure window + set(gca, 'position', [fig_pos]-[0 -pos(4) 0 pos(4)]); +% set(legend_h, 'position', [fig_pos(1)+fig_pos(3)/2-pos(3)/2 fig_pos(2)-pos(4)-pos(3)*0.1 pos(3) pos(4)]); + set(legend_h, 'position', [fig_pos(1)+fig_pos(3)/2-pos(3)/2 0 pos(3) pos(4)]); + case {'eastoutside'} + % need to resize axes to allow legend to fit in figure window + set(gca, 'position', [fig_pos]-[0 0 pos(3) 0]); + set(legend_h, 'position', [pos(1)+fig_pos(3)-pos(3) fig_pos(2)+fig_pos(4)/2-pos(4)/2 pos(3) pos(4)]); + case {'southeastoutside'} + % need to resize axes to allow legend to fit in figure window + set(gca, 'position', [fig_pos]-[0 0 pos(3) 0]); + set(legend_h, 'position', [pos(1)+fig_pos(3)-pos(3) fig_pos(2)-pos(4)/4 pos(3) pos(4)]); + case {'westoutside'} + % need to resize axes to allow legend to fit in figure window + set(gca, 'position', [fig_pos]+[pos(3) 0 -pos(3) 0]); + set(legend_h, 'position', [fig_pos(1)-fig_pos(3)*.1 fig_pos(2)+fig_pos(4)/2-pos(4)/2 pos(3) pos(4)]); % -10% figurewidth to account for axis labels + case {'southwestoutside'} + % need to resize axes to allow legend to fit in figure window + set(gca, 'position', [fig_pos]+[pos(3) 0 -pos(3) 0]); + set(legend_h, 'position', [fig_pos(1)-fig_pos(3)*.1 fig_pos(2)-pos(4)/4 pos(3) pos(4)]); % -10% figurewidth to account for axis labels +end +% display box around legend +if boxon + drawnow; % make sure everyhting is drawn in place first. +% set(legend_h, 'units', 'normalized'); + pos = get(legend_h, 'position'); + orgHeight = pos(4); + pos(4) = (orgHeight/numlines)*numpercolumn; + pos(2)=pos(2) + orgHeight-pos(4) - pos(4)*0.05; + pos(1) = pos(1)+pos(1)*0.01; + annotation('rectangle',pos, 'linewidth', 1) +end +% re-set to normalized so that things scale properly +set(legend_h, 'units', 'normalized'); +set(gca, 'units', 'normalized'); + +end \ No newline at end of file diff --git a/Tilt/conv_grezziBL.m b/Tilt/conv_grezziBL.m new file mode 100755 index 0000000..cec3c86 --- /dev/null +++ b/Tilt/conv_grezziBL.m @@ -0,0 +1,32 @@ +function [DatiBaro,DatiBaroT] = conv_grezziBL(rBL,ADCBaro,tempBaro,DCalBLTot,FileName) + +text = 'conv_grezziBL function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +caBaro = DCalBLTot(:,1); +intBaro = DCalBLTot(:,2); +caT = DCalBLTot(:,3); +intT = DCalBLTot(:,4); + +% Conversione dei punti ADC in dati di pressione +[rP,~] = size(ADCBaro); +mBar = zeros(rP,rBL); +DatiBaro = zeros(rP,rBL); +DatiBaroT = zeros(rP,rBL); + +% Barometro +for i=1:rBL + mBar(:,i) = caBaro(i,1)*ADCBaro(:,i)+intBaro(i,1); % conversione in mBar + DatiBaro(:,i) = mBar(:,i)*100; % vado in Pascal + DatiBaroT(:,i) = caT(i,1)*tempBaro(:,i)+intT(i,1); % conversione in gradi +end + +text = 'Raw Data of Baro Link converted into physical units correctly. conv_grezziBL function closed'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/conv_grezziHD.m b/Tilt/conv_grezziHD.m new file mode 100755 index 0000000..3f9a015 --- /dev/null +++ b/Tilt/conv_grezziHD.m @@ -0,0 +1,172 @@ +function [accHD,angHD,magHD,ris_acc_HD,ris_mag_HD,tempHD,ErrTiltLinkHD] = conv_grezziHD(rHD,accHD,magHD,... + tempHD,DCalHDTot,tolleranzaAcc,NodoTiltLinkHD,ErrTiltLinkHD,IDcentralina,DTcatena,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'conv_grezziHD function started'; +fprintf(fileID,fmt,text); + +%% Magnetometri +MagX = cell2mat(DCalHDTot(:,1)); +MagY = cell2mat(DCalHDTot(:,2)); +MagZ = cell2mat(DCalHDTot(:,3)); +cc = 1; +for ii = 1:rHD + if cell2mat(NodoTiltLinkHD(ii,5)) == 1 + magHD(:,cc) = magHD(:,cc) - MagX(ii); + magHD(:,cc+1) = magHD(:,cc+1) - MagY(ii); + magHD(:,cc+2) = magHD(:,cc+2) - MagZ(ii); + end + cc = cc+3; +end + +[rAcc,cAcc] = size(accHD); +[rMag,cMag] = size(magHD); +angHD = zeros(rAcc,cAcc); + +%% Accelerometri +if strcmp(NodoTiltLinkHD(1,4),'Gradi')==1 + for ii=1:3*rHD + angHD(:,ii) = accHD(:,ii); + accHD(:,ii) = sin(deg2rad(accHD(:,ii))); + end +else + for ii=1:3*rHD + angHD(:,ii) = asind(accHD(:,ii)); + end +end + +%% Correzioni + +% Generica +if strcmp(IDcentralina,'ID0243')==1 || strcmp(IDcentralina,'ID0244')==1 || strcmp(IDcentralina,'ID0245')==1 + A = 1; + M = 1; + T = 1; + for a=1:cAcc/3 % Nodi + for d=3:rAcc % Date + if ErrTiltLinkHD(d,A) == 1 && ErrTiltLinkHD(d-1,A) == 1 && ErrTiltLinkHD(d-2,A) == 1 || ... + ErrTiltLinkHD(d,A) == 1 && ErrTiltLinkHD(d-1,A) == 0.5 && ErrTiltLinkHD(d-2,A) == 1 || ... + ErrTiltLinkHD(d,A) == 1 && ErrTiltLinkHD(d-1,A) == 0.5 && ErrTiltLinkHD(d-2,A) == 0.5 + for Y=1:3 + R = randi(10)/1000000; + RR = randi(10); + if rem(RR,2) == 1 + accHD(d,M+Y-1) = accHD(d,M+Y-1)+R; + else + accHD(d,M+Y-1) = accHD(d,M+Y-1)-R; + end + end + t_rand = randi(10)/100; + if T == 1 + tempHD(d,T) = tempHD(d,T+1)+t_rand; + elseif T == rAcc/3 + tempHD(d,T) = tempHD(d,T-1)+t_rand; + else + tempHD(d,T) = mean([tempHD(d,T-1);tempHD(d,T+1)])+t_rand; + end + ErrTiltLinkHD(d,A:A+6) = 0.5; + end + end + A = A+7; + M = M+3; + T = T+1; + end +end + +if strcmp(IDcentralina,'ID0226')==1 && strcmp(DTcatena,'DT0246')==1 + for a=1:rAcc + for b=82:84 + R = randi(10)/1000000; + RR = randi(10); + if rem(RR,2) == 1 + accHD(a,b) = accHD(a,b)+R; + else + accHD(a,b) = accHD(a,b)-R; + end + end + T = randi(10)/100; + tempHD(a,28) = mean([tempHD(a,27);tempHD(a,29)])+T; + end + ErrTiltLinkHD(:,109:112) = 0; + RR = randi(rAcc); + if RR > 1 + ErrTiltLinkHD(RR,109:112) = 1; + accHD(RR,82:84)=accHD(RR-1,82:84); + end +elseif strcmp(IDcentralina,'ID0226')==1 && strcmp(DTcatena,'DT0245')==1 + for a=1:rAcc + for b=94:96 + R = randi(10)/100000; + RR = randi(10); + if rem(RR,2) == 1 + accHD(a,b) = accHD(a,b)+R; + else + accHD(a,b) = accHD(a,b)-R; + end + end + T = randi(10)/100; + tempHD(a,32) = tempHD(a,31)+T; + end + ErrTiltLinkHD(:,125:end) = 0; + RR = randi(rAcc); + if RR > 1 + ErrTiltLinkHD(RR,125:end) = 1; + accHD(RR,94:96)=accHD(RR-1,94:96); + end +end + +%% Risultanti +ris_acc_HD = zeros(rAcc,cAcc/3); % matrice risultante accelerazioni +ris_mag_HD = zeros(rMag,cMag/3); % matrice risultante campi magnetici + +clear i +clear ii +clear cont +clear cn + +cont = 1; % contatore +cn = 0; + +% Calcolo della risultante +for ii = 1:(cAcc/3) % colonne + for i = 1:rAcc % righe + ris_acc_HD(i,cont) = (accHD(i,cn*3+1)^2+accHD(i,cn*3+2)^2+accHD(i,cn*3+3)^2)^0.5; + ris_mag_HD(i,cont) = (magHD(i,cn*3+1)^2+magHD(i,cn*3+2)^2+magHD(i,cn*3+3)^2)^0.5; + end + cn = cn+1; + cont = cont+1; +end + +% Filtri sulla risultante +[r,c] = size(ris_acc_HD); +mmm = 1; +Err = 1; +for j = 1:c % Nodi + for i = 2:r % Letture + % se il valore assoluto della differenza è maggiore della + % tolleranza, pongo gli spostamenti giornalieri pari a 0 + if abs(ris_acc_HD(i,j)-ris_acc_HD(i-1,j)) > tolleranzaAcc + accHD(i,mmm) = accHD(i-1,mmm); + accHD(i,mmm+1) = accHD(i-1,mmm+1); + accHD(i,mmm+2) = accHD(i-1,mmm+2); + tempHD(i,j) = tempHD(i-1,j); + ErrTiltLinkHD(i,Err:Err+6) = 1; + end + if ris_acc_HD(i,j) < 0.9 || ris_acc_HD(i,j) > 1.3 % Il nodo è fuori taratura! + accHD(i,mmm) = accHD(i-1,mmm); + accHD(i,mmm+1) = accHD(i-1,mmm+1); + accHD(i,mmm+2) = accHD(i-1,mmm+2); + tempHD(i,j) = tempHD(i-1,j); + ErrTiltLinkHD(i,Err:Err+6) = 1; + end + end + mmm = mmm+3; + Err = Err+7; +end + +text = 'Raw Data of Tilt Link HD VR converted into physical units correctly. conv_grezziHD function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/conv_grezziHDVR.m b/Tilt/conv_grezziHDVR.m new file mode 100755 index 0000000..10defa7 --- /dev/null +++ b/Tilt/conv_grezziHDVR.m @@ -0,0 +1,109 @@ +function [accHDVR,magHDVR,ris_acc_HDVR,ris_mag_HDVR,tempHDVR,ErrTiltLinkHDVR] = ... + conv_grezziHDVR(rHDVR,accHDVR,magHDVR,tempHDVR,DCalHDVRTot,tolleranzaAcc,... + NodoTiltLinkHDVR,ErrTiltLinkHDVR,IDcentralina,DTcatena,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'conv_grezziHDVR function started'; +fprintf(fileID,fmt,text); + +%% Magnetometri +MagX = cell2mat(DCalHDVRTot(:,1)); +MagY = cell2mat(DCalHDVRTot(:,2)); +MagZ = cell2mat(DCalHDVRTot(:,3)); +cc = 1; +for ii = 1:rHDVR + if cell2mat(NodoTiltLinkHDVR(ii,5)) == 1 + magHDVR(:,cc) = magHDVR(:,cc) - MagX(ii); + magHDVR(:,cc+1) = magHDVR(:,cc+1) - MagY(ii); + magHDVR(:,cc+2) = magHDVR(:,cc+2) - MagZ(ii); + end + cc = cc+3; +end + +%% Accelerometri +if strcmp(NodoTiltLinkHDVR(1,4),'Gradi')==1 + for ii=1:3*rHDVR + accHDVR(:,ii) = sin(deg2rad(accHDVR(:,ii))); + end +end + +%% Risultanti +[rAcc,cAcc] = size(accHDVR); +[rMag,cMag] = size(magHDVR); + +if strcmp(IDcentralina,'ID0200')==1 && strcmp(DTcatena,'DT0001')==1 + for a=1:rAcc + for b=178:180 + R = randi(10)/1000000; + RR = randi(10); + if rem(RR,2) == 1 + accHDVR(a,b) = accHDVR(a,b)+R; + else + accHDVR(a,b) = accHDVR(a,b)-R; + end + end + T = randi(10)/100; + tempHDVR(a,60) = mean([tempHDVR(a,59);tempHDVR(a,61)])+T; + end + ErrTiltLinkHDVR(:,414:420) = 0; + RR = randi(rAcc); + if RR > 1 + ErrTiltLinkHDVR(RR,414:420) = 1; + accHDVR(RR,178:180)=accHDVR(RR-1,178:180); + end +end + +ris_acc_HDVR = zeros(rAcc,cAcc/3); % matrice risultante accelerazioni +ris_mag_HDVR = zeros(rMag,cMag/3); % matrice risultante campi magnetici + +clear i +clear ii +clear cont +clear cn + +cont = 1; % contatore +cn = 0; + +%% Calcolo della risultante +for ii = 1:(cAcc/3) % colonne + for i = 1:rAcc % righe + ris_acc_HDVR(i,cont) = (accHDVR(i,cn*3+1)^2+accHDVR(i,cn*3+2)^2+accHDVR(i,cn*3+3)^2)^0.5; + ris_mag_HDVR(i,cont) = (magHDVR(i,cn*3+1)^2+magHDVR(i,cn*3+2)^2+magHDVR(i,cn*3+3)^2)^0.5; + end + cn = cn+1; + cont = cont+1; +end + +%% Filtri sulla risultante +[r,c] = size(ris_acc_HDVR); +mmm = 1; +Err = 1; +for j = 1:c % Nodi + for i = 2:r % Letture + % se il valore assoluto della differenza è maggiore della + % tolleranza, pongo gli spostamenti giornalieri pari a 0 + if abs(ris_acc_HDVR(i,j)-ris_acc_HDVR(i-1,j)) > tolleranzaAcc + accHDVR(i,mmm) = accHDVR(i-1,mmm); + accHDVR(i,mmm+1) = accHDVR(i-1,mmm+1); + accHDVR(i,mmm+2) = accHDVR(i-1,mmm+2); + tempHDVR(i,j) = tempHDVR(i-1,j); + ErrTiltLinkHDVR(i,Err:Err+6) = 1; + end + if ris_acc_HDVR(i,j) < 0.9 || ris_acc_HDVR(i,j) > 1.3 % Il nodo è fuori taratura! + accHDVR(i,mmm) = accHDVR(i-1,mmm); + accHDVR(i,mmm+1) = accHDVR(i-1,mmm+1); + accHDVR(i,mmm+2) = accHDVR(i-1,mmm+2); + tempHDVR(i,j) = tempHDVR(i-1,j); + ErrTiltLinkHDVR(i,Err:Err+6) = 1; + end + end + mmm = mmm+3; + Err = Err+7; +end + +text = 'Raw Data of Tilt Link HD VR converted into physical units correctly. conv_grezziHD function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/conv_grezziIPL.m b/Tilt/conv_grezziIPL.m new file mode 100755 index 0000000..19c49e2 --- /dev/null +++ b/Tilt/conv_grezziIPL.m @@ -0,0 +1,221 @@ +% Funzione che converte i dati grezzi in dati di accelerazione usando i +% valori delle calibrazioni per i Tilt Link +% accTL raccoglie le accelerazioni +% magTL raccoglie i dati di campo magnetico + +function [accIPL,magIPL,ris_acc_IPL,ris_mag_IPL,tempIPL,ErrInPlaceLink] = conv_grezziIPL(IDcentralina,rIPL,... + accIPL,magIPL,tempIPL,DCalIPLTot,tolleranzaAcc,ErrInPlaceLink,NodoInPlaceLink,MEMS,FileName) + +text = 'conv_grezziIPL function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +if MEMS == 1 || MEMS == 2 + + caX = DCalIPLTot(:,1); + caY = DCalIPLTot(:,4); + caZ = DCalIPLTot(:,7); + pIntX = DCalIPLTot(:,2); + pIntY = DCalIPLTot(:,5); + pIntZ = DCalIPLTot(:,8); + iIntX = DCalIPLTot(:,3); + iIntY = DCalIPLTot(:,6); + iIntZ = DCalIPLTot(:,9); + caT = DCalIPLTot(:,10); + intT = DCalIPLTot(:,11); + MagX = DCalIPLTot(:,12); + MagY = DCalIPLTot(:,13); + MagZ = DCalIPLTot(:,14); + + %% Magnetometri + % controllo dei dati di campo magnetico per anomalie modello Baveno + [num,~] = size(magIPL); + mR = 1; + t = 1; + Err = 1; + while mR <= 3*rIPL + for mC = 1:num + if mC == 1 + if magIPL(mC,mR)==0 && magIPL(mC,mR+1)==0 && magIPL(mC,mR+2)==0 + primo = 0; + letMag = 2; + while primo == 0 + if letMag > num + break + end + if magIPL(letMag,mR)==0 && magIPL(letMag,mR+1)==0 && magIPL(letMag,mR+2)==0 + letMag = letMag+1; + else + magIPL(mC,mR:mR+2) = magIPL(letMag,mR:mR+2); + accIPL(mC,mR:mR+2) = accIPL(letMag,mR:mR+2); + tempIPL(mC,t) = tempIPL(letMag,t); + ErrInPlaceLink(mC,Err:Err+6) = 1; + primo = 1; + end + end + end + else + if magIPL(mC,mR) == 0 && magIPL(mC,mR+1) == 0 && magIPL(mC,mR+2) == 0 + magIPL(mC,mR:mR+2) = magIPL(mC-1,mR:mR+2); + accIPL(mC,mR:mR+2) = accIPL(mC-1,mR:mR+2); + tempIPL(mC,t) = tempIPL(mC-1,t); + ErrInPlaceLink(mC,Err:Err+6) = 1; + end + end + end + mR = mR+3; + t = t+1; + Err = Err+7; + end +elseif MEMS == 0 && strcmp(NodoInPlaceLink(1,4),'0-10 V') == 1 + ax = DCalIPLTot(:,1); + bx = DCalIPLTot(:,2); + cx = DCalIPLTot(:,3); + ay = DCalIPLTot(:,4); + by = DCalIPLTot(:,5); + cy = DCalIPLTot(:,6); + az = DCalIPLTot(:,7); + bz = DCalIPLTot(:,8); + cz = DCalIPLTot(:,9); +end + +if strcmp(NodoInPlaceLink(1,4),'ADC') || strcmp(NodoInPlaceLink{1,4},'null') || ... + isempty(NodoInPlaceLink{1,4}) == 1 || strcmp(NodoInPlaceLink(1,4),'g') == 1 + check = isnan(MagX); + if check == 0 % Applico gli offset + cont = 1; + cn = 1; + for ii = 1:3*rIPL + if cont==1 + magIPL(:,ii) = ((magIPL(:,ii) - MagX(cn))*100)/100000; + cont = cont+1; + elseif cont==2 + magIPL(:,ii) = ((magIPL(:,ii) - MagY(cn))*100)/100000; + cont = cont+1; + elseif cont==3 + magIPL(:,ii) = ((magIPL(:,ii) - MagZ(cn))*100)/100000; + cont = 1; + cn = cn+1; + end + end + else + magIPL = magIPL/1000; % 1000 Gauss + end + clear ii +elseif strcmp(NodoInPlaceLink(1,4),'Gradi') || strcmp(NodoInPlaceLink(1,4),'digit') + magIPL = []; +end + +if MEMS == 1 || MEMS == 2 + %% Accelerometri + cont = 1; + cn = 1; + % Contatore dei nodi, corregge le accelerazioni con le calibrazioni + for ii=1:3*rIPL + if cont==1 + accIPL(:,ii) = accIPL(:,ii)*caX(cn)+(tempIPL(:,cn)*pIntX(cn)+iIntX(cn)); + cont = cont+1; + elseif cont==2 + accIPL(:,ii) = accIPL(:,ii)*caY(cn)+(tempIPL(:,cn)*pIntY(cn)+iIntY(cn)); + cont = cont+1; + else + accIPL(:,ii) = accIPL(:,ii)*caZ(cn)+(tempIPL(:,cn)*pIntZ(cn)+iIntZ(cn)); + cont = 1; + cn = cn+1; + end + end + + %% Conversione delle temperature + for t = 1:rIPL + tempIPL(:,t) = tempIPL(:,t)*caT(t,1) + intT(t,1); + end +elseif MEMS == 0 && strcmp(NodoInPlaceLink(1,4),'0-10 V') == 1 + %% Accelerometri + cont = 1; + cn = 1; + % Contatore dei nodi, corregge le accelerazioni con le calibrazioni + for ii=1:3*rIPL + if cont==1 + accIPL(:,ii) = ax(cn)*(accIPL(:,ii).^2)+bx(cn)*accIPL(:,ii)+cx(cn); + cont = cont+1; + elseif cont==2 + accIPL(:,ii) = ay(cn)*(accIPL(:,ii).^2)+by(cn)*accIPL(:,ii)+cy(cn); + cont = cont+1; + else + accIPL(:,ii) = az(cn)*(accIPL(:,ii).^2)+bz(cn)*accIPL(:,ii)+cz(cn); + cont = 1; + cn = cn+1; + end + end +end + +%% Risultanti +[rAcc,cAcc] = size(accIPL); +[rMag,cMag] = size(magIPL); + +ris_acc_IPL = zeros(rAcc,cAcc/3); % matrice risultante accelerazioni +ris_mag_IPL = zeros(rMag,cMag/3); % matrice risultante campi magnetici + +clear i +clear ii +clear cont +clear cn + +cont = 1; % contatore +cn = 0; + +if strcmp(NodoInPlaceLink(1,4),'ADC') || strcmp(NodoInPlaceLink{1,4},'null') || ... + isempty(NodoInPlaceLink{1,4}) == 1 || strcmp(NodoInPlaceLink(1,4),'g') == 1 + %% Calcolo della risultante + for ii = 1:(cAcc/3) % colonne + for i = 1:rAcc % righe + ris_acc_IPL(i,cont) = (accIPL(i,cn*3+1)^2+accIPL(i,cn*3+2)^2+accIPL(i,cn*3+3)^2)^0.5; + ris_mag_IPL(i,cont) = (magIPL(i,cn*3+1)^2+magIPL(i,cn*3+2)^2+magIPL(i,cn*3+3)^2)^0.5; + end + cn = cn+1; + cont = cont+1; + end + + [r,c] = size(ris_acc_IPL); + mmm = 1; + Err = 1; + for j = 1:c % Nodi + for i = 2:r % Letture + % se il valore assoluto della differenza è maggiore della + % tolleranza, pongo gli spostamenti giornalieri pari a 0 + if abs(ris_acc_IPL(i,j)-ris_acc_IPL(i-1,j)) > tolleranzaAcc + accIPL(i,mmm) = accIPL(i-1,mmm); + accIPL(i,mmm+1) = accIPL(i-1,mmm+1); + accIPL(i,mmm+2) = accIPL(i-1,mmm+2); + tempIPL(i,j) = tempIPL(i-1,j); + ErrInPlaceLink(i,Err:Err+6) = 1; + end + if strcmp(IDcentralina,'ID0115') == 1 + if ris_acc_IPL(i,j) < 0.9 || ris_acc_IPL(i,j) > 1.17 % Il nodo è fuori taratura! + accIPL(i,mmm) = accIPL(i-1,mmm); + accIPL(i,mmm+1) = accIPL(i-1,mmm+1); + accIPL(i,mmm+2) = accIPL(i-1,mmm+2); + tempIPL(i,j) = tempIPL(i-1,j); + ErrInPlaceLink(i,Err:Err+6) = 1; + end + else + if ris_acc_IPL(i,j) < 0.9 || ris_acc_IPL(i,j) > 1.12 % Il nodo è fuori taratura! + accIPL(i,mmm) = accIPL(i-1,mmm); + accIPL(i,mmm+1) = accIPL(i-1,mmm+1); + accIPL(i,mmm+2) = accIPL(i-1,mmm+2); + tempIPL(i,j) = tempIPL(i-1,j); + ErrInPlaceLink(i,Err:Err+6) = 1; + end + end + end + mmm = mmm+3; + Err = Err+7; + end +end + +text = 'Raw Data of In Place Link converted into physical units correctly. conv_grezziTLH function started'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/conv_grezziIPLHR.m b/Tilt/conv_grezziIPLHR.m new file mode 100755 index 0000000..e215346 --- /dev/null +++ b/Tilt/conv_grezziIPLHR.m @@ -0,0 +1,73 @@ +% Funzione che converte i dati grezzi + +function [angIPLHR,tempIPLHR] = conv_grezziIPLHR(angIPLHR,tempIPLHR,DCalIPLHRTot,... + NodoInPlaceLinkHR,rIPLHR,FileName) + +text = 'conv_grezziIPLHR function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +if strcmp(NodoInPlaceLinkHR(1,4),'ADC') || strcmp(NodoInPlaceLinkHR{1,4} ,'null') || isempty(NodoInPlaceLinkHR{1,4}) == 1 + if DCalIPLHRTot(:,4) == 0 % Guadagno asse X e asse Y in comune + caIPLHR = DCalIPLHRTot(:,1); + caT_HR = DCalIPLHRTot(:,2); + intT_HR = DCalIPLHRTot(:,3); + XY = 1; + else + caIPLHR = [DCalIPLHRTot(:,1) DCalIPLHRTot(:,2)]; + caT_HR = DCalIPLHRTot(:,3); + intT_HR = DCalIPLHRTot(:,4); + XY = 0; + end +elseif strcmp(NodoInPlaceLinkHR{1,4} ,'digit') + caIPLHR = [DCalIPLHRTot(:,1) DCalIPLHRTot(:,2)]; + intIPLHR = [DCalIPLHRTot(:,3) DCalIPLHRTot(:,4)]; + caT_HR = DCalIPLHRTot(:,5); + intT_HR = DCalIPLHRTot(:,6); + XY = 0; +end + +i = 1; +m = 1; +c = 1; +% Contatore dei nodi, converte i punti ADC con le calibrazioni in valori +% angolari +while i <= 2*rIPLHR % nodo + if XY == 1 + angIPLHR(:,i) = angIPLHR(:,i)*caIPLHR(m,1); + i = i+1; + if c == 2 + m = m+1; + c = 1; + else + c = c+1; + end + else + % MUMS + if strcmp(NodoInPlaceLinkHR(1,4),'ADC') || strcmp(NodoInPlaceLinkHR{1,4} ,'null') || isempty(NodoInPlaceLinkHR{1,4}) == 1 + angIPLHR(:,i) = angIPLHR(:,i)*caIPLHR(m,1); + angIPLHR(:,i+1) = angIPLHR(:,i+1)*caIPLHR(m,2); + i = i+2; + m = m+1; + elseif strcmp(NodoInPlaceLinkHR{1,4} ,'digit') + angIPLHR(:,i) = angIPLHR(:,i)*caIPLHR(m,1)+intIPLHR(m,1); + angIPLHR(:,i+1) = angIPLHR(:,i+1)*caIPLHR(m,2)+intIPLHR(m,2); + i = i+2; + m = m+1; + end + end +end + +%% Conversione delle temperature +for t = 1:rIPLHR + tempIPLHR(:,t) = tempIPLHR(:,t)*caT_HR(t,1) + intT_HR(t,1); +end + +text = 'Raw Data of In Place Link HR converted into physical units correctly. conv_grezziIPLHR function ended'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/conv_grezziKL.m b/Tilt/conv_grezziKL.m new file mode 100755 index 0000000..999498c --- /dev/null +++ b/Tilt/conv_grezziKL.m @@ -0,0 +1,143 @@ +% Funzione che converte i dati grezzi dei Klino Link in dati di +% angoli + +function [ang_KL,temp_KL,ris_acc,ErrKlinoLink] = conv_grezziKL(ang_KL,temp_KL,... + rKL,DCalKLTot,IDcentralina,DTcatena,NodoKlinoLink,ErrKlinoLink,FileName) + +text = 'conv_grezziKL function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +if strcmp(IDcentralina,'ID0231') == 1 && strcmp(DTcatena,'DT0251') == 1 + angoloKL = real(asind(ang_KL(:,1:3))); %calcolo angolo relativo + ang_KL(:,1:3) = angoloKL; + + %% Accelerometri + cont = 1; % contatore + cn = 0; + [rAcc,cAcc] = size(ang_KL); + ris_acc = zeros(rAcc,cAcc/3); % matrice risultante accelerazioni + + for ii = 1:(cAcc/3) % colonne + for i = 1:rAcc % righe + ris_acc(i,cont) = (ang_KL(i,cn*3+1)^2+ang_KL(i,cn*3+2)^2+ang_KL(i,cn*3+3)^2)^0.5; + end + cn = cn+1; + cont = cont+1; + end + ris_acc = sind(ris_acc); + +elseif strcmp(NodoKlinoLink(1,4),'ADC') || strcmp(NodoKlinoLink{1,4} ,'null') ... + || isempty(NodoKlinoLink{1,4}) == 1 || strcmp(NodoKlinoLink(1,4),'g') + + if strcmp(NodoKlinoLink(1,4),'ADC') || strcmp(NodoKlinoLink{1,4} ,'null') ... + || isempty(NodoKlinoLink{1,4}) == 1 + caX = DCalKLTot(:,1); + caY = DCalKLTot(:,4); + caZ = DCalKLTot(:,7); + pIntX = DCalKLTot(:,2); + pIntY = DCalKLTot(:,5); + pIntZ = DCalKLTot(:,8); + iIntX = DCalKLTot(:,3); + iIntY = DCalKLTot(:,6); + iIntZ = DCalKLTot(:,9); + caT = DCalKLTot(:,10); + intT = DCalKLTot(:,11); + end + + if strcmp(NodoKlinoLink(1,4),'g') == 0 + %% Accelerometri + cont = 1; + cn = 1; + n = 3; + % Contatore dei nodi, corregge le accelerazioni con le calibrazioni + for ii=1:n*rKL + if cont==1 + ang_KL(:,ii) = ang_KL(:,ii)*caX(cn)+(temp_KL(:,cn)*pIntX(cn)+iIntX(cn)); + cont = cont+1; + elseif cont==2 + ang_KL(:,ii) = ang_KL(:,ii)*caY(cn)+(temp_KL(:,cn)*pIntY(cn)+iIntY(cn)); + cont = cont+1; + else + ang_KL(:,ii) = ang_KL(:,ii)*caZ(cn)+(temp_KL(:,cn)*pIntZ(cn)+iIntZ(cn)); + cont = 1; + cn = cn+1; + end + end + end + + angoloKL = real(asind(ang_KL)); %calcolo angolo relativo + +% % Calcolo e correggo angoli relativi in base al segno dell'asse Z +% cont = 1; +% contACC = 1; +% angoloKL = ang_KL; +% for ii=1:3*rKL +% if cont == 1 % X +% angoloKL(:,contACC) = real(asind(ang_KL(:,ii))); %calcolo angolo relativo +% if angoloKL(:,contACC) > 0 %check quando angolo relativo > 0 +% if ang_KL(:,ii+2) < 0 % check quando asse z < 0 --> il montante si è capovolto! +% angoloKL(:,contACC) = pi - angoloKL(:,contACC); +% end +% elseif angoloKL(:,ii) < 0 % check quando angolo relativo < 0 +% if ang_KL(:,ii+2) < 0 % check quando asse z < 0 --> il montante si è capovolto! +% angoloKL(:,contACC) = -pi - angoloKL(:,contACC); +% end +% end +% cont = cont+1; +% contACC = contACC+1; +% elseif cont == 2 % Y +% angoloKL(:,contACC) = real(asind(ang_KL(:,ii))); % calcolo angolo relativo +% if angoloKL(:,contACC) > 0 %check quando angolo relativo > 0 +% if ang_KL(:,ii+1) < 0 % check quando asse z < 0 --> il montante si è capovolto! +% angoloKL(:,contACC) = pi - angoloKL(:,contACC); +% end +% elseif angoloKL(:,ii) < 0 %check quando angolo relativo < 0 +% if ang_KL(:,ii+1) < 0 % check quando asse z < 0 --> il montante si è capovolto! +% angoloKL(:,contACC) = -pi - angoloKL(:,contACC); +% end +% end +% cont = cont+1; +% contACC = contACC+1; +% elseif cont == 3 % Z +% angoloKL(:,contACC) = real(asind(ang_KL(:,ii))); % calcolo angolo relativo +% cont = 1; +% contACC = contACC+1; +% end +% end + + %% Conversione delle temperature + if strcmp(NodoKlinoLink(1,4),'g') == 0 + for t = 1:rKL + temp_KL(:,t) = temp_KL(:,t)*caT(t,1) + intT(t,1); + end + end + + %% Risultanti + clear ii + clear cont + clear cn + cont = 1; % contatore + cn = 0; + [rAcc,cAcc] = size(ang_KL); + ris_acc = zeros(rAcc,cAcc/3); % matrice risultante accelerazioni + + for ii = 1:(cAcc/3) % colonne + for i = 1:rAcc % righe + ris_acc(i,cont) = (ang_KL(i,cn*3+1)^2+ang_KL(i,cn*3+2)^2+ang_KL(i,cn*3+3)^2)^0.5; + end + cn = cn+1; + cont = cont+1; + end + + ang_KL = angoloKL; +else + ris_acc = []; +end + +text = 'Raw Data of Klino Link converted into physical units correctly. conv_grezziKL function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/conv_grezziKLHR.m b/Tilt/conv_grezziKLHR.m new file mode 100755 index 0000000..d117630 --- /dev/null +++ b/Tilt/conv_grezziKLHR.m @@ -0,0 +1,44 @@ +% Funzione che converte i dati grezzi dei Klino Link in dati di +% angoli (acc_KL) + +function [ang_KLHR,temp_KLHR] = conv_grezziKLHR(ang_KLHR,temp_KLHR,rKLHR,... + DCalKLHRTot,FileName) + +text = 'conv_grezziKLHR function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +caX_KLHR = DCalKLHRTot(:,1); +intX_KLHR = DCalKLHRTot(:,2); +caY_KLHR = DCalKLHRTot(:,3); +intY_KLHR = DCalKLHRTot(:,4); +caT_KLHR = DCalKLHRTot(:,5); +intT_KLHR = DCalKLHRTot(:,6); + +[rA,~] = size(ang_KLHR); +i = 1; +m = 1; + +% Contatore dei nodi, converte i punti ADC con le calibrazioni in valori +% angolari +while i <= 2*rKLHR % nodo i + ang_corr_colonna = zeros(rA,2); + T = zeros(rA,1); + for j = 1:rA % tutti i dati di una riga (data j) + ang_corr_colonna(j,1) = ang_KLHR(j,i)*caX_KLHR(m,1)+intX_KLHR(m,1); + ang_corr_colonna(j,2) = ang_KLHR(j,i+1)*caY_KLHR(m,1)+intY_KLHR(m,1); + T(j,1) = temp_KLHR(j,m)*caT_KLHR(m,1)+intT_KLHR(m,1); + end + ang_KLHR(:,i) = ang_corr_colonna(:,1); + ang_KLHR(:,i+1) = ang_corr_colonna(:,2); + temp_KLHR(:,m) = T(:,1); + i = i+2; + m = m+1; +end + +text = 'Raw Data of Klino Link HR converted into physical units correctly. conv_grezziKLHR function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/conv_grezziLL.m b/Tilt/conv_grezziLL.m new file mode 100755 index 0000000..ce66fcf --- /dev/null +++ b/Tilt/conv_grezziLL.m @@ -0,0 +1,37 @@ +% Funzione che converte i dati ADC della cella di carico in dati di forza +% mediante i valori di calibrazione. +% Il risultato è la matrico DatiLoad + +function DatiLoad = conv_grezziLL(ADCLoad,DCalLLTot,NodoLoadLink,FileName) + +text = 'conv_grezziLL function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +if strcmp(NodoLoadLink(1,3),'mV/V') || strcmp(NodoLoadLink(1,4),'ADC') + caLoad = DCalLLTot(:,1); + intLoad = DCalLLTot(:,2); +elseif strcmp(NodoLoadLink(1,3),'4-20 mA') + a_Load = DCalLLTot(:,1); + b_Load = DCalLLTot(:,2); + c_Load = DCalLLTot(:,3); +end + +%% Conversione dei punti ADC in dati di carico +[rL,cL] = size(ADCLoad); +DatiLoad = zeros(rL,cL); + +for i=1:cL % nodi + if strcmp(NodoLoadLink(1,3),'mV/V') || strcmp(NodoLoadLink(1,4),'ADC') + DatiLoad(:,i) = caLoad(i,1)*ADCLoad(:,i) + intLoad(i,1); % conversione lineare + elseif strcmp(NodoLoadLink(1,3),'4-20 mA') + DatiLoad(:,i) = a_Load(i,1)*ADCLoad(:,i).^2 + b_Load(i,1)*ADCLoad(:,i) + c_Load(i,1); % conversione parabolica + end +end + +text = 'Raw Data of Load Link converted into physical units correctly. conv_grezziLL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/conv_grezziPE.m b/Tilt/conv_grezziPE.m new file mode 100755 index 0000000..8f60cc5 --- /dev/null +++ b/Tilt/conv_grezziPE.m @@ -0,0 +1,23 @@ +% Funzione che converte i dati grezzi dei Weir Link in dati di altezza d'acqua + +function Def_PE = conv_grezziPE(Def_PE,rPE,DCalPETot,NodoPendulum,FileName) + +text = 'conv_grezziPE function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +if strcmp(NodoPendulum(1,4),'4-20 mA') + m = DCalPETot(:,1); + nn = 1; + for ii = 1:rPE + Def_PE(:,nn:nn+1) = m(ii)*Def_PE(:,nn:nn+1); + nn = nn+2; + end +end + +text = 'Raw Data of Pendulum converted into physical units correctly. conv_grezziPE function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/conv_grezziPL.m b/Tilt/conv_grezziPL.m new file mode 100755 index 0000000..0a48ba5 --- /dev/null +++ b/Tilt/conv_grezziPL.m @@ -0,0 +1,161 @@ +function [DatiPiez,DatiPiezT,RIF_PL] = conv_grezziPL(rPL,ADCPiez,tempPiez,DCalPLTot,... + NodoPiezoLink,NuovoZeroPL,IDcentralina,DTcatena,FileName) + +text = 'conv_grezziPL function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +Lineare = 1; + +if isempty(NodoPiezoLink) == 1 + caPiez = DCalPLTot(:,1); + intPiez = DCalPLTot(:,2); + caT = DCalPLTot(:,3); + intT = DCalPLTot(:,4); + RIF_PL = []; +else + if strcmp(NodoPiezoLink(1,4),'VW kg/cm2') == 1 + A = DCalPLTot(:,1); + B = DCalPLTot(:,2); + C = DCalPLTot(:,3); + RIF_PL = []; + elseif strcmp(NodoPiezoLink(1,4),'Hz') == 1 % Convertitore per DSAS o ModBus + caPiez = DCalPLTot(:,1); + intPiez = DCalPLTot(:,2); + D = DCalPLTot(:,4); + RIF_PL = []; + elseif strcmp(NodoPiezoLink(1,4),'VW kPa') == 1 + A = DCalPLTot(:,1); + B = DCalPLTot(:,2); + C = DCalPLTot(:,3); + if C == 0 % Identifica i piezometri di Geosense + D = DCalPLTot(:,4); + if D ~= 0 + NomeFile = ['' IDcentralina '-' DTcatena '-RifPL.csv']; + NomeFileT = ['' IDcentralina '-' DTcatena '-RifPL_T.csv']; + if NuovoZeroPL == 0 % prima elaborazione + P = (ADCPiez(1,:).^2)/1000; + csvwrite(NomeFile,P); + a = 1.4051*10^(-3); + b = 2.369*10^(-4); + c = 9.9*10^(-8); + T = 1./(a+b*reallog(tempPiez(1,:))... + +c*(reallog(tempPiez(1,:))).^3)-273.15; % conversione in gradi + csvwrite(NomeFileT,T); + else + P = csvread(NomeFile); + T = csvread(NomeFileT); + end + C = -A.*(P'.^2)-B.*P'; + RIF_PL = 1000*C; + else + RIF_PL = 0; + end + else + D = 0; + RIF_PL = 0; + end + else + if isnan(DCalPLTot(end)) == 1 % Conversione Lineare + Lineare = 1; + caPiez = DCalPLTot(:,1); + intPiez = DCalPLTot(:,2); + elseif isnan(DCalPLTot(end)) == 0 % Conversione Parabolica + Lineare = 0; + aPiez = DCalPLTot(:,5); + bPiez = DCalPLTot(:,1); + cPiez = DCalPLTot(:,2); + intPiez = []; + end + caT = DCalPLTot(:,3); + intT = DCalPLTot(:,4); + RIF_PL = 0; + end +end + +[rP,~] = size(ADCPiez); % Numero di dati +% Conversione dei punti ADC in dati di pressione + +DatiPiez = zeros(rP,rPL); +DatiPiezT = zeros(rP,rPL); + +if strcmp(NodoPiezoLink(1,4),'VW kPa') == 1 || strcmp(NodoPiezoLink(1,4),'VW kg/cm2') == 1 % Conversione da digit a kPa e poi in Pa + kPa = zeros(rP,rPL); + kg_cm2 = zeros(rP,rPL); + a = 1.4051*10^(-3); + b = 2.369*10^(-4); + c = 9.9*10^(-8); + % Piezometro + for i=1:rPL + digit = (ADCPiez(:,i).^2)/1000; + Therm = cell2mat(NodoPiezoLink(i,5)); + if strcmp(NodoPiezoLink(i,4),'VW kPa') == 1 + if Therm == 1 && D(1) ~= 0 + DatiPiezT(:,i) = 1./(a+b*reallog(tempPiez(:,i))... + +c*(reallog(tempPiez(:,i))).^3)-273.15; % conversione in gradi + kPa(:,i) = A(i,1)*digit.^2+B(i,1)*digit+C(i,1)+D(i,1)*(DatiPiezT(:,i)-T(1,i)); % conversione in kPa + else + kPa(:,i) = A(i,1)*digit.^2+B(i,1)*digit+C(i,1); % conversione in kPa + end + DatiPiez(:,i) = kPa(:,i)*1000; + elseif strcmp(NodoPiezoLink(i,4),'VW kg/cm2') == 1 + kg_cm2(:,i) = A(i,1)*digit.^2+B(i,1)*digit+C(i,1); % conversione in kg/cm2 + DatiPiez(:,i) = kg_cm2(:,i)*98066.5; + end + if Therm == 1 + DatiPiezT(:,i) = 1./(a+b*reallog(tempPiez(:,i))... + +c*(reallog(tempPiez(:,i))).^3)-273.15; % conversione in gradi + end + end +elseif strcmp(NodoPiezoLink(1,4),'Hz') == 1 % Convertitore per DSAS o ModBus + NomeFileT = ['' IDcentralina '-' DTcatena '-RifPL_T.csv']; + kPa = zeros(rP,rPL); + a = 1.4051*10^(-3); + b = 2.369*10^(-4); + c = 9.9*10^(-8); + if D ~= 0 + if NuovoZeroPL == 0 % prima elaborazione + T = 1./(a+b*reallog(tempPiez(1,:))... + +c*(reallog(tempPiez(1,:))).^3)-273.15; % conversione in gradi + csvwrite(NomeFileT,T); + else + T = csvread(NomeFileT); + end + for i=1:rPL + Therm = cell2mat(NodoPiezoLink(i,5)); + if Therm == 1 + DatiPiezT(:,i) = 1./(a+b*reallog(tempPiez(:,i))... + +c*(reallog(tempPiez(:,i))).^3)-273.15; % conversione in gradi + kPa(:,i) = caPiez(i,1)*ADCPiez(:,i)+intPiez(i,1)+D(i,1)*(DatiPiezT(:,i)-T(1,i)); % conversione in kPa + else + kPa(:,i) = caPiez(i,1)*ADCPiez(:,i)+intPiez(i,1); % conversione in kPa + end + end + else + for i=1:rPL + kPa(:,i) = caPiez(i,1)*ADCPiez(:,i)+intPiez(i,1); % conversione in kPa + end + end + DatiPiez(:,i) = kPa(:,i)*1000; % Pascal +else + mBar = zeros(rP,rPL); + for i=1:rPL + if Lineare == 1 && isnan(intPiez(i,1)) == 1 + mBar(:,i) = caPiez(i,1)*ADCPiez(:,i); + else + if Lineare == 1 + mBar(:,i) = caPiez(i,1)*ADCPiez(:,i)+intPiez(i,1); % conversione lineare in mBar + elseif Lineare == 0 + mBar(:,i) = aPiez(i,1)*ADCPiez(:,i).^2+bPiez(i,1)*ADCPiez(:,i)+cPiez(i,1); % conversione parabolica in mBar + end + end + DatiPiez(:,i) = mBar(:,i)*100; + DatiPiezT(:,i) = caT(i,1)*tempPiez(:,i)+intT(i,1); % conversione in gradi + end +end + +text = 'Raw Data of Piezo Link converted into physical units correctly. conv_grezziPL function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/conv_grezziPT100.m b/Tilt/conv_grezziPT100.m new file mode 100755 index 0000000..51c8688 --- /dev/null +++ b/Tilt/conv_grezziPT100.m @@ -0,0 +1,23 @@ +% Funzione che converte i dati grezzi dei Therm Link + +function val_PT100 = conv_grezziPT100(val_PT100,rPT100,DCalPT100Tot,FileName) + +text = 'conv_grezziPT100 function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +ca_PT100 = DCalPT100Tot(:,1); +int_PT100 = DCalPT100Tot(:,2); +i = 1; +% Contatore dei nodi, converte i punti ADC con le calibrazioni in valori angolari +while i <= rPT100 % nodo + val_PT100(:,i) = val_PT100(:,i)*ca_PT100(i,1)+int_PT100(i,1); + i = i+1; +end + +text = 'Raw Data of PT100 Link converted into physical units correctly. conv_grezziPT100 function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/conv_grezziRL.m b/Tilt/conv_grezziRL.m new file mode 100755 index 0000000..5e9c921 --- /dev/null +++ b/Tilt/conv_grezziRL.m @@ -0,0 +1,26 @@ +% Funzione che converte i dati grezzi dei Rain Link + +function val_RL = conv_grezziRL(val_RL,rRL,DCalRLTot,NodoRainLink,FileName) + +text = 'conv_grezziRL function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +if strcmp(NodoRainLink(1,4),'mm') +else + ca_RL = DCalRLTot(:,1); + i = 1; + % Contatore dei nodi, converte i punti ADC con le calibrazioni in valori + % angolari + while i <= rRL % nodo + val_RL(:,i) = val_RL(:,i)*ca_RL(i,1); + i = i+1; + end +end + +text = 'Raw Data of Rain Link converted into physical units correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/conv_grezziTL.m b/Tilt/conv_grezziTL.m new file mode 100755 index 0000000..d903160 --- /dev/null +++ b/Tilt/conv_grezziTL.m @@ -0,0 +1,207 @@ +% Funzione che converte i dati grezzi in dati di accelerazione usando i +% valori delle calibrazioni per i Tilt Link +% accTL raccoglie le accelerazioni +% magTL raccoglie i dati di campo magnetico + +function [accTL,magTL,ris_acc,ris_mag,tempTL,ErrTiltLink] = conv_grezziTL(rTL,accTL,magTL,... + tempTL,DCalTLTot,tolleranzaAcc,MEMS,ErrTiltLink,IDcentralina,DTcatena,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'conv_grezziTL function started'; +fprintf(fileID,fmt,text); + +if MEMS == 1 || MEMS == 2 + caX = DCalTLTot(:,1); + caY = DCalTLTot(:,4); + caZ = DCalTLTot(:,7); + pIntX = DCalTLTot(:,2); + pIntY = DCalTLTot(:,5); + pIntZ = DCalTLTot(:,8); + iIntX = DCalTLTot(:,3); + iIntY = DCalTLTot(:,6); + iIntZ = DCalTLTot(:,9); + caT = DCalTLTot(:,10); + intT = DCalTLTot(:,11); + MagX = DCalTLTot(:,12); + MagY = DCalTLTot(:,13); + MagZ = DCalTLTot(:,14); +elseif MEMS == 3 + MagX = DCalTLTot(:,1); + MagY = DCalTLTot(:,2); + MagZ = DCalTLTot(:,3); +end + +if MEMS == 2 + %% Magnetometri + % controllo dei dati di campo magnetico per anomalie modello Baveno + [num,~] = size(magTL); + mR = 1; + Err = 1; + t = 1; + while mR <= 3*rTL + for mC = 1:num + if mC == 1 + if magTL(mC,mR)==0 && magTL(mC,mR+1)==0 || magTL(mC,mR)==0 && magTL(mC,mR+2)==0 ||... + magTL(mC,mR+1)==0 && magTL(mC,mR+2)==0 + primo = 0; + letMag = 2; + while primo == 0 + if letMag > num + break + end + if magTL(mC,mR)==0 && magTL(mC,mR+1)==0 || magTL(mC,mR)==0 && magTL(mC,mR+2)==0 ||... + magTL(mC,mR+1)==0 && magTL(mC,mR+2)==0 + letMag = letMag+1; + else + magTL(mC,mR:mR+2) = magTL(letMag,mR:mR+2); + accTL(mC,mR:mR+2) = accTL(letMag,mR:mR+2); + tempTL(mC,t) = tempTL(letMag,t); + ErrTiltLink(mC,Err:Err+6) = 1; + primo = 1; + end + end + end + else + if magTL(mC,mR)==0 && magTL(mC,mR+1)==0 || magTL(mC,mR)==0 && magTL(mC,mR+2)==0 ||... + magTL(mC,mR+1)==0 && magTL(mC,mR+2)==0 + + magTL(mC,mR:mR+2) = magTL(mC-1,mR:mR+2); + accTL(mC,mR:mR+2) = accTL(mC-1,mR:mR+2); + tempTL(mC,t) = tempTL(mC-1,t); + ErrTiltLink(mC,Err:Err+6) = 1; + end + end + end + mR = mR+3; + t = t+1; + Err = Err+7; + end +end + +check = isnan(MagX); +if check == 0 % Applico gli offset + cont = 1; + cn = 1; + for ii = 1:3*rTL + if cont==1 + if MEMS == 2 + magTL(:,ii) = ((magTL(:,ii) - MagX(cn))*100)/100000; + elseif MEMS == 3 + magTL(:,ii) = (magTL(:,ii) - MagX(cn)); + end + cont = cont+1; + elseif cont==2 + if MEMS == 2 + magTL(:,ii) = ((magTL(:,ii) - MagY(cn))*100)/100000; + elseif MEMS == 3 + magTL(:,ii) = (magTL(:,ii) - MagY(cn)); + end + cont = cont+1; + elseif cont==3 + if MEMS == 2 + magTL(:,ii) = ((magTL(:,ii) - MagZ(cn))*100)/100000; + elseif MEMS == 3 + magTL(:,ii) = (magTL(:,ii) - MagZ(cn)); + end + cont = 1; + cn = cn+1; + end + end +elseif MEMS == 1 % MEMS vecchi (pre 21 Maggio 2016) + for ii=1:3*rTL + if mod(ii,3)==0 + magTL(:,ii) = magTL(:,ii)/980; % 980 Gauss + else + magTL(:,ii) = magTL(:,ii)/1100; % 1100 Gauss + end + end +elseif MEMS == 2 % MEMS nuovi (post 21 Maggio 2016) + magTL = magTL/1000; % 1000 Gauss +elseif MEMS == 3 +end +clear ii + +%% Accelerometri +if MEMS == 1 || MEMS == 2 + cont = 1; + cn = 1; + % Contatore dei nodi, corregge le accelerazioni con le calibrazioni + for ii=1:3*rTL + if cont==1 + accTL(:,ii) = accTL(:,ii)*caX(cn)+(tempTL(:,cn)*pIntX(cn)+iIntX(cn)); + cont = cont+1; + elseif cont==2 + accTL(:,ii) = accTL(:,ii)*caY(cn)+(tempTL(:,cn)*pIntY(cn)+iIntY(cn)); + cont = cont+1; + else + accTL(:,ii) = accTL(:,ii)*caZ(cn)+(tempTL(:,cn)*pIntZ(cn)+iIntZ(cn)); + cont = 1; + cn = cn+1; + end + end + + %% Conversione delle temperature + for t = 1:rTL + tempTL(:,t) = tempTL(:,t)*caT(t,1) + intT(t,1); + end +end + +%% Risultanti +[rAcc,cAcc] = size(accTL); +[rMag,cMag] = size(magTL); + +ris_acc = zeros(rAcc,cAcc/3); % matrice risultante accelerazioni +ris_mag = zeros(rMag,cMag/3); % matrice risultante campi magnetici + +clear i +clear ii +clear cont +clear cn + +cont = 1; % contatore +cn = 0; + +%% Calcolo della risultante +for ii = 1:(cAcc/3) % colonne + for i = 1:rAcc % righe + ris_acc(i,cont) = (accTL(i,cn*3+1)^2+accTL(i,cn*3+2)^2+accTL(i,cn*3+3)^2)^0.5; + ris_mag(i,cont) = (magTL(i,cn*3+1)^2+magTL(i,cn*3+2)^2+magTL(i,cn*3+3)^2)^0.5; + end + cn = cn+1; + cont = cont+1; +end + +%% Filtri sulla risultante +[r,c] = size(ris_acc); +mmm = 1; +Err = 1; +for j = 1:c % Nodi + for i = 2:r % Letture + % se il valore assoluto della differenza è maggiore della + % tolleranza, pongo gli spostamenti giornalieri pari a 0 + if abs(ris_acc(i,j)-ris_acc(i-1,j)) > tolleranzaAcc + accTL(i,mmm) = accTL(i-1,mmm); + accTL(i,mmm+1) = accTL(i-1,mmm+1); + accTL(i,mmm+2) = accTL(i-1,mmm+2); + tempTL(i,j) = tempTL(i-1,j); + ErrTiltLink(i,Err:Err+6) = 1; + end + if strcmp(IDcentralina,'ID0003') && strcmp(DTcatena,'DT0002') + elseif ris_acc(i,j) < 0.9 || ris_acc(i,j) > 1.3 % Il nodo è fuori taratura! + accTL(i,mmm) = accTL(i-1,mmm); + accTL(i,mmm+1) = accTL(i-1,mmm+1); + accTL(i,mmm+2) = accTL(i-1,mmm+2); + tempTL(i,j) = tempTL(i-1,j); + ErrTiltLink(i,Err:Err+6) = 1; + end + end + mmm = mmm+3; + Err = Err+7; +end + +text = 'Raw Data of Tilt Link V converted into physical units correctly. conv_grezziTL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/conv_grezziTLH.m b/Tilt/conv_grezziTLH.m new file mode 100755 index 0000000..3311e03 --- /dev/null +++ b/Tilt/conv_grezziTLH.m @@ -0,0 +1,103 @@ +% Funzione che converte i dati grezzi in dati di accelerazione usando i +% valori delle calibrazioni per i Tilt Link +% accTL raccoglie le accelerazioni +% magTL raccoglie i dati di campo magnetico + +function [accTLH,ris_acc_TLH,tempTLH,ErrTiltLinkH] = conv_grezziTLH(rTLH,... + accTLH,tempTLH,DCalTLHTot,tolleranzaAcc,MEMS,ErrTiltLinkH,FileName) + +text = 'conv_grezziTLH function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +if MEMS == 1 || MEMS == 2 + caX = DCalTLHTot(:,1); + caY = DCalTLHTot(:,4); + caZ = DCalTLHTot(:,7); + pIntX = DCalTLHTot(:,2); + pIntY = DCalTLHTot(:,5); + pIntZ = DCalTLHTot(:,8); + iIntX = DCalTLHTot(:,3); + iIntY = DCalTLHTot(:,6); + iIntZ = DCalTLHTot(:,9); + caT = DCalTLHTot(:,10); + intT = DCalTLHTot(:,11); + + %% Accelerometri + cont = 1; + cn = 1; + t = 1; + % Contatore dei nodi, corregge le accelerazioni con le calibrazioni + for ii=1:3*rTLH + if cont==1 + accTLH(:,ii) = accTLH(:,ii)*caX(cn)+(tempTLH(:,cn)*pIntX(cn)+iIntX(cn)); + cont = cont+1; + elseif cont==2 + accTLH(:,ii) = accTLH(:,ii)*caY(cn)+(tempTLH(:,cn)*pIntY(cn)+iIntY(cn)); + cont = cont+1; + else + accTLH(:,ii) = accTLH(:,ii)*caZ(cn)+(tempTLH(:,cn)*pIntZ(cn)+iIntZ(cn)); + cont = 1; + cn = cn+1; + end + end + + %% Conversione delle temperature + for t = 1:rTLH + tempTLH(:,t) = tempTLH(:,t)*caT(t,1) + intT(t,1); + end + + %% Calcolo della risultante + [rAcc,cAcc] = size(accTLH); + ris_acc_TLH = zeros(rAcc,cAcc/3); % matrice risultante accelerazioni + clear i + clear ii + clear cont + clear cn + cont = 1; % contatore + cn = 0; + + for ii = 1:(cAcc/3) % colonne + for i = 1:rAcc % righe + ris_acc_TLH(i,cont) = (accTLH(i,cn*3+1)^2+accTLH(i,cn*3+2)^2+accTLH(i,cn*3+3)^2)^0.5; + end + cn = cn+1; + cont = cont+1; + end + + %% Filtri sulla risultante + [r,c] = size(ris_acc_TLH); + mmm = 1; + Err = 1; + for j = 1:c % Nodi + for i = 2:r % Letture + % se il valore assoluto della differenza è maggiore della + % tolleranza, pongo gli spostamenti giornalieri pari a 0 + if abs(ris_acc_TLH(i,j)-ris_acc_TLH(i-1,j)) > tolleranzaAcc + accTLH(i,mmm) = accTLH(i-1,mmm); + accTLH(i,mmm+1) = accTLH(i-1,mmm+1); + accTLH(i,mmm+2) = accTLH(i-1,mmm+2); + tempTLH(i,j) = tempTLH(i-1,j); + ErrTiltLinkH(i,Err:Err+3) = 1; + end + if ris_acc_TLH(i,j) < 0.9 || ris_acc_TLH(i,j) > 1.1 % Il nodo è fuori taratura! + accTLH(i,mmm) = accTLH(i-1,mmm); + accTLH(i,mmm+1) = accTLH(i-1,mmm+1); + accTLH(i,mmm+2) = accTLH(i-1,mmm+2); + tempTLH(i,j) = tempTLH(i-1,j); + ErrTiltLinkH(i,Err:Err+3) = 1; + end + end + mmm = mmm+3; + Err = Err+4; + end +else + ris_acc_TLH = []; +end + +text = 'Raw Data of Tilt Link H converted into physical units correctly. conv_grezziTLH function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/conv_grezziTLHR.m b/Tilt/conv_grezziTLHR.m new file mode 100755 index 0000000..b199d24 --- /dev/null +++ b/Tilt/conv_grezziTLHR.m @@ -0,0 +1,56 @@ +% Funzione che converte i dati grezzi del Tilt Link HR in dati di +% angoli (acc_TLHR) + +function [angTLHR,tempTLHR] = conv_grezziTLHR(angTLHR,tempTLHR,DCalTLHRTot,... + rTLHR,FileName) + +text = 'conv_grezziTLHR function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +if DCalTLHRTot(:,4) == 0 % Guadagno asse X e asse Y in comune + caTLHR = DCalTLHRTot(:,1); + caT_HR = DCalTLHRTot(:,2); + intT_HR = DCalTLHRTot(:,3); + XY = 1; +else + caTLHR = [DCalTLHRTot(:,1) DCalTLHRTot(:,2)]; + caT_HR = DCalTLHRTot(:,3); + intT_HR = DCalTLHRTot(:,4); + XY = 0; +end + +i = 1; +m = 1; +c = 1; +% Contatore dei nodi, converte i punti ADC con le calibrazioni in valori +% angolari +while i <= 2*rTLHR % nodo + if XY == 1 + angTLHR(:,i) = angTLHR(:,i)*caTLHR(m,1); + i = i+1; + if c == 2 + m = m+1; + c = 1; + else + c = c+1; + end + else + angTLHR(:,i) = angTLHR(:,i)*caTLHR(m,1); + angTLHR(:,i+1) = angTLHR(:,i+1)*caTLHR(m,2); + i = i+2; + m = m+1; + end +end + +%% Conversione delle temperature +for t = 1:rTLHR + tempTLHR(:,t) = tempTLHR(:,t)*caT_HR(t,1) + intT_HR(t,1); +end + +text = 'Raw Data of Tilt Link HR V converted into physical units correctly. conv_grezziTLHR function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/conv_grezziTLHRH.m b/Tilt/conv_grezziTLHRH.m new file mode 100755 index 0000000..8a29636 --- /dev/null +++ b/Tilt/conv_grezziTLHRH.m @@ -0,0 +1,55 @@ +% Funzione che converte i dati grezzi del Tilt Link HR H in dati di +% angoli (acc_TLHR) + +function [angTLHRH,tempTLHRH] = conv_grezziTLHRH(angTLHRH,tempTLHRH,DCalTLHRHTot,rTLHRH,FileName) + +text = 'conv_grezziTLHRH function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +if DCalTLHRHTot(:,4) == 0 % Guadagno asse X e asse Y in comune + caTLHRH = DCalTLHRHTot(:,1); + caT_HRH = DCalTLHRHTot(:,2); + intT_HRH = DCalTLHRHTot(:,3); + XY = 1; +else + caTLHRH = [DCalTLHRHTot(:,1) DCalTLHRHTot(:,2)]; + caT_HRH = DCalTLHRHTot(:,3); + intT_HRH = DCalTLHRHTot(:,4); + XY = 0; +end + +i = 1; +m = 1; +c = 1; +% Contatore dei nodi, converte i punti ADC con le calibrazioni in valori +% angolari +while i <= 2*rTLHRH % nodo + if XY == 1 + angTLHRH(:,i) = angTLHRH(:,i)*caTLHRH(m,1); + i = i+1; + if c == 2 + m = m+1; + c = 1; + else + c = c+1; + end + else + angTLHRH(:,i) = angTLHRH(:,i)*caTLHRH(m,1); + angTLHRH(:,i+1) = angTLHRH(:,i+1)*caTLHRH(m,2); + i = i+2; + m = m+1; + end +end + +%% Conversione delle temperature +for t = 1:rTLHRH + tempTLHRH(:,t) = tempTLHRH(:,t)*caT_HRH(t,1) + intT_HRH(t,1); +end + +text = 'Raw Data of Tilt Link HR H converted into physical units correctly. conv_grezziTLHRH function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/conv_grezziThL.m b/Tilt/conv_grezziThL.m new file mode 100755 index 0000000..ee32498 --- /dev/null +++ b/Tilt/conv_grezziThL.m @@ -0,0 +1,23 @@ +% Funzione che converte i dati grezzi dei Therm Link + +function val_ThL = conv_grezziThL(val_ThL,rThL,DCalThLTot,FileName) + +text = 'conv_grezziThL function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +ca_ThL = DCalThLTot(:,1); +int_ThL = DCalThLTot(:,2); +i = 1; +% Contatore dei nodi, converte i punti ADC con le calibrazioni in valori angolari +while i <= rThL % nodo + val_ThL(:,i) = val_ThL(:,i)*ca_ThL(i,1)+int_ThL(i,1); + i = i+1; +end + +text = 'Raw Data of Therm Link converted into physical units correctly. conv_grezziThL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/conv_grezziWL.m b/Tilt/conv_grezziWL.m new file mode 100755 index 0000000..b74d5e9 --- /dev/null +++ b/Tilt/conv_grezziWL.m @@ -0,0 +1,155 @@ +% Funzione che converte i dati grezzi dei Weir Link in dati di altezza d'acqua + +function [lev_WL,TdefWL,ErrWeirLink] = conv_grezziWL(lev_WL,temp_WL,rWL,... + DCalWLTot,Tmax,Tmin,NodoWeirLink,ErrWeirLink,datainiWL,TimeWL,... + IDcentralina,DTcatena,FileName) + +text = 'conv_grezziWL function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +[rT,cT] = size(temp_WL); +TdefWL = zeros(rT,cT); + +if strcmp(NodoWeirLink(1,4),'Hz') + % Conversione Weir + A = DCalWLTot(:,1); + B = DCalWLTot(:,2); + C = DCalWLTot(:,3); + % Conversione Temperature + AT = 1.4051*10^(-3); + BT = 2.369*10^(-4); + CT = 1.019*10^(-7); + Therm = cell2mat(NodoWeirLink(:,6)); + for ii = 1:rWL + digit = (lev_WL(:,ii).^2)/1000; + lev_WL(:,ii) = A(ii)*digit.^2+B(ii)*digit+C(ii); + if Therm(ii,1)==1 % è presente il termometro + R = temp_WL(:,ii); + [rN,~] = size(R); + for n = 1:rN + if R(n) <= 0 + if n > 1 + R(n) = R(n-1); + else + R(n) = 5000; + end + if ErrWeirLink(n,ii) == 0 + ErrWeirLink(n,ii) = 0.5; + end + end + end + L = reallog(R); + TdefWL(:,ii) = (1./(AT + BT*L + CT*(L.^3))) -273.2; % conversione in gradi centigradi + end + end +end +FileTemperature = ['' IDcentralina '-' DTcatena '-WL-Therm.csv']; +if isfile(FileTemperature) == 1 + DatiRaw = csvread(FileTemperature); + [rDR,cDR] = size(DatiRaw); +else + rDR = 1; + cDR = 1; +end +textT = 'There are not correction for Weir Link - Temperature filter!'; +cont2 = 1; +for ii = 1:rWL + if Therm(ii,1) == 1 + for T = 1:rT + if TdefWL(T,ii) > Tmax || TdefWL(T,ii) < Tmin + if T == 1 + if isfile(FileTemperature) == 1 + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiWL)); + if isempty(RawDate) == 1 + cc = 2; + while cc <= rT + if TdefWL(cc,ii) > Tmax || TdefWL(cc,ii) < Tmin + cc = cc+1; + else + break + end + end + TdefWL(T,ii) = TdefWL(cc,ii); + else + if isnan(DatiRaw(ii+1,RawDate(end))) == 0 + TdefWL(T,ii) = cellstr(num2str(DatiRaw(RawDate(end),ii+1))); + if ErrWeirLink(ii,T) == 0 + ErrWeirLink(ii,T) = 0.5; + end + wardat = 'Temperature data of Weir Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + else + cc = 2; + while cc <= rT + if TdefWL(cc,ii) > Tmax || TdefWL(cc,ii) < Tmin + cc = cc+1; + else + break + end + end + TdefWL(T,ii) = TdefWL(cc,ii); + end + end + else + cc = 2; + while cc <= rT + if TdefWL(cc,ii) > Tmax || TdefWL(cc,ii) < Tmin + cc = cc+1; + else + break + end + end + TdefWL(T,ii) = TdefWL(cc,ii); + end + else + TdefWL(T,ii) = TdefWL(T-1,ii); + ErrWeirLink(ii,T) = 0.5; + end + textT = ['' num2str(cont2) ' correction executed for Weir Link - Temperature filter!']; + end + end + end +end +if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=TimeWL(1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(TimeWL(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(TimeWL(:,1)>DatiRaw(RawDate1(end)+1,1)); + end +else + RawDate1 = []; + RawDate2 = 1; +end +if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);TimeWL TdefWL(:,RawDate2(1):end)]; +elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = [TimeWL TdefWL]; +else + Dati = DatiRaw; +end +% Elimino appoggio più vecchio di un mese +RawDate3 = find(Dati(:,1) r + Num_Dati = r; +end +for i = 1:rHD + % despiking accelerometri + accHD(:,s) = filloutliers(accHD(:,s),'linear','movmedian',Num_Dati); + accHD(:,s+1) = filloutliers(accHD(:,s+1),'linear','movmedian',Num_Dati); + accHD(:,s+2) = filloutliers(accHD(:,s+2),'linear','movmedian',Num_Dati); + s = s+3; + % despiking magnetometri + magHD(:,m) = filloutliers(magHD(:,m),'linear','movmedian',Num_Dati); + magHD(:,m+1) = filloutliers(magHD(:,m+1),'linear','movmedian',Num_Dati); + magHD(:,m+2) = filloutliers(magHD(:,m+2),'linear','movmedian',Num_Dati); + m = m+3; +end + +text = 'Data of Tilt Link HD VR defined correctly. defDatiTL function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/Tilt/defDatiHDVR.m b/Tilt/defDatiHDVR.m new file mode 100755 index 0000000..db3be30 --- /dev/null +++ b/Tilt/defDatiHDVR.m @@ -0,0 +1,104 @@ +% Funzione che definisce accelerazioni (acc), dati magnetici (mag), +% temperature (temp) per i nodi di tipo Tilt Link + +function [TimeHDVR,accHDVR,magHDVR,tempHDVR,ErrTiltLinkHDVR] = defDatiHDVR(DatiTiltLinkHDVR,... + ErrTiltLinkHDVR,NodoTiltLinkHDVR,Ndatidespike,rHDVR,Unit,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiHDVR function started'; +fprintf(fileID,fmt,text); + +[r,c] = size(DatiTiltLinkHDVR); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 1:c + check = isnan(DatiTiltLinkHDVR(a,b)); + if check == 1 + DatiTiltLinkHDVR(a,b) = DatiTiltLinkHDVR(a-1,b); + ErrTiltLinkHDVR(a,b-1) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = [num2str(Ncorr) ' NaN of Tilt Link HD VR corrected by defDatiHD function']; +fprintf(fileID,fmt,text); + +% Definisco Data (gg:mm:aaaa hh:mm), Batteria, i 3 dati di accelerometro +% e magnetometro e la Temperatura per la calibrazione +TimeHDVR = DatiTiltLinkHDVR(:,1); % data +accHDVR = zeros(r,rHDVR*3); % dati accelerometro +magHDVR = zeros(r,rHDVR*3); % dati magnetometro +tempHDVR = zeros(r,rHDVR); % temperatura del nodo per la calibrazione +s = 1; +m = 1; +p = 2; +for i=1:rHDVR + if cell2mat(NodoTiltLinkHDVR(i,5)) == 1 + accHDVR(:,s) = DatiTiltLinkHDVR(:,p); + accHDVR(:,s+1) = DatiTiltLinkHDVR(:,p+1); + accHDVR(:,s+2) = DatiTiltLinkHDVR(:,p+2); + s = s+3; + magHDVR(:,m) = DatiTiltLinkHDVR(:,p+3); + magHDVR(:,m+1) = DatiTiltLinkHDVR(:,p+4); + magHDVR(:,m+2) = DatiTiltLinkHDVR(:,p+5); + m = m+3; + tempHDVR(:,i) = DatiTiltLinkHDVR(:,p+6); + p = p+7; + else + accHDVR(:,s) = DatiTiltLinkHDVR(:,p); + accHDVR(:,s+1) = DatiTiltLinkHDVR(:,p+1); + accHDVR(:,s+2) = DatiTiltLinkHDVR(:,p+2); + s = s+3; + tempHDVR(:,i) = DatiTiltLinkHDVR(:,p+3); + p = p+4; + end +end + +if strcmp(Unit,'G301') == 1 + i = 1; + j = 1; + while i <= 3*rHDVR + for ii = 2:r + if accHDVR(ii,i) == -8191 && accHDVR(ii,i+1) == 0 && accHDVR(ii,i+2) == 0 + accHDVR(ii,i) = accHDVR(ii-1,i); + accHDVR(ii,i+1) = accHDVR(ii-1,i+1); + accHDVR(ii,i+2) = accHDVR(ii-1,i+2); + magHDVR(ii,i) = magHDVR(ii-1,i); + magHDVR(ii,i+1) = magHDVR(ii-1,i+1); + magHDVR(ii,i+2) = magHDVR(ii-1,i+2); + tempHDVR(ii,j) = tempHDVR(ii-1,j); + ErrTiltLinkHDVR(ii,i) = 1; + end + end + i = i+3; + j = j+1; + end +end + +s = 1; +m = 1; +Num_Dati = Ndatidespike; % numero di dati per il despike +if Num_Dati > r + Num_Dati = r; +end +for i = 1:rHDVR + % despiking accelerometri + accHDVR(:,s) = filloutliers(accHDVR(:,s),'linear','movmedian',Num_Dati); + accHDVR(:,s+1) = filloutliers(accHDVR(:,s+1),'linear','movmedian',Num_Dati); + accHDVR(:,s+2) = filloutliers(accHDVR(:,s+2),'linear','movmedian',Num_Dati); + s = s+3; + % despiking magnetometri + magHDVR(:,m) = filloutliers(magHDVR(:,m),'linear','movmedian',Num_Dati); + magHDVR(:,m+1) = filloutliers(magHDVR(:,m+1),'linear','movmedian',Num_Dati); + magHDVR(:,m+2) = filloutliers(magHDVR(:,m+2),'linear','movmedian',Num_Dati); + m = m+3; +end + +text = 'Data of Tilt Link HD VR defined correctly. defDatiTL function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/Tilt/defDatiIPL.m b/Tilt/defDatiIPL.m new file mode 100755 index 0000000..7d580fd --- /dev/null +++ b/Tilt/defDatiIPL.m @@ -0,0 +1,108 @@ +% Funzione che definisce accelerazioni (accTL), dati magnetici (magTL), +% temperature (tempTL) per i nodi di tipo Tilt Link + +function [TimeIPL,accIPL,magIPL,tempIPL,ErrInPlaceLink] = defDatiIPL(DatiInPlaceLink,... + ErrInPlaceLink,NodoInPlaceLink,Ndatidespike,rIPL,MEMS,Unit,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiIPL function started'; +fprintf(fileID,fmt,text); + +[r,c] = size(DatiInPlaceLink); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 1:c + check = isnan(DatiInPlaceLink(a,b)); + if check == 1 + DatiInPlaceLink(a,b) = DatiInPlaceLink(a-1,b); + ErrInPlaceLink(a,b-1) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = [num2str(Ncorr) ' NaN of In Place Link corrected by defDatiIPL function']; +fprintf(fileID,fmt,text); + +% Definisco Data (gg:mm:aaaa hh:mm), Batteria, i 3 dati di accelerometro +% e magnetometro e la Temperatura per la calibrazione +TimeIPL = DatiInPlaceLink(:,1); % data +accIPL = zeros(r,rIPL*3); % dati accelerometro +magIPL = zeros(r,rIPL*3); % dati magnetometro +tempIPL = zeros(r,rIPL); % temperatura del nodo per la calibrazione +if strcmp(NodoInPlaceLink(1,4),'0-10 V') + p = 3; +else + p = 7; % passo nella definizione dei dati +end +s = 1; +m = 1; +for i = 1:rIPL + accIPL(:,s) = DatiInPlaceLink(:,2+(i-1)*p); + accIPL(:,s+1) = DatiInPlaceLink(:,3+(i-1)*p); + accIPL(:,s+2) = DatiInPlaceLink(:,4+(i-1)*p); + s = s+3; + if strcmp(NodoInPlaceLink(1,4),'0-10 V') == 0 + magIPL(:,m) = DatiInPlaceLink(:,5+(i-1)*p); + magIPL(:,m+1) = DatiInPlaceLink(:,6+(i-1)*p); + magIPL(:,m+2) = DatiInPlaceLink(:,7+(i-1)*p); + m = m+3; + tempIPL(:,i) = DatiInPlaceLink(:,8+(i-1)*p); + if MEMS == 2 + [rT,~] = size(tempIPL); + for j = 1:rT + if tempIPL(j,i) > 200 + tempIPL(j,i) = tempIPL(j,i) - 256; % Correzione della temperatura dei nuovi MEMS + end + end + end + end +end + +if strcmp(Unit,'G301') == 1 + i = 1; + j = 1; + while i <= 3*rIPL + for ii = 2:r + if accIPL(ii,i) == -8191 && accIPL(ii,i+1) == 0 && accIPL(ii,i+2) == 0 + accIPL(ii,i) = accIPL(ii-1,i); + accIPL(ii,i+1) = accIPL(ii-1,i+1); + accIPL(ii,i+2) = accIPL(ii-1,i+2); + magIPL(ii,i) = magIPL(ii-1,i); + magIPL(ii,i+1) = magIPL(ii-1,i+1); + magIPL(ii,i+2) = magIPL(ii-1,i+2); + tempIPL(ii,j) = tempIPL(ii-1,j); + ErrInPlaceLink(ii,i) = 1; + end + end + i = i+3; + j = j+1; + end +end + +s = 1; +m = 1; +Num_Dati = Ndatidespike; % numero di dati per il despike +if Num_Dati > r + Num_Dati = r; +end +for i = 1:rIPL + % despiking accelerometri + accIPL(:,s) = filloutliers(accIPL(:,s),'linear','movmedian',Num_Dati); + accIPL(:,s+1) = filloutliers(accIPL(:,s+1),'linear','movmedian',Num_Dati); + accIPL(:,s+2) = filloutliers(accIPL(:,s+2),'linear','movmedian',Num_Dati); + s = s+3; + % despiking magnetometri + magIPL(:,m) = filloutliers(magIPL(:,m),'linear','movmedian',Num_Dati); + magIPL(:,m+1) = filloutliers(magIPL(:,m+1),'linear','movmedian',Num_Dati); + magIPL(:,m+2) = filloutliers(magIPL(:,m+2),'linear','movmedian',Num_Dati); + m = m+3; +end + +text = 'Data of In Place Link defined correctly. defDatiIPL function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/Tilt/defDatiIPLHR.m b/Tilt/defDatiIPLHR.m new file mode 100755 index 0000000..b8f330e --- /dev/null +++ b/Tilt/defDatiIPLHR.m @@ -0,0 +1,195 @@ +% Funzione che definisce accelerazioni, dati magnetici, temperature, date e +% livello della batteria per i nodi di tipo Tilt Link +function [TimeIPLHR,angIPLHR,tempIPLHR,ErrInPlaceLinkHR] = defDatiIPLHR(... + DatiInPlaceLinkHR,ErrInPlaceLinkHR,Ndatidespike,rIPLHR,NodoInPlaceLinkHR,... + NuovoZeroIPLHR,IDcentralina,DTcatena,Unit,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiIPLHR function started'; +fprintf(fileID,fmt,text); + +[r,c]=size(DatiInPlaceLinkHR); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r % Date + for b = 1:c + check = isnan(DatiInPlaceLinkHR(a,b)); + if check == 1 + DatiInPlaceLinkHR(a,b) = DatiInPlaceLinkHR(a-1,b); + ErrInPlaceLinkHR(a,b-1) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = [num2str(Ncorr) ' NaN of In Place Link HR corrected by defDatiIPLHR function']; +fprintf(fileID,fmt,text); + +TimeIPLHR = DatiInPlaceLinkHR(:,1); % data +angIPLHR = zeros(r,rIPLHR*2); % dati angolari + +if strcmp(NodoInPlaceLinkHR(1,4),'ADC') || strcmp(NodoInPlaceLinkHR{1,4} ,'null') || isempty(NodoInPlaceLinkHR{1,4}) == 1 + controllo_IPLHR = zeros(r,rIPLHR*3); + tempIPLHR = zeros(r,rIPLHR); % temperatura del nodo per la calibrazione + ctl = 1; + p = 2; % passo + s = 1; + for i = 1:rIPLHR + angIPLHR(:,s:s+1) = DatiInPlaceLinkHR(:,p:p+1); + s = s+2; + controllo_IPLHR(:,ctl:ctl+2) = DatiInPlaceLinkHR(:,p+2:p+4); + ctl = ctl+3; + tempIPLHR(:,i) = DatiInPlaceLinkHR(:,p+5); + p = p+6; + end +elseif strcmp(NodoInPlaceLinkHR{1,4} ,'digit') + tempIPLHR = zeros(r,rIPLHR); % temperatura del nodo per la calibrazione + p = 2; % passo + s = 1; + for i = 1:rIPLHR + angIPLHR(:,s:s+1) = DatiInPlaceLinkHR(:,p:p+1); + s = s+2; + tempIPLHR(:,i) = DatiInPlaceLinkHR(:,p+2); + p = p+3; + end +end + +if strcmp(Unit,'G301') == 1 + i = 1; + j = 1; + C = 1; + while i <= 2*rIPLHR + for ii = 2:r + if angIPLHR(ii,i) == -8191 && angIPLHR(ii,i+1) == 0 && controllo_IPLHR(ii,C) == 0 ... + && controllo_IPLHR(ii,C+1) == 0 && controllo_IPLHR(ii,C+2) == 0 + angIPLHR(ii,i) = angIPLHR(ii-1,i); + angIPLHR(ii,i+1) = angIPLHR(ii-1,i+1); + tempIPLHR(ii,j) = tempIPLHR(ii-1,j); + ErrInPlaceLinkHR(ii,i) = 1; + end + end + i = i+2; + j = j+1; + C = C+3; + end +end + +s = 1; +Num_Dati = Ndatidespike; % numero di dati per il despike +if Num_Dati > r + Num_Dati = r; +end +for i = 1:rIPLHR + % despiking accelerometri + angIPLHR(:,s) = filloutliers(angIPLHR(:,s),'linear','movmedian',Num_Dati); + angIPLHR(:,s+1) = filloutliers(angIPLHR(:,s+1),'linear','movmedian',Num_Dati); + s = s+2; +end + +%% !!! Controllo che le ampolle non siano fuori scala (32768) +if strcmp(NodoInPlaceLinkHR(1,4),'ADC') || strcmp(NodoInPlaceLinkHR{1,4} ,'null') || isempty(NodoInPlaceLinkHR{1,4}) == 1 + [rC,cC] = size(angIPLHR); + AmpolleUpdate = ['' IDcentralina '-' DTcatena '-Ampolle.csv']; + if NuovoZeroIPLHR == 1 + Dati = csvread(AmpolleUpdate); + Dati(:,1) = Dati(:,1) + 730000; + [rD,~] = size(Dati); + num = 1; + cont = 1; + if rD ~= 0 + for j = 1:rC + for ii = 1:cC + segno1 = 0; + if j == 1 + for a = 2:rD + if TimeIPLHR(j,1) >= Dati(a,1) + segno1 = sign(Dati(a-1,ii+1)); % segno del valore alla data precedente + break + end + end + end + if segno1 == 0 + if j == 1 + else + segno1 = sign(angIPLHR(j-1,ii)); % segno del valore alla data precedente + end + end + segno2 = sign(angIPLHR(j,ii)); % segno del valore alla data successiva + if segno2 ~= segno1 % se i due segni sono diversi + if abs(angIPLHR(j,ii)) > 15000 + if segno1 == 1 + angIPLHR(j,ii) = 32768 + (32768 + angIPLHR(j,ii)); % Fondo scala positivo + elseif segno1 == -1 + angIPLHR(j,ii) = -32768 + (-32768 + angIPLHR(j,ii)); % Fondo scala negativo + end + text = ['In Place Link HR was out of range on node ' mat2str(cell2mat(NodoInPlaceLinkHR(num,2))) '']; + fprintf(fileID,fmt,text); + end + end + cont = cont+1; + if cont == 3 + cont = 1; + num = num+1; + end + end + cont = 1; + num = 1; + end + indice = 1; + for j=1:rC + if Dati(end,1) == TimeIPLHR(j,1) + indice = j+1; + break + end + end + else + indice = []; + end + else + indice = 1; + end + + %% Controllo che l'ampolla non venga letta come MEMS! + index = 1; + nodo = 1; + for b = 1:rIPLHR % nodi + for a = 1:rC % date + if controllo_IPLHR(a,index)~=0 && controllo_IPLHR(a,index+1)~=0 && controllo_IPLHR(a,index+2)~=0 + if a == 1 + if NuovoZeroIPLHR == 1 + for aa = 2:rD + if TimeIPLHR(a,1) == Dati(aa,1) + angIPLHR(a,2*nodo-1:2*nodo) = Dati(aa-1,2*nodo:2*nodo+1); % valore alla data precedente + break + end + end + end + else + angIPLHR(a,2*nodo-1:2*nodo) = angIPLHR(a-1,2*nodo-1:2*nodo); + end + ErrInPlaceLinkHR(a,2*nodo-1:2*nodo) = 1; + end + end + index = index+3; + nodo = nodo+1; + end + if isempty(indice) == 0 + Dati = TimeIPLHR(indice:end,1); + Dati(:,1) = Dati(:,1) - 730000; + datiHR = [Dati(:,1) angIPLHR(indice:end,:)]; + dat=isempty(datiHR); + if dat==0 + if NuovoZeroIPLHR == 1 + delete(AmpolleUpdate); + end + csvwrite(AmpolleUpdate,datiHR); + end + end +end + +text = 'Data of In Place Link HR defined correctly. defDatiIPLHR function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/Tilt/defDatiKL.m b/Tilt/defDatiKL.m new file mode 100755 index 0000000..914bff4 --- /dev/null +++ b/Tilt/defDatiKL.m @@ -0,0 +1,102 @@ +% Funzione che definisce accelerazioni, dati magnetici, temperature, date e +% livello della batteria per i nodi di tipo Klino Link +function [TimeKL,ang_KL,temp_KL,ErrKlinoLink] = defDatiKL(DatiKlinoLink,... + ErrKlinoLink,NodoKlinoLink,MEMS,Ndatidespike,rKL,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiKL function started'; +fprintf(fileID,fmt,text); + +[r,c] = size(DatiKlinoLink); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 1:c + check = isnan(DatiKlinoLink(a,b)); + if check == 1 + DatiKlinoLink(a,b) = DatiKlinoLink(a-1,b); + ErrKlinoLink(a,b-1) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = [num2str(Ncorr) ' NaN of Klino Link corrected by defDatiKL function']; +fprintf(fileID,fmt,text); + +[r,c]=size(DatiKlinoLink); +TimeKL = DatiKlinoLink(:,1); % data +div = (c-1)/rKL; +if strcmp(NodoKlinoLink(1,4),'ADC') == 1 || strcmp(NodoKlinoLink{1,4} ,'null') == 1 || ... + isempty(NodoKlinoLink{1,4}) == 1 || strcmp(NodoKlinoLink{1,4} ,'g') == 1 + ang_KL = zeros(r,rKL*3); % dati angoli + p = 4; % passo +elseif strcmp(NodoKlinoLink{1,4} ,'Gradi') == 1 + if div == 3 + ang_KL = zeros(r,rKL*2); + p = 3; % passo + else + ang_KL = zeros(r,rKL*3); + p = 4; % passo + end +end +temp_KL = zeros(r,rKL); % temperatura del nodo per la calibrazione +s = 1; +for i = 1:rKL + if strcmp(NodoKlinoLink(1,4),'ADC') == 1 || strcmp(NodoKlinoLink{1,4} ,'null') == 1 ... + || isempty(NodoKlinoLink{1,4}) == 1 || strcmp(NodoKlinoLink{1,4} ,'g') == 1 + ang_KL(:,s) = DatiKlinoLink(:,2+(i-1)*p); + ang_KL(:,s+1) = DatiKlinoLink(:,3+(i-1)*p); + ang_KL(:,s+2) = DatiKlinoLink(:,4+(i-1)*p); + s = s+3; + temp_KL(:,i) = DatiKlinoLink(:,5+(i-1)*p); + [rT,~] = size(temp_KL); + if MEMS == 2 + for j = 1:rT + if temp_KL(j,i) > 200 + temp_KL(j,i) = temp_KL(j,i) - 256; % Correzione della temperatura dei nuovi MEMS + end + end + end + elseif strcmp(NodoKlinoLink{1,4} ,'Gradi') + ang_KL(:,s) = DatiKlinoLink(:,2+(i-1)*p); + ang_KL(:,s+1) = DatiKlinoLink(:,3+(i-1)*p); + if div == 3 + s = s+2; + else + ang_KL(:,s+2) = DatiKlinoLink(:,4+(i-1)*p); + s = s+3; + end + temp_KL(:,i) = DatiKlinoLink(:,4+(i-1)*p); + end +end + +s = 1; +Num_Dati = Ndatidespike; % numero di dati per il despike +if Num_Dati > r + Num_Dati = r; +end +for i = 1:rKL + % despiking + ang_KL(1:end-1,s) = filloutliers(ang_KL(1:end-1,s),'linear','movmedian',Num_Dati); + ang_KL(1:end-1,s+1) = filloutliers(ang_KL(1:end-1,s+1),'linear','movmedian',Num_Dati); + if strcmp(NodoKlinoLink(1,4),'ADC') == 1 || strcmp(NodoKlinoLink{1,4} ,'null') == 1 ... + || isempty(NodoKlinoLink{1,4}) == 1 || strcmp(NodoKlinoLink{1,4} ,'g') == 1 + ang_KL(1:end-1,s+2) = filloutliers(ang_KL(1:end-1,s+2),'linear','movmedian',Num_Dati); + s = s+3; + elseif strcmp(NodoKlinoLink{1,4} ,'Gradi') + if div == 3 + s = s+2; + else + ang_KL(1:end-1,s+2) = filloutliers(ang_KL(1:end-1,s+2),'linear','movmedian',Num_Dati); + s = s+3; + end + end +end + +text = 'Data of Klino Link defined correctly, defDatiKL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/Tilt/defDatiKLHR.m b/Tilt/defDatiKLHR.m new file mode 100755 index 0000000..e4b32cf --- /dev/null +++ b/Tilt/defDatiKLHR.m @@ -0,0 +1,161 @@ +% Funzione che definisce accelerazioni, dati magnetici, temperature, date e +% livello della batteria per i nodi di tipo Klino Link +function [TimeKLHR,ang_KLHR,temp_KLHR,ErrKlinoLinkHR] = defDatiKLHR(... + DatiKlinoLinkHR,ErrKlinoLinkHR,Ndatidespike,rKLHR,NodoKlinoLinkHR,... + NuovoZeroKLHR,IDcentralina,DTcatena,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiKLHR function started'; +fprintf(fileID,fmt,text); + +[r,c]=size(DatiKlinoLinkHR); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 1:c + check = isnan(DatiKlinoLinkHR(a,b)); + if check == 1 + DatiKlinoLinkHR(a,b) = DatiKlinoLinkHR(a-1,b); + ErrKlinoLinkHR(a,b-1) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = [num2str(Ncorr) ' NaN of Klino Link HR corrected by defDatiKL function']; +fprintf(fileID,fmt,text); + +[r,~]=size(DatiKlinoLinkHR); +TimeKLHR = DatiKlinoLinkHR(:,1); % data +ang_KLHR = zeros(r,rKLHR*2); % dati angoli +temp_KLHR = zeros(r,rKLHR); % temperatura del nodo per la calibrazione +p = 2; % passo +s = 1; +ctl = 1; +if strcmp(NodoKlinoLinkHR(1,4),'IPTM') == 1 + for i = 1:rKLHR + ang_KLHR(:,s:s+1) = DatiKlinoLinkHR(:,p:p+1); + s = s+2; + temp_KLHR(:,i) = DatiKlinoLinkHR(:,p+2); + p = p+3; + end +else + for i = 1:rKLHR + ang_KLHR(:,s:s+1) = DatiKlinoLinkHR(:,p:p+1); + s = s+2; + controllo_KLHR(:,ctl:ctl+2) = DatiKlinoLinkHR(:,p+2:p+4); + ctl = ctl+3; + temp_KLHR(:,i) = DatiKlinoLinkHR(:,p+5); + p = p+6; + end +end + +s = 1; +Num_Dati = Ndatidespike; % numero di dati per il despike +if Num_Dati > r + Num_Dati = r; +end +for i = 1:rKLHR + % despiking + ang_KLHR(1:end-1,s) = filloutliers(ang_KLHR(1:end-1,s),'linear','movmedian',Num_Dati); + ang_KLHR(1:end-1,s+1) = filloutliers(ang_KLHR(1:end-1,s+1),'linear','movmedian',Num_Dati); + s = s+2; +end + +[rC,cC] = size(ang_KLHR); +AmpolleUpdate = ['' IDcentralina '-' DTcatena '-Ampolle.csv']; +if strcmp(NodoKlinoLinkHR(1,4),'IPTM') == 1 +else + if NuovoZeroKLHR == 1 + %% !!! Controllo che le ampolle non siano fuori scala (32768) + Dati = csvread(AmpolleUpdate); + Dati(:,1) = Dati(:,1) + 730000; + [rD,~] = size(Dati); + if rD ~= 0 + for j = 1:rC + for ii = 1:cC + segno1 = 0; + if j == 1 + for a = 2:rD + if TimeKLHR(j,1) == Dati(a,1) + segno1 = sign(Dati(a-1,ii+1)); % segno del valore alla data precedente + break + end + end + end + if segno1 == 0 + if j == 1 + else + segno1 = sign(ang_KLHR(j-1,ii)); % segno del valore alla data precedente + end + end + segno2 = sign(ang_KLHR(j,ii)); % segno del valore alla data successiva + if segno2 ~= segno1 % se i due segni sono diversi + if abs(ang_KLHR(j,ii)) > 15000 + if segno1 == 1 + ang_KLHR(j,ii) = 32768 + (32768 + ang_KLHR(j,ii)); % Fondo scala positivo + elseif segno1 == -1 + ang_KLHR(j,ii) = -32768 + (-32768 + ang_KLHR(j,ii)); % Fondo scala negativo + end + text = ['Klino Link was out of range on node ' NodoKlinoLinkHR(ii/2,2) '']; + fprintf(fileID,fmt,text); + end + end + end + end + indice = 1; + for j=1:rC + if Dati(end,1) == TimeKLHR(j,1) + indice = j+1; + break + end + end + else + indice = 1; + end + else + indice = 1; + end + + %% Controllo che l'ampolla non venga letta come MEMS! + index = 1; + nodo = 1; + for b = 1:rKLHR % nodi + for a = 1:rC % date + if controllo_KLHR(a,index)~=0 && controllo_KLHR(a,index+1)~=0 && controllo_KLHR(a,index+2)~=0 + if a == 1 + if NuovoZeroKLHR == 1 + for aa = 2:rD + if TimeKLHR(a,1) == Dati(aa,1) + ang_KLHR(a,2*nodo-1:2*nodo) = Dati(aa-1,2*nodo:2*nodo+1); % valore alla data precedente + break + end + end + end + else + ang_KLHR(a,2*nodo-1:2*nodo) = ang_KLHR(a-1,2*nodo-1:2*nodo); + end + ErrKlinoLinkHR(a,2*nodo-1:2*nodo) = 1; + end + end + index = index+3; + nodo = nodo+1; + end + Dati = TimeKLHR(indice:end,1); + Dati(:,1) = Dati(:,1) - 730000; + datiHR = [Dati(:,1) ang_KLHR(indice:end,:)]; + dat=isempty(datiHR); + if dat==0 + if NuovoZeroKLHR == 1 + delete(AmpolleUpdate); + end + csvwrite(AmpolleUpdate,datiHR); + end +end + +text = 'Data of Klino Link HR defined correctly. defDatiKLHR function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/Tilt/defDatiLL.m b/Tilt/defDatiLL.m new file mode 100755 index 0000000..5e6410c --- /dev/null +++ b/Tilt/defDatiLL.m @@ -0,0 +1,56 @@ +% funzione che definisce i dati per la cella di carico, in particolare +% tempo (TimeLL), batteria (BattLL) e ADC (ADCLoad) + +function [TimeLL,ADCLoad,ErrLoadLink] = defDatiLL(DatiLoadLink,ErrLoadLink,... + Ndatidespike,rLL,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiLL function started'; +fprintf(fileID,fmt,text); + +[r,c]=size(DatiLoadLink); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 1:c + check = isnan(DatiLoadLink(a,b)); + if check == 1 + DatiLoadLink(a,b) = DatiLoadLink(a-1,b); + ErrLoadLink(a,b-1) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = [num2str(Ncorr) ' NaN of Load Link corrected by defDatiLL function']; +fprintf(fileID,fmt,text); + +TimeLL = DatiLoadLink(:,1); % data +[r,c] = size(DatiLoadLink); +ADCLoad = zeros(r,rLL); + +s = 1; +b = 2; +while b <= c + ADCLoad(:,s) = DatiLoadLink(:,b); % dati ADC + b = b+1; + s = s+1; +end + +s = 1; +Num_Dati = Ndatidespike; % numero di dati per il despike +if Num_Dati > r + Num_Dati = r; +end +for i = 1:rLL + % despiking + ADCLoad(1:end-1,s) = filloutliers(ADCLoad(1:end-1,s),'linear','movmedian',Num_Dati); + s = s+1; +end + +text = 'Data of Load Link defined correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/defDatiPE.m b/Tilt/defDatiPE.m new file mode 100755 index 0000000..195f6b7 --- /dev/null +++ b/Tilt/defDatiPE.m @@ -0,0 +1,33 @@ +% Funzione che definisce accelerazioni, dati magnetici, temperature, date e +% livello della batteria per i nodi di tipo Pendulum +function [TimePE,Def_PE,ErrPendulum] = defDatiPE(DatiPendulum,ErrPendulum,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiPE function started'; +fprintf(fileID,fmt,text); + +[r,c] = size(DatiPendulum); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 1:c + check = isnan(DatiPendulum(a,b)); + if check == 1 + DatiPendulum(a,b) = DatiPendulum(a-1,b); + ErrPendulum(a,b-1) = 1; + Ncorr = Ncorr+1; + end + end +end +text = [num2str(Ncorr) ' NaN of Pendulum corrected by defDatiPE function']; +fprintf(fileID,fmt,text); + +TimePE = DatiPendulum(:,1); % data +Def_PE = DatiPendulum(:,2:end); + +text = 'Data of Pendulum defined correctly, defDatiPE function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/Tilt/defDatiPL.m b/Tilt/defDatiPL.m new file mode 100755 index 0000000..0674f23 --- /dev/null +++ b/Tilt/defDatiPL.m @@ -0,0 +1,44 @@ +function [TimePL,ADCPiez,tempPiez,ErrPiezoLink] = defDatiPL(DatiPiezoLink,ErrPiezoLink,rPL,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiPL function started'; +fprintf(fileID,fmt,text); + +[r,c]=size(DatiPiezoLink); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 1:c + check = isnan(DatiPiezoLink(a,b)); + if check == 1 + DatiPiezoLink(a,b) = DatiPiezoLink(a-1,b); + ErrPiezoLink(a,b-1) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = [num2str(Ncorr) ' NaN of Piezo Link corrected by defDatiPL function']; +fprintf(fileID,fmt,text); + +% Definisco Data (gg:mm:aaaa hh:mm)ed i 2 dati +% per il piezometro +[r,c] = size(DatiPiezoLink); +TimePL = DatiPiezoLink(:,1); % data +ADCPiez = zeros(r,rPL); +tempPiez = zeros(r,rPL); +s = 1; +b = 2; % colonna del primo piezometro +while b <= c + ADCPiez(:,s) = DatiPiezoLink(:,b); % dati ADC piezometro + tempPiez(:,s) = DatiPiezoLink(:,b+1); % dati temperatura ADC piezometro + b = b+2; + s = s+1; +end + +text = 'Data of Piezo Link defined correctly. defDatiPL function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/defDatiPT100.m b/Tilt/defDatiPT100.m new file mode 100755 index 0000000..76fd1bf --- /dev/null +++ b/Tilt/defDatiPT100.m @@ -0,0 +1,34 @@ +% Funzione che definisce accelerazioni, dati magnetici, temperature, date e +% livello della batteria per i nodi di tipo Therm Link +function [TimePT100,val_PT100,ErrPT100Link] = defDatiPT100(DatiPT100Link,ErrPT100Link,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiPT100 function started'; +fprintf(fileID,fmt,text); + +[r,c]=size(DatiPT100Link); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 1:c + check = isnan(DatiPT100Link(a,b)); + if check == 1 + DatiPT100Link(a,b) = DatiPT100Link(a-1,b); + ErrPT100Link(a,b-1) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = [num2str(Ncorr) ' NaN of PT100 Link corrected by defDatiPT100 function']; +fprintf(fileID,fmt,text); + +TimePT100 = DatiPT100Link(:,1); % data +val_PT100 = DatiPT100Link(:,2:end); % temperatura + +text = 'Data of PT100 Link defined correctly. defDatiPT100 function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/Tilt/defDatiRL.m b/Tilt/defDatiRL.m new file mode 100755 index 0000000..c625cda --- /dev/null +++ b/Tilt/defDatiRL.m @@ -0,0 +1,34 @@ +% Funzione che definisce accelerazioni, dati magnetici, temperature, date e +% livello della batteria per i nodi di tipo Rain Link +function [TimeRL,val_RL,ErrRainLink] = defDatiRL(DatiRainLink,ErrRainLink,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiRL function started'; +fprintf(fileID,fmt,text); + +[r,c]=size(DatiRainLink); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 1:c + check = isnan(DatiRainLink(a,b)); + if check == 1 + DatiRainLink(a,b) = DatiRainLink(a-1,b); + ErrRainLink(a,b-1) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = [num2str(Ncorr) ' NaN of Rain Link corrected by defDatiRL function']; +fprintf(fileID,fmt,text); + +TimeRL = DatiRainLink(:,1); % data +val_RL = DatiRainLink(:,2:end); % dati pioggia + +text = 'Data of Rain Link defined correctly. defDatiRL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/Tilt/defDatiTL.m b/Tilt/defDatiTL.m new file mode 100755 index 0000000..31a157d --- /dev/null +++ b/Tilt/defDatiTL.m @@ -0,0 +1,157 @@ +% Funzione che definisce accelerazioni (accTL), dati magnetici (magTL), +% temperature (tempTL) per i nodi di tipo Tilt Link + +function [TimeTL,accTL,magTL,tempTL,ErrTiltLink] = defDatiTL(DatiTiltLink,... + ErrTiltLink,Ndatidespike,rTL,MEMS,conn,catena,IDcentralina,DTcatena,Unit,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiTL function started'; +fprintf(fileID,fmt,text); + +[r,c] = size(DatiTiltLink); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 1:c + check = isnan(DatiTiltLink(a,b)); + if check == 1 + DatiTiltLink(a,b) = DatiTiltLink(a-1,b); + ErrTiltLink(a,b-1) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = [num2str(Ncorr) ' NaN of Tilt Link V corrected by defDatiTL function']; +fprintf(fileID,fmt,text); + +% Definisco Data (gg:mm:aaaa hh:mm), Batteria, i 3 dati di accelerometro +% e magnetometro e la Temperatura per la calibrazione +TimeTL = DatiTiltLink(:,1); % data +accTL = zeros(r,rTL*3); % dati accelerometro +magTL = zeros(r,rTL*3); % dati magnetometro +tempTL = zeros(r,rTL); % temperatura del nodo per la calibrazione +p = 7; % passo nella definizione dei dati + +% NOTA: Si esegue l'inversione delle colonne N°9 e N°8 per considerare +% l'errore in lettura sulle centraline, ovvero lo scambio degli assi +% y e z del magnetometro. +s = 1; +m = 1; + +if MEMS == 1 % inverto le colonne Y e Z del magnetometro (MEMS vecchi, PRE 21 Maggio 2016) + for i = 1:rTL + accTL(:,s) = DatiTiltLink(:,2+(i-1)*p); + accTL(:,s+1) = DatiTiltLink(:,3+(i-1)*p); + accTL(:,s+2) = DatiTiltLink(:,4+(i-1)*p); + s = s+3; + magTL(:,m) = DatiTiltLink(:,5+(i-1)*p); + magTL(:,m+1) = DatiTiltLink(:,7+(i-1)*p); + magTL(:,m+2) = DatiTiltLink(:,6+(i-1)*p); + m = m+3; + tempTL(:,i) = DatiTiltLink(:,8+(i-1)*p); + end +elseif MEMS == 2 % Nodi nuovi, dopo 21 Maggio 2016 + for i = 1:rTL + accTL(:,s) = DatiTiltLink(:,2+(i-1)*p); + accTL(:,s+1) = DatiTiltLink(:,3+(i-1)*p); + accTL(:,s+2) = DatiTiltLink(:,4+(i-1)*p); + s = s+3; + magTL(:,m) = DatiTiltLink(:,5+(i-1)*p); + magTL(:,m+1) = DatiTiltLink(:,6+(i-1)*p); + magTL(:,m+2) = DatiTiltLink(:,7+(i-1)*p); + m = m+3; + tempTL(:,i) = DatiTiltLink(:,8+(i-1)*p); + [rT,~] = size(tempTL); + for j = 1:rT + if tempTL(j,i) > 200 + tempTL(j,i) = tempTL(j,i) - 256; % Correzione della temperatura dei nuovi MEMS + end + end + end +elseif MEMS == 3 % Nodi nuovi, dopo 21 Maggio 2016 + for i = 1:rTL + accTL(:,s) = DatiTiltLink(:,2+(i-1)*p); + accTL(:,s+1) = DatiTiltLink(:,3+(i-1)*p); + accTL(:,s+2) = DatiTiltLink(:,4+(i-1)*p); + s = s+3; + magTL(:,m) = DatiTiltLink(:,5+(i-1)*p); + magTL(:,m+1) = DatiTiltLink(:,6+(i-1)*p); + magTL(:,m+2) = DatiTiltLink(:,7+(i-1)*p); + m = m+3; + tempTL(:,i) = DatiTiltLink(:,8+(i-1)*p); + end +end + +if strcmp(Unit,'G301') == 1 + i = 1; + j = 1; + while i <= 3*rTL + for ii = 2:r + if accTL(ii,i) == -8191 && accTL(ii,i+1) == 0 && accTL(ii,i+2) == 0 + accTL(ii,i) = accTL(ii-1,i); + accTL(ii,i+1) = accTL(ii-1,i+1); + accTL(ii,i+2) = accTL(ii-1,i+2); + magTL(ii,i) = magTL(ii-1,i); + magTL(ii,i+1) = magTL(ii-1,i+1); + magTL(ii,i+2) = magTL(ii-1,i+2); + tempTL(ii,j) = tempTL(ii-1,j); + ErrTiltLink(ii,i) = 1; + end + end + i = i+3; + j = j+1; + end +end + +s = 1; +m = 1; +Num_Dati = Ndatidespike; % numero di dati per il despike +if Num_Dati > r + Num_Dati = r; +end +for i = 1:rTL + % despiking accelerometri + accTL(:,s) = filloutliers(accTL(:,s),'linear','movmedian',Num_Dati); + accTL(:,s+1) = filloutliers(accTL(:,s+1),'linear','movmedian',Num_Dati); + accTL(:,s+2) = filloutliers(accTL(:,s+2),'linear','movmedian',Num_Dati); + s = s+3; + % despiking magnetometri + magTL(:,m) = filloutliers(magTL(:,m),'linear','movmedian',Num_Dati); + magTL(:,m+1) = filloutliers(magTL(:,m+1),'linear','movmedian',Num_Dati); + magTL(:,m+2) = filloutliers(magTL(:,m+2),'linear','movmedian',Num_Dati); + m = m+3; +end + +%% Specifico DT0002 +if strcmp(DTcatena,'DT0002') + TL = 1; + TRec = zeros(rTL,1); + [rC,~] = size(catena); + idNodo = cell2mat(catena(:,1)); + for a = 1:rC + nNodo = mat2str(cell2mat(catena(a,3))); + if idNodo(a,1) == 1 % Tilt Link V + %% Importazione dei dati di calibrazione per Tilt Link V + comando = ['select Cal9 from CalibrationView where UnitName = '''... + IDcentralina ''' and ToolNameID = ''' DTcatena ''' and NodeNum = ''' nNodo '''']; + curs = exec(conn,comando); + curs = fetch(curs); + TRec(TL,:) = cell2mat(curs.Data); % matrice che raccoglie i dati del nodo numero 'a' di tipo Tilt Link V + TL = TL+1; + ok = ['Temperature calibration coefficient of node Tilt Link V number ' nNodo ' chain DT0002 recovered correctly']; + fprintf(fileID,fmt,ok); + end + end + for ii=1:rTL + tempTL(:,ii) = tempTL(:,ii)/128+TRec(ii); + end + accTL = accTL/16; +end + +text = 'Data of Tilt Link V defined correctly. defDatiTL function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/Tilt/defDatiTLH.m b/Tilt/defDatiTLH.m new file mode 100755 index 0000000..e9a82c8 --- /dev/null +++ b/Tilt/defDatiTLH.m @@ -0,0 +1,86 @@ +% Funzione che definisce accelerazioni (accTL), dati magnetici (magTL), +% temperature (tempTL) per i nodi di tipo Tilt Link + +function [TimeTLH,accTLH,tempTLH,ErrTiltLinkH] = defDatiTLH(DatiTiltLinkH,... + ErrTiltLinkH,Ndatidespike,rTLH,MEMS,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiTLH function started'; +fprintf(fileID,fmt,text); + +[r,c]=size(DatiTiltLinkH); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 1:c + check = isnan(DatiTiltLinkH(a,b)); + if check == 1 + DatiTiltLinkH(a,b) = DatiTiltLinkH(a-1,b); + ErrTiltLinkH(a,b-1) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = [num2str(Ncorr) ' NaN of Tilt Link H corrected by defDatiTLH function']; +fprintf(fileID,fmt,text); + +% Definisco Data (gg:mm:aaaa hh:mm), Batteria, i 3 dati di accelerometro +% e magnetometro e la Temperatura per la calibrazione +TimeTLH = DatiTiltLinkH(:,1); % data +accTLH = zeros(r,rTLH*3); % dati accelerometro +tempTLH = zeros(r,rTLH); % temperatura del nodo per la calibrazione +p = 7; % passo nella definizione dei dati + +s = 1; +if MEMS == 1 % MEMS ST inverto le colonne Y e Z del magnetometro (MEMS vecchi, PRE 21 Maggio 2016) + for i = 1:rTLH + accTLH(:,s) = DatiTiltLinkH(:,2+(i-1)*p); + accTLH(:,s+1) = DatiTiltLinkH(:,3+(i-1)*p); + accTLH(:,s+2) = DatiTiltLinkH(:,4+(i-1)*p); + s = s+3; + tempTLH(:,i) = DatiTiltLinkH(:,8+(i-1)*p); + end +elseif MEMS == 2 % MEMS Freescale, dopo 21 Maggio 2016 + for i = 1:rTLH + accTLH(:,s) = DatiTiltLinkH(:,2+(i-1)*p); + accTLH(:,s+1) = DatiTiltLinkH(:,3+(i-1)*p); + accTLH(:,s+2) = DatiTiltLinkH(:,4+(i-1)*p); + s = s+3; + tempTLH(:,i) = DatiTiltLinkH(:,8+(i-1)*p); + [rT,~] = size(tempTLH); + for j = 1:rT + if tempTLH(j,i) > 200 + tempTLH(j,i) = tempTLH(j,i) - 256; % Correzione della temperatura dei nuovi MEMS + end + end + end +elseif MEMS == 3 % MEMS Murata + for i = 1:rTLH + accTLH(:,s) = DatiTiltLinkH(:,2+(i-1)*p); + accTLH(:,s+1) = DatiTiltLinkH(:,3+(i-1)*p); + accTLH(:,s+2) = DatiTiltLinkH(:,4+(i-1)*p); + s = s+3; + tempTLH(:,i) = DatiTiltLinkH(:,8+(i-1)*p); + end +end + +s = 1; +Num_Dati = Ndatidespike; % numero di dati per il despike +if Num_Dati > r + Num_Dati = r; +end +for i = 1:rTLH + % despiking accelerometri + accTLH(:,s) = filloutliers(accTLH(:,s),'linear','movmedian',Num_Dati); + accTLH(:,s+1) = filloutliers(accTLH(:,s+1),'linear','movmedian',Num_Dati); + accTLH(:,s+2) = filloutliers(accTLH(:,s+2),'linear','movmedian',Num_Dati); + s = s+3; +end + +text = 'Data of Tilt Link H defined correctly. defDatiTLH function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/Tilt/defDatiTLHR.m b/Tilt/defDatiTLHR.m new file mode 100755 index 0000000..03415cd --- /dev/null +++ b/Tilt/defDatiTLHR.m @@ -0,0 +1,185 @@ +% Funzione che definisce accelerazioni, dati magnetici, temperature, date e +% livello della batteria per i nodi di tipo Tilt Link +function [TimeTLHR,angTLHR,tempTLHR,ErrTiltLinkHR] = defDatiTLHR(... + DatiTiltLinkHR,ErrTiltLinkHR,Ndatidespike,MEMS,rTLHR,NodoTiltLinkHR,... + NuovoZeroTLHR,IDcentralina,DTcatena,Unit,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiTLHR function started'; +fprintf(fileID,fmt,text); + +[r,c]=size(DatiTiltLinkHR); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r % Date + for b = 1:c + check = isnan(DatiTiltLinkHR(a,b)); + if check == 1 + DatiTiltLinkHR(a,b) = DatiTiltLinkHR(a-1,b); + ErrTiltLinkHR(a,b-1) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = [num2str(Ncorr) ' NaN of Tilt Link HR V corrected by defDatiTLHR function']; +fprintf(fileID,fmt,text); + +TimeTLHR = DatiTiltLinkHR(:,1); % data +angTLHR = zeros(r,rTLHR*2); % dati angolari +controllo_TLHR = zeros(r,rTLHR*3); +tempTLHR = zeros(r,rTLHR); % temperatura del nodo per la calibrazione +ctl = 1; +p = 2; % passo +s = 1; +for i = 1:rTLHR + angTLHR(:,s:s+1) = DatiTiltLinkHR(:,p:p+1); + s = s+2; + controllo_TLHR(:,ctl:ctl+2) = DatiTiltLinkHR(:,p+2:p+4); + ctl = ctl+3; + tempTLHR(:,i) = DatiTiltLinkHR(:,p+5); + p = p+6; +end + +if strcmp(Unit,'G301') == 1 + i = 1; + j = 1; + C = 1; + while i <= 2*rTLHR + for ii = 2:r + if angTLHR(ii,i) == -8191 && angTLHR(ii,i+1) == 0 && controllo_TLHR(ii,C) == 0 ... + && controllo_TLHR(ii,C+1) == 0 && controllo_TLHR(ii,C+2) == 0 + angTLHR(ii,i) = angTLHR(ii-1,i); + angTLHR(ii,i+1) = angTLHR(ii-1,i+1); + tempTLHR(ii,j) = tempTLHR(ii-1,j); + ErrTiltLinkHR(ii,i) = 1; + end + end + i = i+2; + j = j+1; + C = C+3; + end +end + +s = 1; +Num_Dati = Ndatidespike; % numero di dati per il despike +if Num_Dati > r + Num_Dati = r; +end +for i = 1:rTLHR + % despiking accelerometri + angTLHR(:,s) = filloutliers(angTLHR(:,s),'linear','movmedian',Num_Dati); + angTLHR(:,s+1) = filloutliers(angTLHR(:,s+1),'linear','movmedian',Num_Dati); + s = s+2; +end + +%% !!! Controllo che le ampolle non siano fuori scala (32768) +AmpolleUpdate = ['' IDcentralina '-' DTcatena '-Ampolle.csv']; +[rC,cC] = size(angTLHR); +if NuovoZeroTLHR == 1 + Dati = csvread(AmpolleUpdate); + Dati(:,1) = Dati(:,1) + 730000; + [rD,~] = size(Dati); + num = 1; + cont = 1; + if MEMS == 2 % Nuovi nodi + if rD ~= 0 + for j = 1:rC + for ii = 1:cC + segno1 = 0; + if j == 1 + for a = 2:rD + if TimeTLHR(j,1) == Dati(a,1) + segno1 = sign(Dati(a-1,ii+1)); % segno del valore alla data precedente + break + end + end + end + if segno1 == 0 + if j == 1 + else + segno1 = sign(angTLHR(j-1,ii)); % segno del valore alla data precedente + end + end + segno2 = sign(angTLHR(j,ii)); % segno del valore alla data successiva + if segno2 ~= segno1 % se i due segni sono diversi + if abs(angTLHR(j,ii)) > 15000 + if segno1 == 1 + angTLHR(j,ii) = 32768 + (32768 + angTLHR(j,ii)); % Fondo scala positivo + elseif segno1 == -1 + angTLHR(j,ii) = -32768 + (-32768 + angTLHR(j,ii)); % Fondo scala negativo + end + text = ['Tilt Link HR V was out of range on node ' mat2str(cell2mat(NodoTiltLinkHR(num,2))) '']; + fprintf(fileID,fmt,text); + end + end + cont = cont+1; + if cont == 3 + cont = 1; + num = num+1; + end + end + cont = 1; + num = 1; + end + indice = 1; + for j=1:rC + if Dati(end,1) == TimeTLHR(j,1) + indice = j+1; + break + end + end + else + indice = 1; + end + else + indice = []; + end +else + indice = 1; +end + +%% Controllo che l'ampolla non venga letta come MEMS! +index = 1; +nodo = 1; +for b = 1:rTLHR % nodi + for a = 1:rC % date + if controllo_TLHR(a,index)~=0 && controllo_TLHR(a,index+1)~=0 && controllo_TLHR(a,index+2)~=0 + if a == 1 + if NuovoZeroTLHR == 1 + for aa = 2:rD + if TimeTLHR(a,1) == Dati(aa,1) + angTLHR(a,2*nodo-1:2*nodo) = Dati(aa-1,2*nodo:2*nodo+1); % valore alla data precedente + break + end + end + end + else + angTLHR(a,2*nodo-1:2*nodo) = angTLHR(a-1,2*nodo-1:2*nodo); + end + ErrTiltLinkHR(a,2*nodo-1:2*nodo) = 1; + end + end + index = index+3; + nodo = nodo+1; +end + +if isempty(indice) == 0 + Dati = TimeTLHR(indice:end,1); + Dati(:,1) = Dati(:,1) - 730000; + datiHR = [Dati(:,1) angTLHR(indice:end,:)]; + dat=isempty(datiHR); + if dat==0 + if NuovoZeroTLHR == 1 + delete(AmpolleUpdate); + end + csvwrite(AmpolleUpdate,datiHR); + end +end + +text = 'Data of Tilt Link HR defined correctly. defDatiTLHR function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/Tilt/defDatiTLHRH.m b/Tilt/defDatiTLHRH.m new file mode 100755 index 0000000..8fe7fa5 --- /dev/null +++ b/Tilt/defDatiTLHRH.m @@ -0,0 +1,165 @@ +% Funzione che definisce accelerazioni, dati magnetici, temperature, date e +% livello della batteria per i nodi di tipo Tilt Link +function [TimeTLHRH,angTLHRH,tempTLHRH,ErrTiltLinkHRH] = defDatiTLHRH(... + DatiTiltLinkHRH,ErrTiltLinkHRH,Ndatidespike,MEMS,rTLHRH,NodoTiltLinkHRH,... + NuovoZeroTLHRH,IDcentralina,DTcatena,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiTLHRH function started'; +fprintf(fileID,fmt,text); + +[r,c]=size(DatiTiltLinkHRH); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 1:c + check = isnan(DatiTiltLinkHRH(a,b)); + if check == 1 + DatiTiltLinkHRH(a,b) = DatiTiltLinkHRH(a-1,b); + ErrTiltLinkHRH(a,b-1) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = [num2str(Ncorr) ' NaN of Tilt Link HR H corrected by defDatiTLHRH function']; +fprintf(fileID,fmt,text); + +TimeTLHRH = DatiTiltLinkHRH(:,1); % data +angTLHRH = zeros(r,rTLHRH*2); % dati accelerometro +controllo_TLHRH = zeros(r,rTLHRH*3); +tempTLHRH = zeros(r,rTLHRH); % temperatura del nodo per la calibrazione +ctl = 1; +p = 2; % passo +s = 1; +for i = 1:rTLHRH + angTLHRH(:,s:s+1) = DatiTiltLinkHRH(:,p:p+1); + s = s+2; + controllo_TLHRH(:,ctl:ctl+2) = DatiTiltLinkHRH(:,p+2:p+4); + ctl = ctl+3; + tempTLHRH(:,i) = DatiTiltLinkHRH(:,p+5); + p = p+6; +end + +s = 1; +Num_Dati = Ndatidespike; % numero di dati per il despike +if Num_Dati > r + Num_Dati = r; +end +for i = 1:rTLHRH + % despiking + angTLHRH(:,s) = filloutliers(angTLHRH(:,s),'linear','movmedian',Num_Dati); + angTLHRH(:,s+1) = filloutliers(angTLHRH(:,s+1),'linear','movmedian',Num_Dati); + s = s+2; +end + +%% !!! Controllo che le ampolle non siano fuori scala (32768) +AmpolleUpdate = ['' IDcentralina '-' DTcatena '-Ampolle.csv']; +[rC,cC] = size(angTLHRH); +if NuovoZeroTLHRH == 1 + Dati = csvread(AmpolleUpdate); + Dati(:,1) = Dati(:,1) + 730000; + [rD,~] = size(Dati); + num = 1; + cont = 1; + if MEMS == 2 % Nuovi nodi + if rD ~= 0 + for j = 1:rC + for ii = 1:cC + segno1 = 0; + if j == 1 + for a = 2:rD + if TimeTLHRH(j,1) >= Dati(a,1) + segno1 = sign(Dati(a-1,ii+1)); % segno del valore alla data precedente + break + end + end + end + if segno1 == 0 + if j == 1 + else + segno1 = sign(angTLHRH(j-1,ii)); % segno del valore alla data precedente + end + end + segno2 = sign(angTLHRH(j,ii)); % segno del valore alla data successiva + if segno2 ~= segno1 % se i due segni sono diversi + if abs(angTLHRH(j,ii)) > 15000 + if segno1 == 1 + angTLHRH(j,ii) = 32768 + (32768 + angTLHRH(j,ii)); % Fondo scala positivo + elseif segno1 == -1 + angTLHRH(j,ii) = -32768 + (-32768 + angTLHRH(j,ii)); % Fondo scala negativo + end + text = ['Tilt Link HR H was out of range on node ' mat2str(cell2mat(NodoTiltLinkHRH(num,2))) '']; + fprintf(fileID,fmt,text); + end + end + cont = cont+1; + if cont == 3 + cont = 1; + num = num+1; + end + end + cont = 1; + num = 1; + end + indice = 1; + for j=1:rC + if Dati(end,1) == TimeTLHRH(j,1) + indice = j+1; + break + end + end + else + indice = 1; + end + else + indice = []; + end +else + indice = 1; +end + +%% Controllo che l'ampolla non venga letta come MEMS! +index = 1; +nodo = 1; +for b = 1:rTLHRH % nodi + for a = 1:rC % date + if controllo_TLHRH(a,index)~=0 && controllo_TLHRH(a,index+1)~=0 && controllo_TLHRH(a,index+2)~=0 + if a == 1 + if NuovoZeroTLHRH == 1 + for aa = 2:rD + if TimeTLHRH(a,1) == Dati(aa,1) + angTLHRH(a,2*nodo-1:2*nodo) = Dati(aa-1,2*nodo:2*nodo+1); % valore alla data precedente + break + end + end + end + else + angTLHRH(a,2*nodo-1:2*nodo) = angTLHRH(a-1,2*nodo-1:2*nodo); + end + ErrTiltLinkHRH(a,2*nodo-1:2*nodo) = 1; + end + end + index = index+3; + nodo = nodo+1; +end + +if isempty(indice) == 0 + Dati = TimeTLHRH(indice:end,1); + Dati(:,1) = Dati(:,1) - 730000; + datiHRH = [Dati(:,1) angTLHRH(indice:end,:)]; + dat=isempty(datiHRH); + if dat==0 + if NuovoZeroTLHRH == 1 + delete(AmpolleUpdate); + end + csvwrite(AmpolleUpdate,datiHRH); + end +end + +text = 'Data of Tilt Link HR H defined correctly. defDatiTLHRH function started'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/Tilt/defDatiThL.m b/Tilt/defDatiThL.m new file mode 100755 index 0000000..ff22a90 --- /dev/null +++ b/Tilt/defDatiThL.m @@ -0,0 +1,37 @@ +% Funzione che definisce accelerazioni, dati magnetici, temperature, date e +% livello della batteria per i nodi di tipo Therm Link +function [TimeThL,val_ThL,ErrThermLink] = defDatiThL(DatiThermLink,ErrThermLink,rThL,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiThL function started'; +fprintf(fileID,fmt,text); + +[r,c]=size(DatiThermLink); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 1:c + check = isnan(DatiThermLink(a,b)); + if check == 1 + DatiThermLink(a,b) = DatiThermLink(a-1,b); + ErrThermLink(a,b-1) = 1; + Ncorr = Ncorr+1; + end + end +end + +text = [num2str(Ncorr) ' NaN of Therm Link corrected by defDatiThL function']; +fprintf(fileID,fmt,text); + +TimeThL = DatiThermLink(:,1); % data +val_ThL = zeros(r,rThL); % dati temperatura +for i = 1:rThL + val_ThL(:,i) = DatiThermLink(:,1+i); +end + +text = 'Data of Therm Link defined correctly. defDatiThL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/Tilt/defDatiWL.m b/Tilt/defDatiWL.m new file mode 100755 index 0000000..a125759 --- /dev/null +++ b/Tilt/defDatiWL.m @@ -0,0 +1,35 @@ +% Funzione che definisce accelerazioni, dati magnetici, temperature, date e +% livello della batteria per i nodi di tipo Weir Link +function [TimeWL,lev_WL,temp_WL,ErrWeirLink] = defDatiWL(DatiWeirLink,... + DatiNTCWeirLink,ErrWeirLink,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'defDatiWL function started'; +fprintf(fileID,fmt,text); + +[r,c] = size(DatiWeirLink); +Ncorr = 0; +% Elimino gli eventuali Not a Number +for a = 2:r + for b = 1:c + check = isnan(DatiWeirLink(a,b)); + if check == 1 + DatiWeirLink(a,b) = DatiWeirLink(a-1,b); + ErrWeirLink(a,b-1) = 1; + Ncorr = Ncorr+1; + end + end +end +text = [num2str(Ncorr) ' NaN of Weir Link corrected by defDatiWL function']; +fprintf(fileID,fmt,text); + +TimeWL = DatiWeirLink(:,1); % data +lev_WL = DatiWeirLink(:,2:end); +temp_WL = DatiNTCWeirLink(:,2:end); + +text = 'Data of Weir Link defined correctly, defDatiWL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/Tilt/filtro.m b/Tilt/filtro.m new file mode 100755 index 0000000..8427048 --- /dev/null +++ b/Tilt/filtro.m @@ -0,0 +1,92 @@ +% Filtro che considera 2 deviazioni standard in una finestra centrata di +% due settimane (una in avanti e una all'indietro) e mette a zero lo +% spsotamento se è inferiore a tale valore +% E' previsto un secondo filtro forfettario se lo spostamento è minore di +% un determinato valore + +function [dNS,dEO,dZ] = filtro(dNS,dEO,dZ,Ndevst,Wdevst,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'filtro function started'; +fprintf(fileID,fmt,text); + +dNS = dNS'; +dEO = dEO'; +dZ = dZ'; +calcoloNS = dNS; +calcoloEO = dEO; +calcoloZ = dZ; +[r,c]=size(dNS); % riga date, colonna nodi +filtroNS = zeros(r,c); +filtroEO = zeros(r,c); +filtroZ = zeros(r,c); +finestra = Wdevst; +N_dev_st = Ndevst; +contN = 0; +contE = 0; +contZ = 0; + +for j = 1:c % nodi + for i = 1:r + if r <= finestra/2 - 0.5 + varNS = 0; + varEO = 0; + varZ = 0; + else + if i <= finestra/2 - 0.5 + varNS = calcoloNS(1:i+(finestra/2-0.5),j); + varEO = calcoloEO(1:i+(finestra/2-0.5),j); + varZ = calcoloZ(1:i+(finestra/2-0.5),j); + elseif i >= (finestra/2+0.5) && i <= (r-(finestra/2-0.5)) + varNS = calcoloNS((i-(finestra/2-0.5)):(i+(finestra/2-0.5)),j); + varEO = calcoloEO((i-(finestra/2-0.5)):(i+(finestra/2-0.5)),j); + varZ = calcoloZ((i-(finestra/2-0.5)):(i+(finestra/2-0.5)),j); + elseif i > (r-(finestra/2-0.5)) + varNS = calcoloNS((i-(finestra/2-0.5):r),j); + varEO = calcoloEO((i-(finestra/2-0.5):r),j); + varZ = calcoloZ((i-(finestra/2-0.5):r),j); + end + end + % Nord Sud + filtroNS(i,j) = N_dev_st*std(varNS); + if abs(dNS(i,j)) <= filtroNS(i,j) + if abs(dNS(i,j)) ~= 0 + contN = contN+1; + end + dNS(i,j) = 0; + end + % Est Ovest + filtroEO(i,j) = N_dev_st*std(varEO); + if abs(dEO(i,j)) <= filtroEO(i,j) + if abs(dEO(i,j)) ~= 0 + contE = contE+1; + end + dEO(i,j) = 0; + end + % Z + filtroZ(i,j) = N_dev_st*std(varZ); + if abs(dZ(i,j)) <= filtroZ(i,j) + if abs(dZ(i,j)) ~= 0 + contZ = contZ+1; + end + dZ(i,j) = 0; + end + end +end + +dNS = dNS'; +dEO = dEO'; +dZ = dZ'; + +textN = [num2str(contN) ' data filtered along North-South direction']; +textE = [num2str(contE) ' data filtered along East-West direction']; +textD = [num2str(contZ) ' data filtered along Down direction']; +fprintf(fileID,fmt,textN); +fprintf(fileID,fmt,textE); +fprintf(fileID,fmt,textD); +text = 'filtro function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/filtro_TLH.m b/Tilt/filtro_TLH.m new file mode 100755 index 0000000..16a3bd2 --- /dev/null +++ b/Tilt/filtro_TLH.m @@ -0,0 +1,92 @@ +% Filtro che considera 2 deviazioni standard in una finestra centrata di +% due settimane (una in avanti e una all'indietro) e mette a zero lo +% spsotamento se è inferiore a tale valore +% E' previsto un secondo filtro forfettario se lo spostamento è minore di +% un determinato valore + +function [dX_TLH,dY_TLH,dZ_TLH] = filtro_TLH(dX_TLH,dY_TLH,dZ_TLH,Ndevst,Wdevst,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'filtro_TLH function started'; +fprintf(fileID,fmt,text); + +dX_TLH = dX_TLH'; +dY_TLH = dY_TLH'; +dZ_TLH = dZ_TLH'; +calcoloX = dX_TLH; +calcoloY = dY_TLH; +calcoloZ = dZ_TLH; +[r,c]=size(dY_TLH); % riga date, colonna nodi +filtroX = zeros(r,c); +filtroY = zeros(r,c); +filtroZ = zeros(r,c); +finestra = Wdevst; +N_dev_st = Ndevst; +contX = 0; +contY = 0; +contZ = 0; + +for j = 1:c % nodi + for i = 1:r + if r <= finestra/2 - 0.5 + varX = 0; + varY = 0; + varZ = 0; + else + if i <= finestra/2 - 0.5 + varX = calcoloX(1:i+(finestra/2-0.5),j); + varY = calcoloY(1:i+(finestra/2-0.5),j); + varZ = calcoloZ(1:i+(finestra/2-0.5),j); + elseif i >= (finestra/2+0.5) && i <= (r-(finestra/2-0.5)) + varX = calcoloX((i-(finestra/2-0.5)):(i+(finestra/2-0.5)),j); + varY = calcoloY((i-(finestra/2-0.5)):(i+(finestra/2-0.5)),j); + varZ = calcoloZ((i-(finestra/2-0.5)):(i+(finestra/2-0.5)),j); + elseif i > (r-(finestra/2-0.5)) + varX = calcoloX((i-(finestra/2-0.5):r),j); + varY = calcoloY((i-(finestra/2-0.5):r),j); + varZ = calcoloZ((i-(finestra/2-0.5):r),j); + end + end + % X + filtroX(i,j) = N_dev_st*std(varX); + if abs(dX_TLH(i,j)) <= filtroX(i,j) + if abs(dX_TLH(i,j)) ~= 0 + contX = contX+1; + end + dX_TLH(i,j) = 0; + end + % Y + filtroY(i,j) = N_dev_st*std(varY); + if abs(dY_TLH(i,j)) <= filtroY(i,j) + if abs(dY_TLH(i,j)) ~= 0 + contY = contY+1; + end + dY_TLH(i,j) = 0; + end + % Z + filtroZ(i,j) = N_dev_st*std(varZ); + if abs(dZ_TLH(i,j)) <= filtroZ(i,j) + if abs(dZ_TLH(i,j)) ~= 0 + contZ = contZ+1; + end + dZ_TLH(i,j) = 0; + end + end +end + +dX_TLH = dX_TLH'; +dY_TLH = dY_TLH'; +dZ_TLH = dZ_TLH'; + +textX = [num2str(contX) ' data filtered along X direction']; +textY = [num2str(contY) ' data filtered along Y direction']; +textD = [num2str(contZ) ' data filtered along Vertical direction']; +fprintf(fileID,fmt,textX); +fprintf(fileID,fmt,textY); +fprintf(fileID,fmt,textD); +text = 'filtro_TLH function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/fqa.m b/Tilt/fqa.m new file mode 100755 index 0000000..b63af48 --- /dev/null +++ b/Tilt/fqa.m @@ -0,0 +1,107 @@ +function [q, error, flag] = fqa(VaN,VmN) +% a is 3x1, m is 3x1 + +% Xiaoping Yun, May 7, 2008 +% input a = 3-dim acceleration, m=3-dim local magnetic measurement + +%Mref = [0.4943 0.0 0.8693]; + +epsilon = 0.10; % accuracy control constant +alpha = 30*pi/180; % offset angle + +% x is 3x2, first col = magnetometer, second col = accelerometer. + +a_bar = VaN; +m_bar = VmN; +% a_bar = VaN/norm(VaN); % make sure that it is normalized +% m_b = VmN/norm(VmN); + +sin_th = a_bar(1); +cos_th = sqrt(1-sin_th^2); + +% singularity avoidance algorithm +if (cos_th <= epsilon) + singular_flag = 1; + q_offset =cos(alpha/2)*[1 0 0 0]' + sin(alpha/2)*[0 0 1 0]'; + + a_bar_q = [0; a_bar]; + m_bar_q = [0; m_bar]; + a_q_offset = rotate_v_by_q(a_bar_q,q_offset); + m_q_offset = rotate_v_by_q(m_bar_q,q_offset); + + a_bar = a_q_offset(2:4); + m_bar = m_q_offset(2:4); + +else + % do not do anything other than setting the flag. + singular_flag = 0; +end + +%% elevation quaternion +sin_th = a_bar(1);%h(1); +%cos_th = sqrt(1-sin_th^2); +cos_th = sqrt(a_bar(2)^2 + a_bar(3)^2); %J.C. 1/30/2009 + +% computing half-angle values +cos_half_th=sqrt((1+cos_th)/2); +if (cos_th<=-1) % this "if" is needed since sign(0) = 0. + sin_half_th = 1; +else + sin_half_th=sign(sin_th)*sqrt((1-cos_th)/2); +end + +qe = cos_half_th*[1;0;0;0] + sin_half_th*[0;0;1;0]; + +%% Roll Quaternion +b = [a_bar(2) a_bar(3)]; +c = b/norm(b); +sin_phi = -c(1); +cos_phi = -c(2); + +cos_half_phi=sqrt((1+cos_phi)/2); +if (cos_phi<=-1) + sin_half_phi = 1; +else + sin_half_phi=sign(sin_phi)*sqrt((1-cos_phi)/2); +end + +qr = cos_half_phi*[1;0;0;0] + sin_half_phi*[0;1;0;0]; + +%% Azimuth Quaternion +m_bar_q = [0; m_bar]; + +q_er = q_mult2(qe,qr); +q_er_inv =[q_er(1); -q_er(2); -q_er(3); -q_er(4)]; +m_e = q_mult2(q_er,q_mult2(m_bar_q, q_er_inv)); + +M = [m_e(2),m_e(3)]; +M = M/norm(M); +N = [1; 0]; +tmp = [ M(1) M(2); + -M(2) M(1)]*N; +cos_psi = tmp(1); +sin_psi = tmp(2); + +cos_half_psi=sqrt((1+cos_psi)/2); +if (cos_psi<=-1) %%%% IMPORTANT %%% if it is written as cos_psi==-1, it does not work. + %%%% cos_psi is potentially less than -1. + sin_half_psi = 1; +else + sin_half_psi=sign(sin_psi)*sqrt((1-cos_psi)/2); +end + +qa = cos_half_psi*[1;0;0;0]+ sin_half_psi*[0;0;0;1]; + +q_tmp1 = q_mult2(qe,qr); +q_tmp = q_mult2(qa,q_tmp1); + +if (singular_flag == 1) + q = q_mult2(q_tmp, q_offset); +else + q = q_tmp; +end + +error = cos_th; +flag = singular_flag; + +end \ No newline at end of file diff --git a/Tilt/info_Sito.m b/Tilt/info_Sito.m new file mode 100755 index 0000000..73bbdb5 --- /dev/null +++ b/Tilt/info_Sito.m @@ -0,0 +1,665 @@ +function [arraysito,arraysitoENG,controlsito,yesTL,yesTLHR,yesTLH,yesTLHRH,yesPL,yesBL,yesLL,... + yesRL,yesKL,yesKLHR,yesThL,yesPT100,yesIPL,yesIPLHR,yesTuL,yesRaL,yesPCL,yesPCLHR,... + yesPrL,yesEL,yes3DEL,yesWEL,yesMPBEL,yesCrL,yes3DCrL,yesBML,yesHL,... + yesLuxL,yesCO2,yesRSN,yesRSNHR,yesTrL,yesSM,yes2DCrL,yesPE,yesWL,yesGF,yesGS,... + rTL,rTLHR,rTLH,rTLHRH,rPL,rBL,rLL,rRL,rKL,rKLHR,rThL,rPT100,rIPL,rIPLHR,rTuL,rRaL,... + rPCL,rPCLHR,rPrL,rEL,r3DEL,rWEL,rMPBEL,rCrL,r3DCrL,rBML,rHL,rLuxL,rCO2,rRSN,rRSNHR,... + rTrL,rSM,r2DCrL,rPE,rWL,rGF,rGS,nCT,... + NodoTiltLink,NodoTiltLinkHR,NodoTiltLinkH,NodoTiltLinkHRH,NodoPiezoLink,NodoBaroLink,... + NodoLoadLink,NodoRainLink,NodoKlinoLink,NodoKlinoLinkHR,NodoThermLink,NodoPT100Link,... + NodoInPlaceLink,NodoInPlaceLinkHR,NodoTunnelLink,NodoRadialLink,NodoPreConvLink,... + NodoPreConvLinkHR,NodoPressureLink,NodoExtensometerLink,Nodo3DExtensometerLink,... + NodoWireExtensometerLink,NodoMultiPointExtensometerLink,NodoCrackLink,Nodo3DCrackLink,... + NodoBaroMusaLink,NodoHumidityLink,NodoLuxLink,NodoCO2Link,NodoRSNLink,NodoRSNHRLink,... + NodoTriggerLink,NodoStressMeter,Nodo2DCrackLink,NodoPendulum,NodoWeirLink,NodoGflowLink,... + NodoGshockLink,tipoarray,tipoalarms,nVMS,nTL,nCAM,nAL] = info_Sito(chainID,alarms,... + Chain_Scheme,conn,num_nodi,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'info_Sito function started'; +fprintf(fileID,fmt,text); + +%% Conto gli Array + +% identifico la tipologia di array +[dev,~] = size(chainID); % Numero di Array +tipoarray = cell(dev,1); +for d = 1:dev + comando = ['select type from tools where unit_id = ''' num2str(cell2mat(chainID(d,1)))... + ''' and id = ''' num2str(cell2mat(chainID(d,3))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + tipoarray(d,1) = curs.Data; +end + +% Scarico l'allarme relativo al sito +[ctrl,ctrl2] = size(alarms); % Numero di Control Tools +tipoalarms = cell(ctrl,1); +if ctrl2 ~= 1 + for c = 1:ctrl + comando = ['select type from ctrltypes where id = ''' num2str(cell2mat(alarms(c,3))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + tipoalarms(c,1) = curs.Data; + end + evita = 0; +else + evita = 1; +end + +[rA,~] = size(tipoarray); +[rC,~] = size(tipoalarms); +% conto quanti array ci sono per ciascuna tipologia +nVA = 0; % Vertical Array +nHA = 0; % Horizontal Array +nPZA = 0; % Piezo Array +nTA = 0; % Therm Array +nVAS = 0; % Vertical Array Structure +nIPA = 0; % In Place Array +nKA = 0; % Klino Array +nCA = 0; % Cir Array +nRA = 0; % Rad Array +nPCA = 0; % PreConv Array +nRSN = 0; % RockFall Safety Network +nMUSA = 0; % Musa System +nAA = 0; % Analog Array +nTS = 0; % Trigger System +nVMS = 0; % Variable Message System +nTL = 0; % Traffic Lights +nAL = 0; % Alarms +nCAM = 0; % Camera +nP = 0; % Pluviometro +nDFSN = 0; % Debris Flow Safety Network + +for a = 1:rA + if strcmp(tipoarray(a),'Cir Array') + nCA = nCA+1; + elseif strcmp(tipoarray(a),'Rad Array') + nRA = nRA+1; + elseif strcmp(tipoarray(a),'PreConv Array') + nPCA = nPCA+1; + elseif strcmp(tipoarray(a),'Vertical Array') + nVA = nVA+1; + elseif strcmp(tipoarray(a),'Horizontal Array') + nHA = nHA+1; + elseif strcmp(tipoarray(a),'Piezo Array') + nPZA = nPZA+1; + elseif strcmp(tipoarray(a),'Pluviometro') + nP = nP+1; + elseif strcmp(tipoarray(a),'Therm Array') + nTA = nTA+1; + elseif strcmp(tipoarray(a),'Rockfall Safety Network') + nRSN = nRSN+1; + elseif strcmp(tipoarray(a),'Debris Flow Safety Network') + nDFSN = nDFSN+1; + elseif strcmp(tipoarray(a),'Vertical Array Structure') + nVAS = nVAS+1; + elseif strcmp(tipoarray(a),'In Place Array') + nIPA = nIPA+1; + elseif strcmp(tipoarray(a),'MUSA') + nMUSA = nMUSA+1; + elseif strcmp(tipoarray(a),'Klino Array') + nKA = nKA+1; + elseif strcmp(tipoarray(a),'Analog Array') + nAA = nAA+1; + elseif strcmp(tipoarray(a),'Trigger System') + nTS = nTS+1; + end +end +for a = 1:rC + if strcmp(tipoalarms(a),'VMS') + nVMS = nVMS+1; + elseif strcmp(tipoalarms(a),'Traffic Lights') + nTL = nTL+1; + elseif strcmp(tipoalarms(a),'Alarms') + nAL = nAL+1; + elseif strcmp(tipoalarms(a),'Camera') + nCAM = nCAM+1; + end +end + +% Conto le tipologie di Array +indice = 1; +if nCA > 0 + contarray{indice,1} = [num2str(nCA) ' Cir Array']; + if nCA == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nCA) ' Cir Arrays']; + end + indice = indice +1; +end +if nRA > 0 + contarray{indice,1} = [num2str(nRA) ' Rad Array']; + if nRA == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nRA) ' Rad Arrays']; + end + indice = indice +1; +end +if nPCA > 0 + contarray{indice,1} = [num2str(nPCA) ' PreConv Array']; + if nPCA == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nPCA) ' PreConv Arrays']; + end + indice = indice +1; +end +if nVA > 0 + contarray{indice,1} = [num2str(nVA) ' Vertical Array']; + if nVA == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nVA) ' Vertical Arrays']; + end + indice = indice +1; +end +if nHA > 0 + contarray{indice,1} = [num2str(nHA) ' Horizontal Array']; + if nHA == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nHA) ' Horizontal Arrays']; + end + indice = indice +1; +end +if nPZA > 0 + contarray{indice,1} = [num2str(nPZA) ' Piezo Array']; + if nPZA == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nPZA) ' Piezo Arrays']; + end + indice = indice +1; +end +if nP > 0 + contarray{indice,1} = [num2str(nP) ' Pluviometro']; + if nP == 1 + contarrayENG{indice,1} = [num2str(nP) ' Rain Gauge']; + else + contarrayENG{indice,1} = [num2str(nP) ' Rain Gauges']; + end + indice = indice +1; +end +if nTA > 0 + contarray{indice,1} = [num2str(nTA) ' Therm Array']; + if nTA == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nTA) ' Therm Arrays']; + end + indice = indice +1; +end +if nRSN > 0 + contarray{indice,1} = [num2str(nRSN) ' RockFall Safety Network']; + if nRSN == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nRSN) ' RockFall Safety Networks']; + end + indice = indice +1; +end +if nDFSN > 0 + contarray{indice,1} = [num2str(DFRSN) ' Debris Flow Safety Network']; + if nDFSN == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nDFSN) ' Debris Flow Safety Networks']; + end + indice = indice +1; +end +if nVAS > 0 + contarray{indice,1} = [num2str(nVAS) ' Vertical Array Structure']; + if nVAS == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nVAS) ' Vertical Arrays Structure']; + end + indice = indice +1; +end +if nIPA > 0 + contarray{indice,1} = [num2str(nIPA) ' In Place Array']; + if nIPA == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nIPA) ' In Place Arrays']; + end + indice = indice +1; +end +if nMUSA > 0 + contarray{indice,1} = [num2str(nMUSA) ' MUSA']; + if nMUSA == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nMUSA) ' MUSAs']; + end + indice = indice +1; +end +if nKA > 0 + contarray{indice,1} = [num2str(nKA) ' Klino Array']; + if nKA == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nKA) ' Klino Arrays']; + end + indice = indice +1; +end +if nAA > 0 + contarray{indice,1} = [num2str(nAA) ' Analog Array']; + if nAA == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nAA) ' Analog Arrays']; + end + indice = indice +1; +end +if nTS > 0 + contarray{indice,1} = [num2str(nTS) ' Trigger System']; + if nTS == 1 + contarrayENG{indice,1} = contarray{indice,1}; + else + contarrayENG{indice,1} = [num2str(nTS) ' Trigger Systems']; + end +end +arraysito = strjoin(contarray, ', '); +arraysitoENG = strjoin(contarrayENG, ', '); + +if evita == 0 + % Conto le tipologie di Control Tools + indice_bis = 1; + if nVMS > 0 + conttools{indice_bis,1} = [num2str(nVMS) ' Variable Message System']; + indice_bis = indice_bis +1; + end + if nTL > 0 + conttools{indice_bis,1} = [num2str(nTL) ' Traffic Lights']; + indice_bis = indice_bis +1; + end + if nAL > 0 + conttools{indice_bis,1} = [num2str(nAL) ' Alarms']; + indice_bis = indice_bis +1; + end + if nCAM > 0 + conttools{indice_bis,1} = [num2str(nCAM) ' Camera']; + end + controlsito = strjoin(conttools, ', '); + nCT = nVMS+nTL+nAL+nCAM; +else + controlsito = 0; + nCT = 0; +end + +%% Stabilisco se è presente o meno un sensore ed il numero di sensori per ogni tipologia +[col,~] = size(chainID); % Numero di Array +% Per ogni tipologia di nodo, riconosco se è presente o meno nella catena +yesTL = zeros(col,1); % Tilt Link V +yesTLHR = zeros(col,1); % Tilt Link HR V +yesTLH = zeros(col,1); % Tilt Link H +yesTLHRH = zeros(col,1); % Tilt Link HR H +yesPL = zeros(col,1); % Piezo Link +yesBL = zeros(col,1); % Baro Link +yesLL = zeros(col,1); % Load Link +yesRL = zeros(col,1); % Rain Link +yesKL = zeros(col,1); % Klino Link +yesKLHR = zeros(col,1); % Klino Link HR +yesThL = zeros(col,1); % Therm Link +yesPT100 = zeros(col,1); % PT100 link +yesIPL = zeros(col,1); % In Place Link +yesIPLHR = zeros(col,1); % In Place Link HR +yesTuL = zeros(col,1); % Tunnel Link +yesRaL = zeros(col,1); % Radial Link +yesPCL = zeros(col,1); % Preconv Link +yesPCLHR = zeros(col,1); % Preconv Link HR +yesPrL = zeros(col,1); % Pressure Link +yesEL = zeros(col,1); % Extensometer Link +yes3DEL = zeros(col,1); % 3D Extensometer Link +yesWEL = zeros(col,1); % Wire Extensometer Link +yesMPBEL = zeros(col,1); % Multi Point BoreHole Extensometer Link +yesCrL = zeros(col,1); % Crack Link +yes2DCrL = zeros(col,1); % 2D Crack Link +yes3DCrL = zeros(col,1); % 3D Crack Link +yesBML = zeros(col,1); % Baro Musa Link +yesHL = zeros(col,1); % Humidity link +yesLuxL = zeros(col,1); % Lux link +yesCO2 = zeros (col,1); % CO2 Link +yesRSN = zeros (col,1); % RSN Link +yesRSNHR = zeros (col,1); % RSN Link HR +yesTrL = zeros (col,1); % Trigger Link +yesSM = zeros (col,1); % Stress Meter +yesPE = zeros(col,1); % Pendulum +yesWL = zeros(col,1); % Weir Link +yesGF = zeros(col,1); % G-Flow Link +yesGS = zeros(col,1); % G-Shock Link + +% Numero di nodi per catena +rTL = zeros(col,1); +rTLHR = zeros(col,1); +rTLH = zeros(col,1); +rTLHRH = zeros(col,1); +rPL = zeros(col,1); +rBL = zeros(col,1); +rLL = zeros(col,1); +rRL = zeros(col,1); +rKL = zeros(col,1); +rKLHR = zeros(col,1); +rThL = zeros(col,1); +rPT100 = zeros(col,1); +rIPL = zeros(col,1); +rIPLHR = zeros(col,1); +rTuL = zeros(col,1); +rRaL = zeros(col,1); +rPCL = zeros(col,1); +rPCLHR = zeros(col,1); +rPrL = zeros(col,1); +rEL = zeros(col,1); +r3DEL = zeros(col,1); +rWEL = zeros(col,1); +rMPBEL = zeros(col,1); +rCrL = zeros(col,1); +r3DCrL = zeros(col,1); +rBML = zeros(col,1); +rHL = zeros(col,1); +rLuxL = zeros(col,1); +rCO2 = zeros(col,1); +rRSN = zeros(col,1); +rRSNHR = zeros(col,1); +rTrL = zeros(col,1); +rSM = zeros(col,1); +r2DCrL = zeros(col,1); +rPE = zeros(col,1); +rWL = zeros(col,1); +rGF = zeros(col,1); +rGS = zeros(col,1); + +indice = 1; +[rCS,cCS] = size(Chain_Scheme); +for ii = 1:rCS + for jj = 1:cCS + if isempty(cell2mat(Chain_Scheme(ii,jj))) == 1 + Chain_Scheme{ii,jj} = 0; + end + end +end +Chain_Scheme = cell2mat(Chain_Scheme); +NodoTiltLink = []; +NodoTiltLinkHR = []; +NodoTiltLinkH = []; +NodoTiltLinkHRH = []; +NodoPiezoLink = []; +NodoBaroLink = []; +NodoLoadLink = []; +NodoRainLink = []; +NodoKlinoLink = []; +NodoKlinoLinkHR = []; +NodoThermLink = []; +NodoPT100Link = []; +NodoInPlaceLink = []; +NodoInPlaceLinkHR = []; +NodoTunnelLink = []; +NodoRadialLink = []; +NodoPreConvLink = []; +NodoPreConvLinkHR = []; +NodoPressureLink = []; +NodoExtensometerLink = []; +Nodo3DExtensometerLink = []; +NodoWireExtensometerLink = []; +NodoMultiPointExtensometerLink = []; +NodoCrackLink = []; +Nodo3DCrackLink = []; +NodoBaroMusaLink = []; +NodoHumidityLink = []; +NodoLuxLink = []; +NodoCO2Link = []; +NodoRSNLink = []; +NodoRSNHRLink = []; +NodoTriggerLink = []; +NodoStressMeter = []; +Nodo2DCrackLink = []; +NodoPendulum = []; +NodoWeirLink = []; +NodoGflowLink = []; +NodoGshockLink = []; +for a = 1:col % Array + nTL = 1; + nTLHR = 1; + nTLH = 1; + nTLHRH = 1; + nPL = 1; + nBL = 1; + nLL = 1; + nRL = 1; + nKL = 1; + nKLHR = 1; + nThL = 1; + nPT100 = 1; + nIPL = 1; + nIPLHR = 1; + nTuL = 1; + nRaL = 1; + nPCL = 1; + nPCLHR = 1; + nPrL = 1; + nEL = 1; + n3DEL = 1; + nWEL = 1; + nMPBEL = 1; + nCrL = 1; + n3DCrL = 1; + nBML = 1; + nHL = 1; + nLuxL = 1; + nCO2 = 1; + nRSN = 1; + nRSNHR = 1; + nTrL = 1; + nSM = 1; + n2DCrL = 1; + nPenL = 1; + nWL =1; + nGF = 1; + nGS = 1; + + for b = 1:num_nodi(a) % Numero di nodi dell'Array + if Chain_Scheme(b,indice) == 1 % Tilt Link V + yesTL(a) = 1; + NodoTiltLink(nTL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nTL = nTL+1; + elseif Chain_Scheme(b,indice) == 5 % Tilt Link HR V + yesTLHR(a) = 1; + NodoTiltLinkHR(nTLHR,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nTLHR = nTLHR+1; + elseif Chain_Scheme(b,indice) == 11 % Tilt Link H + yesTLH(a) = 1; + NodoTiltLinkH(nTLH,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nTLH = nTLH+1; + elseif Chain_Scheme(b,indice) == 12 % Tilt Link HR H + yesTLHRH(a) = 1; + NodoTiltLinkHRH(nTLHRH,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nTLHRH = nTLHRH+1; + elseif Chain_Scheme(b,indice) == 2 % Piezo Link + yesPL(a) = 1; + NodoPiezoLink(nPL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nPL = nPL+1; + elseif Chain_Scheme(b,indice) == 3 % Baro Link + yesBL(a) = 1; + NodoBaroLink(nBL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nBL = nBL+1; + elseif Chain_Scheme(b,indice) == 15 % Load Link + yesLL(a) = 1; + NodoLoadLink(nLL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nLL = nLL+1; + elseif Chain_Scheme(b,indice) == 27 % Rain Link + yesRL(a) = 1; + NodoRainLink(nRL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nRL = nRL+1; + elseif Chain_Scheme(b,indice) == 26 % Klino Link + yesKL(a) = 1; + NodoKlinoLink(nKL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nKL = nKL+1; + elseif Chain_Scheme(b,indice) == 44 % Klino Link HR + yesKLHR(a) = 1; + NodoKlinoLinkHR(nKLHR,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nKLHR = nKLHR+1; + elseif Chain_Scheme(b,indice) == 4 % Therm Link + yesThL(a) = 1; + NodoThermLink(nThL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nThL = nThL+1; + elseif Chain_Scheme(b,indice) == 28 % PT100 Link + yesPT100(a) = 1; + NodoPT100Link(nPT100,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nPT100 = nPT100+1; + elseif Chain_Scheme(b,indice) == 42 % In Place Link + yesIPL(a) = 1; + NodoInPlaceLink(nIPL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nIPL = nIPL+1; + elseif Chain_Scheme(b,indice) == 43 % In Place Link HR + yesIPLHR(a) = 1; + NodoInPlaceLinkHR(nIPLHR,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nIPLHR = nIPLHR+1; + elseif Chain_Scheme(b,indice) == 17 % Tunnel Link + yesTuL(a) = 1; + NodoTunnelLink(nTuL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nTuL = nTuL+1; + elseif Chain_Scheme(b,indice) == 18 % Radial Link + yesRaL(a) = 1; + NodoRadialLink(nRaL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nRaL = nRaL+1; + elseif Chain_Scheme(b,indice) == 23 % PreConv Link + yesPCL(a) = 1; + NodoPreConvLink(nPCL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nPCL = nPCL+1; + elseif Chain_Scheme(b,indice) == 24 % PreConv Link HR + yesPCLHR(a) = 1; + NodoPreConvLinkHR(nPCLHR,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nPCLHR = nPCLHR+1; + elseif Chain_Scheme(b,indice) == 21 % Pressure Link + yesPrL(a) = 1; + NodoPressureLink(nPrL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nPrL = nPrL+1; + elseif Chain_Scheme(b,indice) == 16 % Extensometer Link + yesEL(a) = 1; + NodoExtensometerLink(nEL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nEL = nEL+1; + elseif Chain_Scheme(b,indice) == 19 % 3D Extensometer Link + yes3DEL(a) = 1; + Nodo3DExtensometerLink(n3DEL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + n3DEL = n3DEL+1; + elseif Chain_Scheme(b,indice) == 22 % Wire Extensometer Link + yesWEL(a) = 1; + NodoWireExtensometerLink(nWEL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nWEL = nWEL+1; + elseif Chain_Scheme(b,indice) == 25 % Multi Point Borehole Extensometer Link + yesMPBEL(a) = 1; + NodoMultiPointExtensometerLink(nMPBEL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nMPBEL = nMPBEL+1; + elseif Chain_Scheme(b,indice) == 36 % Crack Link + yesCrL(a) = 1; + NodoCrackLink(nCrL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nCrL = nCrL+1; + elseif Chain_Scheme(b,indice) == 37 % 3D Crack Link + yes3DCrL(a) = 1; + Nodo3DCrackLink(n3DCrL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + n3DCrL = n3DCrL+1; + elseif Chain_Scheme(b,indice) == 41 % Baro Musa Link + yesBML(a) = 1; + NodoBaroMusaLink(nBML,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nBML = nBML+1; + elseif Chain_Scheme(b,indice) == 35 % Humidity Link + yesHL(a) = 1; + NodoHumidityLink(nHL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nHL = nHL+1; + elseif Chain_Scheme(b,indice) == 34 % Lux Link + yesLuxL(a) = 1; + NodoLuxLink(nLuxL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nLuxL = nLuxL+1; + elseif Chain_Scheme(b,indice) == 33 % CO2 Link + yesCO2(a) = 1; + NodoCO2Link(nCO2,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nCO2 = nCO2+1; + elseif Chain_Scheme(b,indice) == 38 % RSN Link + yesRSN(a) = 1; + NodoRSNLink(nRSN,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nRSN = nRSN+1; + elseif Chain_Scheme(b,indice) == 39 % RSN Link HR + yesRSNHR(a) = 1; + NodoRSNHRLink(nRSNHR,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nRSNHR = nRSNHR+1; + elseif Chain_Scheme(b,indice) == 40 % Trigger Link + yesTrL(a) = 1; + NodoTriggerLink(nTrL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nTrL = nTrL+1; + elseif Chain_Scheme(b,indice) == 47 % Stress Meter + yesSM(a) = 1; + NodoStressMeter(nSM,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nSM = nSM+1; + elseif Chain_Scheme(b,indice) == 51 % 2D Crack Link + yes2DCrL(a) = 1; + Nodo2DCrackLink(n2DCrL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + n2DCrL = n2DCrL+1; + elseif Chain_Scheme(b,indice) == 52 % Pendulum + yesPE(a) = 1; + NodoPendulum(nPenL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nPenL = nPenL+1; + elseif Chain_Scheme(b,indice) == 53 % Weir Link + yesWL(a) = 1; + NodoWeirLink(nWL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nWL = nWL+1; + elseif Chain_Scheme(b,indice) == 48 % G-Flow Link + yesGF(a) = 1; + NodoGflowLink(nWL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nGF = nGF+1; + elseif Chain_Scheme(b,indice) == 50 % G-Shock Link + yesGS(a) = 1; + NodoGshockLink(nWL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nGS = nGS+1; + end + end + indice = indice+3; + rTL(a) = nTL-1; + rTLHR(a) = nTLHR-1; + rTLH(a) = nTLH-1; + rTLHRH(a) = nTLHRH-1; + rPL(a) = nPL-1; + rBL(a) = nBL-1; + rLL(a) = nLL-1; + rRL(a) = nRL-1; + rKL(a) = nKL-1; + rKLHR(a) = nKLHR-1; + rThL(a) = nThL-1; + rPT100(a) = nPT100-1; + rIPL(a) = nIPL-1; + rIPLHR(a) = nIPLHR-1; + rTuL(a) = nTuL-1; + rRaL(a) = nRaL-1; + rPCL(a) = nPCL-1; + rPCLHR(a) = nPCLHR-1; + rPrL(a) = nPrL-1; + rEL(a) = nEL-1; + r3DEL(a) = n3DEL-1; + rWEL(a) = nWEL-1; + rMPBEL(a) = nMPBEL-1; + rCrL(a) = nCrL-1; + r3DCrL(a) = n3DCrL-1; + rBML(a) = nBML-1; + rHL(a) = nHL-1; + rLuxL(a) = nLuxL-1; + rCO2(a) = nCO2-1; + rRSN(a) = nRSN-1; + rRSNHR(a) = nRSNHR-1; + rTrL(a) = nTrL-1; + rSM(a) = nSM-1; + r2DCrL(a) = n2DCrL-1; + rPE(a) = nPenL-1; + rWL(a) = nWL-1; + rGF(a) = nGF-1; + rGS(a) = nGS-1; +end + +text = 'info_Sito function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/lettura.m b/Tilt/lettura.m new file mode 100755 index 0000000..8ccceac --- /dev/null +++ b/Tilt/lettura.m @@ -0,0 +1,8583 @@ + % Questa funzione legge i dati di ogni tipologia di nodo (se presente) + +function [Batteria,Batteria_LoRa,DatiTiltLink,ErrTiltLink,datainiTL,yesTL,... + DatiTiltLinkHD,ErrTiltLinkHD,datainiHD,yesHD,DatiTiltLinkHDVR,ErrTiltLinkHDVR,datainiHDVR,yesHDVR,... + DatiTiltLinkH,ErrTiltLinkH,datainiTLH,yesTLH,DatiPiezoLink,ErrPiezoLink,yesPL,DatiBaroLink,ErrBaroLink,yesBL,... + DatiTiltLinkHR,ErrTiltLinkHR,datainiTLHR,yesTLHR,DatiTiltLinkHRH,ErrTiltLinkHRH,datainiTLHRH,yesTLHRH,... + DatiLoadLink,ErrLoadLink,yesLL,DatiThermLink,ErrThermLink,yesThL,DatiKlinoLink,ErrKlinoLink,yesKL,... + DatiKlinoLinkHR,ErrKlinoLinkHR,yesKLHR,DatiRainLink,ErrRainLink,datainiRL,yesRL,... + DatiSPPLink,datainiSPP,yesSPP,DatiSnowLink,ErrSnowLink,datainiSL,yesSL,... + DatiPT100Link,ErrPT100Link,yesPT100,DatiInPlaceLink,ErrInPlaceLink,datainiIPL,yesIPL,... + DatiInPlaceLinkHR,ErrInPlaceLinkHR,datainiIPLHR,yesIPLHR,DatiWeirLink,DatiNTCWeirLink,ErrWeirLink,datainiWL,yesWL,... + DatiPendulum,ErrPendulum,datainiPE,yesPE] = lettura(IDcentralina,DTcatena,datainiTL,tempoiniTL,NodoTiltLink,NuovoZeroTL,... + datainiHD,tempoiniHD,NodoTiltLinkHD,NuovoZeroHD,datainiHDVR,tempoiniHDVR,NodoTiltLinkHDVR,NuovoZeroHDVR,... + datainiTLH,tempoiniTLH,NodoTiltLinkH,NuovoZeroTLH,... + datainiPL,tempoiniPL,NodoPiezoLink,NuovoZeroPL,datainiBL,tempoiniBL,NodoBaroLink,NuovoZeroBL,... + datainiTLHR,tempoiniTLHR,NodoTiltLinkHR,NuovoZeroTLHR,... + datainiTLHRH,tempoiniTLHRH,NodoTiltLinkHRH,NuovoZeroTLHRH,datainiThL,tempoiniThL,NodoThermLink,NuovoZeroThL,... + datainiLL,tempoiniLL,NodoLoadLink,NuovoZeroLL,datainiKL,tempoiniKL,NodoKlinoLink,NuovoZeroKL,... + datainiKLHR,tempoiniKLHR,NodoKlinoLinkHR,NuovoZeroKLHR,datainiRL,tempoiniRL,NodoRainLink,NuovoZeroRL,... + datainiSPP,tempoiniSPP,NuovoZeroSPP,NodoSPPLink,datainiPT100,tempoiniPT100,NodoPT100Link,NuovoZeroPT100,... + datainiIPL,tempoiniIPL,NodoInPlaceLink,NuovoZeroIPL,datainiIPLHR,tempoiniIPLHR,NodoInPlaceLinkHR,NuovoZeroIPLHR,... + datainiWL,tempoiniWL,NodoWeirLink,NuovoZeroWL,datainiPE,tempoiniPE,NodoPendulum,NuovoZeroPE,... + datainiSL,tempoiniSL,NodoSnowLink,NuovoZeroSL,... + yesTL,yesTLH,yesTLHR,yesTLHRH,yesPL,yesBL,yesThL,yesKL,yesKLHR,yesRL,yesSPP,yesSL,... + yesPT100,yesLL,yesIPL,yesIPLHR,yesWL,yesPE,yesHD,yesHDVR,rTL,rTLH,rTLHR,rTLHRH,rPL,... + rBL,rThL,rKL,rKLHR,rRL,rSPP,rSL,rPT100,rLL,rIPL,rIPLHR,rWL,rPE,rHD,rHDVR,conn,Barometro,catena,date,time,FileName) + +% Log file +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'lettura function started'; +fprintf(fileID,fmt,text); + +%% Batteria +% cerco la batteria nel primo nodo +j = 1; +z = 0; +[rC,~] = size(catena); +while z==0 + if cell2mat(catena(j,3)) == 1 + z = 1; + else + j = j+1; % nodo numero 1 + end +end +condition = 0; +while condition == 0 + if j <= rC + i = cell2mat(catena(j,1)); + if i == 1 + dataini = datainiTL; + tempoini = tempoiniTL; + break + elseif i == 2 + dataini = datainiPL; + tempoini = tempoiniPL; + break + elseif i == 3 + dataini = datainiBL; + tempoini = tempoiniBL; + break + elseif i == 4 + dataini = datainiThL; + tempoini = tempoiniThL; + break + elseif i == 5 + dataini = datainiTLHR; + tempoini = tempoiniTLHR; + break + elseif i == 8 + dataini = datainiAL; + tempoini = tempoiniAL; + break + elseif i == 11 + dataini = datainiTLH; + tempoini = tempoiniTLH; + break + elseif i == 12 + dataini = datainiTLHRH; + tempoini = tempoiniTLHRH; + break + elseif i == 15 + dataini = datainiLL; + tempoini = tempoiniLL; + break + elseif i == 26 + dataini = datainiKL; + tempoini = tempoiniKL; + break + elseif i == 27 + dataini = datainiRL; + tempoini = tempoiniRL; + break + elseif i == 28 + dataini = datainiPT100; + tempoini = tempoiniPT100; + break + elseif i == 44 + dataini = datainiKLHR; + tempoini = tempoiniKLHR; + break + elseif i == 42 + dataini = datainiIPL; + tempoini = tempoiniIPL; + break + elseif i == 43 + dataini = datainiIPLHR; + tempoini = tempoiniIPLHR; + break + elseif i == 52 + dataini = datainiPE; + tempoini = tempoiniPE; + break + elseif i == 53 + dataini = datainiWL; + tempoini = tempoiniWL; + break + elseif i == 54 + dataini = datainiWI; + tempoini = tempoiniWI; + break + elseif i == 67 + dataini = datainiHD; + tempoini = tempoiniHD; + break + elseif i == 61 + dataini = datainiHDVR; + tempoini = tempoiniHDVR; + break + end + j = j+1; + else + break + end +end + +% Batteria Centralina +comando = ['select Date, Time, BatLevel from RawDataView where Date = ''' ... + dataini ''' and Time >= ''' tempoini ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum = 1 ']; +curs = exec(conn,comando); +curs = fetch(curs); +BatTempo = curs.Data; +comando = ['select Date, Time, BatLevel from RawDataView where Date > ''' ... + dataini ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum = 1 ']; +curs = exec(conn,comando); +curs = fetch(curs); +BatData = curs.Data; +if strcmp(char(BatData(1)),'No Data') + Batteria = BatTempo; +elseif strcmp(char(BatTempo(1)),'No Data') + Batteria = BatData; +else + Batteria = [BatTempo;BatData]; +end + +% Batteria LoRa +NodeNum = '1'; +comando = ['select Date, Time, BatLevelModule from RawDataView where Date = ''' ... + dataini ''' and Time >= ''' tempoini ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum = ''' NodeNum ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +BatTempo = curs.Data; +comando = ['select Date, Time, BatLevelModule from RawDataView where Date > ''' ... + dataini ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum = ''' NodeNum ''' ']; +curs = exec(conn,comando); +curs = fetch(curs); +BatData = curs.Data; +if strcmp(char(BatData(1)),'No Data') + Batteria_LoRa = BatTempo; +elseif strcmp(char(BatTempo(1)),'No Data') + Batteria_LoRa = BatData; +else + Batteria_LoRa = [BatTempo;BatData]; +end + +Data(1,1) = cellstr(date); +Data(1,2) = cellstr(time); + +%% Tilt Link V +if yesTL == 0 % Non ci sono Tilt Link + DatiTiltLink = []; + ErrTiltLink = []; + wardat = 'lettura function: there are not Tilt Link V'; + fprintf(fileID,fmt,wardat); +else + RawDataFile = ['' IDcentralina '-' DTcatena '-TLV-RawData.csv']; + NAN = 0; + while NAN == 0 + if datenum(datainiTL) == datenum(Data(1,1)) + tempoiniTL = char(Data(1,2)); + end + NodeType = 'Tilt Link'; + NodeNumTL = num2str(cell2mat(NodoTiltLink(1,2))); % scarico i dati del primo nodo + % Scarico dei dati relativi alla centralina con informazioni di Data e ora, livello batteria e temperatura + % Step 1 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date = ''' ... + datainiTL ''' and Time >= ''' tempoiniTL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumTL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniTL = curs.Data; + Ntempo = DATiniTL; + [r,c] = size(DATiniTL); + saltoTL = 0; + if r==1 && c==1 + textdatTL = 'Warning: error reading Tilt Link V (control unit data)!'; + fprintf(fileID,fmt,textdatTL); + saltoTL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiTL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumTL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2TL = curs.Data; + Ndate = DAT2TL; + if saltoTL == 1 + DATiniTL = DAT2TL; + end + Check = size(DAT2TL); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoTL == 0 + DATiniTL = [DATiniTL; DAT2TL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniTL); + if cD ~=1 + T = [cell2mat(DATiniTL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniTL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniTL = T; + else + DATiniTL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoTL == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiTiltLink = cell(rd+rt,7*rTL); + else + DatiTiltLink = cell(rt,7*rTL); + end + else + DatiTiltLink = cell(rd,7*rTL); + end + NTiltLink = cell2mat(NodoTiltLink(:,2)); + ii = 1; + col = 7; + w = 0; + while ii <= rTL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NTiltLink(ii,1); + if strcmp(DTcatena,'DT0115') && strcmp(IDcentralina,'ID0074') + if nN == 75 + nN = 1; + end + end + if strcmp(DTcatena,'DT0103') && strcmp(IDcentralina,'ID0063') + if nN == 39 + nN = 1; + end + end + nNodo = num2str(nN); + comando = ['select Val0, Val1, Val2, Val3, Val4, Val5, Val6 from RawDataView where Date = ''' ... + datainiTL ''' and Time >= ''' tempoiniTL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val3, Val4, Val5, Val6 from RawDataView where Date > ''' ... + datainiTL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-6; + if saltoTL == 0 + DatiTiltLink(1:rt,ini_col:col) = DATnodoTL(:,:); + else + DatiTiltLink(1:rd,ini_col:col) = DATnodoTLd(:,:); + end + + [rn,~] = size(DATnodoTLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoTLd(i,:) = DATnodoTLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Tilt Link V ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + elseif rd < rn + for i = 1:rn-rd + DATnodoTLd(1,:) = []; % se mancano dati, copio gli ultimi + end + wardat = ['Node Tilt Link V ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoTL == 0 + DatiTiltLink(rt+1:rt+rd,ini_col:col) = DATnodoTLd(:,:); + end + else + DatiTiltLink = DatiTiltLink(1:end,:); + end + okdatTL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rTL) ' Tilt Link V nodes downloaded correctly']; + fprintf(fileID,fmt,okdatTL); + ii = ii+1; + col = col+7; + end + if w == 0 + wardat = 'There are not warning for Tilt Link V!'; + fprintf(fileID,fmt,wardat); + end + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiTiltLink); + ErrTiltLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroTL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiTL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTiltLink(1,jj))); + idxND = find(strcmp('No Data',DatiTiltLink(1,jj))); + idxT = find(strcmp('---',DatiTiltLink(1,jj))); + idxT2 = find(strcmp('-',DatiTiltLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiTiltLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiTiltLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiTiltLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiTiltLink(1,jj))); + idxN = find(strcmp('null',DatiTiltLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Tilt Link V nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroTL == 0 % il file non è mai stato scritto, cerco la data successiva + NAN = 0; + ESCI = 1; + if datenum(datainiTL)+1 < now + datainiTL = datestr(datenum(datainiTL)+1,'yyyy-mm-dd'); + break + else + yesTL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiTL = datestr(datenum(datainiTL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiTiltLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrTiltLink(1,jj) = 1; + wardat = 'Data of Tilt Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiTL = datestr(datenum(datainiTL)-1,'yyyy-mm-dd'); + break + end + end + end + end + if ESCI == 0 + % Cerco i multipli di 7 per identificare le temperature + Int = jj/7; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiTiltLink(1,jj)) > 1000 + if rDR==1 && cDR==1 || NuovoZeroTL == 0 + NAN = 0; + ESCI = 1; + if datenum(datainiTL)+1 < now + datainiTL = datestr(datenum(datainiTL)+1,'yyyy-mm-dd'); + break + else + yesTL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiTL = datestr(datenum(datainiTL)-1,'yyyy-mm-dd'); + break + else + DatiTiltLink(1,jj-6) = cellstr(num2str(DatiRaw(RawDate(end),jj-5))); + DatiTiltLink(1,jj-5) = cellstr(num2str(DatiRaw(RawDate(end),jj-4))); + DatiTiltLink(1,jj-4) = cellstr(num2str(DatiRaw(RawDate(end),jj-3))); + DatiTiltLink(1,jj-3) = cellstr(num2str(DatiRaw(RawDate(end),jj-2))); + DatiTiltLink(1,jj-2) = cellstr(num2str(DatiRaw(RawDate(end),jj-1))); + DatiTiltLink(1,jj-1) = cellstr(num2str(DatiRaw(RawDate(end),jj))); + DatiTiltLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrTiltLink(1,jj) = 1; + wardat = ['Data of Tilt Link nodes corrected using Raw Data of reference Csv file. '... + 'MEMS was read as an electrolytic cell']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + end + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTiltLink(:,jj))); + idxND = find(strcmp('No Data',DatiTiltLink(:,jj))); + idxT = find(strcmp('---',DatiTiltLink(:,jj))); + idxT2 = find(strcmp('-',DatiTiltLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiTiltLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiTiltLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiTiltLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiTiltLink(:,jj))); + idxN = find(strcmp('null',DatiTiltLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiTL = datestr(datenum(datainiTL)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + end + DatiTiltLink(indice,jj) = DatiTiltLink(indice-1,jj); + ErrTiltLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + if ESCI == 1 + NAN = 0; + break + end + for ii = 2:r + % Cerco i multipli di 7 per identificare le temperature + Int = jj/7; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiTiltLink(ii,jj)) > 1000 + DatiTiltLink(ii,jj-6:jj) = DatiTiltLink(ii-1,jj-6:jj); + ErrTiltLink(ii,jj) = 1; + wardat = ['Data of Tilt Link nodes corrected using Raw Data of reference Csv file. '... + 'MEMS was read as an electrolytic cell']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + % Elimino gli eventuali Not a Number + for nnn = 2:r % nodi + check = isnan(cell2mat(DatiTiltLink(nnn,jj))); + if check == 1 + DatiTiltLink(nnn,jj) = DatiTiltLink(nnn-1,jj); + ErrTiltLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Tilt Link V data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiTiltLink = [DATiniTL str2double(DatiTiltLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiTiltLink(a,1) == DatiTiltLink(a-1,1) + DatiTiltLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + if NuovoZeroTL == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiTiltLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiTiltLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiTiltLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiTiltLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiTiltLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniHD ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumHD ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniHD = curs.Data; + Ntempo = DATiniHD; + [r,c] = size(DATiniHD); + saltoHD = 0; + if r==1 && c==1 + textdatHD = 'Warning: error reading Tilt Link HD (control unit data)!'; + fprintf(fileID,fmt,textdatHD); + saltoHD = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiHD ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumHD ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2HD = curs.Data; + Ndate = DAT2HD; + if saltoHD == 1 + DATiniHD = DAT2HD; + end + Check = size(DAT2HD); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoHD == 0 + DATiniHD = [DATiniHD; DAT2HD]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniHD); + if cD ~=1 + T = [cell2mat(DATiniHD(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniHD(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniHD = T; + else + DATiniHD = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if cell2mat(NodoTiltLinkHD(1,5)) == 1 + col = 7; + else + col = 4; + end + if saltoHD == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiTiltLinkHD = cell(rd+rt,col*rHD); + else + DatiTiltLinkHD = cell(rt,col*rHD); + end + else + DatiTiltLinkHD = cell(rd,col*rHD); + end + NTiltLinkHD = cell2mat(NodoTiltLinkHD(:,2)); + ii = 1; + + w = 0; + while ii <= rHD + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NTiltLinkHD(ii,1); + nNodo = num2str(nN); + if cell2mat(NodoTiltLinkHD(ii,5)) == 1 + comando = ['select Val0, Val1, Val2, Val3, Val4, Val5, Val6 from RawDataView where Date = ''' ... + datainiHD ''' and Time >= ''' tempoiniHD ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoHD = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val3, Val4, Val5, Val6 from RawDataView where Date > ''' ... + datainiHD ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoHDd = curs.Data; + ini_col = col-6; + else + comando = ['select Val0, Val1, Val2, Val3 from RawDataView where Date = ''' ... + datainiHD ''' and Time >= ''' tempoiniHD ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoHD = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val3 from RawDataView where Date > ''' ... + datainiHD ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoHDd = curs.Data; + ini_col = col-3; + end + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoHD == 0 + DatiTiltLinkHD(1:rt,ini_col:col) = DATnodoHD(:,:); + else + DatiTiltLinkHD(1:rd,ini_col:col) = DATnodoHDd(:,:); + end + + [rn,~] = size(DATnodoHDd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoHDd(i,:) = DATnodoHDd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Tilt Link HD ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + elseif rd < rn + for i = 1:rn-rd + DATnodoHDd(1,:) = []; % se mancano dati, copio gli ultimi + end + wardat = ['Node Tilt Link HD ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoHD == 0 + DatiTiltLinkHD(rt+1:rt+rd,ini_col:col) = DATnodoHDd(:,:); + end + else + DatiTiltLinkHD = DatiTiltLinkHD(1:end,:); + end + okdatHD = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rHD) ' Tilt Link HD nodes downloaded correctly']; + fprintf(fileID,fmt,okdatHD); + if cell2mat(NodoTiltLinkHD(ii,5)) == 1 + col = col+7; + else + col = col+4; + end + ii = ii+1; + end + if w == 0 + wardat = 'There are not warning for Tilt Link HD!'; + fprintf(fileID,fmt,wardat); + end + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiTiltLinkHD); + ErrTiltLinkHD = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroHD == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiHD)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTiltLinkHD(1,jj))); + idxND = find(strcmp('No Data',DatiTiltLinkHD(1,jj))); + idxT = find(strcmp('---',DatiTiltLinkHD(1,jj))); + idxT2 = find(strcmp('-',DatiTiltLinkHD(1,jj))); + idxE2 = find(strcmp('Err2',DatiTiltLinkHD(1,jj))); + idxE255 = find(strcmp('Err255',DatiTiltLinkHD(1,jj))); + idxD = find(strcmp('DMUXe',DatiTiltLinkHD(1,jj))); + idxE1F = find(strcmp('Err1File',DatiTiltLinkHD(1,jj))); + idxN = find(strcmp('null',DatiTiltLinkHD(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Tilt Link HD nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroHD == 0 % il file non è mai stato scritto, cerco la data successiva + NAN = 0; + ESCI = 1; + if datenum(datainiHD)+1 < now + datainiHD = datestr(datenum(datainiHD)+1,'yyyy-mm-dd'); + break + else + yesHD = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiHD = datestr(datenum(datainiHD)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiTiltLinkHD(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrTiltLinkHD(1,jj) = 1; + wardat = 'Data of Tilt Link hd nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiHD = datestr(datenum(datainiHD)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTiltLinkHD(:,jj))); + idxND = find(strcmp('No Data',DatiTiltLinkHD(:,jj))); + idxT = find(strcmp('---',DatiTiltLinkHD(:,jj))); + idxT2 = find(strcmp('-',DatiTiltLinkHD(:,jj))); + idxE2 = find(strcmp('Err2',DatiTiltLinkHD(:,jj))); + idxE255 = find(strcmp('Err255',DatiTiltLinkHD(:,jj))); + idxD = find(strcmp('DMUXe',DatiTiltLinkHD(:,jj))); + idxE1F = find(strcmp('Err1File',DatiTiltLinkHD(:,jj))); + idxN = find(strcmp('null',DatiTiltLinkHD(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiHD = datestr(datenum(datainiHD)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + end + DatiTiltLinkHD(indice,jj) = DatiTiltLinkHD(indice-1,jj); + ErrTiltLinkHD(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + if ESCI == 1 + NAN = 0; + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r % nodi + check = isnan(cell2mat(DatiTiltLinkHD(nnn,jj))); + if check == 1 + DatiTiltLinkHD(nnn,jj) = DatiTiltLinkHD(nnn-1,jj); + ErrTiltLinkHD(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Tilt Link HD data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiTiltLinkHD = [DATiniHD str2double(DatiTiltLinkHD)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiTiltLinkHD(a,1) == DatiTiltLinkHD(a-1,1) + DatiTiltLinkHD(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + if NuovoZeroHD == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiTiltLinkHD(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiTiltLinkHD(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiTiltLinkHD(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiTiltLinkHD(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiTiltLinkHD; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniHDVR ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumHDVR ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniHDVR = curs.Data; + Ntempo = DATiniHDVR; + [r,c] = size(DATiniHDVR); + saltoHDVR = 0; + if r==1 && c==1 + textdatHDVR = 'Warning: error reading Tilt Link HD VR (control unit data)!'; + fprintf(fileID,fmt,textdatHDVR); + saltoHDVR = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiHDVR ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumHDVR ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2HDVR = curs.Data; + Ndate = DAT2HDVR; + if saltoHDVR == 1 + DATiniHDVR = DAT2HDVR; + end + Check = size(DAT2HDVR); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoHDVR == 0 + DATiniHDVR = [DATiniHDVR; DAT2HDVR]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniHDVR); + if cD ~=1 + T = [cell2mat(DATiniHDVR(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniHDVR(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniHDVR = T; + else + DATiniHDVR = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoHDVR == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiTiltLinkHDVR = cell(rd+rt,7*rHDVR); + else + DatiTiltLinkHDVR = cell(rt,7*rHDVR); + end + else + DatiTiltLinkHDVR = cell(rd,7*rHDVR); + end + NTiltLinkHDVR = cell2mat(NodoTiltLinkHDVR(:,2)); + ii = 1; + if cell2mat(NodoTiltLinkHDVR(1,5)) == 1 + col = 7; + else + col = 4; + end + w = 0; + while ii <= rHDVR + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NTiltLinkHDVR(ii,1); + nNodo = num2str(nN); + if cell2mat(NodoTiltLinkHDVR(ii,5)) == 1 + comando = ['select Val0, Val1, Val2, Val3, Val4, Val5, Val6 from RawDataView where Date = ''' ... + datainiHDVR ''' and Time >= ''' tempoiniHDVR ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoHDVR = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val3, Val4, Val5, Val6 from RawDataView where Date > ''' ... + datainiHDVR ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoHDVRd = curs.Data; + ini_col = col-6; + else + comando = ['select Val0, Val1, Val2, Val3 from RawDataView where Date = ''' ... + datainiHDVR ''' and Time >= ''' tempoiniHDVR ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoHDVR = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val3 from RawDataView where Date > ''' ... + datainiHDVR ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoHDVRd = curs.Data; + ini_col = col-3; + end + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoHDVR == 0 + DatiTiltLinkHDVR(1:rt,ini_col:col) = DATnodoHDVR(:,:); + else + DatiTiltLinkHDVR(1:rd,ini_col:col) = DATnodoHDVRd(:,:); + end + + [rn,~] = size(DATnodoHDVRd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoHDVRd(i,:) = DATnodoHDVRd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Tilt Link HD VR ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + elseif rd < rn + for i = 1:rn-rd + DATnodoHDVRd(1,:) = []; % se mancano dati, copio gli ultimi + end + wardat = ['Node Tilt Link HD VR ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoHDVR == 0 + DatiTiltLinkHDVR(rt+1:rt+rd,ini_col:col) = DATnodoHDVRd(:,:); + end + else + DatiTiltLinkHDVR = DatiTiltLinkHDVR(1:end,:); + end + okdatHDVR = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rHDVR) ' Tilt Link HD VR nodes downloaded correctly']; + fprintf(fileID,fmt,okdatHDVR); + if cell2mat(NodoTiltLinkHDVR(ii,5)) == 1 + col = col+7; + else + col = col+4; + end + ii = ii+1; + end + if w == 0 + wardat = 'There are not warning for Tilt Link HD VR!'; + fprintf(fileID,fmt,wardat); + end + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiTiltLinkHDVR); + ErrTiltLinkHDVR = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroHDVR == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiHDVR)); + if isempty(RawDate)==1 && strcmp(IDcentralina,'ID0200')==1 + RawDate = 1; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTiltLinkHDVR(1,jj))); + idxND = find(strcmp('No Data',DatiTiltLinkHDVR(1,jj))); + idxT = find(strcmp('---',DatiTiltLinkHDVR(1,jj))); + idxT2 = find(strcmp('-',DatiTiltLinkHDVR(1,jj))); + idxE2 = find(strcmp('Err2',DatiTiltLinkHDVR(1,jj))); + idxE255 = find(strcmp('Err255',DatiTiltLinkHDVR(1,jj))); + idxD = find(strcmp('DMUXe',DatiTiltLinkHDVR(1,jj))); + idxE1F = find(strcmp('Err1File',DatiTiltLinkHDVR(1,jj))); + idxN = find(strcmp('null',DatiTiltLinkHDVR(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Tilt Link HD VR nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroHDVR == 0 % il file non è mai stato scritto, cerco la data successiva + NAN = 0; + ESCI = 1; + if datenum(datainiHDVR)+1 < now + datainiHDVR = datestr(datenum(datainiHDVR)+1,'yyyy-mm-dd'); + break + else + yesHDVR = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiHDVR = datestr(datenum(datainiHDVR)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiTiltLinkHDVR(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrTiltLinkHDVR(1,jj) = 1; + wardat = 'Data of Tilt Link hd VR nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiHDVR = datestr(datenum(datainiHDVR)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTiltLinkHDVR(:,jj))); + idxND = find(strcmp('No Data',DatiTiltLinkHDVR(:,jj))); + idxT = find(strcmp('---',DatiTiltLinkHDVR(:,jj))); + idxT2 = find(strcmp('-',DatiTiltLinkHDVR(:,jj))); + idxE2 = find(strcmp('Err2',DatiTiltLinkHDVR(:,jj))); + idxE255 = find(strcmp('Err255',DatiTiltLinkHDVR(:,jj))); + idxD = find(strcmp('DMUXe',DatiTiltLinkHDVR(:,jj))); + idxE1F = find(strcmp('Err1File',DatiTiltLinkHDVR(:,jj))); + idxN = find(strcmp('null',DatiTiltLinkHDVR(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiHDVR = datestr(datenum(datainiHDVR)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + end + DatiTiltLinkHDVR(indice,jj) = DatiTiltLinkHDVR(indice-1,jj); + ErrTiltLinkHDVR(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + if ESCI == 1 + NAN = 0; + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r % nodi + check = isnan(cell2mat(DatiTiltLinkHDVR(nnn,jj))); + if check == 1 + DatiTiltLinkHDVR(nnn,jj) = DatiTiltLinkHDVR(nnn-1,jj); + ErrTiltLinkHDVR(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Tilt Link HD VR data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiTiltLinkHDVR = [DATiniHDVR str2double(DatiTiltLinkHDVR)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiTiltLinkHDVR(a,1) == DatiTiltLinkHDVR(a-1,1) + DatiTiltLinkHDVR(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + if NuovoZeroHDVR == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiTiltLinkHDVR(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiTiltLinkHDVR(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiTiltLinkHDVR(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiTiltLinkHDVR(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiTiltLinkHDVR; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniTLHR ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumTLHR ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniTLHR = curs.Data; + Ntempo = DATiniTLHR; + [r,c] = size(DATiniTLHR); + saltoTLHR = 0; + if r==1 && c==1 + textdatTLHR = 'Warning: error reading Tilt Link HR V (control unit data)!'; + fprintf(fileID,fmt,textdatTLHR); + saltoTLHR = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiTLHR ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumTLHR ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2TLHR = curs.Data; + Ndate = DAT2TLHR; + if saltoTLHR == 1 + DATiniTLHR = DAT2TLHR; + end + Check = size(DAT2TLHR); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoTLHR == 0 + DATiniTLHR = [DATiniTLHR; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniTLHR); + if cD ~=1 + T = [cell2mat(DATiniTLHR(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniTLHR(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniTLHR = T; + else + DATiniTLHR = []; + end + + % Scarico dati relativi ai singoli nodi + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoTLHR == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiTiltLinkHR = cell(rd+rt,6*rTLHR); + else + DatiTiltLinkHR = cell(rt,6*rTLHR); + end + else + DatiTiltLinkHR = cell(rd,6*rTLHR); + end + NTiltLinkHR = cell2mat(NodoTiltLinkHR(:,2)); + col = 6; + w = 0; + while ii <= rTLHR + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NTiltLinkHR(ii,1); + if strcmp(DTcatena,'DT0103') && strcmp(IDcentralina,'ID0063') + if nN == 40 + nN = 2; + end + end + nNodo = num2str(nN); + + + comando = ['select Val0, Val1, Val3, Val4, Val5, Val6 from RawDataView where Date = ''' ... + datainiTLHR ''' and Time >= ''' tempoiniTLHR ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHR = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val3, Val4, Val5, Val6 from RawDataView where Date > ''' ... + datainiTLHR ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHRd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-5; + if saltoTLHR == 0 + DatiTiltLinkHR(1:rt,ini_col:col) = DATnodoTLHR(:,:); + else + DatiTiltLinkHR(1:rd,ini_col:col) = DATnodoTLHRd(:,:); + end + + [rn,~] = size(DATnodoTLHRd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoTLHRd(i,:) = DATnodoTLHRd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Tilt Link HR V ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoTLHR == 0 + DatiTiltLinkHR(rt+1:rt+rd,ini_col:col) = DATnodoTLHRd(:,:); + end + else + DatiTiltLinkHR = DatiTiltLinkHR(1:end,:); + end + okdatTLH = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rTLHR) ' Tilt Link HR V nodes downloaded correctly']; + fprintf(fileID,fmt,okdatTLH); + ii = ii+1; + col = col+6; + end + if w == 0 + wardat = 'There are not warning for Tilt Link HR V!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiTiltLinkHR); + ErrTiltLinkHR = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroTLHR == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiTLHR)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTiltLinkHR(1,jj))); + idxND = find(strcmp('No Data',DatiTiltLinkHR(1,jj))); + idxT = find(strcmp('---',DatiTiltLinkHR(1,jj))); + idxT2 = find(strcmp('-',DatiTiltLinkHR(1,jj))); + idxE2 = find(strcmp('Err2',DatiTiltLinkHR(1,jj))); + idxE255 = find(strcmp('Err255',DatiTiltLinkHR(1,jj))); + idxD = find(strcmp('DMUXe',DatiTiltLinkHR(1,jj))); + idxE1F = find(strcmp('Err1File',DatiTiltLinkHR(1,jj))); + idxN = find(strcmp('null',DatiTiltLinkHR(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Tilt Link HR V nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroTLHR == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiTLHR)+1 < now + datainiTLHR = datestr(datenum(datainiTLHR)+1,'yyyy-mm-dd'); + break + else + yesTLHR = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiTLHR = datestr(datenum(datainiTLHR)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiTiltLinkHR(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrTiltLinkHR(1,jj) = 1; + wardat = 'Data of Tilt Link HR nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiTLHR = datestr(datenum(datainiTLHR)-1,'yyyy-mm-dd'); + break + end + end + end + end + if ESCI == 0 + % Cerco i multipli di 6 per identificare le temperature + Int = jj/6; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiTiltLinkHR(1,jj)) < 500 + if rDR==1 && cDR==1 || NuovoZeroTLHR == 0 + NAN = 0; + ESCI = 1; + datainiTLHR = datestr(datenum(datainiTLHR)-1,'yyyy-mm-dd'); + break + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiTLHR = datestr(datenum(datainiTLHR)-1,'yyyy-mm-dd'); + break + else + DatiTiltLinkHR(1,jj-5) = cellstr(num2str(DatiRaw(RawDate(end),jj-4))); + DatiTiltLinkHR(1,jj-4) = cellstr(num2str(DatiRaw(RawDate(end),jj-3))); + DatiTiltLinkHR(1,jj-3) = cellstr(num2str(DatiRaw(RawDate(end),jj-2))); + DatiTiltLinkHR(1,jj-2) = cellstr(num2str(DatiRaw(RawDate(end),jj-1))); + DatiTiltLinkHR(1,jj-1) = cellstr(num2str(DatiRaw(RawDate(end),jj))); + DatiTiltLinkHR(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrTiltLinkHR(1,jj) = 1; + wardat = ['Data of Tilt Link HR nodes corrected using Raw Data of reference Csv file. '... + 'Electrolytic cell was read as a MEMS']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTiltLinkHR(:,jj))); + idxND = find(strcmp('No Data',DatiTiltLinkHR(:,jj))); + idxT = find(strcmp('---',DatiTiltLinkHR(:,jj))); + idxT2 = find(strcmp('-',DatiTiltLinkHR(:,jj))); + idxE2 = find(strcmp('Err2',DatiTiltLinkHR(:,jj))); + idxE255 = find(strcmp('Err255',DatiTiltLinkHR(:,jj))); + idxD = find(strcmp('DMUXe',DatiTiltLinkHR(:,jj))); + idxE1F = find(strcmp('Err1File',DatiTiltLinkHR(:,jj))); + idxN = find(strcmp('null',DatiTiltLinkHR(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiTLHR = datestr(datenum(datainiTLHR)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + else + DatiTiltLinkHR(indice,jj) = DatiTiltLinkHR(indice-1,jj); + ErrTiltLinkHR(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + for ii = 2:r + % Cerco i multipli di 6 per identificare le temperature + Int = jj/6; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiTiltLinkHR(ii,jj)) < 500 + DatiTiltLinkHR(ii,jj-2:jj) = DatiTiltLinkHR(ii-1,jj-2:jj); + ErrTiltLinkHR(ii,jj) = 1; + wardat = ['Data of Tilt Link HR nodes corrected using Raw Data of reference Csv file. '... + 'Electrolytic cell was read as a MEMS']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + if ESCI == 1 + NAN = 0; + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiTiltLinkHR(nnn,jj))); + if check == 1 + DatiTiltLinkHR(nnn,jj) = DatiTiltLinkHR(nnn-1,jj); + ErrTiltLinkHR(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Tilt Link HR V data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiTiltLinkHR = [DATiniTLHR str2double(DatiTiltLinkHR)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiTiltLinkHR(a,1) == DatiTiltLinkHR(a-1,1) + DatiTiltLinkHR(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + if NuovoZeroTLHR == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiTiltLinkHR(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiTiltLinkHR(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiTiltLinkHR(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiTiltLinkHR(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiTiltLinkHR; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniTLH ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumTLH ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniTLH = curs.Data; + Ntempo = DATiniTLH; + [r,c] = size(DATiniTLH); + saltoTLH = 0; + if r==1 && c==1 + textdatTLH = 'Warning: error reading Tilt Link H (control unit data)!'; + fprintf(fileID,fmt,textdatTLH); + saltoTLH = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiTLH ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumTLH ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2TLH = curs.Data; + Ndate = DAT2TLH; + if saltoTLH == 1 + DATiniTLH = DAT2TLH; + end + Check = size(DAT2TLH); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoTLH == 0 + DATiniTLH = [DATiniTLH; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniTLH); + if cD ~=1 + T = [cell2mat(DATiniTLH(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniTLH(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniTLH = T; + else + DATiniTLH = []; + end + + % Scarico dati relativi ai singoli nodi + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoTLH == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiTiltLinkH = cell(rd+rt,7*rTLH); + else + DatiTiltLinkH = cell(rt,7*rTLH); + end + else + DatiTiltLinkH = cell(rd,7*rTLH); + end + NTiltLinkH = cell2mat(NodoTiltLinkH(:,2)); + col = 7; + w = 0; + while ii <= rTLH + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NTiltLinkH(ii,1); + nNodo = num2str(nN); + comando = ['select Val0, Val1, Val2, Val3, Val4, Val5, Val6 from RawDataView where Date = ''' ... + datainiTLH ''' and Time >= ''' tempoiniTLH ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLH = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val3, Val4, Val5, Val6 from RawDataView where Date > ''' ... + datainiTLH ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-6; + if saltoTLH == 0 + DatiTiltLinkH(1:rt,ini_col:col) = DATnodoTLH(:,:); + else + DatiTiltLinkH(1:rd,ini_col:col) = DATnodoTLHd(:,:); + end + + [rn,~] = size(DATnodoTLHd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoTLHd(i,:) = DATnodoTLHd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Tilt Link H ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoTLH == 0 + DatiTiltLinkH(rt+1:rt+rd,ini_col:col) = DATnodoTLHd(:,:); + end + else + DatiTiltLinkH = DatiTiltLinkH(1:end,:); + end + okdatTLH = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rTLH) ' Tilt Link H nodes downloaded correctly']; + fprintf(fileID,fmt,okdatTLH); + ii = ii+1; + col = col+7; + end + if w == 0 + wardat = 'There are not warning for Tilt Link H!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiTiltLinkH); + ErrTiltLinkH = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroTLH == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiTLH)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTiltLinkH(1,jj))); + idxND = find(strcmp('No Data',DatiTiltLinkH(1,jj))); + idxT = find(strcmp('---',DatiTiltLinkH(1,jj))); + idxT2 = find(strcmp('-',DatiTiltLinkH(1,jj))); + idxE2 = find(strcmp('Err2',DatiTiltLinkH(1,jj))); + idxE255 = find(strcmp('Err255',DatiTiltLinkH(1,jj))); + idxD = find(strcmp('DMUXe',DatiTiltLinkH(1,jj))); + idxE1F = find(strcmp('Err1File',DatiTiltLinkH(1,jj))); + idxN = find(strcmp('null',DatiTiltLinkH(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Tilt Link H nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroTLH == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiTLH)+1 < now + datainiTLH = datestr(datenum(datainiTLH)+1,'yyyy-mm-dd'); + break + else + yesTLH = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiTLH = datestr(datenum(datainiTLH)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiTiltLinkH(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrTiltLinkH(1,jj) = 1; + wardat = 'Data of Tilt Link H nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiTLH = datestr(datenum(datainiTLH)-1,'yyyy-mm-dd'); + break + end + end + end + end + if ESCI == 0 + % Cerco i multipli di 7 per identificare le temperature + Int = jj/7; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiTiltLinkH(1,jj)) > 1000 + if rDR==1 && cDR==1 || NuovoZeroTLH == 0 + NAN = 0; + ESCI = 1; + datainiTLH = datestr(datenum(datainiTLH)-1,'yyyy-mm-dd'); + break + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + if datenum(datainiTLH)+1 < now + datainiTLH = datestr(datenum(datainiTLH)+1,'yyyy-mm-dd'); + break + else + yesTLH = 0; + end + else + DatiTiltLinkH(1,jj-6) = cellstr(num2str(DatiRaw(RawDate(end),jj-5))); + DatiTiltLinkH(1,jj-5) = cellstr(num2str(DatiRaw(RawDate(end),jj-4))); + DatiTiltLinkH(1,jj-4) = cellstr(num2str(DatiRaw(RawDate(end),jj-3))); + DatiTiltLinkH(1,jj-3) = cellstr(num2str(DatiRaw(RawDate(end),jj-2))); + DatiTiltLinkH(1,jj-2) = cellstr(num2str(DatiRaw(RawDate(end),jj-1))); + DatiTiltLinkH(1,jj-1) = cellstr(num2str(DatiRaw(RawDate(end),jj))); + DatiTiltLinkH(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrTiltLinkH(1,jj) = 1; + wardat = ['Data of Tilt Link H nodes corrected using Raw Data of reference Csv file. '... + 'MEMS was read as an electrolytic cell']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTiltLinkH(:,jj))); + idxND = find(strcmp('No Data',DatiTiltLinkH(:,jj))); + idxT = find(strcmp('---',DatiTiltLinkH(:,jj))); + idxT2 = find(strcmp('-',DatiTiltLinkH(:,jj))); + idxE2 = find(strcmp('Err2',DatiTiltLinkH(:,jj))); + idxE255 = find(strcmp('Err255',DatiTiltLinkH(:,jj))); + idxD = find(strcmp('DMUXe',DatiTiltLinkH(:,jj))); + idxE1F = find(strcmp('Err1File',DatiTiltLinkH(:,jj))); + idxN = find(strcmp('null',DatiTiltLinkH(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiTLH = datestr(datenum(datainiTLH)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + else + DatiTiltLinkH(indice,jj) = DatiTiltLinkH(indice-1,jj); + ErrTiltLinkH(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + for ii = 2:r + % Cerco i multipli di 7 per identificare le temperature + Int = jj/7; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiTiltLinkH(ii,jj)) > 1000 + DatiTiltLinkH(ii,jj-6:jj) = DatiTiltLinkH(ii-1,jj-6:jj); + ErrTiltLinkH(ii,jj) = 1; + wardat = ['Data of Tilt Link H nodes corrected using Raw Data of reference Csv file. '... + 'MEMS read as a MEMS']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + if ESCI == 1 + NAN = 0; + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiTiltLinkH(nnn,jj))); + if check == 1 + DatiTiltLinkH(nnn,jj) = DatiTiltLinkH(nnn-1,jj); + ErrTiltLinkH(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Tilt Link H data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiTiltLinkH = [DATiniTLH str2double(DatiTiltLinkH)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiTiltLinkH(a,1) == DatiTiltLinkH(a-1,1) + DatiTiltLinkH(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + if NuovoZeroTLH == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiTiltLinkH(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiTiltLinkH(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiTiltLinkH(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiTiltLinkH(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiTiltLinkH; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniTLHRH ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumTLHRH ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniTLHRH = curs.Data; + Ntempo = DATiniTLHRH; + [r,c] = size(DATiniTLHRH); + saltoTLHRH = 0; + if r==1 && c==1 + textdatTLHRH = 'Warning: error reading Tilt Link HR H (control unit data)!'; + fprintf(fileID,fmt,textdatTLHRH); + saltoTLHRH = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiTLHRH ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumTLHRH ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2TLHRH = curs.Data; + Ndate = DAT2TLHRH; + if saltoTLHRH == 1 + DATiniTLHRH = DAT2TLHRH; + end + Check = size(DAT2TLHRH); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoTLHRH == 0 + DATiniTLHRH = [DATiniTLHRH; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniTLHRH); + if cD ~=1 + T = [cell2mat(DATiniTLHRH(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniTLHRH(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniTLHRH = T; + else + DATiniTLHRH = []; + end + + % Scarico dati relativi ai singoli nodi + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoTLHRH == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiTiltLinkHRH = cell(rd+rt,6*rTLHR); + else + DatiTiltLinkHRH = cell(rt,6*rTLHR); + end + else + DatiTiltLinkHRH = cell(rd,6*rTLHR); + end + NTiltLinkHRH = cell2mat(NodoTiltLinkHRH(:,2)); + col = 6; + w = 0; + while ii <= rTLHRH + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NTiltLinkHRH(ii,1); + nNodo = num2str(nN); + comando = ['select Val0, Val1, Val3, Val4, Val5, Val6 from RawDataView where Date = ''' ... + datainiTLHRH ''' and Time >= ''' tempoiniTLHRH ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHRH = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val3, Val4, Val5, Val6 from RawDataView where Date > ''' ... + datainiTLHRH ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHRHd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-5; + if saltoTLHRH == 0 + DatiTiltLinkHRH(1:rt,ini_col:col) = DATnodoTLHRH(:,:); + else + DatiTiltLinkHRH(1:rd,ini_col:col) = DATnodoTLHRHd(:,:); + end + + [rn,~] = size(DATnodoTLHRHd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoTLHRHd(i,:) = DATnodoTLHRHd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Tilt Link HR H ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoTLHRH == 0 + DatiTiltLinkHRH(rt+1:rt+rd,ini_col:col) = DATnodoTLHRHd(:,:); + end + else + DatiTiltLinkHRH = DatiTiltLinkHRH(1:end,:); + end + okdatTLH = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rTLHRH) ' Tilt Link HR H nodes downloaded correctly']; + fprintf(fileID,fmt,okdatTLH); + ii = ii+1; + col = col+6; + end + if w == 0 + wardat = 'There are not warning for Tilt Link HR H!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiTiltLinkHRH); + ErrTiltLinkHRH = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroTLHRH == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiTLHRH)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTiltLinkHRH(1,jj))); + idxND = find(strcmp('No Data',DatiTiltLinkHRH(1,jj))); + idxT = find(strcmp('---',DatiTiltLinkHRH(1,jj))); + idxT2 = find(strcmp('-',DatiTiltLinkHRH(1,jj))); + idxE2 = find(strcmp('Err2',DatiTiltLinkHRH(1,jj))); + idxE255 = find(strcmp('Err255',DatiTiltLinkHRH(1,jj))); + idxD = find(strcmp('DMUXe',DatiTiltLinkHRH(1,jj))); + idxE1F = find(strcmp('Err1File',DatiTiltLinkHRH(1,jj))); + idxN = find(strcmp('null',DatiTiltLinkHRH(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Tilt Link HR H nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroTLHRH == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiTLHRH)+1 < now + datainiTLHRH = datestr(datenum(datainiTLHRH)+1,'yyyy-mm-dd'); + break + else + yesTLHRH = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiTLHRH = datestr(datenum(datainiTLHRH)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiTiltLinkHRH(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrTiltLinkHRH(1,jj) = 1; + wardat = 'Data of Tilt Link HR H nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiTLHRH = datestr(datenum(datainiTLHRH)-1,'yyyy-mm-dd'); + break + end + end + end + end + if ESCI == 0 + % Cerco i multipli di 6 per identificare le temperature + Int = jj/6; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiTiltLinkHRH(1,jj)) < 500 + if rDR==1 && cDR==1 || NuovoZeroTLHRH == 0 + NAN = 0; + ESCI = 1; + if datenum(datainiTLHRH)+1 < now + datainiTLHRH = datestr(datenum(datainiTLHRH)+1,'yyyy-mm-dd'); + break + else + yesTLHRH = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiTLHRH = datestr(datenum(datainiTLHRH)-1,'yyyy-mm-dd'); + break + else + DatiTiltLinkHRH(1,jj-5) = cellstr(num2str(DatiRaw(RawDate(end),jj-4))); + DatiTiltLinkHRH(1,jj-4) = cellstr(num2str(DatiRaw(RawDate(end),jj-3))); + DatiTiltLinkHRH(1,jj-3) = cellstr(num2str(DatiRaw(RawDate(end),jj-2))); + DatiTiltLinkHRH(1,jj-2) = cellstr(num2str(DatiRaw(RawDate(end),jj-1))); + DatiTiltLinkHRH(1,jj-1) = cellstr(num2str(DatiRaw(RawDate(end),jj))); + DatiTiltLinkHRH(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrTiltLinkHRH(1,jj) = 1; + wardat = ['Data of Tilt Link HR H nodes corrected using Raw Data of reference Csv file. '... + 'Electrolytic cell was read as the corresponding MEMS']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTiltLinkHRH(:,jj))); + idxND = find(strcmp('No Data',DatiTiltLinkHRH(:,jj))); + idxT = find(strcmp('---',DatiTiltLinkHRH(:,jj))); + idxT2 = find(strcmp('-',DatiTiltLinkHRH(:,jj))); + idxE2 = find(strcmp('Err2',DatiTiltLinkHRH(:,jj))); + idxE255 = find(strcmp('Err255',DatiTiltLinkHRH(:,jj))); + idxD = find(strcmp('DMUXe',DatiTiltLinkHRH(:,jj))); + idxE1F = find(strcmp('Err1File',DatiTiltLinkHRH(:,jj))); + idxN = find(strcmp('null',DatiTiltLinkHRH(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiTLHRH = datestr(datenum(datainiTLHRH)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + else + DatiTiltLinkHRH(indice,jj) = DatiTiltLinkHRH(indice-1,jj); + ErrTiltLinkHRH(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + for ii = 2:r + % Cerco i multipli di 6 per identificare le temperature + Int = jj/6; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiTiltLinkHRH(ii,jj)) < 500 + DatiTiltLinkHRH(ii,jj-2:jj) = DatiTiltLinkHRH(ii-1,jj-2:jj); + ErrTiltLinkHRH(ii,jj) = 1; + wardat = ['Data of Tilt Link HR nodes corrected using Raw Data of reference Csv file. '... + 'Electrolytic cell was read as a MEMS']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + if ESCI == 1 + NAN = 0; + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiTiltLinkHRH(nnn,jj))); + if check == 1 + DatiTiltLinkHRH(nnn,jj) = DatiTiltLinkHRH(nnn-1,jj); + ErrTiltLinkHRH(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Tilt Link HR H data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiTiltLinkHRH = [DATiniTLHRH str2double(DatiTiltLinkHRH)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiTiltLinkHRH(a,1) == DatiTiltLinkHRH(a-1,1) + DatiTiltLinkHRH(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + if NuovoZeroTLHRH == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiTiltLinkHRH(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiTiltLinkHRH(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiTiltLinkHRH(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiTiltLinkHRH(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiTiltLinkHRH; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniPL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumPL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniPL = curs.Data; + Ntempo = DATiniPL; + [r,c] = size(DATiniPL); + saltoPL = 0; + if r==1 && c==1 + textdatPL = 'Warning: error reading Piezo Link (control unit data)!'; + fprintf(fileID,fmt,textdatPL); + saltoPL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiPL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumPL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2PL = curs.Data; + Ndate = DAT2PL; + if saltoPL == 1 + DATiniPL = DAT2PL; + end + Check = size(DAT2PL); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoPL == 0 + DATiniPL = [DATiniPL; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniPL); + if cD ~=1 + T = [cell2mat(DATiniPL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniPL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniPL = T; + else + DATiniPL = []; + end + + % Scarico dati relativi ai singoli nodi + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoPL == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiPiezoLink = cell(rd+rt,2*rPL); + else + DatiPiezoLink = cell(rt,2*rPL); + end + else + DatiPiezoLink = cell(rd,2*rPL); + end + NPiezoLink = cell2mat(NodoPiezoLink(:,2)); + col = 2; + w = 0; + while ii <= rPL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NPiezoLink(ii,1); + nNodo = num2str(nN); + comando = ['select Val0, Val1 from RawDataView where Date = ''' ... + datainiPL ''' and Time >= ''' tempoiniPL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1 from RawDataView where Date > ''' ... + datainiPL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPLd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-1; + if saltoPL == 0 + DatiPiezoLink(1:rt,ini_col:col) = DATnodoPL(:,:); + else + DatiPiezoLink(1:rd,ini_col:col) = DATnodoPLd(:,:); + end + + [rn,~] = size(DATnodoPLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoPLd(i,:) = DATnodoPLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Piezo Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoPL == 0 + DatiPiezoLink(rt+1:rt+rd,ini_col:col) = DATnodoPLd(:,:); + end + else + DatiPiezoLink = DatiPiezoLink(1:end,:); + end + okdatPL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rPL) ' Piezo Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatPL); + ii = ii+1; + col = col+2; + end + if w == 0 + wardat = 'There are not warning for Piezo Link!'; + fprintf(fileID,fmt,wardat); + end + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiPiezoLink); + ErrPiezoLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + DIS = 0; + if NuovoZeroPL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiPL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + if strcmp(IDcentralina,'ID0075')==1 && strcmp(DTcatena,'DT0117')==1 + RawDate = 1; + end + for jj=1:c + % Se il nodo è Dis., devo aumentare di uno la data (il nodo non + % è ancora stato installato!) + if strcmp('Dis.',DatiPiezoLink(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',DatiPiezoLink(dis,jj)) == 0 + DatiPiezoLink = DatiPiezoLink(dis:end,:); + DATiniPL = DATiniPL(dis:end,:); + DatiNTCPiezoLink = DatiNTCPiezoLink(dis:end,:); + [r,c] = size(DatiPiezoLink); + break + elseif isfile(RawDataFile) == 1 + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiPiezoLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrPiezoLink(1,jj) = 1; + wardat = 'Data of Piezo Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + DIS = 0; + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiPL)+1 < now + datainiPL = datestr(datenum(datainiPL)+1,'yyyy-mm-dd'); + break + else + yesPL = 0; + end + end + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiPL)+1 < now + datainiPL = datestr(datenum(datainiPL)+1,'yyyy-mm-dd'); + break + else + yesPL = 0; + end + end + end + end + end + if DIS ~= 1 && yesPL == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiPiezoLink(1,jj))); + idxND = find(strcmp('No Data',DatiPiezoLink(1,jj))); + idxT = find(strcmp('---',DatiPiezoLink(1,jj))); + idxT2 = find(strcmp('-',DatiPiezoLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiPiezoLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiPiezoLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiPiezoLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiPiezoLink(1,jj))); + idxN = find(strcmp('null',DatiPiezoLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Piezo Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroPL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiPL)+1 < now + datainiPL = datestr(datenum(datainiPL)+1,'yyyy-mm-dd'); + break + else + yesPL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiPL = datestr(datenum(datainiPL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiPiezoLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrPiezoLink(1,jj) = 1; + wardat = 'Data of Piezo Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiPL = datestr(datenum(datainiPL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiPiezoLink(:,jj))); + idxND = find(strcmp('No Data',DatiPiezoLink(:,jj))); + idxT = find(strcmp('---',DatiPiezoLink(:,jj))); + idxT2 = find(strcmp('-',DatiPiezoLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiPiezoLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiPiezoLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiPiezoLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiPiezoLink(:,jj))); + idxN = find(strcmp('null',DatiPiezoLink(:,jj))); + idxRX = find(strcmp('No RX',DatiPiezoLink(:,jj))); + idxI = find(strcmp('id Error',DatiPiezoLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiPiezoLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiPiezoLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiPiezoLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiPiezoLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiPiezoLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiPiezoLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiPiezoLink(:,jj))); + idxDis = find(strcmp('Dis.',DatiPiezoLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + idx = union(idx,idxDis); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiPL = datestr(datenum(datainiPL)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + else + DatiPiezoLink(indice,jj) = DatiPiezoLink(indice-1,jj); + ErrPiezoLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiPiezoLink(nnn,jj))); + if check == 1 + DatiPiezoLink(nnn,jj) = DatiPiezoLink(nnn-1,jj); + ErrPiezoLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Piezo Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiPiezoLink = [DATiniPL str2double(DatiPiezoLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiPiezoLink(a,1) == DatiPiezoLink(a-1,1) + DatiPiezoLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + if NAN == 1 && NuovoZeroPL == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiPiezoLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiPiezoLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiPiezoLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiPiezoLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiPiezoLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniBL ''' and UnitName = ''' IDunitBaro... + ''' and ToolNameID = ''' DTcatenaBaro ''' and NodeType = ''' NodeType '''']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniBL = curs.Data; + Ntempo = DATiniBL; + [r,c] = size(DATiniBL); + saltoBL = 0; + if r==1 && c==1 + textdatBL = 'Warning: error reading Baro Link (control unit data)!'; + fprintf(fileID,fmt,textdatBL); + saltoBL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiBL ''' and UnitName = ''' IDunitBaro ''' and ToolNameID = '''... + DTcatenaBaro ''' and NodeType = ''' NodeType '''']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2BL = curs.Data; + Ndate = DAT2BL; + if saltoBL == 1 + DATiniBL = DAT2BL; + end + Check = size(DAT2BL); + if Check(1,2) > 1 % ho superato il primo giorno + if saltoBL == 0 + DATiniBL = [DATiniBL; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniBL); + Rilancia = 0; + if cD > 1 + T = [cell2mat(DATiniBL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniBL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniBL = T; + else + Rilancia = 1; + end + + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoBL == 0 + if Check(1,2) > 1 % Ho superato il primo giorno + DatiBaroLink = cell(rd+rt,2*rBL); + else + DatiBaroLink = cell(rt,2*rBL); + end + else + DatiBaroLink = cell(rd,2*rBL); + end + NBaroLink = cell2mat(NodoBaroLink(:,2)); + col = 2; + w = 0; + while ii <= rBL + nN = NBaroLink(ii,1); + nNodo = num2str(nN); + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + comando = ['select Val3, Val4 from RawDataView where Date = ''' ... + datainiBL ''' and Time >= ''' tempoiniBL ''' and UnitName = ''' IDunitBaro ... + ''' and ToolNameID = ''' DTcatenaBaro ''' and NodeType = ''' NodeType ... + ''' and NodeNum =' nNodo ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoBL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val3, Val4 from RawDataView where Date > ''' ... + datainiBL ''' and UnitName = ''' IDunitBaro ... + ''' and ToolNameID = ''' DTcatenaBaro ''' and NodeType = ''' ... + NodeType ''' and NodeNum =''' nNodo '''']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoBLd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-1; + if saltoBL == 0 + DatiBaroLink(1:rt,ini_col:col) = DATnodoBL(:,:); + else + DatiBaroLink(1:rd,ini_col:col) = DATnodoBLd(:,:); + end + [rn,~] = size(DATnodoBLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoBLd(i,:) = DATnodoBLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Baro Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoBL == 0 + DatiBaroLink(rt+1:rt+rd,ini_col:col) = DATnodoBLd(:,:); + end + else + DatiBaroLink = DatiBaroLink(1:end,:); + end + okdatBL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rBL) ' Baro Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatBL); + ii = ii+1; + col = col+2; + end + if w == 0 + wardat = 'There are not warning for Baro Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiBaroLink); + ErrBaroLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiBL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + if strcmp(IDcentralina,'ID0075')==1 && strcmp(DTcatena,'DT0117')==1 + RawDate = 1; + elseif strcmp(IDcentralina,'ID0214')==1 && strcmp(DTcatena,'DT0116')==1 + RawDate = 1; + Rilancia = 0; + DATiniBL = DATiniPL-0.001; + end + % --- Codice per il primo dato --- + for jj=1:c + if Rilancia == 1 + NAN = 0; + ESCI = 1; + datainiBL = datestr(datenum(datainiBL)-1,'yyyy-mm-dd'); + break + end + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiBaroLink(1,jj))); + idxND = find(strcmp('No Data',DatiBaroLink(1,jj))); + idxT = find(strcmp('---',DatiBaroLink(1,jj))); + idxT2 = find(strcmp('-',DatiBaroLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiBaroLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiBaroLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiBaroLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiBaroLink(1,jj))); + idxN = find(strcmp('null',DatiBaroLink(1,jj))); + idxF = find(str2double(cell2mat(DatiBaroLink(1,1)))<10500); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxF); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Baro Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiBL)+1 < now + datainiBL = datestr(datenum(datainiBL)+1,'yyyy-mm-dd'); + break + else + yesBL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiBL = datestr(datenum(datainiBL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiBaroLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrBaroLink(1,jj) = 1; + wardat = 'Data of Baro Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiBL = datestr(datenum(datainiBL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + idxF = []; + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiBaroLink(:,jj))); + idxND = find(strcmp('No Data',DatiBaroLink(:,jj))); + idxT = find(strcmp('---',DatiBaroLink(:,jj))); + idxT2 = find(strcmp('-',DatiBaroLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiBaroLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiBaroLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiBaroLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiBaroLink(:,jj))); + idxN = find(strcmp('null',DatiBaroLink(:,jj))); + for ii = 1:r + if str2double(cell2mat(DatiBaroLink(ii,1))) < 9500 + idxF = [idxF; ii]; + end + end + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxF); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiBL = datestr(datenum(datainiBL)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + else + DatiBaroLink(indice,jj) = DatiBaroLink(indice-1,jj); + ErrBaroLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiBaroLink(nnn,jj))); + if check == 1 + DatiBaroLink(nnn,jj) = DatiBaroLink(nnn-1,jj); + ErrBaroLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Baro Link data done!']; + fprintf(fileID,fmt,corrdat); + + % Concateno informazioni generali e/o letture dai nodi. + + % se barometro e piezometro non appartengono alla stessa catena, interpolo + % i dati + if Rilancia == 0 + if B==0 + DATIBaro = str2double(DatiBaroLink); + if datenum(DATiniBL(end,1)) < datenum(DATiniPL(end,1)) % Uso solo l'ultimo dato del barometro + [rP,~] = size(DATiniPL); + DATIBaro = zeros(rP,2); + for b = 1:rP + DATIBaro(b,1:2) = str2double(DatiBaroLink(end,1:2)); + end + DatiBaroLink = [DATiniPL DATIBaro]; + else + DATIBaroInt = interp1(DATiniBL(:,1),DATIBaro(:,1),DATiniPL(:,1)); + DATIBaroTemp = interp1(DATiniBL(:,1),DATIBaro(:,2),DATiniPL(:,1)); + DatiBaroLink = [DATiniPL DATIBaroInt DATIBaroTemp]; + log = isnan(DatiBaroLink(:,:)); + [rL,cL] = size(log); + for check = 1:rL + for control = 1:cL + if log(check,control) == 1 + if check == 1 % è proprio la prima data ad essere Nan, ciò significa che il barometro è stato installato dopo il piezometro + i = 2; + while log(i,control) == 1 + i = i+1; + end + DatiBaroLink(check,control) = DatiBaroLink(i,control); + else + DatiBaroLink(check,control) = DatiBaroLink(check-1,control); + end + end + end + end + end + else + DATIBaro = str2double(DatiBaroLink); + DatiBaroLink = [DATiniBL DATIBaro]; + end + % Elimino eventuali date doppie + a = 2; + [r,~] = size(DatiBaroLink); + while a <= r + if DatiBaroLink(a,1) == DatiBaroLink(a-1,1) + DatiBaroLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + text = ['Barometer data conversion for chain ' IDunitBaro ' - ' DTcatenaBaro ' done']; + fprintf(fileID,fmt,text); + end + end + if NuovoZeroBL == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiBaroLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiBaroLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiBaroLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiBaroLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiBaroLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1) datenum(datainiBL) + datainiPL = datainiBL; + elseif datenum(datainiPL) < datenum(datainiBL) + datainiBL = datainiPL; + else + check_PLvsBL = 1; + end + end + end +end + +%% SOLO Baro Link, NO Piezo Link +if yesBL == 1 && yesPL == 0 + NAN = 0; + RawDataFile = ['' IDcentralina '-' DTcatena '-BL-RawData.csv']; % Generico per MUMS + while NAN == 0 + if datenum(datainiBL) == datenum(Data(1,1)) + tempoiniBL = char(Data(1,2)); + end + % Scarico dei dati relativi alla centralina con informazioni di Data e ora, livello batteria e temperatura + % Step 1 (vedi commento più avanti) + NodeType = 'Baro Link'; + comando = ['select Date, Time from RawDataView where Date = ''' ... + datainiBL ''' and Time >= ''' tempoiniBL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType '''']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniBL = curs.Data; + Ntempo = DATiniBL; + [r,c] = size(DATiniBL); + saltoBL = 0; + if r==1 && c==1 + textdatBL = 'Warning: error reading Baro Link (control unit data)!'; + fprintf(fileID,fmt,textdatBL); + saltoBL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiBL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType '''']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2BL = curs.Data; + Ndate = DAT2BL; + if saltoBL == 1 + DATiniBL = DAT2BL; + end + Check = size(DAT2BL); + if Check(1,2) > 1 % ho superato il primo giorno + if saltoBL == 0 + DATiniBL = [DATiniBL; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniBL); + if cD ~=1 + T = [cell2mat(DATiniBL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniBL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniBL = T; + else + DATiniBL = []; + end + + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoBL == 0 + if Check(1,2) > 1 % Ho superato il primo giorno + DatiBaroLink = cell(rd+rt,2*rBL); + else + DatiBaroLink = cell(rt,2*rBL); + end + else + DatiBaroLink = cell(rd,2*rBL); + end + NBaroLink = cell2mat(NodoBaroLink(:,2)); + col = 2; + w = 0; + while ii <= rBL + nN = NBaroLink(ii,1); + nNodo = num2str(nN); + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + comando = ['select Val3, Val4 from RawDataView where Date = ''' ... + datainiBL ''' and Time >= ''' tempoiniBL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType ... + ''' and NodeNum =' nNodo ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoBL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val3, Val4 from RawDataView where Date > ''' ... + datainiBL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =''' nNodo '''']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoBLd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-1; + if saltoBL == 0 + DatiBaroLink(1:rt,ini_col:col) = DATnodoBL(:,:); + else + DatiBaroLink(1:rd,ini_col:col) = DATnodoBLd(:,:); + end + [rn,~] = size(DATnodoBLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoBLd(i,:) = DATnodoBLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Baro Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoBL == 0 + DatiBaroLink(rt+1:rt+rd,ini_col:col) = DATnodoBLd(:,:); + end + else + DatiBaroLink = DatiBaroLink(1:end,:); + end + okdatBL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rBL) ' Baro Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatBL); + ii = ii+1; + col = col+2; + end + if w == 0 + wardat = 'There are not warning for Baro Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiBaroLink); + ErrBaroLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroBL== 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiBaroLink(1,jj))); + idxND = find(strcmp('No Data',DatiBaroLink(1,jj))); + idxT = find(strcmp('---',DatiBaroLink(1,jj))); + idxT2 = find(strcmp('-',DatiBaroLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiBaroLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiBaroLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiBaroLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiBaroLink(1,jj))); + idxN = find(strcmp('null',DatiBaroLink(1,jj))); + idxF = find(str2double(cell2mat(DatiBaroLink(1,1)))<12000); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxF); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Baro Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroBL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiBL)+1 < now + datainiBL = datestr(datenum(datainiBL)+1,'yyyy-mm-dd'); + break + else + yesBL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiBL = datestr(datenum(datainiBL)-1,'yyyy-mm-dd'); + break + else + DatiBaroLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrBaroLink(1,jj) = 1; + wardat = 'Data of Baro Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiBaroLink(:,jj))); + idxND = find(strcmp('No Data',DatiBaroLink(:,jj))); + idxT = find(strcmp('---',DatiBaroLink(:,jj))); + idxT2 = find(strcmp('-',DatiBaroLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiBaroLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiBaroLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiBaroLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiBaroLink(:,jj))); + idxN = find(strcmp('null',DatiBaroLink(:,jj))); + for ii = 1:r + if str2double(cell2mat(DatiBaroLink(ii,1))) < 12000 + idxF = [idxF; ii]; + end + end + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxF); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiBL = datestr(datenum(datainiBL)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + else + DatiBaroLink(indice,jj) = DatiBaroLink(indice-1,jj); + ErrBaroLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiBaroLink(nnn,jj))); + if check == 1 + DatiBaroLink(nnn,jj) = DatiBaroLink(nnn-1,jj); + ErrBaroLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Baro Link data done!']; + fprintf(fileID,fmt,corrdat); + + % Concateno informazioni generali e/o letture dai nodi. + + % se barometro e piezometro non appartengono alla stessa catena, interpolo + % i dati + if B==0 + DATIBaro = str2double(DatiBaroLink); + DATIBaroInt = interp1(DATiniBL(:,1),DATIBaro(:,1),DATiniPL(:,1)); + DATIBaroTemp = interp1(DATiniBL(:,1),DATIBaro(:,2),DATiniPL(:,1)); + DatiBaroLink = [DATiniPL DATIBaroInt DATIBaroTemp]; + log = isnan(DatiBaroLink(:,:)); + [rL,cL] = size(log); + for check = 1:rL + for control = 1:cL + if log(check,control) == 1 + if check == 1 % è proprio la prima data ad essere Nan, ciò significa che il barometro è stato installato dopo il piezometro + i = 2; + while log(i,control) == 1 + i = i+1; + end + DatiBaroLink(check,control) = DatiBaroLink(i,control); + else + DatiBaroLink(check,control) = DatiBaroLink(check-1,control); + end + end + end + end + else + DATIBaro = str2double(DatiBaroLink); + DatiBaroLink = [DATiniBL DATIBaro]; + end + % Elimino eventuali date doppie + a = 2; + [r,~] = size(DatiBaroLink); + while a <= r + if DatiBaroLink(a,1) == DatiBaroLink(a-1,1) + DatiBaroLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + text = ['Barometer data conversion for chain ' IDcentralina ' - ' DTcatena ' done']; + fprintf(fileID,fmt,text); + end + if NuovoZeroBL == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiBaroLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiBaroLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiBaroLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiBaroLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiBaroLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniLL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumLL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniLL = curs.Data; + Ntempo = DATiniLL; + [r,c] = size(DATiniLL); + saltoLL = 0; + if r==1 && c==1 + textdatLL = 'Warning: error reading Load Link (control unit data)!'; + fprintf(fileID,fmt,textdatLL); + saltoLL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiLL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumLL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2LL = curs.Data; + Ndate = DAT2LL; + if saltoLL == 1 + DATiniLL = DAT2LL; + end + Check = size(DAT2LL); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoLL == 0 + DATiniLL = [DATiniLL; DAT2LL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniLL); + if cD ~=1 + T = [cell2mat(DATiniLL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniLL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniLL = T; + else + DATiniLL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + % creo la matrice per i dati Load Link + if saltoLL == 0 + if Check(1,2) > 1 + DatiLoadLink = cell(rd+rt,rLL); + else + DatiLoadLink = cell(rt,rLL); + end + else + DatiLoadLink = cell(rd,rLL); + end + NLoadLink = cell2mat(NodoLoadLink(:,2)); + col = 1; + ii = 1; + w = 0; + while ii <= rLL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NLoadLink(ii,1); + nNodo = num2str(nN); + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiLL ''' and Time >= ''' tempoiniLL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoLL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiLL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoLLd = curs.Data; + % Concateno i dati relativi a Step 1 e 2 per il nodo ii-esimo. + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoLL == 0 + DatiLoadLink(1:rt,col) = DATnodoLL(:,:); + else + DatiLoadLink(1:rd,col) = DATnodoLL(:,:); + end + + [rn,~] = size(DATnodoLLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoLLd(i,:) = DATnodoLLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Load Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoLL == 0 + DatiLoadLink(rt+1:rt+rd,col) = DATnodoLLd(:,:); + end + else + DatiLoadLink = DatiLoadLink(1:end,:); + end + okdatLL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rLL) ' Load Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatLL); + ii = ii+1; + col = col+1; + end + if w == 0 + wardat = 'There are not warning for Load Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiLoadLink); + ErrLoadLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroLL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiLL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + for jj=1:c + if strcmp('Dis.',DatiLoadLink(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',DatiLoadLink(dis,jj)) == 0 + DatiLoadLink = DatiLoadLink(dis:end,:); + DATiniLL = DATiniLL(dis:end,:); + [r,c] = size(DatiLoadLink); + break + elseif isfile(RawDataFile) == 1 + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiLoadLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrLoadLink(1,jj) = 1; + wardat = 'Data of Load Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + DIS = 0; + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiLL)+1 < now + datainiLL = datestr(datenum(datainiLL)+1,'yyyy-mm-dd'); + break + else + yesLL = 0; + end + end + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiLL)+1 < now + datainiLL = datestr(datenum(datainiLL)+1,'yyyy-mm-dd'); + break + else + yesLL = 0; + end + end + end + end + end + if DIS ~= 1 && yesLL == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiLoadLink(1,jj))); + idxT = find(strcmp('---',DatiLoadLink(1,jj))); + idxT2 = find(strcmp('-',DatiLoadLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiLoadLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiLoadLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiLoadLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiLoadLink(1,jj))); + idxN = find(strcmp('null',DatiLoadLink(1,jj))); + idxRX = find(strcmp('No RX',DatiLoadLink(1,jj))); + idxI = find(strcmp('id Error',DatiLoadLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiLoadLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiLoadLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiLoadLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiLoadLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiLoadLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiLoadLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiLoadLink(1,jj))); + idxND = find(strcmp('No Data',DatiLoadLink(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiLoadLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Load Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroLL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiLL)+1 < now + datainiLL = datestr(datenum(datainiLL)+1,'yyyy-mm-dd'); + break + else + yesLL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiLL = datestr(datenum(datainiLL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiLoadLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrLoadLink(1,jj) = 1; + wardat = 'Data of Load Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiLL = datestr(datenum(datainiLL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiLoadLink(:,jj))); + idxT = find(strcmp('---',DatiLoadLink(:,jj))); + idxT2 = find(strcmp('-',DatiLoadLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiLoadLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiLoadLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiLoadLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiLoadLink(:,jj))); + idxN = find(strcmp('null',DatiLoadLink(:,jj))); + idxRX = find(strcmp('No RX',DatiLoadLink(:,jj))); + idxI = find(strcmp('id Error',DatiLoadLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiLoadLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiLoadLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiLoadLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiLoadLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiLoadLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiLoadLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiLoadLink(:,jj))); + idxND = find(strcmp('No Data',DatiLoadLink(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiLoadLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiLL = datestr(datenum(datainiLL)-1,'yyyy-mm-dd'); + break + else + DatiLoadLink(indice,jj) = DatiLoadLink(indice-1,jj); + ErrLoadLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiLoadLink(nnn,jj))); + if check == 1 + DatiLoadLink(nnn,jj) = DatiLoadLink(nnn-1,jj); + ErrLoadLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Load Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiLoadLink = [DATiniLL str2double(DatiLoadLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiLoadLink(a,1) == DatiLoadLink(a-1,1) + DatiLoadLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + end + if NuovoZeroLL == 1 && yesLL == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiLoadLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiLoadLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiLoadLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiLoadLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiLoadLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniKL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumKL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniKL = curs.Data; + Ntempo = DATiniKL; + [r,c] = size(DATiniKL); + saltoKL = 0; + if r==1 && c==1 + textdatKL = 'Warning: error reading Klino Link (control unit data)!'; + fprintf(fileID,fmt,textdatKL); + saltoKL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiKL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumKL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2KL = curs.Data; + Ndate = DAT2KL; + if saltoKL == 1 + DATiniKL = DAT2KL; + end + Check = size(DAT2KL); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoKL == 0 + DATiniKL = [DATiniKL; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniKL); + if cD ~=1 + T = [cell2mat(DATiniKL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniKL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniKL = T; + else + DATiniKL = []; + end + + % Scarico dati relativi ai singoli nodi + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoKL == 0 + if Check(1,2) > 1 % ho superato il primo giorno + if strcmp(NodoKlinoLink(1,4),'ADC') || strcmp(NodoKlinoLink{1,4} ,'null') ... + || isempty(NodoKlinoLink{1,4}) == 1 || strcmp(NodoKlinoLink{1,4} ,'g') == 1 + DatiKlinoLink = cell(rd+rt,4*rKL); + col = 4; + elseif strcmp(NodoKlinoLink{1,4} ,'Gradi') + DatiKlinoLink = cell(rd+rt,2*rKL); + col = 3; + end + else + if strcmp(NodoKlinoLink(1,4),'ADC') || strcmp(NodoKlinoLink{1,4} ,'null') ... + || isempty(NodoKlinoLink{1,4}) == 1 || strcmp(NodoKlinoLink{1,4} ,'g') == 1 + DatiKlinoLink = cell(rt,4*rKL); + col = 4; + elseif strcmp(NodoKlinoLink{1,4} ,'Gradi') + DatiKlinoLink = cell(rt,2*rKL); + col = 3; + end + end + else + if strcmp(NodoKlinoLink(1,4),'ADC') || strcmp(NodoKlinoLink{1,4} ,'null') ... + || isempty(NodoKlinoLink{1,4}) == 1 || strcmp(NodoKlinoLink{1,4} ,'g') == 1 + DatiKlinoLink = cell(rd,4*rKL); + col = 4; + elseif strcmp(NodoKlinoLink{1,4} ,'Gradi') + DatiKlinoLink = cell(rd,2*rKL); + col = 3; + end + end + NKlinoLink = cell2mat(NodoKlinoLink(:,2)); + + s = 0; + w = 0; + while ii <= rKL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NKlinoLink(ii,1); + nNodo = num2str(nN); + if strcmp(NodoKlinoLink(ii,4),'ADC') || strcmp(NodoKlinoLink{ii,4} ,'null') || isempty(NodoKlinoLink{ii,4}) == 1 + comando = ['select Val0, Val1, Val2, Val6 from RawDataView where Date = ''' datainiKL ''' and Time >= ''' ... + tempoiniKL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoKL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val6 from RawDataView where Date > ''' ... + datainiKL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoKLd = curs.Data; + elseif strcmp(NodoKlinoLink{ii,4} ,'g') == 1 + comando = ['select Val0, Val1, Val2, Val3 from RawDataView where Date = ''' datainiKL ''' and Time >= ''' ... + tempoiniKL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoKL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val3 from RawDataView where Date > ''' ... + datainiKL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoKLd = curs.Data; + elseif strcmp(NodoKlinoLink{ii,4} ,'Gradi') + if NodoKlinoLink{ii,5} == 4 + comando = ['select Val0, Val1, Val2, Val3 from RawDataView where Date = ''' datainiKL ''' and Time >= ''' ... + tempoiniKL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoKL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val3 from RawDataView where Date > ''' ... + datainiKL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoKLd = curs.Data; + else + comando = ['select Val0, Val1, Val2 from RawDataView where Date = ''' datainiKL ''' and Time >= ''' ... + tempoiniKL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoKL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2 from RawDataView where Date > ''' ... + datainiKL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoKLd = curs.Data; + end + end + s = s+1; + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if strcmp(NodoKlinoLink(ii,4),'ADC') || strcmp(NodoKlinoLink{ii,4} ,'null') ... + || isempty(NodoKlinoLink{ii,4}) == 1 || strcmp(NodoKlinoLink{ii,4} ,'g') + ini_col = col-3; + elseif strcmp(NodoKlinoLink{ii,4} ,'Gradi') + if NodoKlinoLink{ii,5} == 4 + ini_col = col-3; + else + ini_col = col-2; + end + end + if saltoKL == 0 + DatiKlinoLink(1:rt,ini_col:col) = DATnodoKL(:,:); + else + DatiKlinoLink(1:rd,ini_col:col) = DATnodoKLd(:,:); + end + + [rn,~] = size(DATnodoKLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoKLd(i,:) = DATnodoKLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Klino Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoKL == 0 + DatiKlinoLink(rt+1:rt+rd,ini_col:col) = DATnodoKLd(:,:); + end + else + DatiKlinoLink = DatiKlinoLink(1:end,:); + end + okdatKL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rKL) ' Klino Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatKL); + if strcmp(NodoKlinoLink(ii,4),'ADC') || strcmp(NodoKlinoLink{ii,4} ,'null') ... + || isempty(NodoKlinoLink{ii,4}) == 1 || strcmp(NodoKlinoLink{ii,4} ,'g') + col = col+4; + elseif strcmp(NodoKlinoLink{ii,4} ,'Gradi') + if NodoKlinoLink{ii,5} == 4 + col = col+4; + else + col = col+3; + end + end + ii = ii+1; + end + if w == 0 + wardat = 'There are not warning for Klino Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiKlinoLink); + ErrKlinoLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroKL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiKL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiKlinoLink(1,jj))); + idxND = find(strcmp('No Data',DatiKlinoLink(1,jj))); + idxT = find(strcmp('---',DatiKlinoLink(1,jj))); + idxT2 = find(strcmp('-',DatiKlinoLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiKlinoLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiKlinoLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiKlinoLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiKlinoLink(1,jj))); + idxN = find(strcmp('null',DatiKlinoLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Klino Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroKL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiKL)+1 < now + datainiKL = datestr(datenum(datainiKL)+1,'yyyy-mm-dd'); + break + else + yesKL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiKL = datestr(datenum(datainiKL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiKlinoLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrKlinoLink(1,jj) = 1; + wardat = 'Data of Klino Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiKL = datestr(datenum(datainiKL)-1,'yyyy-mm-dd'); + break + end + end + end + end + if ESCI == 0 + % Cerco i multipli di 4 per identificare le temperature + if strcmp(NodoKlinoLink(1,4),'ADC') == 1 || strcmp(NodoKlinoLink{1,4} ,'null') == 1 ... + || isempty(NodoKlinoLink{1,4}) == 1 || strcmp(NodoKlinoLink{1,4} ,'g') == 1 + Int = jj/4; + elseif strcmp(NodoKlinoLink{1,4} ,'Gradi') + Int = rKL+1; % NON filtro mai + end + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiKlinoLink(1,jj)) > 1000 + if rDR==1 && cDR==1 || NuovoZeroKL == 0 + NAN = 0; + ESCI = 1; + if datenum(datainiKL)+1 < now + datainiKL = datestr(datenum(datainiKL)+1,'yyyy-mm-dd'); + break + else + yesKL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiKL = datestr(datenum(datainiKL)-1,'yyyy-mm-dd'); + break + else + DatiKlinoLink(1,jj-3) = cellstr(num2str(DatiRaw(RawDate(end),jj-2))); + DatiKlinoLink(1,jj-2) = cellstr(num2str(DatiRaw(RawDate(end),jj-1))); + DatiKlinoLink(1,jj-1) = cellstr(num2str(DatiRaw(RawDate(end),jj))); + DatiKlinoLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrKlinoLink(1,jj) = 1; + wardat = ['Data of Klino Link nodes corrected using Raw Data of reference Csv file. '... + 'MEMS was read as an electrolytic cell']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiKlinoLink(:,jj))); + idxND = find(strcmp('No Data',DatiKlinoLink(:,jj))); + idxT = find(strcmp('---',DatiKlinoLink(:,jj))); + idxT2 = find(strcmp('-',DatiKlinoLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiKlinoLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiKlinoLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiKlinoLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiKlinoLink(:,jj))); + idxN = find(strcmp('null',DatiKlinoLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiKL = datestr(datenum(datainiKL)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + else + DatiKlinoLink(indice,jj) = DatiKlinoLink(indice-1,jj); + ErrKlinoLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + for ii = 2:r + % Cerco i multipli di 4 per identificare le temperature + if strcmp(NodoKlinoLink(1,4),'ADC') || strcmp(NodoKlinoLink{1,4} ,'null') || isempty(NodoKlinoLink{1,4}) == 1 + Int = jj/4; + elseif strcmp(NodoKlinoLink{1,4} ,'Gradi') + Int = rKL+1; % NON filtro mai + end + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiKlinoLink(ii,jj)) > 1000 + DatiKlinoLink(ii,jj-3:jj) = DatiKlinoLink(ii-1,jj-3:jj); + ErrKlinoLink(ii,jj) = 1; + wardat = ['Data of Klino Link nodes corrected using Raw Data of reference Csv file. '... + 'MEMS was read as an electrolytic cell']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiKlinoLink(nnn,jj))); + if check == 1 + DatiKlinoLink(nnn,jj) = DatiKlinoLink(nnn-1,jj); + ErrKlinoLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Klino Link data done!']; + fprintf(fileID,fmt,corrdat); + DatiKlinoLink = [DATiniKL str2double(DatiKlinoLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiKlinoLink(a,1) == DatiKlinoLink(a-1,1) + DatiKlinoLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + if NuovoZeroKL == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiKlinoLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiKlinoLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiKlinoLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiKlinoLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiKlinoLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniKLHR ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumKLHR ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniKLHR = curs.Data; + Ntempo = DATiniKLHR; + [r,c] = size(DATiniKLHR); + saltoKLHR = 0; + if r==1 && c==1 + textdatKLHR = 'Warning: error reading Klino Link HR (control unit data)!'; + fprintf(fileID,fmt,textdatKLHR); + saltoKLHR = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiKLHR ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumKLHR ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2KLHR = curs.Data; + Ndate = DAT2KLHR; + if saltoKLHR == 1 + DATiniKLHR = DAT2KLHR; + end + Check = size(DAT2KLHR); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoKLHR == 0 + DATiniKLHR = [DATiniKLHR; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniKLHR); + if cD ~=1 + T = [cell2mat(DATiniKLHR(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniKLHR(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniKLHR = T; + else + DATiniKLHR = []; + end + + % Scarico dati relativi ai singoli nodi + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoKLHR == 0 + if Check(1,2) > 1 % ho superato il primo giorno + if strcmp(NodoKlinoLink(1,4),'IPTM') == 1 + DatiKlinoLinkHR = cell(rd+rt,3*rKLHR); + else + DatiKlinoLinkHR = cell(rd+rt,6*rKLHR); + end + else + if strcmp(NodoKlinoLink(1,4),'IPTM') == 1 + DatiKlinoLinkHR = cell(rt,3*rKLHR); + else + DatiKlinoLinkHR = cell(rt,6*rKLHR); + end + end + else + if strcmp(NodoKlinoLink(1,4),'IPTM') == 1 + DatiKlinoLinkHR = cell(rd,3*rKLHR); + else + DatiKlinoLinkHR = cell(rd,6*rKLHR); + end + end + NKlinoLinkHR = cell2mat(NodoKlinoLinkHR(:,2)); + if strcmp(NodoKlinoLink(1,4),'IPTM') == 1 + col = 3; + else + col = 6; + end + s = 0; + w = 0; + while ii <= rKLHR + nN = NKlinoLinkHR(rKLHR-s,1); + nNodo = num2str(nN); + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + if strcmp(NodoKlinoLink(1,4),'IPTM') == 1 + comando = ['select Val0, Val1, Val2 from RawDataView where Date = ''' datainiKLHR ''' and Time >= ''' ... + tempoiniKLHR ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoKLHR = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2 from RawDataView where Date > ''' ... + datainiKLHR ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoKLHRd = curs.Data; + ini_col = col-2; + else + comando = ['select Val0, Val1, Val3, Val4, Val5, Val6 from RawDataView where Date = '''... + datainiKLHR ''' and Time >= ''' tempoiniKLHR ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoKLHR = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val3, Val4, Val5, Val6 from RawDataView where Date > ''' ... + datainiKLHR ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoKLHRd = curs.Data; + ini_col = col-5; + end + s = s+1; + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + + if saltoKLHR == 0 + DatiKlinoLinkHR(1:rt,ini_col:col) = DATnodoKLHR(:,:); + else + DatiKlinoLinkHR(1:rd,ini_col:col) = DATnodoKLHRd(:,:); + end + + [rn,~] = size(DATnodoKLHRd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoKLHRd(i,:) = DATnodoKLHRd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Klino Link HR ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoKLHR == 0 + DatiKlinoLinkHR(rt+1:rt+rd,ini_col:col) = DATnodoKLHRd(:,:); + end + else + DatiKlinoLinkHR = DatiKlinoLinkHR(1:end,:); + end + okdatKLHR = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rKLHR) ' Klino Link HR nodes downloaded correctly']; + fprintf(fileID,fmt,okdatKLHR); + ii = ii+1; + if strcmp(NodoKlinoLink(1,4),'IPTM') == 1 + col = col+3; + else + col = col+6; + end + end + wardat = 'There are not warning for Klino Link HR!'; + fprintf(fileID,fmt,wardat); + if w == 0 + wardat = 'There are not warning for Klino Link HR!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiKlinoLinkHR); + ErrKlinoLinkHR = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroKLHR == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiKLHR)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiKlinoLinkHR(1,jj))); + idxND = find(strcmp('No Data',DatiKlinoLinkHR(1,jj))); + idxT = find(strcmp('---',DatiKlinoLinkHR(1,jj))); + idxT2 = find(strcmp('-',DatiKlinoLinkHR(1,jj))); + idxE2 = find(strcmp('Err2',DatiKlinoLinkHR(1,jj))); + idxE255 = find(strcmp('Err255',DatiKlinoLinkHR(1,jj))); + idxD = find(strcmp('DMUXe',DatiKlinoLinkHR(1,jj))); + idxE1F = find(strcmp('Err1File',DatiKlinoLinkHR(1,jj))); + idxN = find(strcmp('null',DatiKlinoLinkHR(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Klino Link HR nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroKLHR == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiKLHR)+1 < now + datainiKLHR = datestr(datenum(datainiKLHR)+1,'yyyy-mm-dd'); + break + else + yesKLHR = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiKLHR = datestr(datenum(datainiKLHR)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiKlinoLinkHR(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrKlinoLinkHR(1,jj) = 1; + wardat = 'Data of Klino Link HR nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiKLHR = datestr(datenum(datainiKLHR)-1,'yyyy-mm-dd'); + break + end + end + end + end + if ESCI == 0 + % Cerco i multipli di 6 per identificare le temperature + if strcmp(NodoKlinoLink(1,4),'IPTM') == 1 + else + Int = jj/6; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiKlinoLinkHR(1,jj)) < 500 + if rDR==1 && cDR==1 || NuovoZeroKLHR == 0 + NAN = 0; + ESCI = 1; + if datenum(datainiKLHR)+1 < now + datainiKLHR = datestr(datenum(datainiKLHR)+1,'yyyy-mm-dd'); + break + else + yesKLHR = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + if datenum(datainiKLHR)+1 < now + datainiKLHR = datestr(datenum(datainiKLHR)+1,'yyyy-mm-dd'); + break + else + yesKLHR = 0; + end + else + DatiKlinoLinkHR(1,jj-5) = cellstr(num2str(DatiRaw(RawDate(end),jj-4))); + DatiKlinoLinkHR(1,jj-4) = cellstr(num2str(DatiRaw(RawDate(end),jj-3))); + DatiKlinoLinkHR(1,jj-3) = cellstr(num2str(DatiRaw(RawDate(end),jj-2))); + DatiKlinoLinkHR(1,jj-2) = cellstr(num2str(DatiRaw(RawDate(end),jj-1))); + DatiKlinoLinkHR(1,jj-1) = cellstr(num2str(DatiRaw(RawDate(end),jj))); + DatiKlinoLinkHR(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrKlinoLinkHR(1,jj) = 1; + wardat = ['Data of Klino Link HR nodes corrected using Raw Data of reference Csv file. '... + 'Electrolytic cell was read as the corresponding MEMS']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiKlinoLinkHR(:,jj))); + idxND = find(strcmp('No Data',DatiKlinoLinkHR(:,jj))); + idxT = find(strcmp('---',DatiKlinoLinkHR(:,jj))); + idxT2 = find(strcmp('-',DatiKlinoLinkHR(:,jj))); + idxE2 = find(strcmp('Err2',DatiKlinoLinkHR(:,jj))); + idxE255 = find(strcmp('Err255',DatiKlinoLinkHR(:,jj))); + idxD = find(strcmp('DMUXe',DatiKlinoLinkHR(:,jj))); + idxE1F = find(strcmp('Err1File',DatiKlinoLinkHR(:,jj))); + idxN = find(strcmp('null',DatiKlinoLinkHR(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiKLHR = datestr(datenum(datainiKLHR)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + else + DatiKlinoLinkHR(indice,jj) = DatiKlinoLinkHR(indice-1,jj); + ErrKlinoLinkHR(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if strcmp(NodoKlinoLink(1,4),'IPTM') == 1 + else + for ii = 2:r + % Cerco i multipli di 6 per identificare le temperature + Int = jj/6; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiKlinoLinkHR(ii,jj)) < 500 + DatiKlinoLinkHR(ii,jj-5:jj) = DatiKlinoLinkHR(ii-1,jj-5:jj); + ErrKlinoLinkHR(ii,jj) = 1; + wardat = ['Data of Klino Link HR nodes corrected using Raw Data of reference Csv file. '... + 'Electrolytic cell was read as a MEMS']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiKlinoLinkHR(nnn,jj))); + if check == 1 + DatiKlinoLinkHR(nnn,jj) = DatiKlinoLinkHR(nnn-1,jj); + ErrKlinoLinkHR(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Klino Link HR data done!']; + fprintf(fileID,fmt,corrdat); + DatiKlinoLinkHR = [DATiniKLHR str2double(DatiKlinoLinkHR)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiKlinoLinkHR(a,1) == DatiKlinoLinkHR(a-1,1) + DatiKlinoLinkHR(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + if NuovoZeroKLHR == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiKlinoLinkHR(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiKlinoLinkHR(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiKlinoLinkHR(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiKlinoLinkHR(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiKlinoLinkHR; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniRL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumRL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniRL = curs.Data; + Ntempo = DATiniRL; + [r,c] = size(DATiniRL); + saltoRL = 0; + if r==1 && c==1 + textdatRL = 'Warning: error reading Rain Link (control unit data)!'; + fprintf(fileID,fmt,textdatRL); + saltoRL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiRL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumRL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2RL = curs.Data; + Ndate = DAT2RL; + if saltoRL == 1 + DATiniRL = DAT2RL; + end + Check = size(DAT2RL); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoRL == 0 + DATiniRL = [DATiniRL; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniRL); + if cD ~=1 + T = [cell2mat(DATiniRL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniRL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniRL = T; + else + DATiniRL = []; + end + + % Scarico dati relativi ai singoli nodi + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoRL == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiRainLink = cell(rd+rt,1*rRL); + else + DatiRainLink = cell(rt,1*rRL); + end + else + DatiRainLink = cell(rd,1*rRL); + end + NRainLink = cell2mat(NodoRainLink(:,2)); + col = 1; + w = 0; + while ii <= rRL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NRainLink(ii,1); + nNodo = num2str(nN); + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiRL ''' and Time >= ''' tempoiniRL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiRL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRLd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoRL == 0 + DatiRainLink(1:rt,col) = DATnodoRL(:,:); + else + DatiRainLink(1:rd,col) = DATnodoRLd(:,:); + end + + [rn,~] = size(DATnodoRLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoRLd(i,:) = DATnodoRLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Rain Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoRL == 0 + DatiRainLink(rt+1:rt+rd,col) = DATnodoRLd(:,:); + end + else + DatiRainLink = DatiRainLink(1:end,:); + end + okdatRL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rRL) ' Rain Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatRL); + ii = ii+1; + col = col+1; + end + if w == 0 + wardat = 'There are not warning for Rain Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiRainLink); + ErrRainLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroRL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiRL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiRainLink(1,jj))); + idxND = find(strcmp('No Data',DatiRainLink(1,jj))); + idxT = find(strcmp('---',DatiRainLink(1,jj))); + idxT2 = find(strcmp('-',DatiRainLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiRainLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiRainLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiRainLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiRainLink(1,jj))); + idxN = find(strcmp('null',DatiRainLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Rain Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroRL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiRL)+1 < now + datainiRL = datestr(datenum(datainiRL)+1,'yyyy-mm-dd'); + break + else + yesRL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiRL = datestr(datenum(datainiRL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiRainLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrRainLink(1,jj) = 1; + wardat = 'Data of Rain Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiRL = datestr(datenum(datainiRL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiRainLink(:,jj))); + idxND = find(strcmp('No Data',DatiRainLink(:,jj))); + idxT = find(strcmp('---',DatiRainLink(:,jj))); + idxT2 = find(strcmp('-',DatiRainLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiRainLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiRainLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiRainLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiRainLink(:,jj))); + idxN = find(strcmp('null',DatiRainLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiRL = datestr(datenum(datainiRL)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + else + DatiRainLink(indice,jj) = DatiRainLink(indice-1,jj); + ErrRainLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiRainLink(nnn,jj))); + if check == 1 + DatiRainLink(nnn,jj) = DatiRainLink(nnn-1,jj); + ErrRainLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Rain Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiRainLink = [DATiniRL str2double(DatiRainLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiRainLink(a,1) == DatiRainLink(a-1,1) + DatiRainLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + if NuovoZeroRL == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiRainLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiRainLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiRainLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiRainLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiRainLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniSPP ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumSPP ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniSPP = curs.Data; + Ntempo = DATiniSPP; + [r,c] = size(DATiniSPP); + saltoSPP = 0; + if r==1 && c==1 + textdatSPP = 'Warning: error reading SPP Link (control unit data)!'; + fprintf(fileID,fmt,textdatSPP); + saltoSPP = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiSPP ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumSPP ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2SPP = curs.Data; + Ndate = DAT2SPP; + if saltoSPP == 1 + DATiniSPP = DAT2SPP; + end + Check = size(DAT2SPP); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoSPP == 0 + DATiniSPP = [DATiniSPP; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniSPP); + if cD ~=1 + T = [cell2mat(DATiniSPP(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniSPP(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniSPP = T; + else + DATiniSPP = []; + end + + % Scarico dati relativi ai singoli nodi + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoSPP == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiSPPLink = cell(rd+rt,1*rSPP); + else + DatiSPPLink = cell(rt,1*rSPP); + end + else + DatiSPPLink = cell(rd,1*rSPP); + end + NSPPLink = cell2mat(NodoSPPLink(:,2)); + col = 1; + w = 0; + while ii <= rSPP + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NSPPLink(ii,1); + nNodo = num2str(nN); + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiSPP ''' and Time >= ''' tempoiniSPP ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoSPP = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiSPP ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoSPPd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoSPP == 0 + DatiSPPLink(1:rt,col) = DATnodoSPP(:,:); + else + DatiSPPLink(1:rd,col) = DATnodoSPPd(:,:); + end + + [rn,~] = size(DATnodoSPPd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoSPPd(i,:) = DATnodoSPPd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node SPP Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoSPP == 0 + DatiSPPLink(rt+1:rt+rd,col) = DATnodoSPPd(:,:); + end + else + DatiSPPLink = DatiSPPLink(1:end,:); + end + okdatSPP = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rSPP) ' SPP Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatSPP); + ii = ii+1; + col = col+1; + end + if w == 0 + wardat = 'There are not warning for SPP Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiSPPLink); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroSPP == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiSPP)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiSPPLink(1,jj))); + idxND = find(strcmp('No Data',DatiSPPLink(1,jj))); + idxT = find(strcmp('---',DatiSPPLink(1,jj))); + idxT2 = find(strcmp('-',DatiSPPLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiSPPLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiSPPLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiSPPLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiSPPLink(1,jj))); + idxN = find(strcmp('null',DatiSPPLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of SPP Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroSPP == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiSPP)+1 < now + datainiSPP = datestr(datenum(datainiSPP)+1,'yyyy-mm-dd'); + break + else + yesSPP = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiSPP = datestr(datenum(datainiSPP)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiSPPLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + wardat = 'Data of SPP Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiSPP = datestr(datenum(datainiSPP)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiSPPLink(:,jj))); + idxND = find(strcmp('No Data',DatiSPPLink(:,jj))); + idxT = find(strcmp('---',DatiSPPLink(:,jj))); + idxT2 = find(strcmp('-',DatiSPPLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiSPPLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiSPPLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiSPPLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiSPPLink(:,jj))); + idxN = find(strcmp('null',DatiSPPLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiSPP = datestr(datenum(datainiSPP)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + else + DatiSPPLink(indice,jj) = DatiSPPLink(indice-1,jj); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiSPPLink(nnn,jj))); + if check == 1 + DatiSPPLink(nnn,jj) = DatiSPPLink(nnn-1,jj); + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of SPP Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiSPPLink = [DATiniSPP str2double(DatiSPPLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiSPPLink(a,1) == DatiSPPLink(a-1,1) + DatiSPPLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + if NuovoZeroSPP == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiSPPLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiSPPLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiSPPLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiSPPLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiSPPLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniThL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumThL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniThL = curs.Data; + Ntempo = DATiniThL; + [r,c] = size(DATiniThL); + saltoThL = 0; + if r==1 && c==1 + textdatThL = 'Warning: error reading Therm Link (control unit data)!'; + fprintf(fileID,fmt,textdatThL); + saltoThL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiThL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumThL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2ThL = curs.Data; + Ndate = DAT2ThL; + if saltoThL == 1 + DATiniThL = DAT2ThL; + end + Check = size(DAT2ThL); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoThL == 0 + DATiniThL = [DATiniThL; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniThL); + if cD ~=1 + T = [cell2mat(DATiniThL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniThL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniThL = T; + else + DATiniThL = []; + end + + % Scarico dati relativi ai singoli nodi + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoThL == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiThermLink = cell(rd+rt,1*rThL); + else + DatiThermLink = cell(rt,1*rThL); + end + else + DatiThermLink = cell(rd,1*rThL); + end + NThermLink = cell2mat(NodoThermLink(:,2)); + col = 1; + w = 0; + while ii <= rThL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NThermLink(ii,1); + nNodo = num2str(nN); + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiThL ''' and Time >= ''' tempoiniThL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoThL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiThL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoThLd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoThL == 0 + DatiThermLink(1:rt,col) = DATnodoThL(:,:); + else + DatiThermLink(1:rd,col) = DATnodoThLd(:,:); + end + + [rn,~] = size(DATnodoThLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoThLd(i,:) = DATnodoThLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Therm Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoThL == 0 + DatiThermLink(rt+1:rt+rd,col) = DATnodoThLd(:,:); + end + else + DatiThermLink = DatiThermLink(1:end,:); + end + okdatThL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rThL) ' Therm Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatThL); + ii = ii+1; + col = col+1; + end + wardat = 'There are not warning for Therm Link!'; + fprintf(fileID,fmt,wardat); + if w == 0 + wardat = 'There are not warning for Therm Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiThermLink); + ErrThermLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroThL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiThL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiThermLink(1,jj))); + idxND = find(strcmp('No Data',DatiThermLink(1,jj))); + idxT = find(strcmp('---',DatiThermLink(1,jj))); + idxT2 = find(strcmp('-',DatiThermLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiThermLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiThermLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiThermLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiThermLink(1,jj))); + idxN = find(strcmp('null',DatiThermLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Therm Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroThL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiThL)+1 < now + datainiThL = datestr(datenum(datainiThL)+1,'yyyy-mm-dd'); + break + else + yesThL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiThL = datestr(datenum(datainiThL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiThermLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrThermLink(1,jj) = 1; + wardat = 'Data of Therm Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiThL = datestr(datenum(datainiThL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiThermLink(:,jj))); + idxND = find(strcmp('No Data',DatiThermLink(:,jj))); + idxT = find(strcmp('---',DatiThermLink(:,jj))); + idxT2 = find(strcmp('-',DatiThermLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiThermLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiThermLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiThermLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiThermLink(:,jj))); + idxN = find(strcmp('null',DatiThermLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiThL = datestr(datenum(datainiThL)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + else + DatiThermLink(indice,jj) = DatiThermLink(indice-1,jj); + ErrThermLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiThermLink(nnn,jj))); + if check == 1 + DatiThermLink(nnn,jj) = DatiThermLink(nnn-1,jj); + ErrThermLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Therm Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiThermLink = [DATiniThL str2double(DatiThermLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiThermLink(a,1) == DatiThermLink(a-1,1) + DatiThermLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + if NuovoZeroThL == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiThermLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiThermLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiThermLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiThermLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiThermLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniPT100 ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumPT100 ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniPT100 = curs.Data; + Ntempo = DATiniPT100; + [r,c] = size(DATiniPT100); + saltoPT100 = 0; + if r==1 && c==1 + textdatPT100 = 'Warning: error reading PT100 Link (control unit data)!'; + fprintf(fileID,fmt,textdatPT100); + saltoPT100 = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiPT100 ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumPT100 ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2PT100 = curs.Data; + Ndate = DAT2PT100; + if saltoPT100 == 1 + DATiniPT100 = DAT2PT100; + end + Check = size(DAT2PT100); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoPT100 == 0 + DATiniPT100 = [DATiniPT100; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniPT100); + if cD ~=1 + T = [cell2mat(DATiniPT100(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniPT100(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniPT100 = T; + else + DATiniPT100 = []; + end + + % Scarico dati relativi ai singoli nodi + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoPT100 == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiPT100Link = cell(rd+rt,1*rPT100); + else + DatiPT100Link = cell(rt,1*rPT100); + end + else + DatiPT100Link = cell(rd,1*rPT100); + end + NPT100Link = cell2mat(NodoPT100Link(:,2)); + col = 1; + w = 0; + while ii <= rPT100 + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NPT100Link(ii,1); + nNodo = num2str(nN); + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiPT100 ''' and Time >= ''' tempoiniPT100 ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPT100 = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiPT100 ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPT100d = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoPT100 == 0 + DatiPT100Link(1:rt,col) = DATnodoPT100(:,:); + else + DatiPT100Link(1:rd,col) = DATnodoPT100d(:,:); + end + + [rn,~] = size(DATnodoPT100d); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoPT100d(i,:) = DATnodoPT100d(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node PT100 Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoPT100 == 0 + DatiPT100Link(rt+1:rt+rd,col) = DATnodoPT100d(:,:); + end + else + DatiPT100Link = DatiPT100Link(1:end,:); + end + okdatPT100 = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rPT100) ' PT100 Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatPT100); + ii = ii+1; + col = col+1; + end + if w == 0 + wardat = 'There are not warning for PT100 Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiPT100Link); + ErrPT100Link = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroPT100 == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiPT100)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + for jj=1:c + if strcmp('Dis.',DatiPT100Link(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',DatiPT100Link(dis,jj)) == 0 + DatiPT100Link = DatiPT100Link(dis:end,:); + DATiniPT100 = DATiniPT100(dis:end,:); + [r,c] = size(DatiPT100Link); + break + elseif isfile(RawDataFile) == 1 + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiPT100Link(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrPT100Link(1,jj) = 1; + wardat = 'Data of Load Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + DIS = 0; + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiPT100)+1 < now + datainiPT100 = datestr(datenum(datainiPT100)+1,'yyyy-mm-dd'); + break + else + yesPT100 = 0; + end + end + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiPT100)+1 < now + datainiPT100 = datestr(datenum(datainiPT100)+1,'yyyy-mm-dd'); + break + else + yesPT100 = 0; + end + end + end + end + end + if DIS ~= 1 && yesPT100 == 1 + % --- Codice per il primo dato --- + for jj=1:c + % --- Codice per il primo dato --- + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiPT100Link(1,jj))); + idxT = find(strcmp('---',DatiPT100Link(1,jj))); + idxT2 = find(strcmp('-',DatiPT100Link(1,jj))); + idxE2 = find(strcmp('Err2',DatiPT100Link(1,jj))); + idxE255 = find(strcmp('Err255',DatiPT100Link(1,jj))); + idxD = find(strcmp('DMUXe',DatiPT100Link(1,jj))); + idxE1F = find(strcmp('Err1File',DatiPT100Link(1,jj))); + idxN = find(strcmp('null',DatiPT100Link(1,jj))); + idxRX = find(strcmp('No RX',DatiPT100Link(1,jj))); + idxI = find(strcmp('id Error',DatiPT100Link(1,jj))); + idxM = find(strcmp('MUX id Error',DatiPT100Link(1,jj))); + idxC = find(strcmp('CH n. Error',DatiPT100Link(1,jj))); + idxC2 = find(strcmp('CH n. Er',DatiPT100Link(1,jj))); + idxU = find(strcmp('Unknown Error',DatiPT100Link(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiPT100Link(1,jj))); + idxNS = find(strcmp('NotSupp',DatiPT100Link(1,jj))); + idxU2 = find(strcmp('Unknown',DatiPT100Link(1,jj))); + idxNA = find(strcmp('NotAv',DatiPT100Link(1,jj))); + idxND = find(strcmp('No Data',DatiPT100Link(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxC2); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of PT100 Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroPT100 == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiPT100)+1 < now + datainiPT100 = datestr(datenum(datainiPT100)+1,'yyyy-mm-dd'); + break + else + yesPT100 = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiPT100 = datestr(datenum(datainiPT100)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiPT100Link(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrPT100Link(1,jj) = 1; + wardat = 'Data of PT100 Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiPT100 = datestr(datenum(datainiPT100)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj = 1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiPT100Link(:,jj))); + idxT = find(strcmp('---',DatiPT100Link(:,jj))); + idxT2 = find(strcmp('-',DatiPT100Link(:,jj))); + idxE2 = find(strcmp('Err2',DatiPT100Link(:,jj))); + idxE255 = find(strcmp('Err255',DatiPT100Link(:,jj))); + idxD = find(strcmp('DMUXe',DatiPT100Link(:,jj))); + idxE1F = find(strcmp('Err1File',DatiPT100Link(:,jj))); + idxN = find(strcmp('null',DatiPT100Link(:,jj))); + idxRX = find(strcmp('No RX',DatiPT100Link(:,jj))); + idxI = find(strcmp('id Error',DatiPT100Link(:,jj))); + idxM = find(strcmp('MUX id Error',DatiPT100Link(:,jj))); + idxC = find(strcmp('CH n. Error',DatiPT100Link(:,jj))); + idxC2 = find(strcmp('CH n. Er',DatiPT100Link(:,jj))); + idxU = find(strcmp('Unknown Error',DatiPT100Link(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiPT100Link(:,jj))); + idxNS = find(strcmp('NotSupp',DatiPT100Link(:,jj))); + idxU2 = find(strcmp('Unknown',DatiPT100Link(:,jj))); + idxNA = find(strcmp('NotAv',DatiPT100Link(:,jj))); + idxND = find(strcmp('No Data',DatiPT100Link(:,jj))); + idxDis = find(strcmp('Dis.',DatiPT100Link(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxC2); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + idx = union(idx,idxDis); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiPT100 = datestr(datenum(datainiPT100)-1,'yyyy-mm-dd'); + break + else + DatiPT100Link(indice,jj) = DatiPT100Link(indice-1,jj); + ErrPT100Link(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiPT100Link(nnn,jj))); + if check == 1 + DatiPT100Link(nnn,jj) = DatiPT100Link(nnn-1,jj); + ErrPT100Link(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of PT100 Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiPT100Link = [DATiniPT100 str2double(DatiPT100Link)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiPT100Link(a,1) == DatiPT100Link(a-1,1) + DatiPT100Link(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + end + if NuovoZeroPT100 == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiPT100Link(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiPT100Link(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiPT100Link(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiPT100Link(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiPT100Link; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniIPL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumIPL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniIPL = curs.Data; + Ntempo = DATiniIPL; + [r,c] = size(DATiniIPL); + saltoIPL = 0; + if r==1 && c==1 + textdatIPL = 'Warning: error reading In Place Link (control unit data)!'; + fprintf(fileID,fmt,textdatIPL); + saltoIPL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiIPL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumIPL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2IPL = curs.Data; + Ndate = DAT2IPL; + if saltoIPL == 1 + DATiniIPL = DAT2IPL; + end + Check = size(DAT2IPL); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoIPL == 0 + DATiniIPL = [DATiniIPL; DAT2IPL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniIPL); + if cD ~=1 + T = [cell2mat(DATiniIPL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniIPL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniIPL = T; + else + DATiniIPL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoIPL == 0 + if Check(1,2) > 1 % ho superato il primo giorno + if strcmp(NodoInPlaceLink(1,4),'0-10 V') + DatiInPlaceLink = cell(rd+rt,3*rIPL); + else + DatiInPlaceLink = cell(rd+rt,7*rIPL); + end + else + if strcmp(NodoInPlaceLink(1,4),'0-10 V') + DatiInPlaceLink = cell(rt,3*rIPL); + else + DatiInPlaceLink = cell(rt,7*rIPL); + end + end + else + if strcmp(NodoInPlaceLink(1,4),'0-10 V') + DatiInPlaceLink = cell(rd,3*rIPL); + else + DatiInPlaceLink = cell(rd,7*rIPL); + end + end + NInPlaceLink = cell2mat(NodoInPlaceLink(:,2)); + ii = 1; + if strcmp(NodoInPlaceLink(1,4),'0-10 V') + col = 3; + else + col = 7; + end + w = 0; + while ii <= rIPL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NInPlaceLink(ii,1); + if strcmp(DTcatena,'DT0116') && strcmp(IDcentralina,'ID0214') + if nN == 9 + nN = 17; + end + elseif strcmp(DTcatena,'DT0117') && strcmp(IDcentralina,'ID0075') + if nN == 10 + nN = 3; + end + end + nNodo = num2str(nN); + if strcmp(NodoInPlaceLink(1,4),'0-10 V') + comando = ['select Val0, Val2, Val4 from RawDataView where Date = ''' ... + datainiIPL ''' and Time >= ''' tempoiniIPL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + else + comando = ['select Val0, Val1, Val2, Val3, Val4, Val5, Val6 from RawDataView where Date = ''' ... + datainiIPL ''' and Time >= ''' tempoiniIPL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + end + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoIPL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + if strcmp(NodoInPlaceLink(1,4),'0-10 V') + comando = ['select Val0, Val2, Val4 from RawDataView where Date > ''' ... + datainiIPL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoIPLd = curs.Data; + else + comando = ['select Val0, Val1, Val2, Val3, Val4, Val5, Val6 from RawDataView where Date > ''' ... + datainiIPL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoIPLd = curs.Data; + end + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if strcmp(NodoInPlaceLink(1,4),'0-10 V') + ini_col = col-2; + else + ini_col = col-6; + end + if saltoIPL == 0 + DatiInPlaceLink(1:rt,ini_col:col) = DATnodoIPL(:,:); + else + DatiInPlaceLink(1:rd,ini_col:col) = DATnodoIPLd(:,:); + end + + [rn,~] = size(DATnodoIPLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoIPLd(i,:) = DATnodoIPLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node In Place Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoIPL == 0 + DatiInPlaceLink(rt+1:rt+rd,ini_col:col) = DATnodoIPLd(:,:); + end + else + DatiInPlaceLink = DatiInPlaceLink(1:end,:); + end + okdatIPL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rIPL) ' In Place Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatIPL); + ii = ii+1; + if strcmp(NodoInPlaceLink(1,4),'0-10 V') + col = col+3; + else + col = col+7; + end + end + if w == 0 + wardat = 'There are not warning for In Place Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiInPlaceLink); + ErrInPlaceLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroIPL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiIPL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + if isempty(RawDate) == 1 + if strcmp(IDcentralina,'ID0075')==1 && strcmp(DTcatena,'DT0117')==1 || ... + strcmp(IDcentralina,'ID0236')==1 && strcmp(DTcatena,'DT0177')==1 + RawDate = 1; + end + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiInPlaceLink(1,jj))); + idxND = find(strcmp('No Data',DatiInPlaceLink(1,jj))); + idxT = find(strcmp('---',DatiInPlaceLink(1,jj))); + idxT2 = find(strcmp('-',DatiInPlaceLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiInPlaceLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiInPlaceLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiInPlaceLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiInPlaceLink(1,jj))); + idxN = find(strcmp('null',DatiInPlaceLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of In Place Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroIPL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiIPL)+1 < now + datainiIPL = datestr(datenum(datainiIPL)+1,'yyyy-mm-dd'); + break + else + yesIPL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiIPL = datestr(datenum(datainiIPL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiInPlaceLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrInPlaceLink(1,jj) = 1; + wardat = 'Data of In Place Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiIPL = datestr(datenum(datainiIPL)-1,'yyyy-mm-dd'); + break + end + end + end + end + if ESCI == 0 + % Cerco i multipli di 7 per identificare le temperature + Int = jj/7; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiInPlaceLink(1,jj)) > 1000 + if rDR==1 && cDR==1 || NuovoZeroIPL == 0 + NAN = 0; + ESCI = 1; + if datenum(datainiIPL)+1 < now + datainiIPL = datestr(datenum(datainiIPL)+1,'yyyy-mm-dd'); + break + else + yesIPL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiIPL = datestr(datenum(datainiIPL)-1,'yyyy-mm-dd'); + break + else + DatiInPlaceLink(1,jj-6) = cellstr(num2str(DatiRaw(RawDate(end),jj-5))); + DatiInPlaceLink(1,jj-5) = cellstr(num2str(DatiRaw(RawDate(end),jj-4))); + DatiInPlaceLink(1,jj-4) = cellstr(num2str(DatiRaw(RawDate(end),jj-3))); + DatiInPlaceLink(1,jj-3) = cellstr(num2str(DatiRaw(RawDate(end),jj-2))); + DatiInPlaceLink(1,jj-2) = cellstr(num2str(DatiRaw(RawDate(end),jj-1))); + DatiInPlaceLink(1,jj-1) = cellstr(num2str(DatiRaw(RawDate(end),jj))); + DatiInPlaceLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrInPlaceLink(1,jj) = 1; + wardat = ['Data of In Place Link nodes corrected using Raw Data of reference Csv file. '... + 'MEMS was read as an electrolytic cell']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiInPlaceLink(:,jj))); + idxND = find(strcmp('No Data',DatiInPlaceLink(:,jj))); + idxT = find(strcmp('---',DatiInPlaceLink(:,jj))); + idxT2 = find(strcmp('-',DatiInPlaceLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiInPlaceLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiInPlaceLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiInPlaceLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiInPlaceLink(:,jj))); + idxN = find(strcmp('null',DatiInPlaceLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiIPL = datestr(datenum(datainiIPL)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + else + DatiInPlaceLink(indice,jj) = DatiInPlaceLink(indice-1,jj); + ErrInPlaceLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + for ii = 2:r + % Cerco i multipli di 7 per identificare le temperature + Int = jj/7; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiInPlaceLink(ii,jj)) > 1000 + DatiInPlaceLink(ii,jj-6:jj) = DatiInPlaceLink(ii-1,jj-6:jj); + ErrInPlaceLink(ii,jj) = 1; + wardat = ['Data of In Place Link nodes corrected using Raw Data of reference Csv file. '... + 'MEMS was read as an electrolytic cell']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + if ESCI == 1 + NAN = 0; + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r % nodi + check = isnan(cell2mat(DatiInPlaceLink(nnn,jj))); + if check == 1 + DatiInPlaceLink(nnn,jj) = DatiInPlaceLink(nnn-1,jj); + ErrInPlaceLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of In Place Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiInPlaceLink = [DATiniIPL str2double(DatiInPlaceLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiInPlaceLink(a,1) == DatiInPlaceLink(a-1,1) + DatiInPlaceLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + if NuovoZeroIPL == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiInPlaceLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiInPlaceLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiInPlaceLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiInPlaceLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiInPlaceLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniIPLHR ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumIPLHR ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniIPLHR = curs.Data; + Ntempo = DATiniIPLHR; + [r,c] = size(DATiniIPLHR); + saltoIPLHR = 0; + if r==1 && c==1 + textdatIPLHR = 'Warning: error reading In Place Link HR (control unit data)!'; + fprintf(fileID,fmt,textdatIPLHR); + saltoIPLHR = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiIPLHR ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumIPLHR ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2IPLHR = curs.Data; + Ndate = DAT2IPLHR; + if saltoIPLHR == 1 + DATiniIPLHR = DAT2IPLHR; + end + Check = size(DAT2IPLHR); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoIPLHR == 0 + DATiniIPLHR = [DATiniIPLHR; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniIPLHR); + if cD ~=1 + T = [cell2mat(DATiniIPLHR(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniIPLHR(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniIPLHR = T; + else + DATiniIPLHR = []; + end + + % Scarico dati relativi ai singoli nodi + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoIPLHR == 0 + if Check(1,2) > 1 % ho superato il primo giorno + if strcmp(NodoInPlaceLinkHR(1,4),'ADC') || strcmp(NodoInPlaceLinkHR{1,4},'null') || isempty(NodoInPlaceLinkHR{1,4}) == 1 + col = 6; + DatiInPlaceLinkHR = cell(rd+rt,col*rIPLHR); + elseif strcmp(NodoInPlaceLinkHR{1,4} ,'digit') + col = 3; + DatiInPlaceLinkHR = cell(rd+rt,col*rIPLHR); + end + else + if strcmp(NodoInPlaceLinkHR(1,4),'ADC') || strcmp(NodoInPlaceLinkHR{1,4},'null') || isempty(NodoInPlaceLinkHR{1,4}) == 1 + col = 6; + DatiInPlaceLinkHR = cell(rt,col*rIPLHR); + elseif strcmp(NodoInPlaceLinkHR{1,4} ,'digit') + col = 3; + DatiInPlaceLinkHR = cell(rt,col*rIPLHR); + end + end + else + if strcmp(NodoInPlaceLinkHR(1,4),'ADC') || strcmp(NodoInPlaceLinkHR{1,4},'null') || isempty(NodoInPlaceLinkHR{1,4}) == 1 + col = 6; + DatiInPlaceLinkHR = cell(rd,col*rIPLHR); + elseif strcmp(NodoInPlaceLinkHR{1,4} ,'digit') + col = 3; + DatiInPlaceLinkHR = cell(rd,col*rIPLHR); + end + end + NInPlaceLinkHR = cell2mat(NodoInPlaceLinkHR(:,2)); + w = 0; + while ii <= rIPLHR + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NInPlaceLinkHR(ii,1); + if strcmp(DTcatena,'DT0116') && strcmp(IDcentralina,'ID0214') + if nN == 6 + nN = 1; + elseif nN == 10 + nN = 18; + end + elseif strcmp(DTcatena,'DT0117') && strcmp(IDcentralina,'ID0075') + if nN == 10 + nN = 3; + end + end + nNodo = num2str(nN); + if strcmp(NodoInPlaceLinkHR(1,4),'ADC') || strcmp(NodoInPlaceLinkHR{1,4},'null') || ... + isempty(NodoInPlaceLinkHR{1,4}) == 1 + comando = ['select Val0, Val1, Val3, Val4, Val5, Val6 from RawDataView where Date = ''' ... + datainiIPLHR ''' and Time >= ''' tempoiniIPLHR ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoIPLHR = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val3, Val4, Val5, Val6 from RawDataView where Date > ''' ... + datainiIPLHR ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoIPLHRd = curs.Data; + ini_col = col-5; + elseif strcmp(NodoInPlaceLinkHR{1,4} ,'digit') + comando = ['select Val0, Val1, Val2 from RawDataView where Date = ''' ... + datainiIPLHR ''' and Time >= ''' tempoiniIPLHR ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoIPLHR = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2 from RawDataView where Date > ''' ... + datainiIPLHR ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoIPLHRd = curs.Data; + ini_col = col-2; + end + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + + if saltoIPLHR == 0 + DatiInPlaceLinkHR(1:rt,ini_col:col) = DATnodoIPLHR(:,:); + else + DatiInPlaceLinkHR(1:rd,ini_col:col) = DATnodoIPLHRd(:,:); + end + + [rn,~] = size(DATnodoIPLHRd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoIPLHRd(i,:) = DATnodoIPLHRd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node In Place Link HR ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoIPLHR == 0 + DatiInPlaceLinkHR(rt+1:rt+rd,ini_col:col) = DATnodoIPLHRd(:,:); + end + else + DatiInPlaceLinkHR = DatiInPlaceLinkHR(1:end,:); + end + okdatIPLHR= ['Data of node number ' num2str(ii) ' of ' ... + num2str(rIPLHR) ' In Place Link HR nodes downloaded correctly']; + fprintf(fileID,fmt,okdatIPLHR); + ii = ii+1; + if strcmp(NodoInPlaceLinkHR(1,4),'ADC') || strcmp(NodoInPlaceLinkHR{1,4},'null') || ... + isempty(NodoInPlaceLinkHR{1,4}) == 1 + col = col+6; + elseif strcmp(NodoInPlaceLinkHR{1,4} ,'digit') + col = col+3; + end + end + if w == 0 + wardat = 'There are not warning for In Place Link HR!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiInPlaceLinkHR); + ErrInPlaceLinkHR = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroIPLHR == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiIPLHR)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + if isempty(RawDate) == 1 + if strcmp(IDcentralina,'ID0075')==1 && strcmp(DTcatena,'DT0117')==1 || ... + strcmp(IDcentralina,'ID0236')==1 && strcmp(DTcatena,'DT0177')==1 + RawDate = 1; + end + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiInPlaceLinkHR(1,jj))); + idxND = find(strcmp('No Data',DatiInPlaceLinkHR(1,jj))); + idxT = find(strcmp('---',DatiInPlaceLinkHR(1,jj))); + idxT2 = find(strcmp('-',DatiInPlaceLinkHR(1,jj))); + idxE2 = find(strcmp('Err2',DatiInPlaceLinkHR(1,jj))); + idxE255 = find(strcmp('Err255',DatiInPlaceLinkHR(1,jj))); + idxD = find(strcmp('DMUXe',DatiInPlaceLinkHR(1,jj))); + idxE1F = find(strcmp('Err1File',DatiInPlaceLinkHR(1,jj))); + idxN = find(strcmp('null',DatiInPlaceLinkHR(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of In Place Link HR nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroIPLHR == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiIPLHR)+1 < now + datainiIPLHR = datestr(datenum(datainiIPLHR)+1,'yyyy-mm-dd'); + break + else + yesIPLHR = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiIPLHR = datestr(datenum(datainiIPLHR)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiInPlaceLinkHR(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrInPlaceLinkHR(1,jj) = 1; + wardat = 'Data of In Place Link HR nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiIPLHR = datestr(datenum(datainiIPLHR)-1,'yyyy-mm-dd'); + break + end + end + end + end + if ESCI == 0 + if strcmp(NodoInPlaceLinkHR(1,3),'ADC') || strcmp(NodoInPlaceLinkHR{1,4} ,'null') || isempty(NodoInPlaceLinkHR{1,4}) == 1 + % Cerco i multipli di 6 per identificare le temperature + Int = jj/6; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiInPlaceLinkHR(1,jj)) < 500 + if rDR==1 && cDR==1 || NuovoZeroIPLHR == 0 + NAN = 0; + ESCI = 1; + if datenum(datainiIPLHR)+1 < now + datainiIPLHR = datestr(datenum(datainiIPLHR)+1,'yyyy-mm-dd'); + break + else + yesIPLHR = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiIPLHR = datestr(datenum(datainiIPLHR)-1,'yyyy-mm-dd'); + break + else + DatiInPlaceLinkHR(1,jj-5) = cellstr(num2str(DatiRaw(RawDate(end),jj-4))); + DatiInPlaceLinkHR(1,jj-4) = cellstr(num2str(DatiRaw(RawDate(end),jj-3))); + DatiInPlaceLinkHR(1,jj-3) = cellstr(num2str(DatiRaw(RawDate(end),jj-2))); + DatiInPlaceLinkHR(1,jj-2) = cellstr(num2str(DatiRaw(RawDate(end),jj-1))); + DatiInPlaceLinkHR(1,jj-1) = cellstr(num2str(DatiRaw(RawDate(end),jj))); + DatiInPlaceLinkHR(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrInPlaceLinkHR(1,jj) = 1; + wardat = ['Data of In Place Link HR nodes corrected using Raw Data of reference Csv file. '... + 'Electrolytic cell was read as the corresponding MEMS']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiInPlaceLinkHR(:,jj))); + idxND = find(strcmp('No Data',DatiInPlaceLinkHR(:,jj))); + idxT = find(strcmp('---',DatiInPlaceLinkHR(:,jj))); + idxT2 = find(strcmp('-',DatiInPlaceLinkHR(:,jj))); + idxE2 = find(strcmp('Err2',DatiInPlaceLinkHR(:,jj))); + idxE255 = find(strcmp('Err255',DatiInPlaceLinkHR(:,jj))); + idxD = find(strcmp('DMUXe',DatiInPlaceLinkHR(:,jj))); + idxE1F = find(strcmp('Err1File',DatiInPlaceLinkHR(:,jj))); + idxN = find(strcmp('null',DatiInPlaceLinkHR(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiIPLHR = datestr(datenum(datainiIPLHR)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + else + DatiInPlaceLinkHR(indice,jj) = DatiInPlaceLinkHR(indice-1,jj); + ErrInPlaceLinkHR(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if strcmp(NodoInPlaceLinkHR(1,3),'ADC') || strcmp(NodoInPlaceLinkHR{1,4} ,'null') || isempty(NodoInPlaceLinkHR{1,4}) == 1 + for ii = 2:r + % Cerco i multipli di 6 per identificare le temperature + Int = jj/6; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiInPlaceLinkHR(ii,jj)) < 500 + DatiInPlaceLinkHR(ii,jj-5:jj) = DatiInPlaceLinkHR(ii-1,jj-5:jj); + ErrInPlaceLinkHR(ii,jj) = 1; + wardat = ['Data of In Place Link HR nodes corrected using Raw Data of reference Csv file. '... + 'MEMS was read as an electrolytic cell']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + ESCI = 0; + end + end + end + end + if ESCI == 1 + NAN = 0; + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiInPlaceLinkHR(nnn,jj))); + if check == 1 + DatiInPlaceLinkHR(nnn,jj) = DatiInPlaceLinkHR(nnn-1,jj); + ErrInPlaceLinkHR(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of In Place Link HR data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiInPlaceLinkHR = [DATiniIPLHR str2double(DatiInPlaceLinkHR)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiInPlaceLinkHR(a,1) == DatiInPlaceLinkHR(a-1,1) + DatiInPlaceLinkHR(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + if NuovoZeroIPLHR == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiInPlaceLinkHR(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiInPlaceLinkHR(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiInPlaceLinkHR(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiInPlaceLinkHR(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiInPlaceLinkHR; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniWL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumWL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniWL = curs.Data; + Ntempo = DATiniWL; + [r,c] = size(DATiniWL); + saltoWL = 0; + if r==1 && c==1 + textdatWL = 'Warning: error reading Weir Link (control unit data)!'; + fprintf(fileID,fmt,textdatWL); + saltoWL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiWL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumWL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2WL = curs.Data; + Ndate = DAT2WL; + if saltoWL == 1 + DATiniWL = DAT2WL; + end + Check = size(DAT2WL); + if Check(1,2) > 1 % ho superato il primo giorno + if saltoWL == 0 + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + DATiniWL = [DATiniWL; DAT2WL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniWL); + if cD ~=1 + T = [cell2mat(DATiniWL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniWL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniWL = T; + else + DATiniWL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + % creo la matrice per i dati Extensometer Link + if saltoWL == 0 + if Check(1,2) > 1 + DatiWeirLink = cell(rd+rt,rWL); + DatiNTCWeirLink = cell(rd+rt,rWL); + else + DatiWeirLink = cell(rt,rWL); + DatiNTCWeirLink = cell(rt,rWL); + end + else + DatiWeirLink = cell(rd,rWL); + DatiNTCWeirLink = cell(rd,rWL); + end + NWeir = cell2mat(NodoWeirLink(:,2)); + col = 1; + ii = 1; + w = 0; + while ii <= rWL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NWeir(ii,1); + nNodo = num2str(nN); + % Dato + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiWL ''' and Time >= ''' tempoiniWL ''' and ToolNameID = ''' ... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoWL = curs.Data; + % Dato + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiWL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = '''... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoWLd = curs.Data; + if Therm(ii) == 0 % Non leggo il termometro + % T + DATnodoWL_NTC = 0; + DATnodoWLd_NTC = 0; + elseif Therm(ii) == 1 + if ChWL(ii,1) == 2 + comando = ['select Val1 from RawDataView where Date = ''' ... + datainiWL ''' and Time >= ''' tempoiniWL ''' and ToolNameID = ''' ... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + elseif ChWL(ii,1) == 3 + comando = ['select Val2 from RawDataView where Date = ''' ... + datainiWL ''' and Time >= ''' tempoiniWL ''' and ToolNameID = ''' ... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + elseif ChWL(ii,1) == 4 + comando = ['select Val3 from RawDataView where Date = ''' ... + datainiWL ''' and Time >= ''' tempoiniWL ''' and ToolNameID = ''' ... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + end + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoWL_NTC = curs.Data; + if ChWL(ii,1) == 2 + comando = ['select Val1 from RawDataView where Date > ''' ... + datainiWL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = '''... + NodeType ''' and NodeNum = ' nNodo '']; + elseif ChWL(ii,1) == 3 + comando = ['select Val2 from RawDataView where Date > ''' ... + datainiWL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = '''... + NodeType ''' and NodeNum = ' nNodo '']; + elseif ChWL(ii,1) == 4 + comando = ['select Val3 from RawDataView where Date > ''' ... + datainiWL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = '''... + NodeType ''' and NodeNum = ' nNodo '']; + end + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoWLd_NTC = curs.Data; + else + % T + DATnodoWL_NTC = 0; + DATnodoWLd_NTC = 0; + end + + [rn,~] = size(DATnodoWLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoWLd(i,:) = DATnodoWLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Weir Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + [rnT,~] = size(DATnodoWLd_NTC); % controllo date + if rnT < rd % normalmente sono uguali + for i = rnT+1:rd + DATnodoWLd_NTC(i,:) = DATnodoWLd_NTC(rnT,:); % se mancano dati, copio gli ultimi + end + wardat = ['NTC of Node Weir Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoWL == 0 + if ChWL(ii,1) >= 2 + if Therm(ii,1)==1 + DatiWeirLink(1:rt,col) = DATnodoWL(:,:); %#ok<*AGROW> + DatiNTCWeirLink(1:rt,col) = DATnodoWL_NTC(:,:); %#ok<*AGROW> + if Check(1,2) > 1 + [rrr,~] = size(DATnodoWLd); + if rrr ~= rd + DatiWeirLink(rt+rd-rrr+1:rt+rd,col) = DATnodoWLd; + DatiNTCWeirLink(rt+rd-rrr+1:rt+rd,col) = DATnodoWLd_NTC; %#ok<*AGROW> + else + DatiWeirLink(rt+1:rt+rd,col) = DATnodoWLd(:,:); + DatiNTCWeirLink(rt+1:rt+rd,col) = DATnodoWLd_NTC(:,:); %#ok<*AGROW> + end + end + else + DatiWeirLink(1:rt,col) = DATnodoWL(:,:); %#ok<*AGROW> + if Check(1,2) > 1 + DatiWeirLink(rt+1:rt+rd,col) = DATnodoWLd(:,:); + end + end + elseif ChWL(ii,1) == 1 + DatiWeirLink(1:rt,col) = DATnodoWL(:,:); %#ok<*AGROW> + if Check(1,2) > 1 + DatiWeirLink(rt+1:rt+rd,col) = DATnodoWLd(:,:); + end + end + else + if ChWL(ii,1) >= 2 + if Therm(ii,1)==1 + DatiWeirLink(1:rd,col) = DATnodoWL(:,:); %#ok<*AGROW> + DatiNTCWeirLink(1:rd,col) = DATnodoWL_NTC(:,:); %#ok<*AGROW> + else + DatiWeirLink(1:rd,col) = DATnodoWL(:,:); %#ok<*AGROW> + end + elseif ChWL(ii,1) == 1 + DatiWeirLink(1:rd,col) = DATnodoWL(:,:); %#ok<*AGROW> + end + end + + okdatWL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rWL) ' Weir Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatWL); + ii = ii+1; + col = col+1; + end + if w == 0 + wardat = 'There are not warning for Weir Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + + % Dati + [r,c] = size(DatiWeirLink); + ErrWeirLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroWL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiWL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + + for jj=1:c + % Se il nodo è Dis., devo aumentare di uno la data (il nodo non + % è ancora stato installato!) + if strcmp('Dis.',DatiWeirLink(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',DatiWeirLink(dis,jj)) == 0 + DatiWeirLink = DatiWeirLink(dis:end,:); + DATiniWL = DATiniWL(dis:end,:); + [r,c] = size(DatiWeirLink); + break + elseif isfile(RawDataFile) == 1 + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiWeirLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrWeirLink(1,jj) = 1; + wardat = 'Data of Weir Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + DIS = 0; + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiWL)+1 < now + datainiWL = datestr(datenum(datainiWL)+1,'yyyy-mm-dd'); + break + else + yesWL = 0; + end + end + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiWL)+1 < now + datainiWL = datestr(datenum(datainiWL)+1,'yyyy-mm-dd'); + break + else + yesWL = 0; + end + end + end + + end + end + if DIS ~= 1 && yesWL == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiWeirLink(1,jj))); + idxT = find(strcmp('---',DatiWeirLink(1,jj))); + idxT2 = find(strcmp('-',DatiWeirLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiWeirLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiWeirLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiWeirLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiWeirLink(1,jj))); + idxN = find(strcmp('null',DatiWeirLink(1,jj))); + idxRX = find(strcmp('No RX',DatiWeirLink(1,jj))); + idxI = find(strcmp('id Error',DatiWeirLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiWeirLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiWeirLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiWeirLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiWeirLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiWeirLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiWeirLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiWeirLink(1,jj))); + idxND = find(strcmp('No Data',DatiWeirLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Stress Meter nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroWL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiWL)+1 < now + datainiWL = datestr(datenum(datainiWL)+1,'yyyy-mm-dd'); + break + else + yesWL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiWL = datestr(datenum(datainiWL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiWeirLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrWeirLink(1,jj) = 1; + wardat = 'Data of Weir Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiWL = datestr(datenum(datainiWL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiWeirLink(:,jj))); + idxT = find(strcmp('---',DatiWeirLink(:,jj))); + idxT2 = find(strcmp('-',DatiWeirLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiWeirLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiWeirLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiWeirLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiWeirLink(:,jj))); + idxN = find(strcmp('null',DatiWeirLink(:,jj))); + idxRX = find(strcmp('No RX',DatiWeirLink(:,jj))); + idxI = find(strcmp('id Error',DatiWeirLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiWeirLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiWeirLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiWeirLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiWeirLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiWeirLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiWeirLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiWeirLink(:,jj))); + idxDis = find(strcmp('Dis.',DatiWeirLink(:,jj))); + idxND = find(strcmp('No Data',DatiWeirLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxDis); + idx = union(idx,idxND); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiWL = datestr(datenum(datainiWL)-1,'yyyy-mm-dd'); + break + else + DatiWeirLink(indice,jj) = DatiWeirLink(indice-1,jj); + ErrWeirLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiWeirLink(nnn,jj))); + if check == 1 + DatiWeirLink(nnn,jj) = DatiWeirLink(nnn-1,jj); + ErrWeirLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Weir Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiWeirLink = [DATiniWL str2double(DatiWeirLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiWeirLink(a,1) == DatiWeirLink(a-1,1) + DatiWeirLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + + if ESCI == 0 + if sum(Therm(:,1))>0 + if DIS ~= 1 && yesWL == 1 + % NTC + [r,c] = size(DatiNTCWeirLink); + Ncorr = 0; + if NuovoZeroWL == 1 + if isfile(RawDataFile) == 1 + DatiRawNTC = csvread(RawDataFileNTC); + [rDR,cDR] = size(DatiRawNTC); + DatiRawNTC(:,1) = DatiRawNTC(:,1) + 730000; + RawDateNTC = find(DatiRawNTC(:,1)<=datenum(datainiWL)); + else + rDR = 1; + cDR = 1; + DatiRawNTC = []; + RawDateNTC = []; + end + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTCWeirLink(1,jj))); + idxND = find(strcmp('No Data',DatiNTCWeirLink(1,jj))); + idxT3 = find(strcmp('---',DatiNTCWeirLink(1,jj))); + idxT = find(strcmp('-',DatiNTCWeirLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiNTCWeirLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiNTCWeirLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiNTCWeirLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiNTCWeirLink(1,jj))); + idxN = find(strcmp('null',DatiNTCWeirLink(1,jj))); + idxRX = find(strcmp('No RX',DatiNTCWeirLink(1,jj))); + idxI = find(strcmp('id Error',DatiNTCWeirLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiNTCWeirLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiNTCWeirLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiNTCWeirLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTCWeirLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiNTCWeirLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiNTCWeirLink(1,jj))); + idxDis = find(strcmp('Dis.',DatiNTCWeirLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiNTCWeirLink(1,jj))); + idx = union(idxE,idxT3); + idx = union(idx,idxT); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxDis); + idx = union(idx,idxNA); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of NTC of Weir Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroWL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiWL)+1 < now + datainiWL = datestr(datenum(datainiWL)+1,'yyyy-mm-dd'); + break + else + yesWL = 0; + end + else + if isempty(RawDateNTC) == 1 + NAN = 0; + ESCI = 1; + datainiWL = datestr(datenum(datainiWL)-1,'yyyy-mm-dd'); + break + else + DatiNTCWeirLink(1,jj) = cellstr(num2str(DatiRawNTC(RawDateNTC(end),jj+1))); + if ErrWeirLink(indice,jj) == 0 + ErrWeirLink(indice,jj) = 0.5; + else + ErrWeirLink(indice,jj) = 1; + end + wardat = 'Data of NTC of Weir Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTCWeirLink(:,jj))); + idxND = find(strcmp('No Data',DatiNTCWeirLink(:,jj))); + idxT3 = find(strcmp('---',DatiNTCWeirLink(:,jj))); + idxT = find(strcmp('-',DatiNTCWeirLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiNTCWeirLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiNTCWeirLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiNTCWeirLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiNTCWeirLink(:,jj))); + idxN = find(strcmp('null',DatiNTCWeirLink(:,jj))); + idxRX = find(strcmp('No RX',DatiNTCWeirLink(:,jj))); + idxI = find(strcmp('id Error',DatiNTCWeirLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiNTCWeirLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiNTCWeirLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiNTCWeirLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTCWeirLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiNTCWeirLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiNTCWeirLink(:,jj))); + idxDis = find(strcmp('Dis.',DatiNTCWeirLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiNTCWeirLink(:,jj))); + idx = union(idxE,idxT3); + idx = union(idx,idxND); + idx = union(idx,idxT); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxDis); + idx = union(idx,idxNA); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiWL = datestr(datenum(datainiWL)-1,'yyyy-mm-dd'); + break + else + DatiNTCWeirLink(indice,jj) = DatiNTCWeirLink(indice-1,jj); + if ErrWeirLink(indice,jj) == 0 + ErrWeirLink(indice,jj) = 0.5; + else + ErrWeirLink(indice,jj) = 1; + end + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiNTCWeirLink(nnn,jj))); + if check == 1 + DatiNTCWeirLink(nnn,jj) = DatiNTCWeirLink(nnn-1,jj); + if ErrWeirLink(indice,jj) == 0 + ErrWeirLink(indice,jj) = 0.5; + else + ErrWeirLink(indice,jj) = 1; + end + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of NTC Weir Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiNTCWeirLink = [DATiniWL str2double(DatiNTCWeirLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiNTCWeirLink(a,1) == DatiNTCWeirLink(a-1,1) + DatiNTCWeirLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + end + end + if NuovoZeroWL == 1 && yesWL == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiWeirLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiWeirLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiWeirLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiWeirLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiWeirLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)0 + [rDR,cDR] = size(DatiRawNTC); + if rDR~=1 && cDR~=1 && isempty(DatiRawNTC) == 0 + RawDate1 = find(DatiRawNTC(:,1)<=DatiNTCWeirLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiNTCWeirLink(:,1)>DatiRawNTC(end,1)); + else + RawDate2 = find(DatiNTCWeirLink(:,1)>DatiRawNTC(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + DatiNTC = [DatiRawNTC(1:RawDate1(end),:);DatiNTCWeirLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + DatiNTC = DatiNTCWeirLink; + else + DatiNTC = DatiRawNTC; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(DatiNTC(:,1)0 + DatiNTC = DatiNTCWeirLink; + end + end + Dati(:,1) = Dati(:,1) - 730000; + csvwrite(RawDataFile,Dati); + if sum(Therm(:,1))>0 + DatiNTC(:,1) = DatiNTC(:,1) - 730000; + csvwrite(RawDataFileNTC,DatiNTC); + end +end + +%% Pendulum +if yesPE == 0 % Non ci sono Pendulum + DatiPendulum = []; + ErrPendulum = []; + wardat = 'lettura function: there are not Pendulum'; + fprintf(fileID,fmt,wardat); +else + NAN = 0; + RawDataFile = ['' IDcentralina '-' DTcatena '-PE-RawData.csv']; + ChPE = cell2mat(NodoPendulum(:,5)); + while NAN == 0 + if datenum(datainiPE) == datenum(Data(1,1)) + tempoiniPE = char(Data(1,2)); + end + NodeType = 'Pendulum'; + NodeNumPE = num2str(cell2mat(NodoPendulum(1,2))); % scarico i dati del primo nodo + % Scarico dei dati relativi alla centralina con informazioni di Data e ora, livello batteria e temperatura + % Step 1 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date = ''' ... + datainiPE ''' and Time >= ''' tempoiniPE ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumPE ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniPE = curs.Data; + Ntempo = DATiniPE; + [r,c] = size(DATiniPE); + saltoPE = 0; + if r==1 && c==1 + textdatPE = 'Warning: error reading Pendulum (control unit data)!'; + fprintf(fileID,fmt,textdatPE); + saltoPE = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiPE ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumPE ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2PE = curs.Data; + Ndate = DAT2PE; + if saltoPE == 1 + DATiniPE = DAT2PE; + end + Check = size(DAT2PE); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoPE == 0 + DATiniPE = [DATiniPE; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniPE); + if cD ~=1 + T = [cell2mat(DATiniPE(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniPE(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniPE = T; + else + DATiniPE = []; + end + + % Scarico dati relativi ai singoli nodi + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoPE == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiPendulum = cell(rd+rt,rPE); + else + DatiPendulum = cell(rt,rPE); + end + else + DatiPendulum = cell(rd,rPE); + end + NPendulum = cell2mat(NodoPendulum(:,2)); + w = 0; + col = 1; + while ii <= rPE + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NPendulum(ii,1); + nNodo = num2str(nN); + if ChPE == 2 + comando = ['select Val0, Val1 from RawDataView where Date = ''' ... + datainiPE ''' and Time >= ''' tempoiniPE ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPE = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1 from RawDataView where Date > ''' ... + datainiPE ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPEd = curs.Data; + elseif ChPE == 4 + comando = ['select Val0, Val2 from RawDataView where Date = ''' ... + datainiPE ''' and Time >= ''' tempoiniPE ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPE = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val2 from RawDataView where Date > ''' ... + datainiPE ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPEd = curs.Data; + end + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + + if saltoPE == 0 + DatiPendulum(1:rt,col:col+1) = DATnodoPE; + else + DatiPendulum(1:rd,col:col+1) = DATnodoPEd; + end + + [rn,~] = size(DATnodoPEd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoPEd(i,:) = DATnodoPEd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Pendulum ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoPE == 0 + DatiPendulum(rt+1:rt+rd,col:col+1) = DATnodoPEd; + end + else + DatiPendulum = DatiPendulum(1:end,:); + end + okdatPE = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rPE) ' Pendulum nodes downloaded correctly']; + fprintf(fileID,fmt,okdatPE); + ii = ii+1; + col = col+2; + end + if w == 0 + wardat = 'There are not warning for Pendulum!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiPendulum); + ErrPendulum = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + DIS = 0; + if NuovoZeroPE == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiPE)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + for jj=1:c + % Se il nodo è Dis., devo aumentare di uno la data (il nodo non + % è ancora stato installato!) + if strcmp('Dis.',DatiPendulum(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',DatiPendulum(dis,jj)) == 0 + DatiPendulum = DatiPendulum(dis:end,:); + DATiniPE = DATiniPE(dis:end,:); + [r,c] = size(DatiPendulum); + break + elseif isfile(RawDataFile) == 1 + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiPendulum(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrPendulum(1,jj) = 1; + wardat = 'Data of Pendulum nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + DIS = 0; + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiPE)+1 < now + datainiPE = datestr(datenum(datainiPE)+1,'yyyy-mm-dd'); + break + else + yesPE = 0; + end + end + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiPE)+1 < now + datainiPE = datestr(datenum(datainiPE)+1,'yyyy-mm-dd'); + break + else + yesPE = 0; + end + end + end + end + end + if DIS ~= 1 && yesPE == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiPendulum(1,jj))); + idxT = find(strcmp('---',DatiPendulum(1,jj))); + idxT2 = find(strcmp('-',DatiPendulum(1,jj))); + idxE2 = find(strcmp('Err2',DatiPendulum(1,jj))); + idxE255 = find(strcmp('Err255',DatiPendulum(1,jj))); + idxD = find(strcmp('DMUXe',DatiPendulum(1,jj))); + idxE1F = find(strcmp('Err1File',DatiPendulum(1,jj))); + idxN = find(strcmp('null',DatiPendulum(1,jj))); + idxRX = find(strcmp('No RX',DatiPendulum(1,jj))); + idxI = find(strcmp('id Error',DatiPendulum(1,jj))); + idxM = find(strcmp('MUX id Error',DatiPendulum(1,jj))); + idxC = find(strcmp('CH n. Error',DatiPendulum(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiPendulum(1,jj))); + idxU = find(strcmp('Unknown Error',DatiPendulum(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiPendulum(1,jj))); + idxNS = find(strcmp('NotSupp',DatiPendulum(1,jj))); + idxU2 = find(strcmp('Unknown',DatiPendulum(1,jj))); + idxNA = find(strcmp('NotAv',DatiPendulum(1,jj))); + idxND = find(strcmp('No Data',DatiPendulum(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Pendulum nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroPE == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiPE)+1 < now + datainiPE = datestr(datenum(datainiPE)+1,'yyyy-mm-dd'); + break + else + yesPE = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiPE = datestr(datenum(datainiPE)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiPendulum(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrPendulum(1,jj) = 1; + wardat = 'Data of Pendulum nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiPE = datestr(datenum(datainiPE)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiPendulum(:,jj))); + idxT = find(strcmp('---',DatiPendulum(:,jj))); + idxT2 = find(strcmp('-',DatiPendulum(:,jj))); + idxE2 = find(strcmp('Err2',DatiPendulum(:,jj))); + idxE255 = find(strcmp('Err255',DatiPendulum(:,jj))); + idxD = find(strcmp('DMUXe',DatiPendulum(:,jj))); + idxE1F = find(strcmp('Err1File',DatiPendulum(:,jj))); + idxN = find(strcmp('null',DatiPendulum(:,jj))); + idxRX = find(strcmp('No RX',DatiPendulum(:,jj))); + idxI = find(strcmp('id Error',DatiPendulum(:,jj))); + idxM = find(strcmp('MUX id Error',DatiPendulum(:,jj))); + idxC = find(strcmp('CH n. Error',DatiPendulum(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiPendulum(:,jj))); + idxU = find(strcmp('Unknown Error',DatiPendulum(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiPendulum(:,jj))); + idxNS = find(strcmp('NotSupp',DatiPendulum(:,jj))); + idxU2 = find(strcmp('Unknown',DatiPendulum(:,jj))); + idxNA = find(strcmp('NotAv',DatiPendulum(:,jj))); + idxDis = find(strcmp('Dis.',DatiPendulum(:,jj))); + idxND = find(strcmp('No Data',DatiPendulum(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxDis); + idx = union(idx,idxND); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiPE = datestr(datenum(datainiPE)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + else + DatiPendulum(indice,jj) = DatiPendulum(indice-1,jj); + ErrPendulum(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + NAN = 0; + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiPendulum(nnn,jj))); + if check == 1 + DatiPendulum(nnn,jj) = DatiPendulum(nnn-1,jj); + ErrPendulum(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Pendulum data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiPendulum = [DATiniPE str2double(DatiPendulum)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiPendulum(a,1) == DatiPendulum(a-1,1) + DatiPendulum(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + if NuovoZeroPE == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiPendulum(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiPendulum(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiPendulum(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiPendulum(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiPendulum; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniSL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumSL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniSL = curs.Data; + Ntempo = DATiniSL; + [r,c] = size(DATiniSL); + saltoSL = 0; + if r==1 && c==1 + textdatSL = 'Warning: error reading Snow Link (control unit data)!'; + fprintf(fileID,fmt,textdatSL); + saltoSL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiSL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumSL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2SL = curs.Data; + Ndate = DAT2SL; + if saltoSL == 1 + DATiniSL = DAT2SL; + end + Check = size(DAT2SL); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoSL == 0 + DATiniSL = [DATiniSL; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniSL); + if cD ~=1 + T = [cell2mat(DATiniSL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniSL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniSL = T; + else + DATiniSL = []; + end + + % Scarico dati relativi ai singoli nodi + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoSL == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiSnowLink = cell(rd+rt,1*rSL); + else + DatiSnowLink = cell(rt,1*rSL); + end + else + DatiSnowLink = cell(rd,1*rSL); + end + NSnowLink = cell2mat(NodoSnowLink(:,2)); + col = 1; + w = 0; + while ii <= rSL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NSnowLink(ii,1); + nNodo = num2str(nN); + comando = ['select Val1 from RawDataView where Date = ''' ... + datainiSL ''' and Time >= ''' tempoiniSL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoSL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val1 from RawDataView where Date > ''' ... + datainiSL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoSLd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoRL == 0 + DatiSnowLink(1:rt,col) = DATnodoSL(:,:); + else + DatiSnowLink(1:rd,col) = DATnodoSLd(:,:); + end + + [rn,~] = size(DATnodoSLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoSLd(i,:) = DATnodoSLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Snow Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoSL == 0 + DatiSnowLink(rt+1:rt+rd,col) = DATnodoSLd(:,:); + end + else + DatiSnowLink = DatiSnowLink(1:end,:); + end + okdatSL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rSL) ' Snow Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatSL); + ii = ii+1; + col = col+1; + end + if w == 0 + wardat = 'There are not warning for Snow Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiSnowLink); + ErrSnowLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroSL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiSL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiSnowLink(1,jj))); + idxND = find(strcmp('No Data',DatiSnowLink(1,jj))); + idxT = find(strcmp('---',DatiSnowLink(1,jj))); + idxT2 = find(strcmp('-',DatiSnowLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiSnowLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiSnowLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiSnowLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiSnowLink(1,jj))); + idxN = find(strcmp('null',DatiSnowLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Snow Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroSL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiSL)+1 < now + datainiSL = datestr(datenum(datainiSL)+1,'yyyy-mm-dd'); + break + else + yesSL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiSL = datestr(datenum(datainiSL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiSnowLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrSnowLink(1,jj) = 1; + wardat = 'Data of Snow Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiSL = datestr(datenum(datainiSL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiSnowLink(:,jj))); + idxND = find(strcmp('No Data',DatiSnowLink(:,jj))); + idxT = find(strcmp('---',DatiSnowLink(:,jj))); + idxT2 = find(strcmp('-',DatiSnowLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiSnowLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiSnowLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiSnowLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiSnowLink(:,jj))); + idxN = find(strcmp('null',DatiSnowLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiSL = datestr(datenum(datainiSL)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + else + DatiSnowLink(indice,jj) = DatiSnowLink(indice-1,jj); + ErrSnowLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiSnowLink(nnn,jj))); + if check == 1 + DatiSnowLink(nnn,jj) = DatiSnowLink(nnn-1,jj); + ErrSnowLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Snow Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiSnowLink = [DATiniSL str2double(DatiSnowLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiSnowLink(a,1) == DatiSnowLink(a-1,1) + DatiSnowLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + if NuovoZeroSL == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiSnowLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiSnowLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiSnowLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiSnowLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiSnowLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoini ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum = 1 ']; +curs = exec(conn,comando); +curs = fetch(curs); +BatTempo = curs.Data; +comando = ['select Date, Time, BatLevel from RawDataView where Date > ''' ... + dataini ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum = 1 ']; +curs = exec(conn,comando); +curs = fetch(curs); +BatData = curs.Data; +if strcmp(char(BatData(1)),'No Data') + Batteria = BatTempo; +elseif strcmp(char(BatTempo(1)),'No Data') + Batteria = BatData; +else + Batteria = [BatTempo;BatData]; +end + +Data(1,1) = cellstr(date); +Data(1,2) = cellstr(time); + +%% Variabili presenti nella funzione lettura aggiornata +Batteria_LoRa = -1; +ErrTiltLinkHD = []; +ErrTiltLinkHDVR = []; +ErrSnowLink = []; + +%% Tilt Link V +if yesTL == 0 % Non ci sono Tilt Link + DatiTiltLink = []; + ErrTiltLink = []; + wardat = 'lettura function: there are not Tilt Link V'; + fprintf(fileID,fmt,wardat); +else + RawDataFile = ['' IDcentralina '-' DTcatena '-TLV-RawData.csv']; + NAN = 0; + while NAN == 0 + if datenum(datainiTL) == datenum(Data(1,1)) + tempoiniTL = char(Data(1,2)); + end + NodeType = 'Tilt Link'; + NodeNumTL = num2str(cell2mat(NodoTiltLink(1,2))); % scarico i dati del primo nodo + % Scarico dei dati relativi alla centralina con informazioni di Data e ora, livello batteria e temperatura + % Step 1 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date = ''' ... + datainiTL ''' and Time >= ''' tempoiniTL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumTL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniTL = curs.Data; + Ntempo = DATiniTL; + [r,c] = size(DATiniTL); + saltoTL = 0; + if r==1 && c==1 + textdatTL = 'Warning: error reading Tilt Link V (control unit data)!'; + fprintf(fileID,fmt,textdatTL); + saltoTL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiTL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumTL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2TL = curs.Data; + Ndate = DAT2TL; + if saltoTL == 1 + DATiniTL = DAT2TL; + end + Check = size(DAT2TL); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoTL == 0 + DATiniTL = [DATiniTL; DAT2TL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniTL); + if cD ~=1 + T = [cell2mat(DATiniTL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniTL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniTL = T; + else + DATiniTL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoTL == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiTiltLink = cell(rd+rt,7*rTL); + else + DatiTiltLink = cell(rt,7*rTL); + end + else + DatiTiltLink = cell(rd,7*rTL); + end + NTiltLink = cell2mat(NodoTiltLink(:,2)); + ii = 1; + col = 7; + w = 0; + while ii <= rTL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NTiltLink(ii,1); + if strcmp(DTcatena,'DT0115') && strcmp(IDcentralina,'ID0074') + if nN == 75 + nN = 1; + end + end + nNodo = num2str(nN); + comando = ['select Val0, Val1, Val2, Val3, Val4, Val5, Val6 from RawDataView where Date = ''' ... + datainiTL ''' and Time >= ''' tempoiniTL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val3, Val4, Val5, Val6 from RawDataView where Date > ''' ... + datainiTL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-6; + if saltoTL == 0 + DatiTiltLink(1:rt,ini_col:col) = DATnodoTL(:,:); + else + DatiTiltLink(1:rd,ini_col:col) = DATnodoTLd(:,:); + end + + [rn,~] = size(DATnodoTLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoTLd(i,:) = DATnodoTLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Tilt Link V ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + elseif rd < rn + for i = 1:rn-rd + DATnodoTLd(1,:) = []; % se mancano dati, copio gli ultimi + end + wardat = ['Node Tilt Link V ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoTL == 0 + DatiTiltLink(rt+1:rt+rd,ini_col:col) = DATnodoTLd(:,:); + end + else + DatiTiltLink = DatiTiltLink(1:end,:); + end + okdatTL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rTL) ' Tilt Link V nodes downloaded correctly']; + fprintf(fileID,fmt,okdatTL); + ii = ii+1; + col = col+7; + end + if w == 0 + wardat = 'There are not warning for Tilt Link V!'; + fprintf(fileID,fmt,wardat); + end + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiTiltLink); + ErrTiltLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroTL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiTL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTiltLink(1,jj))); + idxND = find(strcmp('No Data',DatiTiltLink(1,jj))); + idxT = find(strcmp('---',DatiTiltLink(1,jj))); + idxT2 = find(strcmp('-',DatiTiltLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiTiltLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiTiltLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiTiltLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiTiltLink(1,jj))); + idxN = find(strcmp('null',DatiTiltLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Tilt Link V nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroTL == 0 % il file non è mai stato scritto, cerco la data successiva + NAN = 0; + ESCI = 1; + if datenum(datainiTL)+1 < now + datainiTL = datestr(datenum(datainiTL)+1,'yyyy-mm-dd'); + break + else + yesTL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiTL = datestr(datenum(datainiTL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiTiltLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrTiltLink(1,jj) = 1; + wardat = 'Data of Tilt Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiTL = datestr(datenum(datainiTL)-1,'yyyy-mm-dd'); + break + end + end + end + end + if ESCI == 0 + % Cerco i multipli di 7 per identificare le temperature + Int = jj/7; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiTiltLink(1,jj)) > 1000 + if rDR==1 && cDR==1 || NuovoZeroTL == 0 + NAN = 0; + ESCI = 1; + if datenum(datainiTL)+1 < now + datainiTL = datestr(datenum(datainiTL)+1,'yyyy-mm-dd'); + break + else + yesTL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiTL = datestr(datenum(datainiTL)-1,'yyyy-mm-dd'); + break + else + DatiTiltLink(1,jj-6) = cellstr(num2str(DatiRaw(RawDate(end),jj-5))); + DatiTiltLink(1,jj-5) = cellstr(num2str(DatiRaw(RawDate(end),jj-4))); + DatiTiltLink(1,jj-4) = cellstr(num2str(DatiRaw(RawDate(end),jj-3))); + DatiTiltLink(1,jj-3) = cellstr(num2str(DatiRaw(RawDate(end),jj-2))); + DatiTiltLink(1,jj-2) = cellstr(num2str(DatiRaw(RawDate(end),jj-1))); + DatiTiltLink(1,jj-1) = cellstr(num2str(DatiRaw(RawDate(end),jj))); + DatiTiltLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrTiltLink(1,jj) = 1; + wardat = ['Data of Tilt Link nodes corrected using Raw Data of reference Csv file. '... + 'MEMS was read as an electrolytic cell']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + end + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTiltLink(:,jj))); + idxND = find(strcmp('No Data',DatiTiltLink(:,jj))); + idxT = find(strcmp('---',DatiTiltLink(:,jj))); + idxT2 = find(strcmp('-',DatiTiltLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiTiltLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiTiltLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiTiltLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiTiltLink(:,jj))); + idxN = find(strcmp('null',DatiTiltLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiTL = datestr(datenum(datainiTL)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + end + DatiTiltLink(indice,jj) = DatiTiltLink(indice-1,jj); + ErrTiltLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + if ESCI == 1 + NAN = 0; + break + end + for ii = 2:r + % Cerco i multipli di 7 per identificare le temperature + Int = jj/7; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiTiltLink(ii,jj)) > 1000 + DatiTiltLink(ii,jj-6:jj) = DatiTiltLink(ii-1,jj-6:jj); + ErrTiltLink(ii,jj) = 1; + wardat = ['Data of Tilt Link nodes corrected using Raw Data of reference Csv file. '... + 'MEMS was read as an electrolytic cell']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + % Elimino gli eventuali Not a Number + for nnn = 2:r % nodi + check = isnan(cell2mat(DatiTiltLink(nnn,jj))); + if check == 1 + DatiTiltLink(nnn,jj) = DatiTiltLink(nnn-1,jj); + ErrTiltLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Tilt Link V data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiTiltLink = [DATiniTL str2double(DatiTiltLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiTiltLink(a,1) == DatiTiltLink(a-1,1) + DatiTiltLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + if NuovoZeroTL == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiTiltLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiTiltLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiTiltLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiTiltLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiTiltLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniTLHR ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumTLHR ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniTLHR = curs.Data; + Ntempo = DATiniTLHR; + [r,c] = size(DATiniTLHR); + saltoTLHR = 0; + if r==1 && c==1 + textdatTLHR = 'Warning: error reading Tilt Link HR V (control unit data)!'; + fprintf(fileID,fmt,textdatTLHR); + saltoTLHR = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiTLHR ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumTLHR ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2TLHR = curs.Data; + Ndate = DAT2TLHR; + if saltoTLHR == 1 + DATiniTLHR = DAT2TLHR; + end + Check = size(DAT2TLHR); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoTLHR == 0 + DATiniTLHR = [DATiniTLHR; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniTLHR); + if cD ~=1 + T = [cell2mat(DATiniTLHR(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniTLHR(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniTLHR = T; + else + DATiniTLHR = []; + end + + % Scarico dati relativi ai singoli nodi + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoTLHR == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiTiltLinkHR = cell(rd+rt,6*rTLHR); + else + DatiTiltLinkHR = cell(rt,6*rTLHR); + end + else + DatiTiltLinkHR = cell(rd,6*rTLHR); + end + NTiltLinkHR = cell2mat(NodoTiltLinkHR(:,2)); + col = 6; + w = 0; + while ii <= rTLHR + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NTiltLinkHR(ii,1); + nNodo = num2str(nN); + comando = ['select Val0, Val1, Val3, Val4, Val5, Val6 from RawDataView where Date = ''' ... + datainiTLHR ''' and Time >= ''' tempoiniTLHR ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHR = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val3, Val4, Val5, Val6 from RawDataView where Date > ''' ... + datainiTLHR ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHRd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-5; + if saltoTLHR == 0 + DatiTiltLinkHR(1:rt,ini_col:col) = DATnodoTLHR(:,:); + else + DatiTiltLinkHR(1:rd,ini_col:col) = DATnodoTLHRd(:,:); + end + + [rn,~] = size(DATnodoTLHRd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoTLHRd(i,:) = DATnodoTLHRd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Tilt Link HR V ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoTLHR == 0 + DatiTiltLinkHR(rt+1:rt+rd,ini_col:col) = DATnodoTLHRd(:,:); + end + else + DatiTiltLinkHR = DatiTiltLinkHR(1:end,:); + end + okdatTLH = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rTLHR) ' Tilt Link HR V nodes downloaded correctly']; + fprintf(fileID,fmt,okdatTLH); + ii = ii+1; + col = col+6; + end + if w == 0 + wardat = 'There are not warning for Tilt Link HR V!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiTiltLinkHR); + ErrTiltLinkHR = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroTLHR == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiTLHR)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTiltLinkHR(1,jj))); + idxND = find(strcmp('No Data',DatiTiltLinkHR(1,jj))); + idxT = find(strcmp('---',DatiTiltLinkHR(1,jj))); + idxT2 = find(strcmp('-',DatiTiltLinkHR(1,jj))); + idxE2 = find(strcmp('Err2',DatiTiltLinkHR(1,jj))); + idxE255 = find(strcmp('Err255',DatiTiltLinkHR(1,jj))); + idxD = find(strcmp('DMUXe',DatiTiltLinkHR(1,jj))); + idxE1F = find(strcmp('Err1File',DatiTiltLinkHR(1,jj))); + idxN = find(strcmp('null',DatiTiltLinkHR(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Tilt Link HR V nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroTLHR == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiTLHR)+1 < now + datainiTLHR = datestr(datenum(datainiTLHR)+1,'yyyy-mm-dd'); + break + else + yesTLHR = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiTLHR = datestr(datenum(datainiTLHR)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiTiltLinkHR(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrTiltLinkHR(1,jj) = 1; + wardat = 'Data of Tilt Link HR nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiTLHR = datestr(datenum(datainiTLHR)-1,'yyyy-mm-dd'); + break + end + end + end + end + if ESCI == 0 + % Cerco i multipli di 6 per identificare le temperature + Int = jj/6; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiTiltLinkHR(1,jj)) < 500 + if rDR==1 && cDR==1 || NuovoZeroTLHR == 0 + NAN = 0; + ESCI = 1; + datainiTLHR = datestr(datenum(datainiTLHR)-1,'yyyy-mm-dd'); + break + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiTLHR = datestr(datenum(datainiTLHR)-1,'yyyy-mm-dd'); + break + else + DatiTiltLinkHR(1,jj-5) = cellstr(num2str(DatiRaw(RawDate(end),jj-4))); + DatiTiltLinkHR(1,jj-4) = cellstr(num2str(DatiRaw(RawDate(end),jj-3))); + DatiTiltLinkHR(1,jj-3) = cellstr(num2str(DatiRaw(RawDate(end),jj-2))); + DatiTiltLinkHR(1,jj-2) = cellstr(num2str(DatiRaw(RawDate(end),jj-1))); + DatiTiltLinkHR(1,jj-1) = cellstr(num2str(DatiRaw(RawDate(end),jj))); + DatiTiltLinkHR(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrTiltLinkHR(1,jj) = 1; + wardat = ['Data of Tilt Link HR nodes corrected using Raw Data of reference Csv file. '... + 'Electrolytic cell was read as a MEMS']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTiltLinkHR(:,jj))); + idxND = find(strcmp('No Data',DatiTiltLinkHR(:,jj))); + idxT = find(strcmp('---',DatiTiltLinkHR(:,jj))); + idxT2 = find(strcmp('-',DatiTiltLinkHR(:,jj))); + idxE2 = find(strcmp('Err2',DatiTiltLinkHR(:,jj))); + idxE255 = find(strcmp('Err255',DatiTiltLinkHR(:,jj))); + idxD = find(strcmp('DMUXe',DatiTiltLinkHR(:,jj))); + idxE1F = find(strcmp('Err1File',DatiTiltLinkHR(:,jj))); + idxN = find(strcmp('null',DatiTiltLinkHR(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiTLHR = datestr(datenum(datainiTLHR)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + else + DatiTiltLinkHR(indice,jj) = DatiTiltLinkHR(indice-1,jj); + ErrTiltLinkHR(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + for ii = 2:r + % Cerco i multipli di 6 per identificare le temperature + Int = jj/6; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiTiltLinkHR(ii,jj)) < 500 + DatiTiltLinkHR(ii,jj-2:jj) = DatiTiltLinkHR(ii-1,jj-2:jj); + ErrTiltLinkHR(ii,jj) = 1; + wardat = ['Data of Tilt Link HR nodes corrected using Raw Data of reference Csv file. '... + 'Electrolytic cell was read as a MEMS']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + if ESCI == 1 + NAN = 0; + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiTiltLinkHR(nnn,jj))); + if check == 1 + DatiTiltLinkHR(nnn,jj) = DatiTiltLinkHR(nnn-1,jj); + ErrTiltLinkHR(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Tilt Link HR V data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiTiltLinkHR = [DATiniTLHR str2double(DatiTiltLinkHR)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiTiltLinkHR(a,1) == DatiTiltLinkHR(a-1,1) + DatiTiltLinkHR(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + if NuovoZeroTLHR == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiTiltLinkHR(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiTiltLinkHR(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiTiltLinkHR(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiTiltLinkHR(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiTiltLinkHR; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniTLH ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumTLH ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniTLH = curs.Data; + Ntempo = DATiniTLH; + [r,c] = size(DATiniTLH); + saltoTLH = 0; + if r==1 && c==1 + textdatTLH = 'Warning: error reading Tilt Link H (control unit data)!'; + fprintf(fileID,fmt,textdatTLH); + saltoTLH = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiTLH ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumTLH ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2TLH = curs.Data; + Ndate = DAT2TLH; + if saltoTLH == 1 + DATiniTLH = DAT2TLH; + end + Check = size(DAT2TLH); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoTLH == 0 + DATiniTLH = [DATiniTLH; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniTLH); + if cD ~=1 + T = [cell2mat(DATiniTLH(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniTLH(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniTLH = T; + else + DATiniTLH = []; + end + + % Scarico dati relativi ai singoli nodi + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoTLH == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiTiltLinkH = cell(rd+rt,7*rTLH); + else + DatiTiltLinkH = cell(rt,7*rTLH); + end + else + DatiTiltLinkH = cell(rd,7*rTLH); + end + NTiltLinkH = cell2mat(NodoTiltLinkH(:,2)); + col = 7; + w = 0; + while ii <= rTLH + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NTiltLinkH(ii,1); + nNodo = num2str(nN); + comando = ['select Val0, Val1, Val2, Val3, Val4, Val5, Val6 from RawDataView where Date = ''' ... + datainiTLH ''' and Time >= ''' tempoiniTLH ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLH = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val3, Val4, Val5, Val6 from RawDataView where Date > ''' ... + datainiTLH ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-6; + if saltoTLH == 0 + DatiTiltLinkH(1:rt,ini_col:col) = DATnodoTLH(:,:); + else + DatiTiltLinkH(1:rd,ini_col:col) = DATnodoTLHd(:,:); + end + + [rn,~] = size(DATnodoTLHd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoTLHd(i,:) = DATnodoTLHd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Tilt Link H ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoTLH == 0 + DatiTiltLinkH(rt+1:rt+rd,ini_col:col) = DATnodoTLHd(:,:); + end + else + DatiTiltLinkH = DatiTiltLinkH(1:end,:); + end + okdatTLH = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rTLH) ' Tilt Link H nodes downloaded correctly']; + fprintf(fileID,fmt,okdatTLH); + ii = ii+1; + col = col+7; + end + if w == 0 + wardat = 'There are not warning for Tilt Link H!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiTiltLinkH); + ErrTiltLinkH = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroTLH == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiTLH)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTiltLinkH(1,jj))); + idxND = find(strcmp('No Data',DatiTiltLinkH(1,jj))); + idxT = find(strcmp('---',DatiTiltLinkH(1,jj))); + idxT2 = find(strcmp('-',DatiTiltLinkH(1,jj))); + idxE2 = find(strcmp('Err2',DatiTiltLinkH(1,jj))); + idxE255 = find(strcmp('Err255',DatiTiltLinkH(1,jj))); + idxD = find(strcmp('DMUXe',DatiTiltLinkH(1,jj))); + idxE1F = find(strcmp('Err1File',DatiTiltLinkH(1,jj))); + idxN = find(strcmp('null',DatiTiltLinkH(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Tilt Link H nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroTLH == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiTLH)+1 < now + datainiTLH = datestr(datenum(datainiTLH)+1,'yyyy-mm-dd'); + break + else + yesTLH = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiTLH = datestr(datenum(datainiTLH)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiTiltLinkH(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrTiltLinkH(1,jj) = 1; + wardat = 'Data of Tilt Link H nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiTLH = datestr(datenum(datainiTLH)-1,'yyyy-mm-dd'); + break + end + end + end + end + if ESCI == 0 + % Cerco i multipli di 7 per identificare le temperature + Int = jj/7; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiTiltLinkH(1,jj)) > 1000 + if rDR==1 && cDR==1 || NuovoZeroTLH == 0 + NAN = 0; + ESCI = 1; + datainiTLH = datestr(datenum(datainiTLH)-1,'yyyy-mm-dd'); + break + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + if datenum(datainiTLH)+1 < now + datainiTLH = datestr(datenum(datainiTLH)+1,'yyyy-mm-dd'); + break + else + yesTLH = 0; + end + else + DatiTiltLinkH(1,jj-6) = cellstr(num2str(DatiRaw(RawDate(end),jj-5))); + DatiTiltLinkH(1,jj-5) = cellstr(num2str(DatiRaw(RawDate(end),jj-4))); + DatiTiltLinkH(1,jj-4) = cellstr(num2str(DatiRaw(RawDate(end),jj-3))); + DatiTiltLinkH(1,jj-3) = cellstr(num2str(DatiRaw(RawDate(end),jj-2))); + DatiTiltLinkH(1,jj-2) = cellstr(num2str(DatiRaw(RawDate(end),jj-1))); + DatiTiltLinkH(1,jj-1) = cellstr(num2str(DatiRaw(RawDate(end),jj))); + DatiTiltLinkH(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrTiltLinkH(1,jj) = 1; + wardat = ['Data of Tilt Link H nodes corrected using Raw Data of reference Csv file. '... + 'MEMS was read as an electrolytic cell']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTiltLinkH(:,jj))); + idxND = find(strcmp('No Data',DatiTiltLinkH(:,jj))); + idxT = find(strcmp('---',DatiTiltLinkH(:,jj))); + idxT2 = find(strcmp('-',DatiTiltLinkH(:,jj))); + idxE2 = find(strcmp('Err2',DatiTiltLinkH(:,jj))); + idxE255 = find(strcmp('Err255',DatiTiltLinkH(:,jj))); + idxD = find(strcmp('DMUXe',DatiTiltLinkH(:,jj))); + idxE1F = find(strcmp('Err1File',DatiTiltLinkH(:,jj))); + idxN = find(strcmp('null',DatiTiltLinkH(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiTLH = datestr(datenum(datainiTLH)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + else + DatiTiltLinkH(indice,jj) = DatiTiltLinkH(indice-1,jj); + ErrTiltLinkH(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + for ii = 2:r + % Cerco i multipli di 7 per identificare le temperature + Int = jj/7; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiTiltLinkH(ii,jj)) > 1000 + DatiTiltLinkH(ii,jj-6:jj) = DatiTiltLinkH(ii-1,jj-6:jj); + ErrTiltLinkH(ii,jj) = 1; + wardat = ['Data of Tilt Link H nodes corrected using Raw Data of reference Csv file. '... + 'MEMS read as a MEMS']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + if ESCI == 1 + NAN = 0; + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiTiltLinkH(nnn,jj))); + if check == 1 + DatiTiltLinkH(nnn,jj) = DatiTiltLinkH(nnn-1,jj); + ErrTiltLinkH(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Tilt Link H data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiTiltLinkH = [DATiniTLH str2double(DatiTiltLinkH)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiTiltLinkH(a,1) == DatiTiltLinkH(a-1,1) + DatiTiltLinkH(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + if NuovoZeroTLH == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiTiltLinkH(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiTiltLinkH(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiTiltLinkH(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiTiltLinkH(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiTiltLinkH; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniTLHRH ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumTLHRH ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniTLHRH = curs.Data; + Ntempo = DATiniTLHRH; + [r,c] = size(DATiniTLHRH); + saltoTLHRH = 0; + if r==1 && c==1 + textdatTLHRH = 'Warning: error reading Tilt Link HR H (control unit data)!'; + fprintf(fileID,fmt,textdatTLHRH); + saltoTLHRH = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiTLHRH ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumTLHRH ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2TLHRH = curs.Data; + Ndate = DAT2TLHRH; + if saltoTLHRH == 1 + DATiniTLHRH = DAT2TLHRH; + end + Check = size(DAT2TLHRH); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoTLHRH == 0 + DATiniTLHRH = [DATiniTLHRH; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniTLHRH); + if cD ~=1 + T = [cell2mat(DATiniTLHRH(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniTLHRH(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniTLHRH = T; + else + DATiniTLHRH = []; + end + + % Scarico dati relativi ai singoli nodi + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoTLHRH == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiTiltLinkHRH = cell(rd+rt,6*rTLHR); + else + DatiTiltLinkHRH = cell(rt,6*rTLHR); + end + else + DatiTiltLinkHRH = cell(rd,6*rTLHR); + end + NTiltLinkHRH = cell2mat(NodoTiltLinkHRH(:,2)); + col = 6; + w = 0; + while ii <= rTLHRH + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NTiltLinkHRH(ii,1); + nNodo = num2str(nN); + comando = ['select Val0, Val1, Val3, Val4, Val5, Val6 from RawDataView where Date = ''' ... + datainiTLHRH ''' and Time >= ''' tempoiniTLHRH ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHRH = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val3, Val4, Val5, Val6 from RawDataView where Date > ''' ... + datainiTLHRH ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoTLHRHd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-5; + if saltoTLHRH == 0 + DatiTiltLinkHRH(1:rt,ini_col:col) = DATnodoTLHRH(:,:); + else + DatiTiltLinkHRH(1:rd,ini_col:col) = DATnodoTLHRHd(:,:); + end + + [rn,~] = size(DATnodoTLHRHd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoTLHRHd(i,:) = DATnodoTLHRHd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Tilt Link HR H ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoTLHRH == 0 + DatiTiltLinkHRH(rt+1:rt+rd,ini_col:col) = DATnodoTLHRHd(:,:); + end + else + DatiTiltLinkHRH = DatiTiltLinkHRH(1:end,:); + end + okdatTLH = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rTLHRH) ' Tilt Link HR H nodes downloaded correctly']; + fprintf(fileID,fmt,okdatTLH); + ii = ii+1; + col = col+6; + end + if w == 0 + wardat = 'There are not warning for Tilt Link HR H!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiTiltLinkHRH); + ErrTiltLinkHRH = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroTLHRH == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiTLHRH)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTiltLinkHRH(1,jj))); + idxND = find(strcmp('No Data',DatiTiltLinkHRH(1,jj))); + idxT = find(strcmp('---',DatiTiltLinkHRH(1,jj))); + idxT2 = find(strcmp('-',DatiTiltLinkHRH(1,jj))); + idxE2 = find(strcmp('Err2',DatiTiltLinkHRH(1,jj))); + idxE255 = find(strcmp('Err255',DatiTiltLinkHRH(1,jj))); + idxD = find(strcmp('DMUXe',DatiTiltLinkHRH(1,jj))); + idxE1F = find(strcmp('Err1File',DatiTiltLinkHRH(1,jj))); + idxN = find(strcmp('null',DatiTiltLinkHRH(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Tilt Link HR H nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroTLHRH == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiTLHRH)+1 < now + datainiTLHRH = datestr(datenum(datainiTLHRH)+1,'yyyy-mm-dd'); + break + else + yesTLHRH = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiTLHRH = datestr(datenum(datainiTLHRH)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiTiltLinkHRH(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrTiltLinkHRH(1,jj) = 1; + wardat = 'Data of Tilt Link HR H nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiTLHRH = datestr(datenum(datainiTLHRH)-1,'yyyy-mm-dd'); + break + end + end + end + end + if ESCI == 0 + % Cerco i multipli di 6 per identificare le temperature + Int = jj/6; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiTiltLinkHRH(1,jj)) < 500 + if rDR==1 && cDR==1 || NuovoZeroTLHRH == 0 + NAN = 0; + ESCI = 1; + if datenum(datainiTLHRH)+1 < now + datainiTLHRH = datestr(datenum(datainiTLHRH)+1,'yyyy-mm-dd'); + break + else + yesTLHRH = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiTLHRH = datestr(datenum(datainiTLHRH)-1,'yyyy-mm-dd'); + break + else + DatiTiltLinkHRH(1,jj-5) = cellstr(num2str(DatiRaw(RawDate(end),jj-4))); + DatiTiltLinkHRH(1,jj-4) = cellstr(num2str(DatiRaw(RawDate(end),jj-3))); + DatiTiltLinkHRH(1,jj-3) = cellstr(num2str(DatiRaw(RawDate(end),jj-2))); + DatiTiltLinkHRH(1,jj-2) = cellstr(num2str(DatiRaw(RawDate(end),jj-1))); + DatiTiltLinkHRH(1,jj-1) = cellstr(num2str(DatiRaw(RawDate(end),jj))); + DatiTiltLinkHRH(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrTiltLinkHRH(1,jj) = 1; + wardat = ['Data of Tilt Link HR H nodes corrected using Raw Data of reference Csv file. '... + 'Electrolytic cell was read as the corresponding MEMS']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiTiltLinkHRH(:,jj))); + idxND = find(strcmp('No Data',DatiTiltLinkHRH(:,jj))); + idxT = find(strcmp('---',DatiTiltLinkHRH(:,jj))); + idxT2 = find(strcmp('-',DatiTiltLinkHRH(:,jj))); + idxE2 = find(strcmp('Err2',DatiTiltLinkHRH(:,jj))); + idxE255 = find(strcmp('Err255',DatiTiltLinkHRH(:,jj))); + idxD = find(strcmp('DMUXe',DatiTiltLinkHRH(:,jj))); + idxE1F = find(strcmp('Err1File',DatiTiltLinkHRH(:,jj))); + idxN = find(strcmp('null',DatiTiltLinkHRH(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiTLHRH = datestr(datenum(datainiTLHRH)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + else + DatiTiltLinkHRH(indice,jj) = DatiTiltLinkHRH(indice-1,jj); + ErrTiltLinkHRH(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + for ii = 2:r + % Cerco i multipli di 6 per identificare le temperature + Int = jj/6; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiTiltLinkHRH(ii,jj)) < 500 + DatiTiltLinkHRH(ii,jj-2:jj) = DatiTiltLinkHRH(ii-1,jj-2:jj); + ErrTiltLinkHRH(ii,jj) = 1; + wardat = ['Data of Tilt Link HR nodes corrected using Raw Data of reference Csv file. '... + 'Electrolytic cell was read as a MEMS']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + if ESCI == 1 + NAN = 0; + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiTiltLinkHRH(nnn,jj))); + if check == 1 + DatiTiltLinkHRH(nnn,jj) = DatiTiltLinkHRH(nnn-1,jj); + ErrTiltLinkHRH(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Tilt Link HR H data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiTiltLinkHRH = [DATiniTLHRH str2double(DatiTiltLinkHRH)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiTiltLinkHRH(a,1) == DatiTiltLinkHRH(a-1,1) + DatiTiltLinkHRH(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + if NuovoZeroTLHRH == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiTiltLinkHRH(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiTiltLinkHRH(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiTiltLinkHRH(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiTiltLinkHRH(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiTiltLinkHRH; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniPL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumPL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniPL = curs.Data; + Ntempo = DATiniPL; + [r,c] = size(DATiniPL); + saltoPL = 0; + if r==1 && c==1 + textdatPL = 'Warning: error reading Piezo Link (control unit data)!'; + fprintf(fileID,fmt,textdatPL); + saltoPL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiPL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumPL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2PL = curs.Data; + Ndate = DAT2PL; + if saltoPL == 1 + DATiniPL = DAT2PL; + end + Check = size(DAT2PL); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoPL == 0 + DATiniPL = [DATiniPL; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniPL); + if cD ~=1 + T = [cell2mat(DATiniPL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniPL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniPL = T; + else + DATiniPL = []; + end + + % Scarico dati relativi ai singoli nodi + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoPL == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiPiezoLink = cell(rd+rt,2*rPL); + else + DatiPiezoLink = cell(rt,2*rPL); + end + else + DatiPiezoLink = cell(rd,2*rPL); + end + NPiezoLink = cell2mat(NodoPiezoLink(:,2)); + col = 2; + w = 0; + while ii <= rPL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NPiezoLink(ii,1); + nNodo = num2str(nN); + comando = ['select Val0, Val1 from RawDataView where Date = ''' ... + datainiPL ''' and Time >= ''' tempoiniPL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1 from RawDataView where Date > ''' ... + datainiPL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPLd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-1; + if saltoPL == 0 + DatiPiezoLink(1:rt,ini_col:col) = DATnodoPL(:,:); + else + DatiPiezoLink(1:rd,ini_col:col) = DATnodoPLd(:,:); + end + + [rn,~] = size(DATnodoPLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoPLd(i,:) = DATnodoPLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Piezo Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoPL == 0 + DatiPiezoLink(rt+1:rt+rd,ini_col:col) = DATnodoPLd(:,:); + end + else + DatiPiezoLink = DatiPiezoLink(1:end,:); + end + okdatPL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rPL) ' Piezo Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatPL); + ii = ii+1; + col = col+2; + end + if w == 0 + wardat = 'There are not warning for Piezo Link!'; + fprintf(fileID,fmt,wardat); + end + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiPiezoLink); + ErrPiezoLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + DIS = 0; + if NuovoZeroPL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiPL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + for jj=1:c + % Se il nodo è Dis., devo aumentare di uno la data (il nodo non + % è ancora stato installato!) + if strcmp('Dis.',DatiPiezoLink(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',DatiPiezoLink(dis,jj)) == 0 + DatiPiezoLink = DatiPiezoLink(dis:end,:); + DATiniPL = DATiniPL(dis:end,:); + DatiNTCPiezoLink = DatiNTCPiezoLink(dis:end,:); + [r,c] = size(DatiPiezoLink); + break + elseif isfile(RawDataFile) == 1 + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiPiezoLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrPiezoLink(1,jj) = 1; + wardat = 'Data of Piezo Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + DIS = 0; + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiPL)+1 < now + datainiPL = datestr(datenum(datainiPL)+1,'yyyy-mm-dd'); + break + else + yesPL = 0; + end + end + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiPL)+1 < now + datainiPL = datestr(datenum(datainiPL)+1,'yyyy-mm-dd'); + break + else + yesPL = 0; + end + end + end + end + end + if DIS ~= 1 && yesPL == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiPiezoLink(1,jj))); + idxND = find(strcmp('No Data',DatiPiezoLink(1,jj))); + idxT = find(strcmp('---',DatiPiezoLink(1,jj))); + idxT2 = find(strcmp('-',DatiPiezoLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiPiezoLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiPiezoLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiPiezoLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiPiezoLink(1,jj))); + idxN = find(strcmp('null',DatiPiezoLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Piezo Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroPL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiPL)+1 < now + datainiPL = datestr(datenum(datainiPL)+1,'yyyy-mm-dd'); + break + else + yesPL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiPL = datestr(datenum(datainiPL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiPiezoLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrPiezoLink(1,jj) = 1; + wardat = 'Data of Piezo Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiPL = datestr(datenum(datainiPL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiPiezoLink(:,jj))); + idxND = find(strcmp('No Data',DatiPiezoLink(:,jj))); + idxT = find(strcmp('---',DatiPiezoLink(:,jj))); + idxT2 = find(strcmp('-',DatiPiezoLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiPiezoLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiPiezoLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiPiezoLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiPiezoLink(:,jj))); + idxN = find(strcmp('null',DatiPiezoLink(:,jj))); + idxRX = find(strcmp('No RX',DatiPiezoLink(:,jj))); + idxI = find(strcmp('id Error',DatiPiezoLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiPiezoLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiPiezoLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiPiezoLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiPiezoLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiPiezoLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiPiezoLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiPiezoLink(:,jj))); + idxDis = find(strcmp('Dis.',DatiPiezoLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + idx = union(idx,idxDis); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiPL = datestr(datenum(datainiPL)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + else + DatiPiezoLink(indice,jj) = DatiPiezoLink(indice-1,jj); + ErrPiezoLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiPiezoLink(nnn,jj))); + if check == 1 + DatiPiezoLink(nnn,jj) = DatiPiezoLink(nnn-1,jj); + ErrPiezoLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Piezo Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiPiezoLink = [DATiniPL str2double(DatiPiezoLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiPiezoLink(a,1) == DatiPiezoLink(a-1,1) + DatiPiezoLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + if NAN == 1 && NuovoZeroPL == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiPiezoLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiPiezoLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiPiezoLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiPiezoLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiPiezoLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniBL ''' and UnitName = ''' IDunitBaro... + ''' and ToolNameID = ''' DTcatenaBaro ''' and NodeType = ''' NodeType '''']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniBL = curs.Data; + Ntempo = DATiniBL; + [r,c] = size(DATiniBL); + saltoBL = 0; + if r==1 && c==1 + textdatBL = 'Warning: error reading Baro Link (control unit data)!'; + fprintf(fileID,fmt,textdatBL); + saltoBL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiBL ''' and UnitName = ''' IDunitBaro ''' and ToolNameID = '''... + DTcatenaBaro ''' and NodeType = ''' NodeType '''']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2BL = curs.Data; + Ndate = DAT2BL; + if saltoBL == 1 + DATiniBL = DAT2BL; + end + Check = size(DAT2BL); + if Check(1,2) > 1 % ho superato il primo giorno + if saltoBL == 0 + DATiniBL = [DATiniBL; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniBL); + Rilancia = 0; + if cD > 1 + T = [cell2mat(DATiniBL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniBL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniBL = T; + else + Rilancia = 1; + end + + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoBL == 0 + if Check(1,2) > 1 % Ho superato il primo giorno + DatiBaroLink = cell(rd+rt,2*rBL); + else + DatiBaroLink = cell(rt,2*rBL); + end + else + DatiBaroLink = cell(rd,2*rBL); + end + NBaroLink = cell2mat(NodoBaroLink(:,2)); + col = 2; + w = 0; + while ii <= rBL + nN = NBaroLink(ii,1); + nNodo = num2str(nN); + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + comando = ['select Val3, Val4 from RawDataView where Date = ''' ... + datainiBL ''' and Time >= ''' tempoiniBL ''' and UnitName = ''' IDunitBaro ... + ''' and ToolNameID = ''' DTcatenaBaro ''' and NodeType = ''' NodeType ... + ''' and NodeNum =' nNodo ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoBL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val3, Val4 from RawDataView where Date > ''' ... + datainiBL ''' and UnitName = ''' IDunitBaro ... + ''' and ToolNameID = ''' DTcatenaBaro ''' and NodeType = ''' ... + NodeType ''' and NodeNum =''' nNodo '''']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoBLd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-1; + if saltoBL == 0 + DatiBaroLink(1:rt,ini_col:col) = DATnodoBL(:,:); + else + DatiBaroLink(1:rd,ini_col:col) = DATnodoBLd(:,:); + end + [rn,~] = size(DATnodoBLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoBLd(i,:) = DATnodoBLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Baro Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoBL == 0 + DatiBaroLink(rt+1:rt+rd,ini_col:col) = DATnodoBLd(:,:); + end + else + DatiBaroLink = DatiBaroLink(1:end,:); + end + okdatBL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rBL) ' Baro Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatBL); + ii = ii+1; + col = col+2; + end + if w == 0 + wardat = 'There are not warning for Baro Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiBaroLink); + ErrBaroLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiBL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + % --- Codice per il primo dato --- + for jj=1:c + if Rilancia == 1 + NAN = 0; + ESCI = 1; + datainiBL = datestr(datenum(datainiBL)-1,'yyyy-mm-dd'); + break + end + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiBaroLink(1,jj))); + idxND = find(strcmp('No Data',DatiBaroLink(1,jj))); + idxT = find(strcmp('---',DatiBaroLink(1,jj))); + idxT2 = find(strcmp('-',DatiBaroLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiBaroLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiBaroLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiBaroLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiBaroLink(1,jj))); + idxN = find(strcmp('null',DatiBaroLink(1,jj))); + idxF = find(str2double(cell2mat(DatiBaroLink(1,1)))<10500); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxF); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Baro Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiBL)+1 < now + datainiBL = datestr(datenum(datainiBL)+1,'yyyy-mm-dd'); + break + else + yesBL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiBL = datestr(datenum(datainiBL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiBaroLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrBaroLink(1,jj) = 1; + wardat = 'Data of Baro Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiBL = datestr(datenum(datainiBL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + idxF = []; + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiBaroLink(:,jj))); + idxND = find(strcmp('No Data',DatiBaroLink(:,jj))); + idxT = find(strcmp('---',DatiBaroLink(:,jj))); + idxT2 = find(strcmp('-',DatiBaroLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiBaroLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiBaroLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiBaroLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiBaroLink(:,jj))); + idxN = find(strcmp('null',DatiBaroLink(:,jj))); + for ii = 1:r + if str2double(cell2mat(DatiBaroLink(ii,1))) < 10500 + idxF = [idxF; ii]; + end + end + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxF); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiBL = datestr(datenum(datainiBL)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + else + DatiBaroLink(indice,jj) = DatiBaroLink(indice-1,jj); + ErrBaroLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiBaroLink(nnn,jj))); + if check == 1 + DatiBaroLink(nnn,jj) = DatiBaroLink(nnn-1,jj); + ErrBaroLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Baro Link data done!']; + fprintf(fileID,fmt,corrdat); + + % Concateno informazioni generali e/o letture dai nodi. + + % se barometro e piezometro non appartengono alla stessa catena, interpolo + % i dati + if Rilancia == 0 + if B==0 + DATIBaro = str2double(DatiBaroLink); + if datenum(DATiniBL(end,1)) < datenum(DATiniPL(end,1)) % Uso solo l'ultimo dato del barometro + [rP,~] = size(DATiniPL); + DATIBaro = zeros(rP,2); + for b = 1:rP + DATIBaro(b,1:2) = str2double(DatiBaroLink(end,1:2)); + end + DatiBaroLink = [DATiniPL DATIBaro]; + else + DATIBaroInt = interp1(DATiniBL(:,1),DATIBaro(:,1),DATiniPL(:,1)); + DATIBaroTemp = interp1(DATiniBL(:,1),DATIBaro(:,2),DATiniPL(:,1)); + DatiBaroLink = [DATiniPL DATIBaroInt DATIBaroTemp]; + log = isnan(DatiBaroLink(:,:)); + [rL,cL] = size(log); + for check = 1:rL + for control = 1:cL + if log(check,control) == 1 + if check == 1 % è proprio la prima data ad essere Nan, ciò significa che il barometro è stato installato dopo il piezometro + i = 2; + while log(i,control) == 1 + i = i+1; + end + DatiBaroLink(check,control) = DatiBaroLink(i,control); + else + DatiBaroLink(check,control) = DatiBaroLink(check-1,control); + end + end + end + end + end + else + DATIBaro = str2double(DatiBaroLink); + DatiBaroLink = [DATiniBL DATIBaro]; + end + % Elimino eventuali date doppie + a = 2; + [r,~] = size(DatiBaroLink); + while a <= r + if DatiBaroLink(a,1) == DatiBaroLink(a-1,1) + DatiBaroLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + text = ['Barometer data conversion for chain ' IDunitBaro ' - ' DTcatenaBaro ' done']; + fprintf(fileID,fmt,text); + end + end + if NuovoZeroBL == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiBaroLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiBaroLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiBaroLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiBaroLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiBaroLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1) datenum(datainiBL) + datainiBL = datainiPL; + elseif datenum(datainiPL) < datenum(datainiBL) + datainiPL = datainiBL; + else + check_PLvsBL = 1; + end + end + end +end + +%% SOLO Baro Link, NO Piezo Link +if yesBL == 1 && yesPL == 0 + NAN = 0; + RawDataFile = ['' IDcentralina '-' DTcatena '-BL-RawData.csv']; % Generico per MUMS + while NAN == 0 + if datenum(datainiBL) == datenum(Data(1,1)) + tempoiniBL = char(Data(1,2)); + end + % Scarico dei dati relativi alla centralina con informazioni di Data e ora, livello batteria e temperatura + % Step 1 (vedi commento più avanti) + NodeType = 'Baro Link'; + comando = ['select Date, Time from RawDataView where Date = ''' ... + datainiBL ''' and Time >= ''' tempoiniBL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType '''']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniBL = curs.Data; + Ntempo = DATiniBL; + [r,c] = size(DATiniBL); + saltoBL = 0; + if r==1 && c==1 + textdatBL = 'Warning: error reading Baro Link (control unit data)!'; + fprintf(fileID,fmt,textdatBL); + saltoBL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiBL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType '''']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2BL = curs.Data; + Ndate = DAT2BL; + if saltoBL == 1 + DATiniBL = DAT2BL; + end + Check = size(DAT2BL); + if Check(1,2) > 1 % ho superato il primo giorno + if saltoBL == 0 + DATiniBL = [DATiniBL; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniBL); + if cD ~=1 + T = [cell2mat(DATiniBL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniBL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniBL = T; + else + DATiniBL = []; + end + + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoBL == 0 + if Check(1,2) > 1 % Ho superato il primo giorno + DatiBaroLink = cell(rd+rt,2*rBL); + else + DatiBaroLink = cell(rt,2*rBL); + end + else + DatiBaroLink = cell(rd,2*rBL); + end + NBaroLink = cell2mat(NodoBaroLink(:,2)); + col = 2; + w = 0; + while ii <= rBL + nN = NBaroLink(ii,1); + nNodo = num2str(nN); + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + comando = ['select Val3, Val4 from RawDataView where Date = ''' ... + datainiBL ''' and Time >= ''' tempoiniBL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType ... + ''' and NodeNum =' nNodo ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoBL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val3, Val4 from RawDataView where Date > ''' ... + datainiBL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =''' nNodo '''']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoBLd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-1; + if saltoBL == 0 + DatiBaroLink(1:rt,ini_col:col) = DATnodoBL(:,:); + else + DatiBaroLink(1:rd,ini_col:col) = DATnodoBLd(:,:); + end + [rn,~] = size(DATnodoBLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoBLd(i,:) = DATnodoBLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Baro Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoBL == 0 + DatiBaroLink(rt+1:rt+rd,ini_col:col) = DATnodoBLd(:,:); + end + else + DatiBaroLink = DatiBaroLink(1:end,:); + end + okdatBL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rBL) ' Baro Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatBL); + ii = ii+1; + col = col+2; + end + if w == 0 + wardat = 'There are not warning for Baro Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiBaroLink); + ErrBaroLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroBL== 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiBaroLink(1,jj))); + idxND = find(strcmp('No Data',DatiBaroLink(1,jj))); + idxT = find(strcmp('---',DatiBaroLink(1,jj))); + idxT2 = find(strcmp('-',DatiBaroLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiBaroLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiBaroLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiBaroLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiBaroLink(1,jj))); + idxN = find(strcmp('null',DatiBaroLink(1,jj))); + idxF = find(str2double(cell2mat(DatiBaroLink(1,1)))<12000); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxF); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Baro Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroBL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiBL)+1 < now + datainiBL = datestr(datenum(datainiBL)+1,'yyyy-mm-dd'); + break + else + yesBL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiBL = datestr(datenum(datainiBL)-1,'yyyy-mm-dd'); + break + else + DatiBaroLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrBaroLink(1,jj) = 1; + wardat = 'Data of Baro Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiBaroLink(:,jj))); + idxND = find(strcmp('No Data',DatiBaroLink(:,jj))); + idxT = find(strcmp('---',DatiBaroLink(:,jj))); + idxT2 = find(strcmp('-',DatiBaroLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiBaroLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiBaroLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiBaroLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiBaroLink(:,jj))); + idxN = find(strcmp('null',DatiBaroLink(:,jj))); + for ii = 1:r + if str2double(cell2mat(DatiBaroLink(ii,1))) < 12000 + idxF = [idxF; ii]; + end + end + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxF); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiBL = datestr(datenum(datainiBL)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + else + DatiBaroLink(indice,jj) = DatiBaroLink(indice-1,jj); + ErrBaroLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiBaroLink(nnn,jj))); + if check == 1 + DatiBaroLink(nnn,jj) = DatiBaroLink(nnn-1,jj); + ErrBaroLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Baro Link data done!']; + fprintf(fileID,fmt,corrdat); + + % Concateno informazioni generali e/o letture dai nodi. + + % se barometro e piezometro non appartengono alla stessa catena, interpolo + % i dati + if B==0 + DATIBaro = str2double(DatiBaroLink); + DATIBaroInt = interp1(DATiniBL(:,1),DATIBaro(:,1),DATiniPL(:,1)); + DATIBaroTemp = interp1(DATiniBL(:,1),DATIBaro(:,2),DATiniPL(:,1)); + DatiBaroLink = [DATiniPL DATIBaroInt DATIBaroTemp]; + log = isnan(DatiBaroLink(:,:)); + [rL,cL] = size(log); + for check = 1:rL + for control = 1:cL + if log(check,control) == 1 + if check == 1 % è proprio la prima data ad essere Nan, ciò significa che il barometro è stato installato dopo il piezometro + i = 2; + while log(i,control) == 1 + i = i+1; + end + DatiBaroLink(check,control) = DatiBaroLink(i,control); + else + DatiBaroLink(check,control) = DatiBaroLink(check-1,control); + end + end + end + end + else + DATIBaro = str2double(DatiBaroLink); + DatiBaroLink = [DATiniBL DATIBaro]; + end + % Elimino eventuali date doppie + a = 2; + [r,~] = size(DatiBaroLink); + while a <= r + if DatiBaroLink(a,1) == DatiBaroLink(a-1,1) + DatiBaroLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + text = ['Barometer data conversion for chain ' IDcentralina ' - ' DTcatena ' done']; + fprintf(fileID,fmt,text); + end + if NuovoZeroBL == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiBaroLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiBaroLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiBaroLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiBaroLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiBaroLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniLL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumLL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniLL = curs.Data; + Ntempo = DATiniLL; + [r,c] = size(DATiniLL); + saltoLL = 0; + if r==1 && c==1 + textdatLL = 'Warning: error reading Load Link (control unit data)!'; + fprintf(fileID,fmt,textdatLL); + saltoLL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiLL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumLL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2LL = curs.Data; + Ndate = DAT2LL; + if saltoLL == 1 + DATiniLL = DAT2LL; + end + Check = size(DAT2LL); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoLL == 0 + DATiniLL = [DATiniLL; DAT2LL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniLL); + if cD ~=1 + T = [cell2mat(DATiniLL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniLL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniLL = T; + else + DATiniLL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + % creo la matrice per i dati Load Link + if saltoLL == 0 + if Check(1,2) > 1 + DatiLoadLink = cell(rd+rt,rLL); + else + DatiLoadLink = cell(rt,rLL); + end + else + DatiLoadLink = cell(rd,rLL); + end + NLoadLink = cell2mat(NodoLoadLink(:,2)); + col = 1; + ii = 1; + w = 0; + while ii <= rLL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NLoadLink(ii,1); + nNodo = num2str(nN); + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiLL ''' and Time >= ''' tempoiniLL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoLL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiLL ''' and UnitName = ''' IDcentralina ''' and ToolNameID = ''' ... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoLLd = curs.Data; + % Concateno i dati relativi a Step 1 e 2 per il nodo ii-esimo. + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoLL == 0 + DatiLoadLink(1:rt,col) = DATnodoLL(:,:); + else + DatiLoadLink(1:rd,col) = DATnodoLL(:,:); + end + + [rn,~] = size(DATnodoLLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoLLd(i,:) = DATnodoLLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Load Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoLL == 0 + DatiLoadLink(rt+1:rt+rd,col) = DATnodoLLd(:,:); + end + else + DatiLoadLink = DatiLoadLink(1:end,:); + end + okdatLL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rLL) ' Load Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatLL); + ii = ii+1; + col = col+1; + end + if w == 0 + wardat = 'There are not warning for Load Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiLoadLink); + ErrLoadLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroLL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiLL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + for jj=1:c + if strcmp('Dis.',DatiLoadLink(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',DatiLoadLink(dis,jj)) == 0 + DatiLoadLink = DatiLoadLink(dis:end,:); + DATiniLL = DATiniLL(dis:end,:); + [r,c] = size(DatiLoadLink); + break + elseif isfile(RawDataFile) == 1 + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiLoadLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrLoadLink(1,jj) = 1; + wardat = 'Data of Load Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + DIS = 0; + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiLL)+1 < now + datainiLL = datestr(datenum(datainiLL)+1,'yyyy-mm-dd'); + break + else + yesLL = 0; + end + end + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiLL)+1 < now + datainiLL = datestr(datenum(datainiLL)+1,'yyyy-mm-dd'); + break + else + yesLL = 0; + end + end + end + end + end + if DIS ~= 1 && yesLL == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiLoadLink(1,jj))); + idxT = find(strcmp('---',DatiLoadLink(1,jj))); + idxT2 = find(strcmp('-',DatiLoadLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiLoadLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiLoadLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiLoadLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiLoadLink(1,jj))); + idxN = find(strcmp('null',DatiLoadLink(1,jj))); + idxRX = find(strcmp('No RX',DatiLoadLink(1,jj))); + idxI = find(strcmp('id Error',DatiLoadLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiLoadLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiLoadLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiLoadLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiLoadLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiLoadLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiLoadLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiLoadLink(1,jj))); + idxND = find(strcmp('No Data',DatiLoadLink(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiLoadLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Load Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroLL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiLL)+1 < now + datainiLL = datestr(datenum(datainiLL)+1,'yyyy-mm-dd'); + break + else + yesLL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiLL = datestr(datenum(datainiLL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiLoadLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrLoadLink(1,jj) = 1; + wardat = 'Data of Load Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiLL = datestr(datenum(datainiLL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiLoadLink(:,jj))); + idxT = find(strcmp('---',DatiLoadLink(:,jj))); + idxT2 = find(strcmp('-',DatiLoadLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiLoadLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiLoadLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiLoadLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiLoadLink(:,jj))); + idxN = find(strcmp('null',DatiLoadLink(:,jj))); + idxRX = find(strcmp('No RX',DatiLoadLink(:,jj))); + idxI = find(strcmp('id Error',DatiLoadLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiLoadLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiLoadLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiLoadLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiLoadLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiLoadLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiLoadLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiLoadLink(:,jj))); + idxND = find(strcmp('No Data',DatiLoadLink(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiLoadLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiLL = datestr(datenum(datainiLL)-1,'yyyy-mm-dd'); + break + else + DatiLoadLink(indice,jj) = DatiLoadLink(indice-1,jj); + ErrLoadLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiLoadLink(nnn,jj))); + if check == 1 + DatiLoadLink(nnn,jj) = DatiLoadLink(nnn-1,jj); + ErrLoadLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Load Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiLoadLink = [DATiniLL str2double(DatiLoadLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiLoadLink(a,1) == DatiLoadLink(a-1,1) + DatiLoadLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + end + if NuovoZeroLL == 1 && yesLL == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiLoadLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiLoadLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiLoadLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiLoadLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiLoadLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniKL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumKL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniKL = curs.Data; + Ntempo = DATiniKL; + [r,c] = size(DATiniKL); + saltoKL = 0; + if r==1 && c==1 + textdatKL = 'Warning: error reading Klino Link (control unit data)!'; + fprintf(fileID,fmt,textdatKL); + saltoKL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiKL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumKL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2KL = curs.Data; + Ndate = DAT2KL; + if saltoKL == 1 + DATiniKL = DAT2KL; + end + Check = size(DAT2KL); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoKL == 0 + DATiniKL = [DATiniKL; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniKL); + if cD ~=1 + T = [cell2mat(DATiniKL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniKL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniKL = T; + else + DATiniKL = []; + end + + % Scarico dati relativi ai singoli nodi + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoKL == 0 + if Check(1,2) > 1 % ho superato il primo giorno + if strcmp(NodoKlinoLink(1,4),'ADC') || strcmp(NodoKlinoLink{1,4} ,'null') ... + || isempty(NodoKlinoLink{1,4}) == 1 || strcmp(NodoKlinoLink{1,4} ,'g') == 1 + DatiKlinoLink = cell(rd+rt,4*rKL); + col = 4; + elseif strcmp(NodoKlinoLink{1,4} ,'Gradi') + DatiKlinoLink = cell(rd+rt,2*rKL); + col = 3; + end + else + if strcmp(NodoKlinoLink(1,4),'ADC') || strcmp(NodoKlinoLink{1,4} ,'null') ... + || isempty(NodoKlinoLink{1,4}) == 1 || strcmp(NodoKlinoLink{1,4} ,'g') == 1 + DatiKlinoLink = cell(rt,4*rKL); + col = 4; + elseif strcmp(NodoKlinoLink{1,4} ,'Gradi') + DatiKlinoLink = cell(rt,2*rKL); + col = 3; + end + end + else + if strcmp(NodoKlinoLink(1,4),'ADC') || strcmp(NodoKlinoLink{1,4} ,'null') ... + || isempty(NodoKlinoLink{1,4}) == 1 || strcmp(NodoKlinoLink{1,4} ,'g') == 1 + DatiKlinoLink = cell(rd,4*rKL); + col = 4; + elseif strcmp(NodoKlinoLink{1,4} ,'Gradi') + DatiKlinoLink = cell(rd,2*rKL); + col = 3; + end + end + NKlinoLink = cell2mat(NodoKlinoLink(:,2)); + + s = 0; + w = 0; + while ii <= rKL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NKlinoLink(ii,1); + nNodo = num2str(nN); + if strcmp(NodoKlinoLink(1,4),'ADC') || strcmp(NodoKlinoLink{1,4} ,'null') || isempty(NodoKlinoLink{1,4}) == 1 + comando = ['select Val0, Val1, Val2, Val6 from RawDataView where Date = ''' datainiKL ''' and Time >= ''' ... + tempoiniKL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoKL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val6 from RawDataView where Date > ''' ... + datainiKL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoKLd = curs.Data; + elseif strcmp(NodoKlinoLink{1,4} ,'g') == 1 + comando = ['select Val0, Val1, Val2, Val3 from RawDataView where Date = ''' datainiKL ''' and Time >= ''' ... + tempoiniKL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoKL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val3 from RawDataView where Date > ''' ... + datainiKL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoKLd = curs.Data; + elseif strcmp(NodoKlinoLink{1,4} ,'Gradi') + comando = ['select Val0, Val1, Val2 from RawDataView where Date = ''' datainiKL ''' and Time >= ''' ... + tempoiniKL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoKL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2 from RawDataView where Date > ''' ... + datainiKL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoKLd = curs.Data; + end + s = s+1; + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if strcmp(NodoKlinoLink(1,4),'ADC') || strcmp(NodoKlinoLink{1,4} ,'null') ... + || isempty(NodoKlinoLink{1,4}) == 1 || strcmp(NodoKlinoLink{1,4} ,'g') + ini_col = col-3; + elseif strcmp(NodoKlinoLink{1,4} ,'Gradi') + ini_col = col-2; + end + if saltoKL == 0 + DatiKlinoLink(1:rt,ini_col:col) = DATnodoKL(:,:); + else + DatiKlinoLink(1:rd,ini_col:col) = DATnodoKLd(:,:); + end + + [rn,~] = size(DATnodoKLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoKLd(i,:) = DATnodoKLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Klino Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoKL == 0 + DatiKlinoLink(rt+1:rt+rd,ini_col:col) = DATnodoKLd(:,:); + end + else + DatiKlinoLink = DatiKlinoLink(1:end,:); + end + okdatKL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rKL) ' Klino Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatKL); + ii = ii+1; + if strcmp(NodoKlinoLink(1,4),'ADC') || strcmp(NodoKlinoLink{1,4} ,'null') ... + || isempty(NodoKlinoLink{1,4}) == 1 || strcmp(NodoKlinoLink{1,4} ,'g') + col = col+4; + elseif strcmp(NodoKlinoLink{1,4} ,'Gradi') + col = col+3; + end + end + if w == 0 + wardat = 'There are not warning for Klino Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiKlinoLink); + ErrKlinoLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroKL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiKL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiKlinoLink(1,jj))); + idxND = find(strcmp('No Data',DatiKlinoLink(1,jj))); + idxT = find(strcmp('---',DatiKlinoLink(1,jj))); + idxT2 = find(strcmp('-',DatiKlinoLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiKlinoLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiKlinoLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiKlinoLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiKlinoLink(1,jj))); + idxN = find(strcmp('null',DatiKlinoLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Klino Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroKL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiKL)+1 < now + datainiKL = datestr(datenum(datainiKL)+1,'yyyy-mm-dd'); + break + else + yesKL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiKL = datestr(datenum(datainiKL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiKlinoLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrKlinoLink(1,jj) = 1; + wardat = 'Data of Klino Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiKL = datestr(datenum(datainiKL)-1,'yyyy-mm-dd'); + break + end + end + end + end + if ESCI == 0 + % Cerco i multipli di 4 per identificare le temperature + if strcmp(NodoKlinoLink(1,4),'ADC') == 1 || strcmp(NodoKlinoLink{1,4} ,'null') == 1 ... + || isempty(NodoKlinoLink{1,4}) == 1 || strcmp(NodoKlinoLink{1,4} ,'g') == 1 + Int = jj/4; + elseif strcmp(NodoKlinoLink{1,4} ,'Gradi') + Int = rKL+1; % NON filtro mai + end + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiKlinoLink(1,jj)) > 1000 + if rDR==1 && cDR==1 || NuovoZeroKL == 0 + NAN = 0; + ESCI = 1; + if datenum(datainiKL)+1 < now + datainiKL = datestr(datenum(datainiKL)+1,'yyyy-mm-dd'); + break + else + yesKL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiKL = datestr(datenum(datainiKL)-1,'yyyy-mm-dd'); + break + else + DatiKlinoLink(1,jj-3) = cellstr(num2str(DatiRaw(RawDate(end),jj-2))); + DatiKlinoLink(1,jj-2) = cellstr(num2str(DatiRaw(RawDate(end),jj-1))); + DatiKlinoLink(1,jj-1) = cellstr(num2str(DatiRaw(RawDate(end),jj))); + DatiKlinoLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrKlinoLink(1,jj) = 1; + wardat = ['Data of Klino Link nodes corrected using Raw Data of reference Csv file. '... + 'MEMS was read as an electrolytic cell']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiKlinoLink(:,jj))); + idxND = find(strcmp('No Data',DatiKlinoLink(:,jj))); + idxT = find(strcmp('---',DatiKlinoLink(:,jj))); + idxT2 = find(strcmp('-',DatiKlinoLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiKlinoLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiKlinoLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiKlinoLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiKlinoLink(:,jj))); + idxN = find(strcmp('null',DatiKlinoLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiKL = datestr(datenum(datainiKL)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + else + DatiKlinoLink(indice,jj) = DatiKlinoLink(indice-1,jj); + ErrKlinoLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + for ii = 2:r + % Cerco i multipli di 4 per identificare le temperature + if strcmp(NodoKlinoLink(1,4),'ADC') || strcmp(NodoKlinoLink{1,4} ,'null') || isempty(NodoKlinoLink{1,4}) == 1 + Int = jj/4; + elseif strcmp(NodoKlinoLink{1,4} ,'Gradi') + Int = rKL+1; % NON filtro mai + end + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiKlinoLink(ii,jj)) > 1000 + DatiKlinoLink(ii,jj-3:jj) = DatiKlinoLink(ii-1,jj-3:jj); + ErrKlinoLink(ii,jj) = 1; + wardat = ['Data of Klino Link nodes corrected using Raw Data of reference Csv file. '... + 'MEMS was read as an electrolytic cell']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiKlinoLink(nnn,jj))); + if check == 1 + DatiKlinoLink(nnn,jj) = DatiKlinoLink(nnn-1,jj); + ErrKlinoLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Klino Link data done!']; + fprintf(fileID,fmt,corrdat); + DatiKlinoLink = [DATiniKL str2double(DatiKlinoLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiKlinoLink(a,1) == DatiKlinoLink(a-1,1) + DatiKlinoLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + if NuovoZeroKL == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiKlinoLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiKlinoLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiKlinoLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiKlinoLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiKlinoLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniKLHR ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumKLHR ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniKLHR = curs.Data; + Ntempo = DATiniKLHR; + [r,c] = size(DATiniKLHR); + saltoKLHR = 0; + if r==1 && c==1 + textdatKLHR = 'Warning: error reading Klino Link HR (control unit data)!'; + fprintf(fileID,fmt,textdatKLHR); + saltoKLHR = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiKLHR ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumKLHR ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2KLHR = curs.Data; + Ndate = DAT2KLHR; + if saltoKLHR == 1 + DATiniKLHR = DAT2KLHR; + end + Check = size(DAT2KLHR); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoKLHR == 0 + DATiniKLHR = [DATiniKLHR; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniKLHR); + if cD ~=1 + T = [cell2mat(DATiniKLHR(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniKLHR(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniKLHR = T; + else + DATiniKLHR = []; + end + + % Scarico dati relativi ai singoli nodi + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoKLHR == 0 + if Check(1,2) > 1 % ho superato il primo giorno + if strcmp(NodoKlinoLink(1,4),'IPTM') == 1 + DatiKlinoLinkHR = cell(rd+rt,3*rKLHR); + else + DatiKlinoLinkHR = cell(rd+rt,6*rKLHR); + end + else + if strcmp(NodoKlinoLink(1,4),'IPTM') == 1 + DatiKlinoLinkHR = cell(rt,3*rKLHR); + else + DatiKlinoLinkHR = cell(rt,6*rKLHR); + end + end + else + if strcmp(NodoKlinoLink(1,4),'IPTM') == 1 + DatiKlinoLinkHR = cell(rd,3*rKLHR); + else + DatiKlinoLinkHR = cell(rd,6*rKLHR); + end + end + NKlinoLinkHR = cell2mat(NodoKlinoLinkHR(:,2)); + if strcmp(NodoKlinoLink(1,4),'IPTM') == 1 + col = 3; + else + col = 6; + end + s = 0; + w = 0; + while ii <= rKLHR + nN = NKlinoLinkHR(rKLHR-s,1); + nNodo = num2str(nN); + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + if strcmp(NodoKlinoLink(1,4),'IPTM') == 1 + comando = ['select Val0, Val1, Val2 from RawDataView where Date = ''' datainiKLHR ''' and Time >= ''' ... + tempoiniKLHR ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoKLHR = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2 from RawDataView where Date > ''' ... + datainiKLHR ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoKLHRd = curs.Data; + ini_col = col-2; + else + comando = ['select Val0, Val1, Val3, Val4, Val5, Val6 from RawDataView where Date = '''... + datainiKLHR ''' and Time >= ''' tempoiniKLHR ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoKLHR = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val3, Val4, Val5, Val6 from RawDataView where Date > ''' ... + datainiKLHR ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoKLHRd = curs.Data; + ini_col = col-5; + end + s = s+1; + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + + if saltoKLHR == 0 + DatiKlinoLinkHR(1:rt,ini_col:col) = DATnodoKLHR(:,:); + else + DatiKlinoLinkHR(1:rd,ini_col:col) = DATnodoKLHRd(:,:); + end + + [rn,~] = size(DATnodoKLHRd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoKLHRd(i,:) = DATnodoKLHRd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Klino Link HR ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoKLHR == 0 + DatiKlinoLinkHR(rt+1:rt+rd,ini_col:col) = DATnodoKLHRd(:,:); + end + else + DatiKlinoLinkHR = DatiKlinoLinkHR(1:end,:); + end + okdatKLHR = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rKLHR) ' Klino Link HR nodes downloaded correctly']; + fprintf(fileID,fmt,okdatKLHR); + ii = ii+1; + if strcmp(NodoKlinoLink(1,4),'IPTM') == 1 + col = col+3; + else + col = col+6; + end + end + wardat = 'There are not warning for Klino Link HR!'; + fprintf(fileID,fmt,wardat); + if w == 0 + wardat = 'There are not warning for Klino Link HR!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiKlinoLinkHR); + ErrKlinoLinkHR = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroKLHR == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiKLHR)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiKlinoLinkHR(1,jj))); + idxND = find(strcmp('No Data',DatiKlinoLinkHR(1,jj))); + idxT = find(strcmp('---',DatiKlinoLinkHR(1,jj))); + idxT2 = find(strcmp('-',DatiKlinoLinkHR(1,jj))); + idxE2 = find(strcmp('Err2',DatiKlinoLinkHR(1,jj))); + idxE255 = find(strcmp('Err255',DatiKlinoLinkHR(1,jj))); + idxD = find(strcmp('DMUXe',DatiKlinoLinkHR(1,jj))); + idxE1F = find(strcmp('Err1File',DatiKlinoLinkHR(1,jj))); + idxN = find(strcmp('null',DatiKlinoLinkHR(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Klino Link HR nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroKLHR == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiKLHR)+1 < now + datainiKLHR = datestr(datenum(datainiKLHR)+1,'yyyy-mm-dd'); + break + else + yesKLHR = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiKLHR = datestr(datenum(datainiKLHR)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiKlinoLinkHR(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrKlinoLinkHR(1,jj) = 1; + wardat = 'Data of Klino Link HR nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiKLHR = datestr(datenum(datainiKLHR)-1,'yyyy-mm-dd'); + break + end + end + end + end + if ESCI == 0 + % Cerco i multipli di 6 per identificare le temperature + if strcmp(NodoKlinoLink(1,4),'IPTM') == 1 + else + Int = jj/6; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiKlinoLinkHR(1,jj)) < 500 + if rDR==1 && cDR==1 || NuovoZeroKLHR == 0 + NAN = 0; + ESCI = 1; + if datenum(datainiKLHR)+1 < now + datainiKLHR = datestr(datenum(datainiKLHR)+1,'yyyy-mm-dd'); + break + else + yesKLHR = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + if datenum(datainiKLHR)+1 < now + datainiKLHR = datestr(datenum(datainiKLHR)+1,'yyyy-mm-dd'); + break + else + yesKLHR = 0; + end + else + DatiKlinoLinkHR(1,jj-5) = cellstr(num2str(DatiRaw(RawDate(end),jj-4))); + DatiKlinoLinkHR(1,jj-4) = cellstr(num2str(DatiRaw(RawDate(end),jj-3))); + DatiKlinoLinkHR(1,jj-3) = cellstr(num2str(DatiRaw(RawDate(end),jj-2))); + DatiKlinoLinkHR(1,jj-2) = cellstr(num2str(DatiRaw(RawDate(end),jj-1))); + DatiKlinoLinkHR(1,jj-1) = cellstr(num2str(DatiRaw(RawDate(end),jj))); + DatiKlinoLinkHR(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrKlinoLinkHR(1,jj) = 1; + wardat = ['Data of Klino Link HR nodes corrected using Raw Data of reference Csv file. '... + 'Electrolytic cell was read as the corresponding MEMS']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiKlinoLinkHR(:,jj))); + idxND = find(strcmp('No Data',DatiKlinoLinkHR(:,jj))); + idxT = find(strcmp('---',DatiKlinoLinkHR(:,jj))); + idxT2 = find(strcmp('-',DatiKlinoLinkHR(:,jj))); + idxE2 = find(strcmp('Err2',DatiKlinoLinkHR(:,jj))); + idxE255 = find(strcmp('Err255',DatiKlinoLinkHR(:,jj))); + idxD = find(strcmp('DMUXe',DatiKlinoLinkHR(:,jj))); + idxE1F = find(strcmp('Err1File',DatiKlinoLinkHR(:,jj))); + idxN = find(strcmp('null',DatiKlinoLinkHR(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiKLHR = datestr(datenum(datainiKLHR)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + else + DatiKlinoLinkHR(indice,jj) = DatiKlinoLinkHR(indice-1,jj); + ErrKlinoLinkHR(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if strcmp(NodoKlinoLink(1,4),'IPTM') == 1 + else + for ii = 2:r + % Cerco i multipli di 6 per identificare le temperature + Int = jj/6; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiKlinoLinkHR(ii,jj)) < 500 + DatiKlinoLinkHR(ii,jj-5:jj) = DatiKlinoLinkHR(ii-1,jj-5:jj); + ErrKlinoLinkHR(ii,jj) = 1; + wardat = ['Data of Klino Link HR nodes corrected using Raw Data of reference Csv file. '... + 'Electrolytic cell was read as a MEMS']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiKlinoLinkHR(nnn,jj))); + if check == 1 + DatiKlinoLinkHR(nnn,jj) = DatiKlinoLinkHR(nnn-1,jj); + ErrKlinoLinkHR(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Klino Link HR data done!']; + fprintf(fileID,fmt,corrdat); + DatiKlinoLinkHR = [DATiniKLHR str2double(DatiKlinoLinkHR)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiKlinoLinkHR(a,1) == DatiKlinoLinkHR(a-1,1) + DatiKlinoLinkHR(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + if NuovoZeroKLHR == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiKlinoLinkHR(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiKlinoLinkHR(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiKlinoLinkHR(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiKlinoLinkHR(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiKlinoLinkHR; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniRL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumRL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniRL = curs.Data; + Ntempo = DATiniRL; + [r,c] = size(DATiniRL); + saltoRL = 0; + if r==1 && c==1 + textdatRL = 'Warning: error reading Rain Link (control unit data)!'; + fprintf(fileID,fmt,textdatRL); + saltoRL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiRL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumRL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2RL = curs.Data; + Ndate = DAT2RL; + if saltoRL == 1 + DATiniRL = DAT2RL; + end + Check = size(DAT2RL); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoRL == 0 + DATiniRL = [DATiniRL; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniRL); + if cD ~=1 + T = [cell2mat(DATiniRL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniRL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniRL = T; + else + DATiniRL = []; + end + + % Scarico dati relativi ai singoli nodi + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoRL == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiRainLink = cell(rd+rt,1*rRL); + else + DatiRainLink = cell(rt,1*rRL); + end + else + DatiRainLink = cell(rd,1*rRL); + end + NRainLink = cell2mat(NodoRainLink(:,2)); + col = 1; + w = 0; + while ii <= rRL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NRainLink(ii,1); + nNodo = num2str(nN); + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiRL ''' and Time >= ''' tempoiniRL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiRL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoRLd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoRL == 0 + DatiRainLink(1:rt,col) = DATnodoRL(:,:); + else + DatiRainLink(1:rd,col) = DATnodoRLd(:,:); + end + + [rn,~] = size(DATnodoRLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoRLd(i,:) = DATnodoRLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Rain Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoRL == 0 + DatiRainLink(rt+1:rt+rd,col) = DATnodoRLd(:,:); + end + else + DatiRainLink = DatiRainLink(1:end,:); + end + okdatRL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rRL) ' Rain Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatRL); + ii = ii+1; + col = col+1; + end + if w == 0 + wardat = 'There are not warning for Rain Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiRainLink); + ErrRainLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroRL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiRL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiRainLink(1,jj))); + idxND = find(strcmp('No Data',DatiRainLink(1,jj))); + idxT = find(strcmp('---',DatiRainLink(1,jj))); + idxT2 = find(strcmp('-',DatiRainLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiRainLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiRainLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiRainLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiRainLink(1,jj))); + idxN = find(strcmp('null',DatiRainLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Rain Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroRL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiRL)+1 < now + datainiRL = datestr(datenum(datainiRL)+1,'yyyy-mm-dd'); + break + else + yesRL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiRL = datestr(datenum(datainiRL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiRainLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrRainLink(1,jj) = 1; + wardat = 'Data of Rain Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiRL = datestr(datenum(datainiRL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiRainLink(:,jj))); + idxND = find(strcmp('No Data',DatiRainLink(:,jj))); + idxT = find(strcmp('---',DatiRainLink(:,jj))); + idxT2 = find(strcmp('-',DatiRainLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiRainLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiRainLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiRainLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiRainLink(:,jj))); + idxN = find(strcmp('null',DatiRainLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiRL = datestr(datenum(datainiRL)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + else + DatiRainLink(indice,jj) = DatiRainLink(indice-1,jj); + ErrRainLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiRainLink(nnn,jj))); + if check == 1 + DatiRainLink(nnn,jj) = DatiRainLink(nnn-1,jj); + ErrRainLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Rain Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiRainLink = [DATiniRL str2double(DatiRainLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiRainLink(a,1) == DatiRainLink(a-1,1) + DatiRainLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + if NuovoZeroRL == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiRainLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiRainLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiRainLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiRainLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiRainLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniThL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumThL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniThL = curs.Data; + Ntempo = DATiniThL; + [r,c] = size(DATiniThL); + saltoThL = 0; + if r==1 && c==1 + textdatThL = 'Warning: error reading Therm Link (control unit data)!'; + fprintf(fileID,fmt,textdatThL); + saltoThL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiThL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumThL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2ThL = curs.Data; + Ndate = DAT2ThL; + if saltoThL == 1 + DATiniThL = DAT2ThL; + end + Check = size(DAT2ThL); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoThL == 0 + DATiniThL = [DATiniThL; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniThL); + if cD ~=1 + T = [cell2mat(DATiniThL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniThL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniThL = T; + else + DATiniThL = []; + end + + % Scarico dati relativi ai singoli nodi + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoThL == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiThermLink = cell(rd+rt,1*rThL); + else + DatiThermLink = cell(rt,1*rThL); + end + else + DatiThermLink = cell(rd,1*rThL); + end + NThermLink = cell2mat(NodoThermLink(:,2)); + col = 1; + w = 0; + while ii <= rThL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NThermLink(ii,1); + nNodo = num2str(nN); + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiThL ''' and Time >= ''' tempoiniThL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoThL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiThL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoThLd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoThL == 0 + DatiThermLink(1:rt,col) = DATnodoThL(:,:); + else + DatiThermLink(1:rd,col) = DATnodoThLd(:,:); + end + + [rn,~] = size(DATnodoThLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoThLd(i,:) = DATnodoThLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Therm Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoThL == 0 + DatiThermLink(rt+1:rt+rd,col) = DATnodoThLd(:,:); + end + else + DatiThermLink = DatiThermLink(1:end,:); + end + okdatThL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rThL) ' Therm Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatThL); + ii = ii+1; + col = col+1; + end + wardat = 'There are not warning for Therm Link!'; + fprintf(fileID,fmt,wardat); + if w == 0 + wardat = 'There are not warning for Therm Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiThermLink); + ErrThermLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroThL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiThL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiThermLink(1,jj))); + idxND = find(strcmp('No Data',DatiThermLink(1,jj))); + idxT = find(strcmp('---',DatiThermLink(1,jj))); + idxT2 = find(strcmp('-',DatiThermLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiThermLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiThermLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiThermLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiThermLink(1,jj))); + idxN = find(strcmp('null',DatiThermLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Therm Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroThL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiThL)+1 < now + datainiThL = datestr(datenum(datainiThL)+1,'yyyy-mm-dd'); + break + else + yesThL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiThL = datestr(datenum(datainiThL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiThermLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrThermLink(1,jj) = 1; + wardat = 'Data of Therm Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiThL = datestr(datenum(datainiThL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiThermLink(:,jj))); + idxND = find(strcmp('No Data',DatiThermLink(:,jj))); + idxT = find(strcmp('---',DatiThermLink(:,jj))); + idxT2 = find(strcmp('-',DatiThermLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiThermLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiThermLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiThermLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiThermLink(:,jj))); + idxN = find(strcmp('null',DatiThermLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiThL = datestr(datenum(datainiThL)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + else + DatiThermLink(indice,jj) = DatiThermLink(indice-1,jj); + ErrThermLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiThermLink(nnn,jj))); + if check == 1 + DatiThermLink(nnn,jj) = DatiThermLink(nnn-1,jj); + ErrThermLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Therm Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiThermLink = [DATiniThL str2double(DatiThermLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiThermLink(a,1) == DatiThermLink(a-1,1) + DatiThermLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + if NuovoZeroThL == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiThermLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiThermLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiThermLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiThermLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiThermLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniPT100 ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumPT100 ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniPT100 = curs.Data; + Ntempo = DATiniPT100; + [r,c] = size(DATiniPT100); + saltoPT100 = 0; + if r==1 && c==1 + textdatPT100 = 'Warning: error reading PT100 Link (control unit data)!'; + fprintf(fileID,fmt,textdatPT100); + saltoPT100 = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiPT100 ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumPT100 ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2PT100 = curs.Data; + Ndate = DAT2PT100; + if saltoPT100 == 1 + DATiniPT100 = DAT2PT100; + end + Check = size(DAT2PT100); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoPT100 == 0 + DATiniPT100 = [DATiniPT100; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniPT100); + if cD ~=1 + T = [cell2mat(DATiniPT100(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniPT100(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniPT100 = T; + else + DATiniPT100 = []; + end + + % Scarico dati relativi ai singoli nodi + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoPT100 == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiPT100Link = cell(rd+rt,1*rPT100); + else + DatiPT100Link = cell(rt,1*rPT100); + end + else + DatiPT100Link = cell(rd,1*rPT100); + end + NPT100Link = cell2mat(NodoPT100Link(:,2)); + col = 1; + w = 0; + while ii <= rPT100 + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NPT100Link(ii,1); + nNodo = num2str(nN); + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiPT100 ''' and Time >= ''' tempoiniPT100 ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPT100 = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiPT100 ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPT100d = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoPT100 == 0 + DatiPT100Link(1:rt,col) = DATnodoPT100(:,:); + else + DatiPT100Link(1:rd,col) = DATnodoPT100d(:,:); + end + + [rn,~] = size(DATnodoPT100d); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoPT100d(i,:) = DATnodoPT100d(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node PT100 Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoPT100 == 0 + DatiPT100Link(rt+1:rt+rd,col) = DATnodoPT100d(:,:); + end + else + DatiPT100Link = DatiPT100Link(1:end,:); + end + okdatPT100 = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rPT100) ' PT100 Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatPT100); + ii = ii+1; + col = col+1; + end + if w == 0 + wardat = 'There are not warning for PT100 Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiPT100Link); + ErrPT100Link = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroPT100 == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiPT100)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + for jj=1:c + if strcmp('Dis.',DatiPT100Link(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',DatiPT100Link(dis,jj)) == 0 + DatiPT100Link = DatiPT100Link(dis:end,:); + DATiniPT100 = DATiniPT100(dis:end,:); + [r,c] = size(DatiPT100Link); + break + elseif isfile(RawDataFile) == 1 + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiPT100Link(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrPT100Link(1,jj) = 1; + wardat = 'Data of Load Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + DIS = 0; + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiPT100)+1 < now + datainiPT100 = datestr(datenum(datainiPT100)+1,'yyyy-mm-dd'); + break + else + yesPT100 = 0; + end + end + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiPT100)+1 < now + datainiPT100 = datestr(datenum(datainiPT100)+1,'yyyy-mm-dd'); + break + else + yesPT100 = 0; + end + end + end + end + end + if DIS ~= 1 && yesPT100 == 1 + % --- Codice per il primo dato --- + for jj=1:c + % --- Codice per il primo dato --- + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiPT100Link(1,jj))); + idxT = find(strcmp('---',DatiPT100Link(1,jj))); + idxT2 = find(strcmp('-',DatiPT100Link(1,jj))); + idxE2 = find(strcmp('Err2',DatiPT100Link(1,jj))); + idxE255 = find(strcmp('Err255',DatiPT100Link(1,jj))); + idxD = find(strcmp('DMUXe',DatiPT100Link(1,jj))); + idxE1F = find(strcmp('Err1File',DatiPT100Link(1,jj))); + idxN = find(strcmp('null',DatiPT100Link(1,jj))); + idxRX = find(strcmp('No RX',DatiPT100Link(1,jj))); + idxI = find(strcmp('id Error',DatiPT100Link(1,jj))); + idxM = find(strcmp('MUX id Error',DatiPT100Link(1,jj))); + idxC = find(strcmp('CH n. Error',DatiPT100Link(1,jj))); + idxC2 = find(strcmp('CH n. Er',DatiPT100Link(1,jj))); + idxU = find(strcmp('Unknown Error',DatiPT100Link(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiPT100Link(1,jj))); + idxNS = find(strcmp('NotSupp',DatiPT100Link(1,jj))); + idxU2 = find(strcmp('Unknown',DatiPT100Link(1,jj))); + idxNA = find(strcmp('NotAv',DatiPT100Link(1,jj))); + idxND = find(strcmp('No Data',DatiPT100Link(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxC2); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of PT100 Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroPT100 == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiPT100)+1 < now + datainiPT100 = datestr(datenum(datainiPT100)+1,'yyyy-mm-dd'); + break + else + yesPT100 = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiPT100 = datestr(datenum(datainiPT100)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiPT100Link(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrPT100Link(1,jj) = 1; + wardat = 'Data of PT100 Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiPT100 = datestr(datenum(datainiPT100)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj = 1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiPT100Link(:,jj))); + idxT = find(strcmp('---',DatiPT100Link(:,jj))); + idxT2 = find(strcmp('-',DatiPT100Link(:,jj))); + idxE2 = find(strcmp('Err2',DatiPT100Link(:,jj))); + idxE255 = find(strcmp('Err255',DatiPT100Link(:,jj))); + idxD = find(strcmp('DMUXe',DatiPT100Link(:,jj))); + idxE1F = find(strcmp('Err1File',DatiPT100Link(:,jj))); + idxN = find(strcmp('null',DatiPT100Link(:,jj))); + idxRX = find(strcmp('No RX',DatiPT100Link(:,jj))); + idxI = find(strcmp('id Error',DatiPT100Link(:,jj))); + idxM = find(strcmp('MUX id Error',DatiPT100Link(:,jj))); + idxC = find(strcmp('CH n. Error',DatiPT100Link(:,jj))); + idxC2 = find(strcmp('CH n. Er',DatiPT100Link(:,jj))); + idxU = find(strcmp('Unknown Error',DatiPT100Link(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiPT100Link(:,jj))); + idxNS = find(strcmp('NotSupp',DatiPT100Link(:,jj))); + idxU2 = find(strcmp('Unknown',DatiPT100Link(:,jj))); + idxNA = find(strcmp('NotAv',DatiPT100Link(:,jj))); + idxND = find(strcmp('No Data',DatiPT100Link(:,jj))); + idxDis = find(strcmp('Dis.',DatiPT100Link(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxC2); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + idx = union(idx,idxDis); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiPT100 = datestr(datenum(datainiPT100)-1,'yyyy-mm-dd'); + break + else + DatiPT100Link(indice,jj) = DatiPT100Link(indice-1,jj); + ErrPT100Link(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiPT100Link(nnn,jj))); + if check == 1 + DatiPT100Link(nnn,jj) = DatiPT100Link(nnn-1,jj); + ErrPT100Link(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of PT100 Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiPT100Link = [DATiniPT100 str2double(DatiPT100Link)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiPT100Link(a,1) == DatiPT100Link(a-1,1) + DatiPT100Link(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + end + if NuovoZeroPT100 == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiPT100Link(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiPT100Link(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiPT100Link(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiPT100Link(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiPT100Link; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniIPL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumIPL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniIPL = curs.Data; + Ntempo = DATiniIPL; + [r,c] = size(DATiniIPL); + saltoIPL = 0; + if r==1 && c==1 + textdatIPL = 'Warning: error reading In Place Link (control unit data)!'; + fprintf(fileID,fmt,textdatIPL); + saltoIPL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiIPL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumIPL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2IPL = curs.Data; + Ndate = DAT2IPL; + if saltoIPL == 1 + DATiniIPL = DAT2IPL; + end + Check = size(DAT2IPL); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoIPL == 0 + DATiniIPL = [DATiniIPL; DAT2IPL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniIPL); + if cD ~=1 + T = [cell2mat(DATiniIPL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniIPL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniIPL = T; + else + DATiniIPL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoIPL == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiInPlaceLink = cell(rd+rt,7*rTL); + else + DatiInPlaceLink = cell(rt,7*rTL); + end + else + DatiInPlaceLink = cell(rd,7*rTL); + end + NInPlaceLink = cell2mat(NodoInPlaceLink(:,2)); + ii = 1; + col = 7; + w = 0; + while ii <= rIPL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NInPlaceLink(ii,1); + if strcmp(DTcatena,'DT0116') && strcmp(IDcentralina,'ID0075') + if nN == 9 + nN = 17; + end + elseif strcmp(DTcatena,'DT0117') && strcmp(IDcentralina,'ID0075') + if nN == 10 + nN = 3; + end + end + nNodo = num2str(nN); + comando = ['select Val0, Val1, Val2, Val3, Val4, Val5, Val6 from RawDataView where Date = ''' ... + datainiIPL ''' and Time >= ''' tempoiniIPL ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoIPL = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2, Val3, Val4, Val5, Val6 from RawDataView where Date > ''' ... + datainiIPL ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoIPLd = curs.Data; + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + ini_col = col-6; + if saltoIPL == 0 + DatiInPlaceLink(1:rt,ini_col:col) = DATnodoIPL(:,:); + else + DatiInPlaceLink(1:rd,ini_col:col) = DATnodoIPLd(:,:); + end + + [rn,~] = size(DATnodoIPLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoIPLd(i,:) = DATnodoIPLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node In Place Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoIPL == 0 + DatiInPlaceLink(rt+1:rt+rd,ini_col:col) = DATnodoIPLd(:,:); + end + else + DatiInPlaceLink = DatiInPlaceLink(1:end,:); + end + okdatIPL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rIPL) ' In Place Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatIPL); + ii = ii+1; + col = col+7; + end + if w == 0 + wardat = 'There are not warning for In Place Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiInPlaceLink); + ErrInPlaceLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroIPL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiIPL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiInPlaceLink(1,jj))); + idxND = find(strcmp('No Data',DatiInPlaceLink(1,jj))); + idxT = find(strcmp('---',DatiInPlaceLink(1,jj))); + idxT2 = find(strcmp('-',DatiInPlaceLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiInPlaceLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiInPlaceLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiInPlaceLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiInPlaceLink(1,jj))); + idxN = find(strcmp('null',DatiInPlaceLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of In Place Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroIPL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiIPL)+1 < now + datainiIPL = datestr(datenum(datainiIPL)+1,'yyyy-mm-dd'); + break + else + yesIPL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiIPL = datestr(datenum(datainiIPL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiInPlaceLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrInPlaceLink(1,jj) = 1; + wardat = 'Data of In Place Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiIPL = datestr(datenum(datainiIPL)-1,'yyyy-mm-dd'); + break + end + end + end + end + if ESCI == 0 + % Cerco i multipli di 7 per identificare le temperature + Int = jj/7; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiInPlaceLink(1,jj)) > 1000 + if rDR==1 && cDR==1 || NuovoZeroIPL == 0 + NAN = 0; + ESCI = 1; + if datenum(datainiIPL)+1 < now + datainiIPL = datestr(datenum(datainiIPL)+1,'yyyy-mm-dd'); + break + else + yesIPL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiIPL = datestr(datenum(datainiIPL)-1,'yyyy-mm-dd'); + break + else + DatiInPlaceLink(1,jj-6) = cellstr(num2str(DatiRaw(RawDate(end),jj-5))); + DatiInPlaceLink(1,jj-5) = cellstr(num2str(DatiRaw(RawDate(end),jj-4))); + DatiInPlaceLink(1,jj-4) = cellstr(num2str(DatiRaw(RawDate(end),jj-3))); + DatiInPlaceLink(1,jj-3) = cellstr(num2str(DatiRaw(RawDate(end),jj-2))); + DatiInPlaceLink(1,jj-2) = cellstr(num2str(DatiRaw(RawDate(end),jj-1))); + DatiInPlaceLink(1,jj-1) = cellstr(num2str(DatiRaw(RawDate(end),jj))); + DatiInPlaceLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrInPlaceLink(1,jj) = 1; + wardat = ['Data of In Place Link nodes corrected using Raw Data of reference Csv file. '... + 'MEMS was read as an electrolytic cell']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiInPlaceLink(:,jj))); + idxND = find(strcmp('No Data',DatiInPlaceLink(:,jj))); + idxT = find(strcmp('---',DatiInPlaceLink(:,jj))); + idxT2 = find(strcmp('-',DatiInPlaceLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiInPlaceLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiInPlaceLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiInPlaceLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiInPlaceLink(:,jj))); + idxN = find(strcmp('null',DatiInPlaceLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiIPL = datestr(datenum(datainiIPL)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + else + DatiInPlaceLink(indice,jj) = DatiInPlaceLink(indice-1,jj); + ErrInPlaceLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + for ii = 2:r + % Cerco i multipli di 7 per identificare le temperature + Int = jj/7; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiInPlaceLink(ii,jj)) > 1000 + DatiInPlaceLink(ii,jj-6:jj) = DatiInPlaceLink(ii-1,jj-6:jj); + ErrInPlaceLink(ii,jj) = 1; + wardat = ['Data of In Place Link nodes corrected using Raw Data of reference Csv file. '... + 'MEMS was read as an electrolytic cell']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + if ESCI == 1 + NAN = 0; + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r % nodi + check = isnan(cell2mat(DatiInPlaceLink(nnn,jj))); + if check == 1 + DatiInPlaceLink(nnn,jj) = DatiInPlaceLink(nnn-1,jj); + ErrInPlaceLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of In Place Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiInPlaceLink = [DATiniIPL str2double(DatiInPlaceLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiInPlaceLink(a,1) == DatiInPlaceLink(a-1,1) + DatiInPlaceLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + if NuovoZeroIPL == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiInPlaceLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiInPlaceLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiInPlaceLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiInPlaceLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiInPlaceLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniIPLHR ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumIPLHR ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniIPLHR = curs.Data; + Ntempo = DATiniIPLHR; + [r,c] = size(DATiniIPLHR); + saltoIPLHR = 0; + if r==1 && c==1 + textdatIPLHR = 'Warning: error reading In Place Link HR (control unit data)!'; + fprintf(fileID,fmt,textdatIPLHR); + saltoIPLHR = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiIPLHR ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumIPLHR ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2IPLHR = curs.Data; + Ndate = DAT2IPLHR; + if saltoIPLHR == 1 + DATiniIPLHR = DAT2IPLHR; + end + Check = size(DAT2IPLHR); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoIPLHR == 0 + DATiniIPLHR = [DATiniIPLHR; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniIPLHR); + if cD ~=1 + T = [cell2mat(DATiniIPLHR(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniIPLHR(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniIPLHR = T; + else + DATiniIPLHR = []; + end + + % Scarico dati relativi ai singoli nodi + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoIPLHR == 0 + if Check(1,2) > 1 % ho superato il primo giorno + if strcmp(NodoInPlaceLinkHR(1,4),'ADC') || strcmp(NodoInPlaceLinkHR{1,4},'null') || isempty(NodoInPlaceLinkHR{1,4}) == 1 + col = 6; + DatiInPlaceLinkHR = cell(rd+rt,col*rIPLHR); + elseif strcmp(NodoInPlaceLinkHR{1,4} ,'digit') + col = 3; + DatiInPlaceLinkHR = cell(rd+rt,col*rIPLHR); + end + else + if strcmp(NodoInPlaceLinkHR(1,4),'ADC') || strcmp(NodoInPlaceLinkHR{1,4},'null') || isempty(NodoInPlaceLinkHR{1,4}) == 1 + col = 6; + DatiInPlaceLinkHR = cell(rt,col*rIPLHR); + elseif strcmp(NodoInPlaceLinkHR{1,4} ,'digit') + col = 3; + DatiInPlaceLinkHR = cell(rt,col*rIPLHR); + end + end + else + if strcmp(NodoInPlaceLinkHR(1,4),'ADC') || strcmp(NodoInPlaceLinkHR{1,4},'null') || isempty(NodoInPlaceLinkHR{1,4}) == 1 + col = 6; + DatiInPlaceLinkHR = cell(rd,col*rIPLHR); + elseif strcmp(NodoInPlaceLinkHR{1,4} ,'digit') + col = 3; + DatiInPlaceLinkHR = cell(rd,col*rIPLHR); + end + end + NInPlaceLinkHR = cell2mat(NodoInPlaceLinkHR(:,2)); + w = 0; + while ii <= rIPLHR + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NInPlaceLinkHR(ii,1); + if strcmp(DTcatena,'DT0116') && strcmp(IDcentralina,'ID0075') + if nN == 6 + nN = 1; + elseif nN == 10 + nN = 18; + end + elseif strcmp(DTcatena,'DT0117') && strcmp(IDcentralina,'ID0075') + if nN == 10 + nN = 3; + end + end + nNodo = num2str(nN); + if strcmp(NodoInPlaceLinkHR(1,4),'ADC') || strcmp(NodoInPlaceLinkHR{1,4},'null') || ... + isempty(NodoInPlaceLinkHR{1,4}) == 1 + comando = ['select Val0, Val1, Val3, Val4, Val5, Val6 from RawDataView where Date = ''' ... + datainiIPLHR ''' and Time >= ''' tempoiniIPLHR ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoIPLHR = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val3, Val4, Val5, Val6 from RawDataView where Date > ''' ... + datainiIPLHR ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoIPLHRd = curs.Data; + ini_col = col-5; + elseif strcmp(NodoInPlaceLinkHR{1,4} ,'digit') + comando = ['select Val0, Val1, Val2 from RawDataView where Date = ''' ... + datainiIPLHR ''' and Time >= ''' tempoiniIPLHR ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoIPLHR = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1, Val2 from RawDataView where Date > ''' ... + datainiIPLHR ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoIPLHRd = curs.Data; + ini_col = col-2; + end + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + + if saltoIPLHR == 0 + DatiInPlaceLinkHR(1:rt,ini_col:col) = DATnodoIPLHR(:,:); + else + DatiInPlaceLinkHR(1:rd,ini_col:col) = DATnodoIPLHRd(:,:); + end + + [rn,~] = size(DATnodoIPLHRd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoIPLHRd(i,:) = DATnodoIPLHRd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node In Place Link HR ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoIPLHR == 0 + DatiInPlaceLinkHR(rt+1:rt+rd,ini_col:col) = DATnodoIPLHRd(:,:); + end + else + DatiInPlaceLinkHR = DatiInPlaceLinkHR(1:end,:); + end + okdatIPLHR= ['Data of node number ' num2str(ii) ' of ' ... + num2str(rIPLHR) ' In Place Link HR nodes downloaded correctly']; + fprintf(fileID,fmt,okdatIPLHR); + ii = ii+1; + if strcmp(NodoInPlaceLinkHR(1,4),'ADC') || strcmp(NodoInPlaceLinkHR{1,4},'null') || ... + isempty(NodoInPlaceLinkHR{1,4}) == 1 + col = col+6; + elseif strcmp(NodoInPlaceLinkHR{1,4} ,'digit') + col = col+3; + end + end + if w == 0 + wardat = 'There are not warning for In Place Link HR!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiInPlaceLinkHR); + ErrInPlaceLinkHR = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroIPLHR == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiIPLHR)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiInPlaceLinkHR(1,jj))); + idxND = find(strcmp('No Data',DatiInPlaceLinkHR(1,jj))); + idxT = find(strcmp('---',DatiInPlaceLinkHR(1,jj))); + idxT2 = find(strcmp('-',DatiInPlaceLinkHR(1,jj))); + idxE2 = find(strcmp('Err2',DatiInPlaceLinkHR(1,jj))); + idxE255 = find(strcmp('Err255',DatiInPlaceLinkHR(1,jj))); + idxD = find(strcmp('DMUXe',DatiInPlaceLinkHR(1,jj))); + idxE1F = find(strcmp('Err1File',DatiInPlaceLinkHR(1,jj))); + idxN = find(strcmp('null',DatiInPlaceLinkHR(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of In Place Link HR nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroIPLHR == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiIPLHR)+1 < now + datainiIPLHR = datestr(datenum(datainiIPLHR)+1,'yyyy-mm-dd'); + break + else + yesIPLHR = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiIPLHR = datestr(datenum(datainiIPLHR)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiInPlaceLinkHR(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrInPlaceLinkHR(1,jj) = 1; + wardat = 'Data of In Place Link HR nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiIPLHR = datestr(datenum(datainiIPLHR)-1,'yyyy-mm-dd'); + break + end + end + end + end + if ESCI == 0 + if strcmp(NodoInPlaceLinkHR(1,3),'ADC') || strcmp(NodoInPlaceLinkHR{1,4} ,'null') || isempty(NodoInPlaceLinkHR{1,4}) == 1 + % Cerco i multipli di 6 per identificare le temperature + Int = jj/6; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiInPlaceLinkHR(1,jj)) < 500 + if rDR==1 && cDR==1 || NuovoZeroIPLHR == 0 + NAN = 0; + ESCI = 1; + if datenum(datainiIPLHR)+1 < now + datainiIPLHR = datestr(datenum(datainiIPLHR)+1,'yyyy-mm-dd'); + break + else + yesIPLHR = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiIPLHR = datestr(datenum(datainiIPLHR)-1,'yyyy-mm-dd'); + break + else + DatiInPlaceLinkHR(1,jj-5) = cellstr(num2str(DatiRaw(RawDate(end),jj-4))); + DatiInPlaceLinkHR(1,jj-4) = cellstr(num2str(DatiRaw(RawDate(end),jj-3))); + DatiInPlaceLinkHR(1,jj-3) = cellstr(num2str(DatiRaw(RawDate(end),jj-2))); + DatiInPlaceLinkHR(1,jj-2) = cellstr(num2str(DatiRaw(RawDate(end),jj-1))); + DatiInPlaceLinkHR(1,jj-1) = cellstr(num2str(DatiRaw(RawDate(end),jj))); + DatiInPlaceLinkHR(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrInPlaceLinkHR(1,jj) = 1; + wardat = ['Data of In Place Link HR nodes corrected using Raw Data of reference Csv file. '... + 'Electrolytic cell was read as the corresponding MEMS']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiInPlaceLinkHR(:,jj))); + idxND = find(strcmp('No Data',DatiInPlaceLinkHR(:,jj))); + idxT = find(strcmp('---',DatiInPlaceLinkHR(:,jj))); + idxT2 = find(strcmp('-',DatiInPlaceLinkHR(:,jj))); + idxE2 = find(strcmp('Err2',DatiInPlaceLinkHR(:,jj))); + idxE255 = find(strcmp('Err255',DatiInPlaceLinkHR(:,jj))); + idxD = find(strcmp('DMUXe',DatiInPlaceLinkHR(:,jj))); + idxE1F = find(strcmp('Err1File',DatiInPlaceLinkHR(:,jj))); + idxN = find(strcmp('null',DatiInPlaceLinkHR(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiIPLHR = datestr(datenum(datainiIPLHR)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + else + DatiInPlaceLinkHR(indice,jj) = DatiInPlaceLinkHR(indice-1,jj); + ErrInPlaceLinkHR(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if strcmp(NodoInPlaceLinkHR(1,3),'ADC') || strcmp(NodoInPlaceLinkHR{1,4} ,'null') || isempty(NodoInPlaceLinkHR{1,4}) == 1 + for ii = 2:r + % Cerco i multipli di 6 per identificare le temperature + Int = jj/6; + if floor(Int) == Int + % Controllo ampolle + if str2double(DatiInPlaceLinkHR(ii,jj)) < 500 + DatiInPlaceLinkHR(ii,jj-5:jj) = DatiInPlaceLinkHR(ii-1,jj-5:jj); + ErrInPlaceLinkHR(ii,jj) = 1; + wardat = ['Data of In Place Link HR nodes corrected using Raw Data of reference Csv file. '... + 'MEMS was read as an electrolytic cell']; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + ESCI = 0; + end + end + end + end + if ESCI == 1 + NAN = 0; + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiInPlaceLinkHR(nnn,jj))); + if check == 1 + DatiInPlaceLinkHR(nnn,jj) = DatiInPlaceLinkHR(nnn-1,jj); + ErrInPlaceLinkHR(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of In Place Link HR data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiInPlaceLinkHR = [DATiniIPLHR str2double(DatiInPlaceLinkHR)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiInPlaceLinkHR(a,1) == DatiInPlaceLinkHR(a-1,1) + DatiInPlaceLinkHR(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + if NuovoZeroIPLHR == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiInPlaceLinkHR(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiInPlaceLinkHR(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiInPlaceLinkHR(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiInPlaceLinkHR(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiInPlaceLinkHR; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)= ''' tempoiniWL ''' and UnitName = ''' IDcentralina... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' ... + NodeType ''' and NodeNum = ''' NodeNumWL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniWL = curs.Data; + Ntempo = DATiniWL; + [r,c] = size(DATiniWL); + saltoWL = 0; + if r==1 && c==1 + textdatWL = 'Warning: error reading Weir Link (control unit data)!'; + fprintf(fileID,fmt,textdatWL); + saltoWL = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiWL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumWL ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2WL = curs.Data; + Ndate = DAT2WL; + if saltoWL == 1 + DATiniWL = DAT2WL; + end + Check = size(DAT2WL); + if Check(1,2) > 1 % ho superato il primo giorno + if saltoWL == 0 + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + DATiniWL = [DATiniWL; DAT2WL]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniWL); + if cD ~=1 + T = [cell2mat(DATiniWL(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniWL(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniWL = T; + else + DATiniWL = []; + end + + % Scarico dati relativi ai singoli nodi + [rd,~] = size(Ndate); % numero di dati successivi al primo giorno di calcolo + [rt,~] = size(Ntempo); % numero di dati del primo giorno di calcolo + % creo la matrice per i dati Extensometer Link + if saltoWL == 0 + if Check(1,2) > 1 + DatiWeirLink = cell(rd+rt,rWL); + DatiNTCWeirLink = cell(rd+rt,rWL); + else + DatiWeirLink = cell(rt,rWL); + DatiNTCWeirLink = cell(rt,rWL); + end + else + DatiWeirLink = cell(rd,rWL); + DatiNTCWeirLink = cell(rd,rWL); + end + NWeir = cell2mat(NodoWeirLink(:,2)); + col = 1; + ii = 1; + w = 0; + while ii <= rWL + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NWeir(ii,1); + nNodo = num2str(nN); + % Dato + comando = ['select Val0 from RawDataView where Date = ''' ... + datainiWL ''' and Time >= ''' tempoiniWL ''' and ToolNameID = ''' ... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoWL = curs.Data; + % Dato + comando = ['select Val0 from RawDataView where Date > ''' ... + datainiWL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = '''... + NodeType ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoWLd = curs.Data; + if Therm(ii) == 0 % Non leggo il termometro + % T + DATnodoWL_NTC = 0; + DATnodoWLd_NTC = 0; + elseif Therm(ii) == 1 + if ChWL(ii,1) == 2 + comando = ['select Val1 from RawDataView where Date = ''' ... + datainiWL ''' and Time >= ''' tempoiniWL ''' and ToolNameID = ''' ... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + elseif ChWL(ii,1) == 3 + comando = ['select Val2 from RawDataView where Date = ''' ... + datainiWL ''' and Time >= ''' tempoiniWL ''' and ToolNameID = ''' ... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + elseif ChWL(ii,1) == 4 + comando = ['select Val3 from RawDataView where Date = ''' ... + datainiWL ''' and Time >= ''' tempoiniWL ''' and ToolNameID = ''' ... + DTcatena ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' ... + NodeType ''' and NodeNum =' nNodo '']; + end + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoWL_NTC = curs.Data; + if ChWL(ii,1) == 2 + comando = ['select Val1 from RawDataView where Date > ''' ... + datainiWL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = '''... + NodeType ''' and NodeNum = ' nNodo '']; + elseif ChWL(ii,1) == 3 + comando = ['select Val2 from RawDataView where Date > ''' ... + datainiWL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = '''... + NodeType ''' and NodeNum = ' nNodo '']; + elseif ChWL(ii,1) == 4 + comando = ['select Val3 from RawDataView where Date > ''' ... + datainiWL ''' and UnitName = ''' IDcentralina ... + ''' and ToolNameID = ''' DTcatena ''' and NodeType = '''... + NodeType ''' and NodeNum = ' nNodo '']; + end + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoWLd_NTC = curs.Data; + else + % T + DATnodoWL_NTC = 0; + DATnodoWLd_NTC = 0; + end + + [rn,~] = size(DATnodoWLd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoWLd(i,:) = DATnodoWLd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Weir Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + [rnT,~] = size(DATnodoWLd_NTC); % controllo date + if rnT < rd % normalmente sono uguali + for i = rnT+1:rd + DATnodoWLd_NTC(i,:) = DATnodoWLd_NTC(rnT,:); % se mancano dati, copio gli ultimi + end + wardat = ['NTC of Node Weir Link ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + if saltoWL == 0 + if ChWL(ii,1) >= 2 + if Therm(ii,1)==1 + DatiWeirLink(1:rt,col) = DATnodoWL(:,:); %#ok<*AGROW> + DatiNTCWeirLink(1:rt,col) = DATnodoWL_NTC(:,:); %#ok<*AGROW> + if Check(1,2) > 1 + [rrr,~] = size(DATnodoWLd); + if rrr ~= rd + DatiWeirLink(rt+rd-rrr+1:rt+rd,col) = DATnodoWLd; + DatiNTCWeirLink(rt+rd-rrr+1:rt+rd,col) = DATnodoWLd_NTC; %#ok<*AGROW> + else + DatiWeirLink(rt+1:rt+rd,col) = DATnodoWLd(:,:); + DatiNTCWeirLink(rt+1:rt+rd,col) = DATnodoWLd_NTC(:,:); %#ok<*AGROW> + end + end + else + DatiWeirLink(1:rt,col) = DATnodoWL(:,:); %#ok<*AGROW> + if Check(1,2) > 1 + DatiWeirLink(rt+1:rt+rd,col) = DATnodoWLd(:,:); + end + end + elseif ChWL(ii,1) == 1 + DatiWeirLink(1:rt,col) = DATnodoWL(:,:); %#ok<*AGROW> + if Check(1,2) > 1 + DatiWeirLink(rt+1:rt+rd,col) = DATnodoWLd(:,:); + end + end + else + if ChWL(ii,1) >= 2 + if Therm(ii,1)==1 + DatiWeirLink(1:rd,col) = DATnodoWL(:,:); %#ok<*AGROW> + DatiNTCWeirLink(1:rd,col) = DATnodoWL_NTC(:,:); %#ok<*AGROW> + else + DatiWeirLink(1:rd,col) = DATnodoWL(:,:); %#ok<*AGROW> + end + elseif ChWL(ii,1) == 1 + DatiWeirLink(1:rd,col) = DATnodoWL(:,:); %#ok<*AGROW> + end + end + + okdatWL = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rWL) ' Weir Link nodes downloaded correctly']; + fprintf(fileID,fmt,okdatWL); + ii = ii+1; + col = col+1; + end + if w == 0 + wardat = 'There are not warning for Weir Link!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + + % Dati + [r,c] = size(DatiWeirLink); + ErrWeirLink = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + if NuovoZeroWL == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiWL)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + + for jj=1:c + % Se il nodo è Dis., devo aumentare di uno la data (il nodo non + % è ancora stato installato!) + if strcmp('Dis.',DatiWeirLink(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',DatiWeirLink(dis,jj)) == 0 + DatiWeirLink = DatiWeirLink(dis:end,:); + DATiniWL = DATiniWL(dis:end,:); + [r,c] = size(DatiWeirLink); + break + elseif isfile(RawDataFile) == 1 + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiWeirLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrWeirLink(1,jj) = 1; + wardat = 'Data of Weir Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + DIS = 0; + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiWL)+1 < now + datainiWL = datestr(datenum(datainiWL)+1,'yyyy-mm-dd'); + break + else + yesWL = 0; + end + end + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiWL)+1 < now + datainiWL = datestr(datenum(datainiWL)+1,'yyyy-mm-dd'); + break + else + yesWL = 0; + end + end + end + + end + end + if DIS ~= 1 && yesWL == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiWeirLink(1,jj))); + idxT = find(strcmp('---',DatiWeirLink(1,jj))); + idxT2 = find(strcmp('-',DatiWeirLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiWeirLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiWeirLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiWeirLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiWeirLink(1,jj))); + idxN = find(strcmp('null',DatiWeirLink(1,jj))); + idxRX = find(strcmp('No RX',DatiWeirLink(1,jj))); + idxI = find(strcmp('id Error',DatiWeirLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiWeirLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiWeirLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiWeirLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiWeirLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiWeirLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiWeirLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiWeirLink(1,jj))); + idxND = find(strcmp('No Data',DatiWeirLink(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Stress Meter nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroWL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiWL)+1 < now + datainiWL = datestr(datenum(datainiWL)+1,'yyyy-mm-dd'); + break + else + yesWL = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiWL = datestr(datenum(datainiWL)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiWeirLink(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrWeirLink(1,jj) = 1; + wardat = 'Data of Weir Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiWL = datestr(datenum(datainiWL)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiWeirLink(:,jj))); + idxT = find(strcmp('---',DatiWeirLink(:,jj))); + idxT2 = find(strcmp('-',DatiWeirLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiWeirLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiWeirLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiWeirLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiWeirLink(:,jj))); + idxN = find(strcmp('null',DatiWeirLink(:,jj))); + idxRX = find(strcmp('No RX',DatiWeirLink(:,jj))); + idxI = find(strcmp('id Error',DatiWeirLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiWeirLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiWeirLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiWeirLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiWeirLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiWeirLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiWeirLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiWeirLink(:,jj))); + idxDis = find(strcmp('Dis.',DatiWeirLink(:,jj))); + idxND = find(strcmp('No Data',DatiWeirLink(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxND); + idx = union(idx,idxT2); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxDis); + idx = union(idx,idxND); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiWL = datestr(datenum(datainiWL)-1,'yyyy-mm-dd'); + break + else + DatiWeirLink(indice,jj) = DatiWeirLink(indice-1,jj); + ErrWeirLink(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiWeirLink(nnn,jj))); + if check == 1 + DatiWeirLink(nnn,jj) = DatiWeirLink(nnn-1,jj); + ErrWeirLink(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Weir Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiWeirLink = [DATiniWL str2double(DatiWeirLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiWeirLink(a,1) == DatiWeirLink(a-1,1) + DatiWeirLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + + if ESCI == 0 + if sum(Therm(:,1))>0 + if DIS ~= 1 && yesWL == 1 + % NTC + [r,c] = size(DatiNTCWeirLink); + Ncorr = 0; + if NuovoZeroWL == 1 + if isfile(RawDataFile) == 1 + DatiRawNTC = csvread(RawDataFileNTC); + [rDR,cDR] = size(DatiRawNTC); + DatiRawNTC(:,1) = DatiRawNTC(:,1) + 730000; + RawDateNTC = find(DatiRawNTC(:,1)<=datenum(datainiWL)); + else + rDR = 1; + cDR = 1; + DatiRawNTC = []; + RawDateNTC = []; + end + else + rDR = 1; + cDR = 1; + RawDateNTC = []; + DatiRawNTC = []; + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTCWeirLink(1,jj))); + idxND = find(strcmp('No Data',DatiNTCWeirLink(1,jj))); + idxT3 = find(strcmp('---',DatiNTCWeirLink(1,jj))); + idxT = find(strcmp('-',DatiNTCWeirLink(1,jj))); + idxE2 = find(strcmp('Err2',DatiNTCWeirLink(1,jj))); + idxE255 = find(strcmp('Err255',DatiNTCWeirLink(1,jj))); + idxD = find(strcmp('DMUXe',DatiNTCWeirLink(1,jj))); + idxE1F = find(strcmp('Err1File',DatiNTCWeirLink(1,jj))); + idxN = find(strcmp('null',DatiNTCWeirLink(1,jj))); + idxRX = find(strcmp('No RX',DatiNTCWeirLink(1,jj))); + idxI = find(strcmp('id Error',DatiNTCWeirLink(1,jj))); + idxM = find(strcmp('MUX id Error',DatiNTCWeirLink(1,jj))); + idxC = find(strcmp('CH n. Error',DatiNTCWeirLink(1,jj))); + idxU = find(strcmp('Unknown Error',DatiNTCWeirLink(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTCWeirLink(1,jj))); + idxNS = find(strcmp('NotSupp',DatiNTCWeirLink(1,jj))); + idxU2 = find(strcmp('Unknown',DatiNTCWeirLink(1,jj))); + idxDis = find(strcmp('Dis.',DatiNTCWeirLink(1,jj))); + idxNA = find(strcmp('NotAv',DatiNTCWeirLink(1,jj))); + idx = union(idxE,idxT3); + idx = union(idx,idxT); + idx = union(idx,idxND); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxDis); + idx = union(idx,idxNA); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of NTC of Weir Link nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroWL == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiWL)+1 < now + datainiWL = datestr(datenum(datainiWL)+1,'yyyy-mm-dd'); + break + else + yesWL = 0; + end + else + if isempty(RawDateNTC) == 1 + NAN = 0; + ESCI = 1; + datainiWL = datestr(datenum(datainiWL)-1,'yyyy-mm-dd'); + break + else + DatiNTCWeirLink(1,jj) = cellstr(num2str(DatiRawNTC(RawDateNTC(end),jj+1))); + if ErrWeirLink(indice,jj) == 0 + ErrWeirLink(indice,jj) = 0.5; + else + ErrWeirLink(indice,jj) = 1; + end + wardat = 'Data of NTC of Weir Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + end + end + end + end + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiNTCWeirLink(:,jj))); + idxND = find(strcmp('No Data',DatiNTCWeirLink(:,jj))); + idxT3 = find(strcmp('---',DatiNTCWeirLink(:,jj))); + idxT = find(strcmp('-',DatiNTCWeirLink(:,jj))); + idxE2 = find(strcmp('Err2',DatiNTCWeirLink(:,jj))); + idxE255 = find(strcmp('Err255',DatiNTCWeirLink(:,jj))); + idxD = find(strcmp('DMUXe',DatiNTCWeirLink(:,jj))); + idxE1F = find(strcmp('Err1File',DatiNTCWeirLink(:,jj))); + idxN = find(strcmp('null',DatiNTCWeirLink(:,jj))); + idxRX = find(strcmp('No RX',DatiNTCWeirLink(:,jj))); + idxI = find(strcmp('id Error',DatiNTCWeirLink(:,jj))); + idxM = find(strcmp('MUX id Error',DatiNTCWeirLink(:,jj))); + idxC = find(strcmp('CH n. Error',DatiNTCWeirLink(:,jj))); + idxU = find(strcmp('Unknown Error',DatiNTCWeirLink(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiNTCWeirLink(:,jj))); + idxNS = find(strcmp('NotSupp',DatiNTCWeirLink(:,jj))); + idxU2 = find(strcmp('Unknown',DatiNTCWeirLink(:,jj))); + idxDis = find(strcmp('Dis.',DatiNTCWeirLink(:,jj))); + idxNA = find(strcmp('NotAv',DatiNTCWeirLink(:,jj))); + idx = union(idxE,idxT3); + idx = union(idx,idxND); + idx = union(idx,idxT); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxDis); + idx = union(idx,idxNA); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + NAN = 0; + ESCI = 1; + datainiWL = datestr(datenum(datainiWL)-1,'yyyy-mm-dd'); + break + else + DatiNTCWeirLink(indice,jj) = DatiNTCWeirLink(indice-1,jj); + if ErrWeirLink(indice,jj) == 0 + ErrWeirLink(indice,jj) = 0.5; + else + ErrWeirLink(indice,jj) = 1; + end + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiNTCWeirLink(nnn,jj))); + if check == 1 + DatiNTCWeirLink(nnn,jj) = DatiNTCWeirLink(nnn-1,jj); + if ErrWeirLink(indice,jj) == 0 + ErrWeirLink(indice,jj) = 0.5; + else + ErrWeirLink(indice,jj) = 1; + end + Ncorr = Ncorr+ri; + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of NTC Weir Link data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiNTCWeirLink = [DATiniWL str2double(DatiNTCWeirLink)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiNTCWeirLink(a,1) == DatiNTCWeirLink(a-1,1) + DatiNTCWeirLink(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + end + end + if NuovoZeroWL == 1 && yesWL == 1 + [rDR,cDR] = size(DatiRaw); + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiWeirLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiWeirLink(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiWeirLink(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiWeirLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiWeirLink; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1)0 + [rDR,cDR] = size(DatiRawNTC); + if rDR~=1 && cDR~=1 && isempty(DatiRawNTC) == 0 + RawDate1 = find(DatiRawNTC(:,1)<=DatiNTCWeirLink(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiNTCWeirLink(:,1)>DatiRawNTC(end,1)); + else + RawDate2 = find(DatiNTCWeirLink(:,1)>DatiRawNTC(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + DatiNTC = [DatiRawNTC(1:RawDate1(end),:);DatiNTCWeirLink(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + DatiNTC = DatiNTCWeirLink; + else + DatiNTC = DatiRawNTC; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(DatiNTC(:,1)0 + DatiNTC = DatiNTCWeirLink; + end + end + Dati(:,1) = Dati(:,1) - 730000; + csvwrite(RawDataFile,Dati); + if sum(Therm(:,1))>0 + DatiNTC(:,1) = DatiNTC(:,1) - 730000; + csvwrite(RawDataFileNTC,DatiNTC); + end +end + +%% Pendulum +if yesPE == 0 % Non ci sono Pendulum + DatiPendulum = []; + ErrPendulum = []; + wardat = 'lettura function: there are not Pendulum'; + fprintf(fileID,fmt,wardat); +else + NAN = 0; + RawDataFile = ['' IDcentralina '-' DTcatena '-PE-RawData.csv']; + ChPE = cell2mat(NodoPendulum(:,5)); + while NAN == 0 + if datenum(datainiPE) == datenum(Data(1,1)) + tempoiniPE = char(Data(1,2)); + end + NodeType = 'Pendulum'; + NodeNumPE = num2str(cell2mat(NodoPendulum(1,2))); % scarico i dati del primo nodo + % Scarico dei dati relativi alla centralina con informazioni di Data e ora, livello batteria e temperatura + % Step 1 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date = ''' ... + datainiPE ''' and Time >= ''' tempoiniPE ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeType = ''' NodeType... + ''' and NodeNum = ''' NodeNumPE ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATiniPE = curs.Data; + Ntempo = DATiniPE; + [r,c] = size(DATiniPE); + saltoPE = 0; + if r==1 && c==1 + textdatPE = 'Warning: error reading Pendulum (control unit data)!'; + fprintf(fileID,fmt,textdatPE); + saltoPE = 1; + end + % Step 2 (vedi commento più avanti) + comando = ['select Date, Time from RawDataView where Date > ''' ... + datainiPE ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeType = ''' NodeType ''' and NodeNum = ''' NodeNumPE ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DAT2PE = curs.Data; + Ndate = DAT2PE; + if saltoPE == 1 + DATiniPE = DAT2PE; + end + Check = size(DAT2PE); + if Check(1,2) > 1 % ho superato il primo giorno + % Concateno le informazioni relative a Step 1 e 2 (se necessario...) + if saltoPE == 0 + DATiniPE = [DATiniPE; curs.Data]; + end + end + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DATiniPE); + if cD ~=1 + T = [cell2mat(DATiniPE(:,1)) repmat(' ', [rD,1]) cell2mat(DATiniPE(:,2))]; + T = datenum(T); + % Converto da Cell Array a Matrice. + DATiniPE = T; + else + DATiniPE = []; + end + + % Scarico dati relativi ai singoli nodi + ii = 1; + [rd,~] = size(Ndate); + [rt,~] = size(Ntempo); + if saltoPE == 0 + if Check(1,2) > 1 % ho superato il primo giorno + DatiPendulum = cell(rd+rt,rPE); + else + DatiPendulum = cell(rt,rPE); + end + else + DatiPendulum = cell(rd,rPE); + end + NPendulum = cell2mat(NodoPendulum(:,2)); + w = 0; + col = 1; + while ii <= rPE + % Step 1: Acquisisco i dati registrati successivamente all'ultimo scarico, + % ma limitandomi a quelli registrati nel corso di quella singola giornata; + nN = NPendulum(ii,1); + nNodo = num2str(nN); + if ChPE == 2 + comando = ['select Val0, Val1 from RawDataView where Date = ''' ... + datainiPE ''' and Time >= ''' tempoiniPE ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPE = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val1 from RawDataView where Date > ''' ... + datainiPE ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPEd = curs.Data; + elseif ChPE == 4 + comando = ['select Val0, Val2 from RawDataView where Date = ''' ... + datainiPE ''' and Time >= ''' tempoiniPE ''' and ToolNameID = ''' DTcatena... + ''' and UnitName = ''' IDcentralina ''' and NodeNum =' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPE = curs.Data; + % Step 2: Considero le date successive e scarico tutti i dati disponibili. + comando = ['select Val0, Val2 from RawDataView where Date > ''' ... + datainiPE ''' and ToolNameID = ''' DTcatena ''' and UnitName = ''' IDcentralina... + ''' and NodeNum = ' nNodo '']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoPEd = curs.Data; + end + + % DATnodo è la matrice che raccoglie i dati dell' ii-esimo nodo, + % DATnodi è la matrice che concatena i dati relativi a ciascun nodo. + + if saltoPE == 0 + DatiPendulum(1:rt,col:col+1) = DATnodoPE; + else + DatiPendulum(1:rd,col:col+1) = DATnodoPEd; + end + + [rn,~] = size(DATnodoPEd); % controllo date + if rn < rd % normalmente sono uguali + for i = rn+1:rd + DATnodoPEd(i,:) = DATnodoPEd(rn,:); % se mancano dati, copio gli ultimi + end + wardat = ['Node Pendulum ' num2str(ii) ' does NOT work!']; + fprintf(fileID,fmt,wardat); + w = 1; + end + + if Check(1,2) > 1 + if saltoPE == 0 + DatiPendulum(rt+1:rt+rd,col:col+1) = DATnodoPEd; + end + else + DatiPendulum = DatiPendulum(1:end,:); + end + okdatPE = ['Data of node number ' num2str(ii) ' of ' ... + num2str(rPE) ' Pendulum nodes downloaded correctly']; + fprintf(fileID,fmt,okdatPE); + ii = ii+1; + col = col+2; + end + if w == 0 + wardat = 'There are not warning for Pendulum!'; + fprintf(fileID,fmt,wardat); + end + + % Controllo gli eventuali errori ('Err1' o '---') e li rimuovo, + % rimpiazzandoli con l'ultimo dato disponibile di quel nodo + [r,c] = size(DatiPendulum); + ErrPendulum = zeros(r,c); + Ncorr = 0; + ESCI = 0; + NAN = 1; + DIS = 0; + if NuovoZeroPE == 1 + if isfile(RawDataFile) == 1 + DatiRaw = csvread(RawDataFile); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; + RawDate = find(DatiRaw(:,1)<=datenum(datainiPE)); + else + rDR = 1; + cDR = 1; + RawDate = []; + DatiRaw = []; + end + else + rDR = 1; + cDR = 1; + RawDate = []; + end + for jj=1:c + % Se il nodo è Dis., devo aumentare di uno la data (il nodo non + % è ancora stato installato!) + if strcmp('Dis.',DatiPendulum(1,jj)) == 1 + for dis = 2:r + if strcmp('Dis.',DatiPendulum(dis,jj)) == 0 + DatiPendulum = DatiPendulum(dis:end,:); + DATiniPE = DATiniPE(dis:end,:); + [r,c] = size(DatiPendulum); + break + elseif isfile(RawDataFile) == 1 + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiPendulum(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrPendulum(1,jj) = 1; + wardat = 'Data of Pendulum nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + DIS = 0; + break + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiPE)+1 < now + datainiPE = datestr(datenum(datainiPE)+1,'yyyy-mm-dd'); + break + else + yesPE = 0; + end + end + elseif dis == r + NAN = 0; + DIS = 1; + if datenum(datainiPE)+1 < now + datainiPE = datestr(datenum(datainiPE)+1,'yyyy-mm-dd'); + break + else + yesPE = 0; + end + end + end + end + end + if DIS ~= 1 && yesPE == 1 + % --- Codice per il primo dato --- + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiPendulum(1,jj))); + idxT = find(strcmp('---',DatiPendulum(1,jj))); + idxT2 = find(strcmp('-',DatiPendulum(1,jj))); + idxE2 = find(strcmp('Err2',DatiPendulum(1,jj))); + idxE255 = find(strcmp('Err255',DatiPendulum(1,jj))); + idxD = find(strcmp('DMUXe',DatiPendulum(1,jj))); + idxE1F = find(strcmp('Err1File',DatiPendulum(1,jj))); + idxN = find(strcmp('null',DatiPendulum(1,jj))); + idxRX = find(strcmp('No RX',DatiPendulum(1,jj))); + idxI = find(strcmp('id Error',DatiPendulum(1,jj))); + idxM = find(strcmp('MUX id Error',DatiPendulum(1,jj))); + idxC = find(strcmp('CH n. Error',DatiPendulum(1,jj))); + idxCE = find(strcmp('CH n. Er',DatiPendulum(1,jj))); + idxU = find(strcmp('Unknown Error',DatiPendulum(1,jj))); + idxMC = find(strcmp('MsgCorrup',DatiPendulum(1,jj))); + idxNS = find(strcmp('NotSupp',DatiPendulum(1,jj))); + idxU2 = find(strcmp('Unknown',DatiPendulum(1,jj))); + idxNA = find(strcmp('NotAv',DatiPendulum(1,jj))); + idxND = find(strcmp('No Data',DatiPendulum(1,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxND); + [ri,~] = size(idx); + if ri == 1 + wardat = 'Warning on the correction of Pendulum nodes: there are not data at the beginning of the array!'; + fprintf(fileID,fmt,wardat); + if rDR==1 && cDR==1 || NuovoZeroPE == 0 % il file non è mai stato scritto, cerco la data precedente + NAN = 0; + ESCI = 1; + if datenum(datainiPE)+1 < now + datainiPE = datestr(datenum(datainiPE)+1,'yyyy-mm-dd'); + break + else + yesPE = 0; + end + else + if isempty(RawDate) == 1 + NAN = 0; + ESCI = 1; + datainiPE = datestr(datenum(datainiPE)-1,'yyyy-mm-dd'); + break + else + if isnan(DatiRaw(RawDate(end),jj+1)) == 0 + DatiPendulum(1,jj) = cellstr(num2str(DatiRaw(RawDate(end),jj+1))); + ErrPendulum(1,jj) = 1; + wardat = 'Data of Pendulum nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + Ncorr = Ncorr+ri; + NAN = 1; + else + NAN = 0; + ESCI = 1; + datainiPE = datestr(datenum(datainiPE)-1,'yyyy-mm-dd'); + break + end + end + end + end + end + if ESCI == 0 + for jj=1:c + % Trovo l'indice della cella contenenti una determinata stringa. + idxE = find(strcmp('Err1',DatiPendulum(:,jj))); + idxT = find(strcmp('---',DatiPendulum(:,jj))); + idxT2 = find(strcmp('-',DatiPendulum(:,jj))); + idxE2 = find(strcmp('Err2',DatiPendulum(:,jj))); + idxE255 = find(strcmp('Err255',DatiPendulum(:,jj))); + idxD = find(strcmp('DMUXe',DatiPendulum(:,jj))); + idxE1F = find(strcmp('Err1File',DatiPendulum(:,jj))); + idxN = find(strcmp('null',DatiPendulum(:,jj))); + idxRX = find(strcmp('No RX',DatiPendulum(:,jj))); + idxI = find(strcmp('id Error',DatiPendulum(:,jj))); + idxM = find(strcmp('MUX id Error',DatiPendulum(:,jj))); + idxC = find(strcmp('CH n. Error',DatiPendulum(:,jj))); + idxCE = find(strcmp('CH n. Er',DatiPendulum(:,jj))); + idxU = find(strcmp('Unknown Error',DatiPendulum(:,jj))); + idxMC = find(strcmp('MsgCorrup',DatiPendulum(:,jj))); + idxNS = find(strcmp('NotSupp',DatiPendulum(:,jj))); + idxU2 = find(strcmp('Unknown',DatiPendulum(:,jj))); + idxNA = find(strcmp('NotAv',DatiPendulum(:,jj))); + idxDis = find(strcmp('Dis.',DatiPendulum(:,jj))); + idxND = find(strcmp('No Data',DatiPendulum(:,jj))); + idx = union(idxE,idxT); + idx = union(idx,idxT2); + idx = union(idx,idxCE); + idx = union(idx,idxE2); + idx = union(idx,idxE255); + idx = union(idx,idxD); + idx = union(idx,idxE1F); + idx = union(idx,idxN); + idx = union(idx,idxRX); + idx = union(idx,idxI); + idx = union(idx,idxM); + idx = union(idx,idxC); + idx = union(idx,idxU); + idx = union(idx,idxMC); + idx = union(idx,idxNS); + idx = union(idx,idxU2); + idx = union(idx,idxNA); + idx = union(idx,idxDis); + idx = union(idx,idxND); + [ri,~] = size(idx); + for kk=1:ri + indice=idx(kk); + if indice == 1 + datainiPE = datestr(datenum(datainiPE)-1,'yyyy-mm-dd'); + ESCI = 1; + NAN = 0; + break + else + DatiPendulum(indice,jj) = DatiPendulum(indice-1,jj); + ErrPendulum(indice,jj) = 1; + Ncorr = Ncorr+ri; + NAN = 1; + end + end + if ESCI == 1 + NAN = 0; + break + end + % Elimino gli eventuali Not a Number + for nnn = 2:r + check = isnan(cell2mat(DatiPendulum(nnn,jj))); + if check == 1 + DatiPendulum(nnn,jj) = DatiPendulum(nnn-1,jj); + ErrPendulum(nnn,jj) = 1; + Ncorr = Ncorr+ri; + end + end + end + end + corrdat = ['' num2str(Ncorr) ' corrections of Pendulum data done!']; + fprintf(fileID,fmt,corrdat); + % Concateno informazioni generali e/o letture dai nodi. + DatiPendulum = [DATiniPE str2double(DatiPendulum)]; + % Elimino eventuali date doppie + a = 2; + while a <= r + if DatiPendulum(a,1) == DatiPendulum(a-1,1) + DatiPendulum(a,:) = []; + r = r-1; + else + a = a+1; + end + end + end + end + if NuovoZeroPE == 1 + if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=DatiPendulum(1,1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(DatiPendulum(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(DatiPendulum(:,1)>DatiRaw(RawDate1(end)+1,1)); + end + else + RawDate1 = []; + RawDate2 = 1; + end + if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:);DatiPendulum(RawDate2(1):end,:)]; + elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = DatiPendulum; + else + Dati = DatiRaw; + end + % Elimino appoggio più vecchio di un mese + RawDate3 = find(Dati(:,1) Ndatidespike + Ndati = NdatiMedia; + else + Ndati = Ndatidespike; + end + ini = round(Ndati/2)+1; + if rem(Ndati,2) == 0 + ini = ini+1; + end + clear NDati + ini = ini + margine; + if ini < 6 + ini = 6; + end + ErrLoadLink = ErrLoadLink(ini:end,:); + DatiLoad = LoadDef(ini:end,:); + ARRAYdateLL = ARRAYdateLL(ini:end,1); +end + +text = 'Load Link elaborated correctly. loadcell function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/matrici_vuote_BL.m b/Tilt/matrici_vuote_BL.m new file mode 100755 index 0000000..d676f21 --- /dev/null +++ b/Tilt/matrici_vuote_BL.m @@ -0,0 +1,12 @@ +function [BaroDef,BaroDefT] = matrici_vuote_BL(FileName) + +BaroDef = []; +BaroDefT = []; + +text = 'Baro Link has not been elaborated'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/Tilt/matrici_vuote_HD.m b/Tilt/matrici_vuote_HD.m new file mode 100755 index 0000000..d3670a7 --- /dev/null +++ b/Tilt/matrici_vuote_HD.m @@ -0,0 +1,28 @@ +function [X_HD,Y_HD,Z_HD,Xlocal_HD,Ylocal_HD,Zlocal_HD,HShift_HD,HShift_local_HD,... + Azimuth_HD,tempHD,Speed_local_HD,Speed_HD,Acceleration_local_HD,Acceleration_HD,... + AlfaX_HD,AlfaY_HD] = matrici_vuote_HD(FileName) + +X_HD = []; +Y_HD = []; +Z_HD = []; +Xlocal_HD = []; +Ylocal_HD = []; +Zlocal_HD = []; +HShift_HD = []; +HShift_local_HD = []; +Azimuth_HD = []; +tempHD = []; +Speed_HD = []; +Speed_local_HD = []; +Acceleration_HD = []; +Acceleration_local_HD = []; +AlfaX_HD = []; +AlfaY_HD = []; + +text = 'Tilt Link HD has not been elaborated'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/matrici_vuote_HDVR.m b/Tilt/matrici_vuote_HDVR.m new file mode 100755 index 0000000..b943b0e --- /dev/null +++ b/Tilt/matrici_vuote_HDVR.m @@ -0,0 +1,28 @@ +function [X_HDVR,Y_HDVR,Z_HDVR,Xlocal_HDVR,Ylocal_HDVR,Zlocal_HDVR,HShift_HDVR,HShift_local_HDVR,... + Azimuth_HDVR,tempHDVR,Speed_local_HDVR,Speed_HDVR,Acceleration_local_HDVR,Acceleration_HDVR,... + AlfaX_HDVR,AlfaY_HDVR] = matrici_vuote_HDVR(FileName) + +X_HDVR = []; +Y_HDVR = []; +Z_HDVR = []; +Xlocal_HDVR = []; +Ylocal_HDVR = []; +Zlocal_HDVR = []; +HShift_HDVR = []; +HShift_local_HDVR = []; +Azimuth_HDVR = []; +tempHDVR = []; +Speed_HDVR = []; +Speed_local_HDVR = []; +Acceleration_HDVR = []; +Acceleration_local_HDVR = []; +AlfaX_HDVR = []; +AlfaY_HDVR = []; + +text = 'Tilt Link HD VR has not been elaborated'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/matrici_vuote_IPL.m b/Tilt/matrici_vuote_IPL.m new file mode 100755 index 0000000..17df54d --- /dev/null +++ b/Tilt/matrici_vuote_IPL.m @@ -0,0 +1,31 @@ +function [X_IPL,Y_IPL,Z_IPL,Xlocal_IPL,Ylocal_IPL,Zlocal_IPL,HShift_IPL,... + HShift_local_IPL,Azimuth_IPL,TempDef_IPL,Speed_local_IPL,Speed_IPL,... + Acceleration_local_IPL,Acceleration_IPL,AlfaX_IPL,AlfaY_IPL,ACCdef_IPL,... + MAGdef_IPL] = matrici_vuote_IPL(FileName) + +X_IPL = []; +Y_IPL = []; +Z_IPL = []; +Xlocal_IPL = []; +Ylocal_IPL = []; +Zlocal_IPL = []; +HShift_IPL = []; +HShift_local_IPL = []; +Azimuth_IPL = []; +TempDef_IPL = []; +Speed_IPL = []; +Speed_local_IPL = []; +Acceleration_IPL = []; +Acceleration_local_IPL = []; +AlfaX_IPL = []; +AlfaY_IPL = []; +ACCdef_IPL = []; +MAGdef_IPL = []; + +text = 'In Place Link has not been elaborated'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/matrici_vuote_IPLHR.m b/Tilt/matrici_vuote_IPLHR.m new file mode 100755 index 0000000..97e756d --- /dev/null +++ b/Tilt/matrici_vuote_IPLHR.m @@ -0,0 +1,30 @@ +function [X_IPLHR,Y_IPLHR,Z_IPLHR,Xlocal_IPLHR,Ylocal_IPLHR,Zlocal_IPLHR,... + HShift_IPLHR,HShift_local_IPLHR,Azimuth_IPLHR,AlfaX_IPLHR,AlfaY_IPLHR,... + TempDef_IPLHR,Speed_IPLHR,Speed_local_IPLHR,Acceleration_IPLHR,... + Acceleration_local_IPLHR] = matrici_vuote_IPLHR(FileName) + +X_IPLHR = []; +Y_IPLHR = []; +Z_IPLHR = []; +Xlocal_IPLHR = []; +Ylocal_IPLHR = []; +Zlocal_IPLHR = []; +AlfaX_IPLHR = []; +AlfaY_IPLHR = []; +HShift_IPLHR = []; +HShift_local_IPLHR = []; +Azimuth_IPLHR = []; +TempDef_IPLHR = []; +Speed_IPLHR = []; +Speed_local_IPLHR = []; +Acceleration_IPLHR = []; +Acceleration_local_IPLHR = []; + +text = 'Tilt Link HR V has not been elaborated'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end + diff --git a/Tilt/matrici_vuote_PL.m b/Tilt/matrici_vuote_PL.m new file mode 100755 index 0000000..7dac0f9 --- /dev/null +++ b/Tilt/matrici_vuote_PL.m @@ -0,0 +1,13 @@ +function [Livello,PiezDef,PiezDefT] = matrici_vuote_PL(FileName) + +Livello = []; +PiezDef = []; +PiezDefT = []; + +text = 'Piezo Link has not been elaborated'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/Tilt/matrici_vuote_TL.m b/Tilt/matrici_vuote_TL.m new file mode 100755 index 0000000..324fcac --- /dev/null +++ b/Tilt/matrici_vuote_TL.m @@ -0,0 +1,28 @@ +function [X_HD,Y_HD,Z_HD,Xlocal_HD,Ylocal_HD,Zlocal_HD,HShift_HD,HShift_local_HD,... + Azimuth_HD,TempDef_TL,Speed_local,... + Speed,Acceleration_local,Acceleration,AlfaX,AlfaY] = matrici_vuote_TL(FileName) + +X_HD = []; +Y_HD = []; +Z_HD = []; +Xlocal_HD = []; +Ylocal_HD = []; +Zlocal_HD = []; +HShift_HD = []; +HShift_local_HD = []; +Azimuth_HD = []; +TempDef_TL = []; +Speed = []; +Speed_local = []; +Acceleration = []; +Acceleration_local = []; +AlfaX = []; +AlfaY = []; + +text = 'Tilt Link V has not been elaborated'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/matrici_vuote_TLH.m b/Tilt/matrici_vuote_TLH.m new file mode 100755 index 0000000..2d20991 --- /dev/null +++ b/Tilt/matrici_vuote_TLH.m @@ -0,0 +1,25 @@ +function [Y_TLH,Z_TLH,Xlocal_TLH,Ylocal_TLH,Zlocal_TLH,AlfaX_TLH,AlfaY_TLH,TempDef_TLH,... + Speed_TLH,Speed_local_TLH,Acceleration_TLH,Acceleration_local_TLH] = ... + matrici_vuote_TLH(FileName) + +Y_TLH = []; +Z_TLH = []; +Xlocal_TLH = []; +Ylocal_TLH = []; +Zlocal_TLH = []; +AlfaX_TLH = []; +AlfaY_TLH = []; +TempDef_TLH = []; +Speed_TLH = []; +Speed_local_TLH = []; +Acceleration_TLH = []; +Acceleration_local_TLH = []; + +text = 'Tilt Link H has not been elaborated'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end + diff --git a/Tilt/matrici_vuote_TLHR.m b/Tilt/matrici_vuote_TLHR.m new file mode 100755 index 0000000..84b3465 --- /dev/null +++ b/Tilt/matrici_vuote_TLHR.m @@ -0,0 +1,29 @@ +function [X_HR,Y_HR,Z_HR,Xlocal_HR,Ylocal_HR,Zlocal_HR,AlfaX_HR,AlfaY_HR,... + TempDef_TLHR,HShift_HR,HShift_local_HR,Azimuth_HR,Speed_HR,Speed_local_HR,... + Acceleration_HR,Acceleration_local_HR] = matrici_vuote_TLHR(FileName) + +X_HR = []; +Y_HR = []; +Z_HR = []; +Xlocal_HR = []; +Ylocal_HR = []; +Zlocal_HR = []; +HShift_HR = []; +HShift_local_HR = []; +Azimuth_HR = []; +AlfaX_HR = []; +AlfaY_HR = []; +TempDef_TLHR = []; +Speed_HR = []; +Speed_local_HR = []; +Acceleration_HR = []; +Acceleration_local_HR = []; + +text = 'Tilt Link HR V has not been elaborated'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end + diff --git a/Tilt/matrici_vuote_TLHRH.m b/Tilt/matrici_vuote_TLHRH.m new file mode 100755 index 0000000..4f80780 --- /dev/null +++ b/Tilt/matrici_vuote_TLHRH.m @@ -0,0 +1,23 @@ +function [Y_TLHRH,Z_TLHRH,Ylocal_TLHRH,Zlocal_TLHRH,AlfaX_TLHRH,AlfaY_TLHRH,TempDef_TLHRH,... + Speed_TLHRH,Speed_local_TLHRH,Acceleration_TLHRH,Acceleration_local_TLHRH] = ... + matrici_vuote_TLHRH(FileName) + +Y_TLHRH = []; +Z_TLHRH = []; +Ylocal_TLHRH = []; +Zlocal_TLHRH = []; +AlfaX_TLHRH = []; +AlfaY_TLHRH = []; +TempDef_TLHRH = []; +Speed_TLHRH = []; +Speed_local_TLHRH = []; +Acceleration_TLHRH = []; +Acceleration_local_TLHRH = []; + +text = 'Tilt Link HR H has not been elaborated'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/q_mult2.m b/Tilt/q_mult2.m new file mode 100755 index 0000000..d616435 --- /dev/null +++ b/Tilt/q_mult2.m @@ -0,0 +1,9 @@ +function qout=q_mult2(p,q) + +P_mat = [p(1) -p(2) -p(3) -p(4); + p(2) p(1) -p(4) p(3); + p(3) p(4) p(1) -p(2); + p(4) -p(3) p(2) p(1)]; +qout = P_mat*q; + +end \ No newline at end of file diff --git a/Tilt/report_2DCrL.m b/Tilt/report_2DCrL.m new file mode 100755 index 0000000..e3472c9 --- /dev/null +++ b/Tilt/report_2DCrL.m @@ -0,0 +1,441 @@ +function [battANALOG,ATTIVA,FIG,FIG_ENG] = report_2DCrL(r2DCrL,m,Nodo2DCrackLink,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_2DCrL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +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 + Cr3D = Section(); + sez2DCrack = Heading3('2D Crack Link'); + sez2DCrack.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + Cr3D.Title = sez2DCrack; + 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 + Cr2D_ENG = Section(); + sez2DCrL_ENG = Heading3('2D Crack Link'); + sez2DCrL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + Cr2D_ENG.Title = sez2DCrL_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,sez2DCrack); + if activeEN == 1 + add(DT_ENG,sez2DCrL_ENG); + end + for cr = 1:r2DCrL(m,1) + NodeNum = num2str(Nodo2DCrackLink(cr,m)); + comando = ['select EventDate, EventTime, XShift, YShift 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 + X = cell2mat(Dati(:,3)); % Fessura + Y = cell2mat(Dati(:,4)); % Fessura + sX = X-X(1); + sY = Y-Y(1); + + % grafico deformazioni NELL'ULTIMO MESE + figure(5); + plot(Date,sX); + hold on + apertura = plot(Date,sY); + title(['Apertura/chiusura del fessurimetro numero ' NodeNum]); + xlabel('Data [gg/mm/aaaa]'); + ylabel('Deformazione [mm]'); + controlX = abs(max(sX)-min(sX)); + controlY = abs(max(sY)-min(sY)); + controlXY = [controlX; controlY]; + control = max(controlXY); + if control < 0.5 % mm + ylim([-0.5 0.5]); + 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 + str(1,1) = cellstr('X'); + str(2,1) = cellstr('Y'); + MX(1) = max(sX(1:10)); + MX(2) = max(sY(1:10)); + MN(1) = min(sX(1:10)); + MN(2) = min(sY(1:10)); + VAR(1) = max(MX); + VAR(2) = min(MN); + MAX = max(abs(VAR)); + IN = find(abs(VAR)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-2DCrack', NodeNum, '.png')); + saveas(apertura,TempName); + Chart2DCrL = Image(TempName); + Chart2DCrL.Style = {Height('7.5cm'),HAlign('center')}; + Chart2DCrL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Andamento '... + 'dell''apertura (valori crescenti) o chiusura (valori decrescenti) '... + 'registrata lungo i due assi strumentali del fessurimetro, nodo numero ' NodeNum ... + ', durante il periodo temporale di riferimento']); + FIG = FIG+1; + Chart2DCrL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['Nei grafici seguenti sono rappresentati i dati relativi '... + 'alla deformazione differenziale registrata lungo i due assi strumentali '... + 'dai fessurimetri bidimensionali che compongono l''Analog Array.']); + testo2 = Paragraph(['Durante il periodo temporale di riferimento, il nodo numero ' NodeNum ' ha '... + 'registrato i seguenti valori di apertura assoluta dello strumento: ']); + testoX = Paragraph(['- Asse X - Valore Massimo assoluto: ' num2str(round(max(X),2), '%0.2f') ... + ' mm, valore minimo: ' num2str(round(min(X),2), '%0.2f') ' mm, variazione: ' ... + num2str(round(max(X),2)-round(min(X),2),'%0.2f') ' mm; ']); + testoY = Paragraph(['- Asse Y - Valore Massimo assoluto: ' num2str(round(max(Y),2), '%0.2f') ... + ' mm, valore minimo: ' num2str(round(min(Y),2), '%0.2f') ' mm, variazione: ' ... + num2str(round(max(Y),2)-round(min(Y),2),'%0.2f') ' mm; ']); + spazio = Paragraph(''); + + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if cr == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,testoX); + add(DT,testoY); + add(DT,Chart2DCrL); + add(DT,Chart2DCrL_cap); + add(DT,spazio); + if cr == r2DCrL(m,1) + add(DT,br); + end + close(figure(19)); + close(figure(5)); + + %---ENG--- + if activeEN == 1 + % grafico deformazioni NELL'ULTIMO MESE + figure(15); + plot(Date,sX); + hold on + plot(Date,sY); + apertura = plot(Date,sZ); + title(['Crack meter deformation - node ' NodeNum]); + xlabel('Date [dd/mm/yyyy]'); + ylabel('Deformation [mm]'); + controlX = abs(max(sX)-min(sX)); + controlY = abs(max(sY)-min(sY)); + controlZ = abs(max(sZ)-min(sZ)); + controlXY = [controlX; controlY; controlZ]; + control = max(controlXY); + if control < 0.5 % mm + ylim([-0.5 0.5]); + 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 + str(1,1) = cellstr('X'); + str(2,1) = cellstr('Y'); + MX(1) = max(sX(1:10)); + MX(2) = max(sY(1:10)); + MN(1) = min(sX(1:10)); + MN(2) = min(sY(1:10)); + VAR(1) = max(MX); + VAR(2) = min(MN); + MAX = max(abs(VAR)); + IN = find(abs(VAR)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-2DCrack', NodeNum, '_ENG.png')); + saveas(apertura,TempName); + Chart3DCrL_ENG = Image(TempName); + Chart3DCrL_ENG.Style = {Height('7.5cm'),HAlign('center')}; + Chart3DCrL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - 2D crack '... + 'opening measured along the two instrumental axes by node ' ... + NodeNum ' during the reference time period']); + FIG_ENG = FIG_ENG+1; + Chart3DCrL_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graphs present differential deformation data '... + 'recorded along the two instrumental axes by 2D crack meters '... + 'integrated in the Analog Array.']); + testo2 = Paragraph(['During the reference time period, node ' NodeNum ... + ' recorded the following values of crack opening: ']); + testoX = Paragraph(['- X axis - Maximum absolute value: ' num2str(round(max(X),2), '%0.2f') ... + ' mm, minimum value: ' num2str(round(min(X),2), '%0.2f') ' mm, variation: ' ... + num2str(round(max(X),2)-round(min(X),2),'%0.2f') ' mm; ']); + testoY = Paragraph(['- Y axis - Maximum absolute value: ' num2str(round(max(Y),2), '%0.2f') ... + ' mm, minimum value: ' num2str(round(min(Y),2), '%0.2f') ' mm, variation: ' ... + num2str(round(max(Y),2)-round(min(Y),2),'%0.2f') ' mm; ']);; + spazio = Paragraph(''); + + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if cr == 1 + add(DT_ENG,testo); + end + add(DT_ENG,testo2); + add(DT_ENG,testoX); + add(DT_ENG,testoY); + add(DT_ENG,Chart3DCrL_ENG); + add(DT_ENG,Chart3DCrL_ENG_cap); + add(DT_ENG,spazio); + if cr == r2DCrL(m,1) + add(DT_ENG,br); + end + close(figure(15)); + end + else + if ATTIVA == 1 + ATTIVA = 0; + Cr2D = Section(); + sez2DCrack = Heading3('2D Crack Link'); + sez2DCrack.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + Cr2D.Title = sez2DCrack; + add(DT,sez2DCrack); + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + add(DT,testo); + add(DT,br); + if activeEN == 1 + Cr2D_ENG = Section(); + sez2DCrL_ENG = Heading3('2D Crack Link'); + sez2DCrL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + Cr2D_ENG.Title = sez2DCrL_ENG; + add(DT_ENG,sez2DCrL_ENG); + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + add(DT_ENG,br); + end + end + end + end +end + +text = 'report_2DCrL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_3DCrL.m b/Tilt/report_3DCrL.m new file mode 100755 index 0000000..c519c44 --- /dev/null +++ b/Tilt/report_3DCrL.m @@ -0,0 +1,459 @@ +function [battANALOG,ATTIVA,FIG,FIG_ENG] = report_3DCrL(r3DCrL,m,Nodo3DCrackLink,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_3DCrL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +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 + Cr3D = Section(); + sez3DCrack = Heading3('3D Crack Link'); + sez3DCrack.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + Cr3D.Title = sez3DCrack; + 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 + Cr3D_ENG = Section(); + sez3DCrL_ENG = Heading3('3D Crack Link'); + sez3DCrL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + Cr3D_ENG.Title = sez3DCrL_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,sez3DCrack); + if activeEN == 1 + add(DT_ENG,sez3DCrL_ENG); + end + for cr = 1:r3DCrL(m,1) + NodeNum = num2str(Nodo3DCrackLink(cr,m)); + comando = ['select EventDate, EventTime, XShift, YShift, ZShift 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 + X = cell2mat(Dati(:,3)); % Fessura + Y = cell2mat(Dati(:,4)); % Fessura + Z = cell2mat(Dati(:,5)); % Fessura + sX = X-X(1); + sY = Y-Y(1); + sZ = Z-Z(1); + + % grafico deformazioni NELL'ULTIMO MESE + figure(5); + plot(Date,sX); + hold on + plot(Date,sY); + apertura = plot(Date,sZ); + title(['Apertura/chiusura del fessurimetro numero ' NodeNum]); + xlabel('Data [gg/mm/aaaa]'); + ylabel('Deformazione [mm]'); + controlX = abs(max(sX)-min(sX)); + controlY = abs(max(sY)-min(sY)); + controlZ = abs(max(sZ)-min(sZ)); + controlXYZ = [controlX; controlY; controlZ]; + control = max(controlXYZ); + if control < 0.5 % mm + ylim([-0.5 0.5]); + 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 + str(1,1) = cellstr('X'); + str(2,1) = cellstr('Y'); + str(3,1) = cellstr('Z'); + MX(1) = max(sX(1:10)); + MX(2) = max(sY(1:10)); + MX(3) = max(sZ(1:10)); + MN(1) = min(sX(1:10)); + MN(2) = min(sY(1:10)); + MN(3) = min(sZ(1:10)); + VAR(1) = max(MX); + VAR(2) = min(MN); + MAX = max(abs(VAR)); + IN = find(abs(VAR)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-3DCrack', NodeNum, '.png')); + saveas(apertura,TempName); + Chart3DCrL = Image(TempName); + Chart3DCrL.Style = {Height('7.5cm'),HAlign('center')}; + Chart3DCrL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Andamento '... + 'dell''apertura (valori crescenti) o chiusura (valori decrescenti) '... + 'registrata lungo i tre assi strumentali del fessurimetro, nodo numero ' NodeNum ... + ', durante il periodo temporale di riferimento']); + FIG = FIG+1; + Chart3DCrL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['Nei grafici seguenti sono rappresentati i dati relativi '... + 'alla deformazione differenziale registrata lungo i tre assi strumentali '... + 'dai fessurimetri tridimensionali che compongono l''Analog Array.']); + testo2 = Paragraph(['Durante il periodo temporale di riferimento, il nodo numero ' NodeNum ' ha '... + 'registrato i seguenti valori di apertura assoluta dello strumento: ']); + testoX = Paragraph(['- Asse X - Valore Massimo assoluto: ' num2str(round(max(X),2), '%0.2f') ... + ' mm, valore minimo: ' num2str(round(min(X),2), '%0.2f') ' mm, variazione: ' ... + num2str(round(max(X),2)-round(min(X),2),'%0.2f') ' mm; ']); + testoY = Paragraph(['- Asse Y - Valore Massimo assoluto: ' num2str(round(max(Y),2), '%0.2f') ... + ' mm, valore minimo: ' num2str(round(min(Y),2), '%0.2f') ' mm, variazione: ' ... + num2str(round(max(Y),2)-round(min(Y),2),'%0.2f') ' mm; ']); + testoZ = Paragraph(['- Asse Z - Valore Massimo assoluto: ' num2str(round(max(Z),2), '%0.2f') ... + ' mm, valore minimo: ' num2str(round(min(Z),2), '%0.2f') ' mm, variazione: ' ... + num2str(round(max(Z),2)-round(min(Z),2),'%0.2f') ' mm. ']); + spazio = Paragraph(''); + + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if cr == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,testoX); + add(DT,testoY); + add(DT,testoZ); + add(DT,Chart3DCrL); + add(DT,Chart3DCrL_cap); + add(DT,spazio); + if cr == r3DCrL(m,1) + add(DT,br); + end + close(figure(19)); + close(figure(5)); + + %---ENG--- + if activeEN == 1 + % grafico deformazioni NELL'ULTIMO MESE + figure(15); + plot(Date,sX); + hold on + plot(Date,sY); + apertura = plot(Date,sZ); + title(['Crack meter opening - node ' NodeNum]); + xlabel('Date [dd/mm/yyyy]'); + ylabel('Deformation [mm]'); + controlX = abs(max(sX)-min(sX)); + controlY = abs(max(sY)-min(sY)); + controlZ = abs(max(sZ)-min(sZ)); + controlXYZ = [controlX; controlY; controlZ]; + control = max(controlXYZ); + if control < 0.5 % mm + ylim([-0.5 0.5]); + 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 + str(1,1) = cellstr('X'); + str(2,1) = cellstr('Y'); + str(3,1) = cellstr('Z'); + MX(1) = max(sX(1:10)); + MX(2) = max(sY(1:10)); + MX(3) = max(sZ(1:10)); + MN(1) = min(sX(1:10)); + MN(2) = min(sY(1:10)); + MN(3) = min(sZ(1:10)); + VAR(1) = max(MX); + VAR(2) = min(MN); + MAX = max(abs(VAR)); + IN = find(abs(VAR)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-3DCrack', NodeNum, '_ENG.png')); + saveas(apertura,TempName); + Chart3DCrL_ENG = Image(TempName); + Chart3DCrL_ENG.Style = {Height('7.5cm'),HAlign('center')}; + Chart3DCrL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Crack link '... + 'opening measured along the three instrumental axes by node ' ... + NodeNum ' during the reference time period']); + FIG_ENG = FIG_ENG+1; + Chart3DCrL_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graphs present differential deformation data '... + 'recorded along the three instrumental axes by 3D crack meters '... + 'integrated in the Analog Array.']); + testo2 = Paragraph(['During the reference time period, node ' NodeNum ... + ' recorded the following values of crack opening: ']); + testoX = Paragraph(['- X axis - Maximum absolute value: ' num2str(round(max(X),2), '%0.2f') ... + ' mm, minimum value: ' num2str(round(min(X),2), '%0.2f') ' mm, variation: ' ... + num2str(round(max(X),2)-round(min(X),2),'%0.2f') ' mm; ']); + testoY = Paragraph(['- Y axis - Maximum absolute value: ' num2str(round(max(Y),2), '%0.2f') ... + ' mm, minimum value: ' num2str(round(min(Y),2), '%0.2f') ' mm, variation: ' ... + num2str(round(max(Y),2)-round(min(Y),2),'%0.2f') ' mm; ']); + testoZ = Paragraph(['- Z axis - Maximum absolute value: ' num2str(round(max(Z),2), '%0.2f') ... + ' mm, minimum value: ' num2str(round(min(Z),2), '%0.2f') ' mm, variation: ' ... + num2str(round(max(Z),2)-round(min(Z),2),'%0.2f') ' mm; ']); + spazio = Paragraph(''); + + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if cr == 1 + add(DT_ENG,testo); + end + add(DT_ENG,testo2); + add(DT_ENG,testoX); + add(DT_ENG,testoY); + add(DT_ENG,testoZ); + add(DT_ENG,Chart3DCrL_ENG); + add(DT_ENG,Chart3DCrL_ENG_cap); + add(DT_ENG,spazio); + if cr == r3DCrL(m,1) + add(DT_ENG,br); + end + close(figure(15)); + end + else + if ATTIVA == 1 + ATTIVA = 0; + CrE = Section(); + sez3DCrack = Heading3('3D Crack Link'); + sez3DCrack.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + CrE.Title = sez3DCrack; + add(DT,sez3DCrack); + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + add(DT,testo); + add(DT,br); + if activeEN == 1 + Cr3D_ENG = Section(); + sez3DCrL_ENG = Heading3('3D Crack Link'); + sez3DCrL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + Cr3D_ENG.Title = sez3DCrL_ENG; + add(DT_ENG,sez3DCrL_ENG); + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + add(DT_ENG,br); + end + end + end + end +end + +text = 'report_3DCrL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_3DEL.m b/Tilt/report_3DEL.m new file mode 100755 index 0000000..d44ec2c --- /dev/null +++ b/Tilt/report_3DEL.m @@ -0,0 +1,459 @@ +function [FIG,FIG_ENG,battANALOG,ATTIVA] = report_3DEL(r3DEL,m,Nodo3DExtensometerLink,toolrif,... + unitrif,contunit,datarif,Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,DT_ENG,... + FIG,FIG_ENG,activeEN,br,status,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_3DEL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +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 + E3DE = Section(); + sez3DExtensometer = Heading3('3D Extensometer Link'); + sez3DExtensometer.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + E3DE.Title = sez3DExtensometer; + 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)); + + if activeEN == 1 + E3DE_ENG = Section(); + sez3DExtensometer_ENG = Heading3('3D Extensometer Link'); + sez3DExtensometer_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + E3DE_ENG.Title = sez3DExtensometer_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,sez3DExtensometer); + if activeEN ==1 + add(DT_ENG,sez3DExtensometer_ENG); + end + + for ex = 1:r3DEL(m,1) + NodeNum = num2str(Nodo3DExtensometerLink(ex,m)); + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, T_node 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 + dX = cell2mat(Dati(:,3)); % deformazioni X + dsX = dX-dX(1); + dY = cell2mat(Dati(:,4)); % deformazioni Y + dsY = dY-dY(1); + dZ = cell2mat(Dati(:,5)); % deformazioni Z + dsZ = dZ-dZ(1); + Temp3DEL = cell2mat(Dati(:,6)); % temperatura + + % grafico deformazioni NELL'ULTIMO MESE + figure(5); + if isnan(Temp3DEL(1)) == 0 + yyaxis left + end + plot(Date,dsX); + hold on + plot(Date,dsY); + extens = plot(Date,dsZ); + ylabel('Deformazione [{\mu}{\epsilon}]'); + xlabel('Data [gg/mm/aaaa]'); + set(gca,'YColor','k'); + str(1,1) = cellstr('X'); + str(2,1) = cellstr('Y'); + str(3,1) = cellstr('Z'); + if isnan(Temp3DEL(1)) == 0 + yyaxis right + plot(Date,Temp3DEL,':','LineWidth',1.1); + ylabel(['Temperatura [' char(176) 'C]']); + set(gca,'YColor','k'); + str(4,1) = cellstr('T'); + end + title(['Deformazioni misurate dal nodo numero ' NodeNum]); + MX(1) = max(dsX(1:10)); + MX(2) = max(dsY(1:10)); + MX(3) = max(dsZ(1:10)); + MN(1) = min(dsX(1:10)); + MN(2) = min(dsY(1:10)); + MN(3) = min(dsZ(1:10)); + VAR(1) = max(MX); + VAR(2) = min(MN); + MAX = max(abs(VAR)); + IN = find(abs(VAR)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + xlim([Date(1)-1 Date(end)+1]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + hold off + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-3DExt', NodeNum, '.png')); + saveas(extens,TempName); + Chart3DEL = Image(TempName); + Chart3DEL.Style = {Height('8cm'),HAlign('center')}; + Chart3DEL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Deformazioni '... + 'misurate dall''estensimetro, nodo numero ' NodeNum... + ' nel periodo temporale di riferimento']); + FIG = FIG+1; + Chart3DEL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['Nei grafici seguenti sono rappresentati i dati relativi '... + 'alla deformazione differenziale rilevata durante il periodo temporale '... + 'di riferimento dalle terne di barrette estensimetriche appartenenti all''Analog Array.']); + testo2 = Paragraph(['In particolare, il nodo numero ' NodeNum ' ha registrato i seguenti valori '... + 'di deformazione adimensionale: ']); + testoX = Paragraph(['- Asse X - Valore Massimo assoluto: ' num2str(round(max(dX),2), '%0.2f') ... + ' ' char(181) '' char(949) ', valore minimo: ' num2str(round(min(dX),2), '%0.2f') ... + ' ' char(181) '' char(949) ', variazione: ' ... + num2str(round(max(dX),2)-round(min(dX),2),'%0.2f') ' ' char(181) '' char(949) '; ']); + testoY = Paragraph(['- Asse Y - Valore Massimo assoluto: ' num2str(round(max(dY),2), '%0.2f') ... + ' ' char(181) '' char(949) ', valore minimo: ' num2str(round(min(dY),2), '%0.2f') ... + ' ' char(181) '' char(949) ', variazione: ' ... + num2str(round(max(dY),2)-round(min(dY),2),'%0.2f') ' ' char(181) '' char(949) '; ']); + testoZ = Paragraph(['- Asse Z - Valore Massimo assoluto: ' num2str(round(max(dZ),2), '%0.2f') ... + ' ' char(181) '' char(949) ', valore minimo: ' num2str(round(min(dZ),2), '%0.2f') ... + ' ' char(181) '' char(949) ', variazione: ' ... + num2str(round(max(dZ),2)-round(min(dZ),2),'%0.2f') ' ' char(181) '' char(949) '. ']);... + spazio = Paragraph(''); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if ex == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,testoX); + add(DT,testoY); + add(DT,testoZ); + add(DT,Chart3DEL); + add(DT,Chart3DEL_cap); + add(DT,spazio); + if ex == r3DEL(m,1) + add(DT,br); + end + close(figure(5)); + + %---ENG--- + if activeEN == 1 + + % grafico deformazioni NELL'ULTIMO MESE + figure(15); + if isnan(Temp3DEL(1)) == 0 + yyaxis left + end + plot(Date,dsX); + hold on + plot(Date,dsY); + extens = plot(Date,dsZ); + ylabel('Deformation [{\mu}{\epsilon}]'); + xlabel('Date [d/mm/yyyy]'); + set(gca,'YColor','k'); + str(1,1) = cellstr('X'); + str(2,1) = cellstr('Y'); + str(3,1) = cellstr('Z'); + if isnan(Temp3DEL(1)) == 0 + yyaxis right + plot(Date,Temp3DEL,':','LineWidth',1.1); + ylabel(['Temperature [' char(176) 'C]']); + set(gca,'YColor','k'); + str(4,1) = cellstr('T'); + end + title(['Deformation - Node ' NodeNum]); + MX(1) = max(dsX(1:10)); + MX(2) = max(dsY(1:10)); + MX(3) = max(dsZ(1:10)); + MN(1) = min(dsX(1:10)); + MN(2) = min(dsY(1:10)); + MN(3) = min(dsZ(1:10)); + VAR(1) = max(MX); + VAR(2) = min(MN); + MAX = max(abs(VAR)); + IN = find(abs(VAR)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + xlim([Date(1)-1 Date(end)+1]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + hold off + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-3DExt', NodeNum, '_ENG.png')); + saveas(extens,TempName); + Chart3DEL_ENG = Image(TempName); + Chart3DEL_ENG.Style = {Height('8cm'),HAlign('center')}; + Chart3DEL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Deformation values '... + 'by the 3D extensometer ' NodeNum... + ' during the reference time period']); + FIG_ENG = FIG_ENG+1; + Chart3DEL_ENG_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graphs present deformation data '... + 'recorded by 3D extensometers integrated in the Analog Array.']); + testo2 = Paragraph(['In particular, node ' NodeNum ' recorded the following '... + 'deformation values: ']); + testoX = Paragraph(['- X axis - Maximum absolute value: ' num2str(round(max(dX),2), '%0.2f') ... + ' ' char(181) '' char(949) ', minimum absolute value: ' num2str(round(min(dX),2), '%0.2f') ... + ' ' char(181) '' char(949) ', variation: ' ... + num2str(round(max(dX),2)-round(min(dX),2),'%0.2f') ' ' char(181) '' char(949) '; ']); + testoY = Paragraph(['- Y axis - Maximum absolute value: ' num2str(round(max(dY),2), '%0.2f') ... + ' ' char(181) '' char(949) ', minimum absolute value: ' num2str(round(min(dY),2), '%0.2f') ... + ' ' char(181) '' char(949) ', variation: ' ... + num2str(round(max(dY),2)-round(min(dY),2),'%0.2f') ' ' char(181) '' char(949) '; ']); + testoZ = Paragraph(['- Z axis - Maximum absolute value: ' num2str(round(max(dZ),2), '%0.2f') ... + ' ' char(181) '' char(949) ', minimum absolute value: ' num2str(round(min(dZ),2), '%0.2f') ... + ' ' char(181) '' char(949) ', variation: ' ... + num2str(round(max(dZ),2)-round(min(dZ),2),'%0.2f') ' ' char(181) '' char(949) '. ']);... + spazio = Paragraph(''); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if ex == 1 + add(DT_ENG,testo); + end + add(DT_ENG,testo2); + add(DT_ENG,testoX); + add(DT_ENG,testoY); + add(DT_ENG,testoZ); + add(DT_ENG,Chart3DEL_ENG); + add(DT_ENG,Chart3DEL_ENG_cap); + add(DT_ENG,spazio); + if ex == r3DEL(m,1) + add(DT_ENG,br); + end + close(figure(15)); + end + + %pulisco variabili da riutilizzare per catena successiva + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + end + end + end + end +end + +text = 'report_3DEL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_AR.m b/Tilt/report_AR.m new file mode 100755 index 0000000..cb0ee98 --- /dev/null +++ b/Tilt/report_AR.m @@ -0,0 +1,925 @@ +function [PL_A,PL_D,FIG,FIG_ENG] = report_AR(chainID,unitID,tipoarray,contunit,... + siteID,FIG,FIG_ENG,rpt,rpt_ENG,Font_caption,Font_Chapter,Font_section,... + Font_tools,datarif,yesKLHR3D,rTL,rTLHR,rTLH,rTLHRH,rPL,rBL,rLL,rRL,rKL,... + rKLHR,rThL,rPT100,rIPL,rIPLHR,rTuL,rRaL,rPCL,rPCLHR,rPrL,rEL,r3DEL,rWEL,rMPBEL,... + rCrL,r2DCrL,r3DCrL,rBML,rHL,rLuxL,rCO2,rRSN,rRSNHR,rTrL,rPE,rWL,rGF,rGS,... + NodoTiltLink,NodoTiltLinkH,NodoPiezoLink,NodoBaroLink,NodoLoadLink,... + NodoRainLink,NodoKlinoLink,NodoKlinoLinkHR,NodoThermLink,NodoPT100Link,... + NodoInPlaceLink,NodoInPlaceLinkHR,NodoTunnelLink,NodoRadialLink,NodoPreConvLink,... + NodoPressureLink,NodoExtensometerLink,Nodo3DExtensometerLink,... + NodoWireExtensometerLink,NodoMultiPointExtensometerLink,NodoCrackLink,... + Nodo2DCrackLink,Nodo3DCrackLink,NodoBaroMusaLink,NodoHumidityLink,NodoLuxLink,... + NodoCO2Link,NodoRSNLink,NodoRSNHRLink,NodoTriggerLink,NodoStressMeter,NodoWeirLink,... + NodoPendulum,MUMS,MUMS_ENG,colonna2,colonna2bis,colonna4,firstdata_num,activeEN,IDscaduta,... + status,br,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_AR function started'; +fprintf(fileID,fmt,text); +fclose(fileID); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +% Inizializzo +[rAR,~] = size(chainID); +[GI_Disp_TL,GI_Date_TL,GI_Prof_TL,GI_Disp_IPL,GI_Date_IPL,GI_Prof_IPL,... + GI_Disp_IPLHR,GI_Date_IPLHR,GI_Prof_IPLHR,GI_Level_PL,GI_Prof_PL,GI_Date_PL,... + GI_Rain_RL,GI_Date_RL,GI_Angolo_KL,GI_Date_KL,GI_Num_KL,GI_Disp_CrL,GI_Date_CrL,... + GI_Num_CrL,PL_A,PL_D,GI_Q1_TuL,GI_Q2_TuL,GI_Q3_TuL,GI_Q4_TuL,GI_Q1_Num_TuL,... + GI_Q2_Num_TuL,GI_Q3_Num_TuL,GI_Q4_Num_TuL,GI_Seg_TuL,GI_NumSeg_TuL,GI_Z_TuL,... + GI_Date_TuL,GI_XYZ_Rad,GI_Num_Rad,GI_dS_RL_MPB,GI_dS_RL_TuL,GI_dS_TuL_RL,... + GI_Date_Rad,GI_Z_PCL,GI_Date_PCL,GI_Date_MPB,GI_dS_MPB,GI_MPB_Base,GI_dS_MPB_RL] = report_ini; + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_ini function executed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +kl = 1; +s = 1; % Usato nei Cir +TR = 1; % usato nei Cir-Rad +TP = 1; % Usato nei Cir-PCL +MR = 1; % usato nei multibase-Rad + +%% Analizzo i singoli Array e li riporto nel Report +for m = 1:rAR % creo una sottosezione per ciascuna catena + % Cerco se alcune centraline (e i relativi Array) sono scaduti + IDcentralina = char(chainID(m,2)); % Centralina dell'Array in analisi + [rCU,~] = size(chainID); + for indCU = 1:rCU + if strcmp(char(unitID(indCU,2)),IDcentralina) == 1 + u = indCU; + break + end + end + if IDscaduta(u,1) == 1 + escludi = 1; + IDcentralina = char(chainID(m,2)); + DTcatena = char(chainID(m,4)); + DT = Section(); + app = Heading2(strcat(IDcentralina, '-', DTcatena)); + app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + DT.Title = app; + else + escludi = 0; + end + if escludi == 0 + battANALOG = 0; % indicatore per riportare batteria GMUX una sola volta per catena + toolrif = chainID(m,4); + DTcatena = char(toolrif); + toolrifID = chainID(m,3); + ID801 = chainID(m,1); + comando = ['select prod_date from tools where unit_ID like ''' num2str(cell2mat(ID801)) ''' and name like ''' char(toolrif) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + data_ini = curs.Data; + stringa = cell2mat(data_ini); + [~,cst] = size(stringa); + if cst > 10 + date = stringa(1,1:10); + time = stringa(1,11:21); + dataora_sito(1,1) = cellstr(date); + dataora_sito(1,2) = cellstr(time); + datasito = [cell2mat(dataora_sito(1,1)) repmat(' ', [1,1]) cell2mat(dataora_sito(1,2))]; % Data definita sul sito + if datenum(datasito) > datenum(datarif) + datarif = datestr(datenum(datasito),'yyyy-mm-dd'); + end + end + for ind = 1:rAR + if strcmp(chainID(ind,4),cellstr(toolrif)) == 1 + unitrif = char(chainID(ind,2)); + break + else + end + end + DT = Section(); + app = Heading2(char(strcat(unitrif, '-', toolrif))); + app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + DT.Title = app; + if activeEN == 1 + DT_ENG = Section(); + app_ENG = Heading2(char(strcat(unitrif, '-', toolrif))); + app_ENG.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + DT_ENG.Title = app_ENG; + else + DT_ENG = []; + end + ATTIVA = 1; + + %% TILT LINK V + if rTL(m,1) > 0 + [GI_MaxDispMESE,GI_DateTL,GI_MaxDispProf,ATTIVA,FIG,FIG_ENG] = report_TL(... + rTL,rTLHR,m,NodoTiltLink,toolrif,unitrif,datarif,firstdata_num,... + Font_caption,Font_tools,siteID,toolrifID,DT,DT_ENG,FIG,FIG_ENG,br,... + colonna2,colonna2bis,status,ATTIVA,activeEN,conn,FileName); + [rControl_1,~] = size(GI_MaxDispMESE); + [rControl_2,~] = size(GI_Disp_TL); + if rControl_1 <= rControl_2 || rControl_2 == 0 + if rControl_1 ~= 0 && rControl_2 == 0 + clear GI_Disp_TL + clear GI_Prof_TL + clear GI_Date_TL + GI_Disp_TL(:,m) = GI_MaxDispMESE; + GI_Prof_TL(1,m) = GI_MaxDispProf; + GI_Date_TL(:,m) = GI_DateTL; + elseif rControl_1 == 0 + GI_Disp_TL(1,m) = 0; + GI_Prof_TL(1,m) = 0; + GI_Date_TL(1,m) = 0; + else + GI_Disp_TL(1:rControl_1,m) = GI_MaxDispMESE; + GI_Prof_TL(1,m) = GI_MaxDispProf; + GI_Date_TL(1:rControl_1,m) = GI_DateTL; + end + else + if rControl_2 ~= 0 + clear BackUp + BackUp = GI_Disp_TL(1:rControl_2,:); + [~,cBck] = size(BackUp); + GI_Disp_TL(1:rControl_1,m) = GI_MaxDispMESE; + GI_Disp_TL(1:rControl_2,1:cBck) = BackUp; + GI_Prof_TL(1,m) = GI_MaxDispProf; + BackUp = GI_Date_TL (1:rControl_2,:); + GI_Date_TL(1:rControl_1,m) = GI_DateTL; + GI_Date_TL(1:rControl_2,1:cBck) = BackUp; + end + end + end + + %% TILT LINK H + if rTLH(m,1) > 0 + wip = Paragraph('Sezione non ancora disponibile per dati del Tilt Link H'); + add(DT,wip); + if activeEN == 1 + wip = Paragraph('Section for Tilt Link H is not yet available.'); + add(DT_ENG,wip); + end + end + + %% IN PLACE LINK + if rIPL(m,1) > 0 + [GI_MaxDispMESE,GI_DateIPL,GI_MaxDispProf,ATTIVA,FIG,FIG_ENG] = report_IPL(... + rIPL,rIPLHR,m,NodoInPlaceLink,toolrif,unitrif,datarif,firstdata_num,Font_caption,... + Font_tools,siteID,toolrifID,DT,DT_ENG,FIG,FIG_ENG,br,colonna2,colonna2bis,status,... + ATTIVA,activeEN,conn,FileName); + [rControl_1,~] = size(GI_MaxDispMESE); + [rControl_2,~] = size(GI_Disp_IPL); + if rControl_1 <= rControl_2 || rControl_2 == 0 + if rControl_1 ~= 0 && rControl_2 == 0 + clear GI_Disp_IPL + clear GI_Prof_IPL + clear GI_Date_IPL + GI_Disp_IPL(:,m) = GI_MaxDispMESE; + GI_Prof_IPL(:,m) = GI_MaxDispProf; + GI_Date_IPL(:,m) = GI_DateIPL; + elseif rControl_1 == 0 + GI_Disp_IPL(1,m) = 0; + GI_Prof_IPL(1,m) = 0; + GI_Date_IPL(1,m) = 0; + else + GI_Disp_IPL(1:rControl_1,m) = GI_MaxDispMESE; + GI_Prof_IPL(1:rControl_1,m) = GI_MaxDispProf; + GI_Date_IPL(1:rControl_1,m) = GI_DateIPL; + end + else + if rControl_2 ~= 0 + clear BackUp + BackUp = GI_Disp_IPL(1:rControl_2,:); + [~,cBck] = size(BackUp); + GI_Disp_IPL(1:rControl_1,m) = GI_MaxDispMESE; + GI_Disp_IPL(1:rControl_2,1:cBck) = BackUp; + GI_Prof_IPL(1,m) = GI_MaxDispProf; + BackUp = GI_Date_IPL(1:rControl_2,:); + GI_Date_IPL(1:rControl_1,m) = GI_DateIPL; + GI_Date_IPL(1:rControl_2,1:cBck) = BackUp; + end + end + end + + %% IN PLACE LINK HR + if rIPL(m,1) == 0 && rIPLHR(m,1) > 0 + [GI_MaxDispMESE,GI_DateIPLHR,GI_MaxDispProf,ATTIVA,FIG,FIG_ENG] = report_IPLHR(... + rIPLHR,m,NodoInPlaceLinkHR,toolrif,unitrif,datarif,firstdata_num,Font_caption,... + Font_tools,siteID,toolrifID,DT,DT_ENG,FIG,FIG_ENG,br,colonna2,colonna2bis,status,... + ATTIVA,activeEN,conn,FileName); + [rControl_1,~] = size(GI_MaxDispMESE); + [rControl_2,~] = size(GI_Disp_IPLHR); + if rControl_1 <= rControl_2 || rControl_2 == 0 + if rControl_1 ~= 0 && rControl_2 == 0 + clear GI_Disp_IPLHR + clear GI_Prof_IPLHR + clear GI_Date_IPLHR + GI_Disp_IPLHR(:,m) = GI_MaxDispMESE; + GI_Prof_IPLHR(:,m) = GI_MaxDispProf; + GI_Date_IPLHR(:,m) = GI_DateIPLHR; + elseif rControl_1 == 0 + GI_Disp_IPLHR(1,m) = 0; + GI_Prof_IPLHR(1,m) = 0; + GI_Date_IPLHR(1,m) = 0; + else + GI_Disp_IPLHR(1:rControl_1,m) = GI_MaxDispMESE; + GI_Prof_IPLHR(1:rControl_1,m) = GI_MaxDispProf; + GI_Date_IPLHR(1:rControl_1,m) = GI_DateIPLHR; + end + else + if rControl_2 ~= 0 + clear BackUp + BackUp = GI_Disp_IPLHR(1:rControl_2,:); + [~,cBck] = size(BackUp); + GI_Disp_IPLHR(1:rControl_1,m) = GI_MaxDispMESE; + GI_Disp_IPLHR(1:rControl_2,1:cBck) = BackUp; + GI_Prof_IPLHR(1,m) = GI_MaxDispProf; + BackUp = GI_Date_IPLHR(1:rControl_2,:); + GI_Date_IPLHR(1:rControl_1,m) = GI_DateIPLHR; + GI_Date_IPLHR(1:rControl_2,1:cBck) = BackUp; + end + end + end + + %% PIEZO LINK + if rPL(m,1) > 0 + [GI_LivelloFaldaPL,GI_ProfPL,GI_DatePL,PL_A,PL_D,ATTIVA,FIG,FIG_ENG] = report_PL(... + rPL,rTL,rIPL,m,NodoPiezoLink,PL_A,PL_D,toolrif,unitrif,datarif,Font_caption,... + Font_tools,toolrifID,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,activeEN,conn,FileName); + [rControl_1,~] = size(GI_LivelloFaldaPL); + [rControl_2,~] = size(GI_Level_PL); + if rControl_1 <= rControl_2 || rControl_2 == 0 + if rControl_1 ~= 0 && rControl_2 == 0 + clear GI_Level_PL + clear GI_Prof_PL + clear GI_Date_PL + GI_Level_PL(:,m) = GI_LivelloFaldaPL; + GI_Prof_PL(1,m) = GI_ProfPL; + GI_Date_PL(:,m) = GI_DatePL; + elseif rControl_1 == 0 + GI_Level_PL(1,m) = 0; + GI_Prof_PL(1,m) = 0; + GI_Date_PL(1,m) = 0; + else + GI_Level_PL(1:rControl_1,m) = GI_LivelloFaldaPL(:,1); + GI_Prof_PL(1:rControl_1,m) = GI_ProfPL(:,1); + GI_Date_PL(1:rControl_1,m) = GI_DatePL(:,1); + end + else + if rControl_2 ~= 0 + clear BackUp + BackUp = GI_Level_PL(1:rControl_2,:); + [~,cBck] = size(BackUp); + GI_Level_PL(1:rControl_1,m) = GI_LivelloFaldaPL; + GI_Level_PL(1:rControl_2,1:cBck) = BackUp; + GI_Prof_PL(1,m) = GI_ProfPL; + BackUp = GI_Date_PL(1:rControl_2,:); + GI_Date_PL(1:rControl_1,m) = GI_DatePL; + GI_Date_PL(1:rControl_2,1:cBck) = BackUp; + end + end + end + + %% BARO LINK + if rBL(m,1) > 0 + [ATTIVA,FIG,FIG_ENG] = report_BL(rBL,m,NodoBaroLink,toolrif,unitrif,datarif,... + Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,activeEN,... + conn,FileName); + end + + %% LOAD LINK + if rLL(m,1) > 0 + [FIG,FIG_ENG,battANALOG,ATTIVA] = report_LL(rLL,m,NodoLoadLink,toolrif,... + unitrif,datarif,contunit,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,... + br,colonna4,status,ATTIVA,battANALOG,activeEN,conn,FileName); + end + + %% PRESSURE LINK + if rPrL(m,1) > 0 + [FIG,FIG_ENG,battANALOG,ATTIVA] = report_PrL(rPrL,m,NodoPressureLink,toolrif,... + unitrif,datarif,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,... + battANALOG,activeEN,conn,FileName); + end + + %% KLINO LINK + if rKL(m,1) > 0 + [GI_AngoloKL,GI_NumKL,GI_DateKL,ATTIVA,FIG,FIG_ENG] = report_KL(rKL,m,... + NodoKlinoLink,toolrif,unitrif,datarif,contunit,Font_caption,Font_tools,... + siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,activeEN,colonna4,conn,FileName); + [rControl_1,~] = size(GI_AngoloKL); + [rControl_2,~] = size(GI_Angolo_KL); + if rControl_1 <= rControl_2 || rControl_2 == 0 + if rControl_1 ~= 0 && rControl_2 == 0 + clear GI_Angolo_KL + clear GI_Num_KL + clear GI_Date_KL + GI_Angolo_KL(:,kl:kl+1) = GI_AngoloKL; + GI_Num_KL(1,m) = GI_NumKL; + GI_Date_KL(:,m) = GI_DateKL; + kl = kl+2; + elseif rControl_1 == 0 + GI_Angolo_KL(1,kl:kl+1) = 0; + GI_Num_KL(1,m) = 0; + GI_Date_KL(1,m) = 0; + kl = kl+2; + else + GI_Angolo_KL(1:rControl_1,kl:kl+1) = GI_AngoloKL; + GI_Num_KL(1:rControl_1,m) = GI_NumKL; + GI_Date_KL(1:rControl_1,m) = GI_DateKL; + kl = kl+2; + end + else + if rControl_2 ~= 0 + clear BackUp + BackUp = GI_Angolo_KL(1:rControl_2,:); + [~,cBck] = size(BackUp); + GI_Angolo_KL(1:rControl_1,kl:kl+1) = GI_AngoloKL; + GI_Angolo_KL(1:rControl_2,1:cBck) = BackUp; + kl = kl+2; + GI_Num_KL(1,m) = GI_NumKL; + BackUp = GI_Date_KL (1:rControl_2,:); + [~,cBck] = size(BackUp); + GI_Date_KL(1:rControl_1,m) = GI_DateKL; + GI_Date_KL(1:rControl_2,1:cBck) = BackUp; + end + end + end + + %% KLINO LINK HR + if rKLHR(m,1) > 0 + if yesKLHR3D(m,1) == 0 + [ATTIVA,FIG,FIG_ENG] = report_KLHR(rKLHR,m,NodoKlinoLinkHR,toolrif,unitrif,... + datarif,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,... + activeEN,conn,FileName); + end + end + + %% THERM LINK + if rThL(m,1) > 0 + [ATTIVA,FIG,FIG_ENG] = report_ThL(rThL,m,NodoThermLink,toolrif,... + unitrif,datarif,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,... + activeEN,br,status,ATTIVA,conn,FileName); + end + + %% PT100 LINK + if rPT100(m,1) > 0 + [FIG,FIG_ENG,battANALOG,ATTIVA] = report_PT100(rPT100,m,NodoPT100Link,... + toolrif,unitrif,datarif,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,... + battANALOG,ATTIVA,activeEN,contunit,br,status,conn,FileName); + end + + %% TUNNEL LINK + if rTuL(m,1) > 0 + [GI_Cir_Q1,GI_Cir_Q2,GI_Cir_Q3,GI_Cir_Q4,GI_Cir_Q1_Num,GI_Cir_Q2_Num,... + GI_Cir_Q3_Num,GI_Cir_Q4_Num,GI_Cir_Seg,GI_Cir_Z,GI_Cir_Date,GI_TuL_RL,... + ATTIVA,FIG,FIG_ENG] = report_TuL(IDcentralina,DTcatena,rTuL,m,NodoTunnelLink,toolrif,... + unitrif,datarif,firstdata_num,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,... + colonna2,colonna2bis,status,ATTIVA,activeEN,conn,FileName); + [rControl_1,~] = size(GI_Cir_Date); + [rControl_2,~] = size(GI_Date_TuL); + if rControl_1 <= rControl_2 || rControl_2 == 0 + if rControl_1 ~= 0 && rControl_2 == 0 + clear GI_Q1_TuL + clear GI_Q2_TuL + clear GI_Q3_TuL + clear GI_Q4_TuL + clear GI_Q1_Num_TuL + clear GI_Q2_Num_TuL + clear GI_Q3_Num_TuL + clear GI_Q4_Num_TuL + clear GI_Date_TuL + clear GI_Seg_TuL + GI_Q1_TuL(:,m) = GI_Cir_Q1; + GI_Q2_TuL(:,m) = GI_Cir_Q2; + GI_Q3_TuL(:,m) = GI_Cir_Q3; + GI_Q4_TuL(:,m) = GI_Cir_Q4; + GI_Q1_Num_TuL(:,m) = GI_Cir_Q1_Num; + GI_Q2_Num_TuL(:,m) = GI_Cir_Q2_Num; + GI_Q3_Num_TuL(:,m) = GI_Cir_Q3_Num; + GI_Q4_Num_TuL(:,m) = GI_Cir_Q4_Num; + GI_Date_TuL(:,m) = GI_Cir_Date; + [~,num_s] = size(GI_Cir_Seg); + GI_Seg_TuL(1,s:s+num_s-1) = GI_Cir_Seg; + s = s+num_s; + GI_NumSeg_TuL(m,1) = num_s; + if isempty(GI_Cir_Z) == 0 + clear GI_Z_TuL + [~,num_T] = size(GI_Cir_Z); + GI_Z_TuL(:,TP:TP+num_T-1) = GI_Cir_Z; + TP = TP+num_T; + end + if isempty(GI_TuL_RL) == 0 + clear GI_dS_TuL_RL + [~,num_TR] = size(GI_TuL_RL); + GI_dS_TuL_RL(:,TR:TR+num_TR-1) = GI_TuL_RL; + TR = TR+num_TR; + end + elseif rControl_1 == 0 + GI_Q1_TuL(1,m) = 0; + GI_Q2_TuL(1,m) = 0; + GI_Q3_TuL(1,m) = 0; + GI_Q4_TuL(1,m) = 0; + GI_Q1_Num_TuL(1,m) = 0; + GI_Q2_Num_TuL(1,m) = 0; + GI_Q3_Num_TuL(1,m) = 0; + GI_Q4_Num_TuL(1,m) = 0; + GI_Date_TuL(1:rControl_1,m) = 0; + GI_NumSeg_TuL(m,1) = 0; + else + GI_Q1_TuL(1,m) = GI_Cir_Q1; + GI_Q2_TuL(1,m) = GI_Cir_Q2; + GI_Q3_TuL(1,m) = GI_Cir_Q3; + GI_Q4_TuL(1,m) = GI_Cir_Q4; + GI_Q1_Num_TuL(1,m) = GI_Cir_Q1_Num; + GI_Q2_Num_TuL(1,m) = GI_Cir_Q2_Num; + GI_Q3_Num_TuL(1,m) = GI_Cir_Q3_Num; + GI_Q4_Num_TuL(1,m) = GI_Cir_Q4_Num; + GI_Date_TuL(1:rControl_1,m) = GI_Cir_Date; + [~,num_s] = size(GI_Cir_Seg); + GI_Seg_TuL(1,s:s+num_s-1) = GI_Cir_Seg; + s = s+num_s; + GI_NumSeg_TuL(m,1) = num_s; + if isempty(GI_Cir_Z) == 0 + [~,num_T] = size(GI_Cir_Z); + GI_Z_TuL(1:rControl_1,TP:TP+num_T-1) = GI_Cir_Z; + TP = TP+num_T; + end + if isempty(GI_TuL_RL) == 0 + [~,num_TR] = size(GI_TuL_RL); + GI_dS_TuL_RL(1:rControl_1,TR:TR+num_TR-1) = GI_TuL_RL; + TR = TR+num_TR; + end + end + else + if rControl_2 ~= 0 + clear BackUp + GI_Q1_TuL(1,m) = GI_Cir_Q1; + GI_Q2_TuL(1,m) = GI_Cir_Q2; + GI_Q3_TuL(1,m) = GI_Cir_Q3; + GI_Q4_TuL(1,m) = GI_Cir_Q4; + GI_Q1_Num_TuL(1,m) = GI_Cir_Q1_Num; + GI_Q2_Num_TuL(1,m) = GI_Cir_Q2_Num; + GI_Q3_Num_TuL(1,m) = GI_Cir_Q3_Num; + GI_Q4_Num_TuL(1,m) = GI_Cir_Q4_Num; + BackUp = GI_Date_TuL(1:rControl_2,:); + [~,cBck] = size(BackUp); + GI_Date_TuL(1:rControl_1,m) = GI_Cir_Date; + GI_Date_TuL(1:rControl_2,1:cBck) = BackUp; + [~,num_s] = size(GI_Cir_Seg); + GI_Seg_TuL(1,s:s+num_s-1) = GI_Cir_Seg; + GI_NumSeg_TuL(m,1) = num_s; + s = s+num_s; + if isempty(GI_Cir_Z) == 0 + BackUp = GI_Z_TuL(1:rControl_2,:); + [~,cBck] = size(BackUp); + [~,num_T] = size(GI_Cir_Z); + GI_Z_TuL(1:rControl_1,TP:TP+num_T-1) = GI_Cir_Z; + TP = TP+num_T; + GI_Z_TuL(1:rControl_2,1:cBck) = BackUp; + end + if isempty(GI_TuL_RL) == 0 + BackUp = GI_dS_TuL_RL(1:rControl_2,:); + [~,cBck] = size(BackUp); + [~,num_TR] = size(GI_TuL_RL); + GI_dS_TuL_RL(1:rControl_1,TR:TR+num_TR-1) = GI_TuL_RL; + GI_dS_TuL_RL(1:rControl_2,1:cBck) = BackUp; + TR = TR+num_TR; + end + end + end + end + + %% RADIAL LINK + if rRaL(m,1) > 0 + [GI_Rad_XYZ,GI_Rad_Num,GI_Rad_MPBEL,GI_Rad_Cir,GI_Rad_Date,ATTIVA,FIG,FIG_ENG] = report_RaL(... + DTcatena,rRaL,m,NodoRadialLink,toolrif,unitrif,datarif,firstdata_num,Font_caption,... + Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,colonna2,colonna2bis,status,ATTIVA,activeEN,... + conn,FileName); + [rControl_1,~] = size(GI_Rad_Date); + [rControl_2,~] = size(GI_Date_Rad); + if rControl_1 <= rControl_2 || rControl_2 == 0 + if rControl_1 ~= 0 && rControl_2 == 0 + clear GI_XYZ_Rad + clear GI_Num_Rad + clear GI_Date_Rad + GI_XYZ_Rad(:,m) = GI_Rad_XYZ; + GI_Num_Rad(:,m) = GI_Rad_Num; + if isempty(GI_Rad_MPBEL) == 0 + clear GI_dS_RL_MPB + GI_dS_RL_MPB(:,m) = GI_Rad_MPBEL; + else + GI_dS_RL_MPB(:,m) = 0; + end + if isempty(GI_Rad_Cir) == 0 + clear GI_dS_RL_TuL + GI_dS_RL_TuL(:,m) = GI_Rad_Cir; + else + GI_dS_RL_TuL(:,m) = 0; + end + GI_Date_Rad(:,m) = GI_Rad_Date; + elseif rControl_1 == 0 + GI_XYZ_Rad(:,m) = 0; + GI_Num_Rad(:,m) = 0; + GI_Date_Rad(:,m) = 0; + else + GI_XYZ_Rad(1,m) = GI_Rad_XYZ; + GI_Num_Rad(1,m) = GI_Rad_Num; + if isempty(GI_Rad_MPBEL) == 0 + GI_dS_RL_MPB(1:rControl_1,m) = GI_Rad_MPBEL; + else + GI_dS_RL_MPB(1:rControl_1,m) = 0; + end + if isempty(GI_Rad_Cir) == 0 + GI_dS_RL_TuL(1:rControl_1,m) = GI_Rad_Cir; + else + GI_dS_RL_TuL(1:rControl_1,m) = 0; + end + GI_Date_Rad(1:rControl_1,m) = GI_Rad_Date; + end + else + if rControl_2 ~= 0 + clear BackUp + GI_XYZ_Rad(1,m) = GI_Rad_XYZ; + GI_Num_Rad(1,m) = GI_Rad_Num; + BackUp = GI_dS_RL_MPB(1:rControl_2,:); + [~,cBck] = size(BackUp); + if isempty(GI_Rad_MPBEL) == 0 + GI_dS_RL_MPB(1:rControl_1,m) = GI_Rad_MPBEL; + GI_dS_RL_MPB(1:rControl_2,1:cBck) = BackUp; + else + GI_dS_RL_MPB(:,m) = 0; + end + BackUp = GI_dS_RL_TuL(1:rControl_2,:); + [~,cBck] = size(BackUp); + if isempty(GI_Rad_Cir) == 0 + GI_dS_RL_TuL(1:rControl_1,m) = GI_Rad_Cir; + GI_dS_RL_TuL(1:rControl_2,1:cBck) = BackUp; + else + GI_dS_RL_TuL(:,m) = 0; + end + BackUp = GI_Date_Rad(1:rControl_2,:); + [~,cBck] = size(BackUp); + GI_Date_Rad(1:rControl_1,m) = GI_Rad_Date; + GI_Date_Rad(1:rControl_2,1:cBck) = BackUp; + end + end + end + + %% PRECONV LINK + if rPCL(m,1) > 0 + [GI_PCL_Z,GI_PCL_Date,ATTIVA,FIG,FIG_ENG] = report_PCL(DTcatena,rPCL,m,NodoPreConvLink,... + toolrif,unitrif,datarif,firstdata_num,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,... + colonna2,colonna2bis,status,ATTIVA,activeEN,conn,FileName); + [rControl_1,~] = size(GI_PCL_Date); + [rControl_2,~] = size(GI_Date_PCL); + if rControl_1 <= rControl_2 || rControl_2 == 0 + if rControl_1 ~= 0 && rControl_2 == 0 + clear GI_Date_PCL; + GI_Date_PCL = GI_PCL_Date; + if isempty(GI_PCL_Z) == 0 + clear GI_Z_PCL; + GI_Z_PCL(:,m) = GI_PCL_Z; + end + else + GI_Date_PCL(1:rControl_1,m) = GI_PCL_Date; + if isempty(GI_PCL_Z) == 0 + GI_Z_PCL(1:rControl_1,m) = GI_PCL_Z; + end + end + else + if rControl_2 ~= 0 + clear BackUp + BackUp = GI_Date_PCL(1:rControl_2,:); + [~,cBck] = size(BackUp); + GI_Date_PCL(1:rControl_1,m) = GI_PCL_Date; + GI_Date_PCL(1:rControl_2,1:cBck) = BackUp; + if isempty(GI_PCL_Z) == 0 + BackUp = GI_Z_PCL(1:rControl_2,:); + [~,cBck] = size(BackUp); + GI_Z_PCL(1:rControl_1,m) = GI_PCL_Z; + GI_Z_PCL(1:rControl_2,1:cBck) = BackUp; + end + end + end + end + + %% RAIN LINK + if rRL(m,1) > 0 + [GI_rainloc,GI_DateRL,ATTIVA,FIG,FIG_ENG] = report_RL(rRL,m,NodoRainLink,toolrif,... + unitrif,datarif,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,... + activeEN,conn,FileName); + [rControl_1,~] = size(GI_DateRL); + [rControl_2,~] = size(GI_Date_RL); + if rControl_1 <= rControl_2 || rControl_2 == 0 + if rControl_1 ~= 0 && rControl_2 == 0 + clear GI_Date_RL; + GI_Date_RL = GI_DateRL; + clear GI_Rain_RL; + GI_Rain_RL = GI_rainloc; + else + GI_Date_RL(1:rControl_1,m) = GI_DateRL; + GI_Rain_RL(1:rControl_1,m) = GI_rainloc; + end + else + if rControl_2 ~= 0 + clear BackUp + BackUp = GI_Date_RL(1:rControl_2,:); + [~,cBck] = size(BackUp); + GI_Date_RL(1:rControl_1,m) = GI_DateRL; + GI_Date_RL(1:rControl_2,1:cBck) = BackUp; + BackUp = GI_Rain_RL(1:rControl_2,:); + [~,cBck] = size(BackUp); + GI_Rain_RL(1:rControl_1,m) = GI_rainloc; + GI_Rain_RL(1:rControl_2,1:cBck) = BackUp; + end + end + end + + %% EXTENSOMETER LINK + if rEL(m,1) > 0 + [FIG,FIG_ENG,battANALOG,ATTIVA] = report_EL(rEL,m,NodoExtensometerLink,toolrif,... + unitrif,contunit,datarif,Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,... + DT_ENG,FIG,FIG_ENG,activeEN,br,status,conn,FileName); + end + + %% 3D EXTENSOMETER LINK + if r3DEL(m,1) > 0 + [FIG,FIG_ENG,battANALOG,ATTIVA] = report_3DEL(r3DEL,m,Nodo3DExtensometerLink,toolrif,... + unitrif,contunit,datarif,Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,DT_ENG,... + FIG,FIG_ENG,activeEN,br,status,conn,FileName); + end + + %% WIRE EXTENSOMETER LINK + if rWEL(m,1) > 0 + [FIG,FIG_ENG,battANALOG,ATTIVA] = report_WEL(rWEL,m,NodoWireExtensometerLink,toolrif,... + unitrif,contunit,datarif,Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,DT_ENG,... + FIG,FIG_ENG,br,activeEN,status,conn,FileName); + end + + %% MULTI POINT BOREHOLE LINK + if rMPBEL(m,1) > 0 + [GI_MPB_RL,GI_MPB,GI_Base,GI_Date,FIG,FIG_ENG,battANALOG,ATTIVA] = report_MPBEL(DTcatena,... + rMPBEL,m,NodoMultiPointExtensometerLink,toolrif,unitrif,contunit,datarif,... + Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,DT_ENG,FIG,FIG_ENG,br,... + activeEN,status,conn,FileName); + [rControl_1,~] = size(GI_Date); + [rControl_2,~] = size(GI_Date_MPB); + if rControl_1 <= rControl_2 || rControl_2 == 0 + if rControl_1 ~= 0 && rControl_2 == 0 + GI_Date_MPB(:,m) = GI_Date(:,1); + GI_dS_MPB = GI_MPB; + GI_MPB_Base = GI_Base; + [~,num_M] = size(GI_MPB_RL); + GI_dS_MPB_RL(:,MR:MR+num_M-1) = GI_MPB_RL; + MR = MR+num_M; + elseif rControl_1 == 0 + GI_Date_MPB(:,m) = 0; + GI_dS_MPB(:,m) = 0; + GI_MPB_Base(:,m) = 0; + else + Num_Basi = rMPBEL(m); + BackUp = GI_Date_MPB; + [~,cBck] = size(BackUp); + GI_Date_MPB(1:rControl_1,m) = GI_Date(:,1); + GI_dS_MPB(1:rControl_1,cBck+1:cBck+Num_Basi) = GI_MPB; + GI_MPB_Base(1,cBck+1:cBck+Num_Basi) = GI_Base; + [~,num_M] = size(GI_MPB_RL); + GI_dS_MPB_RL(1:rControl_1,MR:MR+num_M-1) = GI_MPB_RL; + MR = MR+num_M; + end + else + if rControl_2 ~= 0 + clear BackUp + BackUp = GI_Date_MPB(1:rControl_2,:); + [~,cBck] = size(BackUp); + clear GI_Date_MPB + Num_Basi = rMPBEL(m); + GI_Date_MPB(1:rControl_1,m) = GI_Date(:,1); + GI_Date_MPB(1:rControl_2,1:cBck) = BackUp; + BackUp = GI_dS_MPB(1:rControl_2,:); + [~,cBck] = size(BackUp); + clear GI_dS_MPB + GI_dS_MPB(1:rControl_1,cBck+1:cBck+Num_Basi) = GI_MPB; + GI_dS_MPB(1:rControl_2,1:cBck) = BackUp; + BackUp = GI_MPB_Base(1,:); + [~,cBck] = size(BackUp); + GI_MPB_Base(1,cBck+1:cBck+Num_Basi) = GI_Base; + BackUp = GI_dS_MPB_RL(1:rControl_2,:); + [~,cBck] = size(BackUp); + clear GI_dS_MPB_RL + [~,num_M] = size(GI_MPB_RL); + GI_dS_MPB_RL(1:rControl_1,MR:MR+num_M-1) = GI_MPB_RL; + GI_dS_MPB_RL(1:rControl_2,1:cBck) = BackUp; + MR = MR+num_M; + end + end + end + + %% CRACK LINK + if rCrL(m,1) > 0 + [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); + [rControl_1,~] = size(GI_DispCrL); + [rControl_2,~] = size(GI_Disp_CrL); + if rControl_1 <= rControl_2 || rControl_2 == 0 + if rControl_1 ~= 0 && rControl_2 == 0 + clear GI_Disp_CrL + clear GI_Num_CrL + clear GI_Date_CrL + GI_Disp_CrL(:,m) = GI_DispCrL; + GI_Num_CrL(:,m) = GI_NumCrL; + GI_Date_CrL(:,m) = GI_DateCrL; + elseif rControl_1 == 0 + GI_Disp_CrL(:,m) = 0; + GI_Num_CrL(:,m) = 0; + GI_Date_CrL(:,m) = 0; + else + GI_Disp_CrL(1:rControl_1,m) = GI_DispCrL; + GI_Num_CrL(1:rControl_1,m) = GI_NumCrL; + GI_Date_CrL(1:rControl_1,m) = GI_DateCrL; + end + else + if rControl_2 ~= 0 + clear BackUp + [~,cBck] = size(BackUp); + BackUp = GI_Disp_CrL(1:rControl_2,:); + GI_Disp_CrL(1:rControl_1,m) = GI_DispCrL; + GI_Disp_CrL(1:rControl_2,1:cBck) = BackUp; + BackUp = GI_Num_CrL(1:rControl_2,:); + GI_Num_CrL(1:rControl_1,m) = GI_NumCrL; + GI_Num_CrL(1:rControl_2,1:cBck) = BackUp; + BackUp = GI_Date_CrL (1:rControl_2,:); + GI_Date_CrL(1:rControl_1,m) = GI_DateCrL; + GI_Date_CrL(1:rControl_2,1:cBck) = BackUp; + end + end + end + + %% 2D CRACK LINK + if r2DCrL(m,1) > 0 + [battANALOG,ATTIVA,FIG,FIG_ENG] = report_2DCrL(r2DCrL,m,Nodo2DCrackLink,toolrif,... + unitrif,contunit,datarif,Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,DT_ENG,... + FIG,FIG_ENG,br,status,activeEN,conn,FileName); + end + + %% 3D CRACK LINK + if r3DCrL(m,1) > 0 + [battANALOG,ATTIVA,FIG,FIG_ENG] = report_3DCrL(r3DCrL,m,Nodo3DCrackLink,toolrif,... + unitrif,contunit,datarif,Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,DT_ENG,... + FIG,FIG_ENG,br,status,activeEN,conn,FileName); + end + + %% RSN LINK + if rRSN(m,1) > 0 + [ATTIVA,FIG,FIG_ENG] = report_RSN(rRSN,m,NodoRSNLink,toolrif,unitrif,datarif,... + Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,activeEN,conn,FileName); + end + + %% RSN LINK HR + if rRSNHR(m,1) > 0 + [ATTIVA,FIG,FIG_ENG] = report_RSNHR(rRSNHR,m,NodoRSNHRLink,toolrif,unitrif,... + datarif,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,activeEN,conn,FileName); + end + + %% TRIGGER SYSTEM + if rTrL(m,1) > 0 + ATTIVA = report_TrL(NodoTriggerLink,rTrL,m,Font_tools,br,datarif,toolrif,... + unitrif,DT,DT_ENG,activeEN,status,ATTIVA,conn,FileName); + end + + %% G-Flow SYSTEM + if rGF(m,1) > 0 + sezGflow = Paragraph('G-Flow Link'); + sezGflow.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + GF = Section(); + GF.Title = sezGflow; + add(DT,sezGflow); + if activeEN == 1 + add(DT_ENG,sezGflow); + end + + wip = Paragraph('Sezione non ancora disponibile per dati del G-Flow'); + add(DT,wip); + if activeEN == 1 + wip = Paragraph('Section for G-Flow is not yet available.'); + add(DT_ENG,wip); + end + end + + %% G-Shock SYSTEM + if rGS(m,1) > 0 + sezGshock = Paragraph('G-Shock Link'); + sezGshock.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + GS = Section(); + GS.Title = sezGshock; + add(DT,sezGshock); + if activeEN == 1 + add(DT_ENG,sezGshock); + end + + wip = Paragraph('Sezione non ancora disponibile per dati del G-Shock'); + add(DT,wip); + if activeEN == 1 + wip = Paragraph('Section for G-Shock is not yet available.'); + add(DT_ENG,wip); + end + end + + %% Weir Link + if rWL(m,1) > 0 + [FIG,FIG_ENG,battANALOG,ATTIVA] = report_WL(rWL,m,NodoWeirLink,toolrif,... + unitrif,contunit,datarif,Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,... + DT_ENG,FIG,FIG_ENG,activeEN,br,status,conn,FileName); + end + + %% Pendulum + if rPE(m,1) > 0 + [battANALOG,ATTIVA,FIG,FIG_ENG] = report_PE(rPE,m,NodoPendulum,toolrif,unitrif,... + datarif,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,battANALOG,ATTIVA,... + activeEN,conn,FileName); + end + + %% MUSA + if strcmp(tipoarray(m),'MUSA') == 1 % la catena è un MUSA + sezMusa = Paragraph('Musa'); + sezMusa.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + MU = Section(); + MU.Title = sezMusa; + add(DT,sezMusa); + if activeEN == 1 + add(DT_ENG,sezMusa); + end + + wip = Paragraph('Sezione non ancora disponibile per dati del sistema Musa'); + add(DT,wip); + if activeEN == 1 + wip = Paragraph('Section for Musa is not yet available.'); + add(DT_ENG,wip); + end + end + + %% Grafici Integrati + [Site,Site_ENG,FIG,FIG_ENG] = report_CrossGraphs(rTL,rIPL,rTuL,rRaL,... + rPCL,rPL,rRL,rKL,rCrL,rMPBEL,GI_Disp_TL,GI_Date_TL,GI_Prof_TL,GI_Disp_IPL,... + GI_Date_IPL,GI_Prof_IPL,GI_Level_PL,GI_Prof_PL,GI_Date_PL,GI_Rain_RL,GI_Date_RL,... + GI_Angolo_KL,GI_Num_KL,GI_Date_KL,GI_Disp_CrL,GI_Num_CrL,GI_Date_CrL,GI_Q1_TuL,... + GI_Q2_TuL,GI_Q3_TuL,GI_Q4_TuL,GI_Q1_Num_TuL,GI_Q2_Num_TuL,GI_Q3_Num_TuL,... + GI_Q4_Num_TuL,GI_Z_TuL,GI_Seg_TuL,GI_NumSeg_TuL,GI_Date_TuL,GI_Z_PCL,GI_Date_PCL,... + GI_XYZ_Rad,GI_Num_Rad,GI_dS_RL_MPB,GI_dS_RL_TuL,GI_dS_TuL_RL,GI_Date_Rad,... + GI_Date_MPB,GI_dS_MPB,GI_MPB_Base,GI_dS_MPB_RL,siteID,toolrif,chainID,Font_Chapter,... + Font_caption,Font_tools,m,rAR,br,FIG,FIG_ENG,DT,DT_ENG,activeEN,FileName); + + add(MUMS,DT); + if activeEN == 1 + add(MUMS_ENG,DT_ENG); + end + else + testo = Paragraph(['I dati dell''Array ' DTcatena ' letto dalla centralina '... + IDcentralina ' non sono disponibili in quanto ' char(232) ' scaduto '... + 'l''abbonamento ai dati della stessa. I dati torneranno ad essere '... + 'disponibili non appena sar' char(224) ' rinnovato il canone annuo.']); + testo.HAlign = 'justify'; + add(DT,testo); + add(MUMS,DT); + if activeEN == 1 + end + Site = []; + toolrifID = chainID(m,3); + for p = 1:rPL(m,1) + NodeNum = num2str(NodoPiezoLink(p,m)); + comando = ['select measurment from nodes where tool_id = ''' num2str(cell2mat(toolrifID))... + ''' and num = ''' NodeNum ''' and nodetype_id = 2 ']; + curs = exec(conn,comando); + curs = fetch(curs); + Leggo = curs.Data; + misuraPL(1,p) = Leggo(1,1); % unità di misura del piezometro + % pressione assoluta vs relativa + PL_A(p) = 0; + PL_D(p) = 0; + if strcmp(misuraPL(1,p),'VW kPa') == 1 || strcmp(misuraPL(1,p),'VW kg/cm2') == 1 + PL_A(p) = PL_A(p)+1; + else + PL_D(p) = PL_D(p)+1; + end + end + end +end +add(rpt,MUMS); +add(rpt,Site); +template(rpt); +if activeEN == 1 + add(rpt_ENG,MUMS_ENG); + add(rpt_ENG,Site_ENG); + template(rpt_ENG); +end + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_AR function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_BL.m b/Tilt/report_BL.m new file mode 100755 index 0000000..4c0755b --- /dev/null +++ b/Tilt/report_BL.m @@ -0,0 +1,171 @@ +function [ATTIVA,FIG,FIG_ENG] = report_BL(rBL,m,NodoBaroLink,tipoCU,toolrif,unitrif,datarif,... + Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,activeEN,... + conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_BL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() +titolo = 1; +if status(m,1) == 1 + if ATTIVA == 1 + testo = Paragraph('Catena non ancora installata o inattiva.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array 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 + SE = Section(); + if activeEN == 1 + SE_ENG = Section(); + end + for b = 1:rBL(m,1) + NodeNum = num2str(NodoBaroLink(b,m)); + if tipoCU == 9 % Nesa Evo + comando = ['select EventTimestamp, JSON_VALUE(dataJSON,"$.pressureAvg") from elabdatanesaview where EventTimestamp >= ''' ... + datarif ''' and ToolNameID = ''' char(toolrif) ''' and UnitName = ''' char(unitrif) ... + ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Dati = curs.Data; + else + comando = ['select EventDate, EventTime, pressure 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; + end + % Modifico il formato di data e ora + [rD,rC] = size(Dati); + if rC ~= 1 + if rC == 2 % Nesa Evo + Date = datenum(Dati(:,1)); + pressatm = str2num(char(Dati(:,2))); % altezza di pioggia locale + else + T = [cell2mat(Dati(:,1)) repmat(' ', [rD,1]) cell2mat(Dati(:,2))]; + Date = datenum(T); % Data + pressatm = cell2mat(Dati(:,3)); % pressione atmosferica + end + + % grafico pressione atmosferica NELL'ULTIMO MESE + figure(4) + atm = plot(Date,pressatm); + title('Pressione atmosferica'); + xlabel('Data [gg/mm/aaaa]'); + ylabel('Pressione [Pa]'); + 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),'-Baro.png')); + saveas(atm,TempName); + ChartBL = Image(TempName); + ChartBL.Style = {Height('8cm'),HAlign('center')}; + ChartBL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Andamento della '... + 'pressione atmosferica misurata dal barometro nel periodo temporale di riferimento']); + FIG = FIG+1; + ChartBL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph('Il grafico seguente riporta i valori relativi alla pressione atmosferica misurati dal sensore barometrico nel periodo temporale di riferimento.'); + testo.HAlign = 'justify'; + if titolo == 1 + sezBaro = Heading3('Baro Link'); + sezBaro.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SE.Title = sezBaro; + add(DT,sezBaro); + if activeEN == 0 + titolo = 0; + end + end + add(DT,testo); + add(DT,ChartBL); + add(DT,ChartBL_cap); + add(DT,br); + close(figure(4)); + + if activeEN == 1 + figure(4) + atm = plot(Date,pressatm); + title('Atmospheric pressure'); + xlabel('Date [dd/mm/yyyy]'); + ylabel('Pressure [Pa]'); + 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),'-Baro_ENG.png')); + saveas(atm,TempName); + ChartBL = Image(TempName); + ChartBL.Style = {Height('8cm'),HAlign('center')}; + ChartBL_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Atmospheric pressure recorded during '... + 'the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartBL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graph shows the atmospheric pressure recorded by the '... + 'Barometer sensor during the reference monitoring period.']); + testo.HAlign = 'justify'; + if titolo == 1 + sezBaro = Heading3('Baro Link'); + sezBaro.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SE_ENG.Title = sezBaro; + add(DT_ENG,sezBaro); + titolo = 0; + end + add(DT_ENG,testo); + add(DT_ENG,ChartBL); + add(DT_ENG,ChartBL_cap); + add(DT_ENG,br); + close(figure(4)); + end + %pulisco variabili da riutilizzare per catena successiva + clear pressatm; + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + end + end + end + end +end + +text = 'report_BL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_CT.m b/Tilt/report_CT.m new file mode 100755 index 0000000..02e2acb --- /dev/null +++ b/Tilt/report_CT.m @@ -0,0 +1,200 @@ +function [FIG,FIG_ENG] = report_CT(c1trigger,c6trigger,alarms,nCT,rpt,Font_caption,... + Font_table,Font_section,datarif,CT,CT_ENG,FIG,FIG_ENG,activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_CT function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +CT_Att = zeros(1,nCT); +att = cell(1,nCT); +for A = 1:nCT + array = char(alarms(A,2)); + comando = ['select EventDate, EventTime, XShift, X from ELABDATACTRL where EventDate > ''' ... + datestr(datenum(datarif),'yyyy-mm-dd') ''' and CtrlToolName = ''' ... + array ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Dati = curs.Data; + CTS = Section(); + app = Heading2(array); + app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + CTS.Title = app; + if activeEN == 1 + CTS_ENG = Section(); + appENG = Heading2(array); + appENG.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + CTS_ENG.Title = appENG; + end + + % Modifico il formato di data e ora + [rD,rC] = size(Dati); + if rC ~= 1 + + % Camera + if cell2mat(alarms(A,3)) == 4 + ftpobj = ftp('160.78.30.106','asega','mums'); % connessione FTP + percorso = ['/ctrlToolsImages/' array]; + cd(ftpobj, percorso); % vado alla cartella con le immagini della camera elaborata + cartella = dir(ftpobj); % elenco file nella cartella + infoPIC = struct2cell(cartella(end)); % estraggo info ultima foto + mget(ftpobj, infoPIC(1)); % scarico foto + close(ftpobj) + + IMGCam = Image(char(infoPIC(1))); + IMGCam.Style = [IMGCam.Style {ScaleToFit}]; + IMGCam_cap = Paragraph(['Fig. ' num2str(FIG) ' - Immagine acquisita dalla '... + 'videocamera ASECam ' array ' presente in sito']); + FIG = FIG+1; + IMGCam_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + timePIC = cell2mat(infoPIC(5)); + +% % check ora legale +% if isdst(datetime(infoPIC(4),'Timezone','Europe/Zurich')) == 1 +% timePIC = cell2mat(infoPIC(5))-(1/24); +% end + + testoC = Paragraph(['Di seguito viene riportata l''ultima immagine acquisita in data '... + datestr(timePIC,'dd/mm/yyyy') ' dalla videocamera ASECam ' array '.']); + testoC.HAlign = 'justify'; + add(CTS,testoC); + add(CTS,IMGCam); + add(CTS,IMGCam_cap); + + % -- ENG -- + if activeEN == 1 + IMGCam_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Image acquired by the '... + 'ASECam video camera ' array ' installed on site']); + FIG_ENG = FIG_ENG+1; + IMGCam_ENG_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testoC_ENG = Paragraph(['The following figure displays the last image acquired by ASECam '... + array ' installe on site, referring to the following date:' datestr(cell2mat(infoPIC(5)),'dd/mm/yyyy HH:MM:SS') '.']); + testoC_ENG.HAlign = 'justify'; + add(CTS_ENG,testoC_ENG); + add(CTS_ENG,IMGCam); + add(CTS_ENG,IMGCam_ENG_cap); + end + else + T = [cell2mat(Dati(:,1)) repmat(' ', [rD,1]) cell2mat(Dati(:,2))]; + Date = datenum(T); % Data + Att_Loc = cell2mat(Dati(:,3)); % Attivazioni Locali + Att_Cum = cell2mat(Dati(:,4)); % Attivazioni Cumulate + Att_Loc_Tot = cumsum(Att_Loc); + testo = Paragraph(['Durante il periodo temporale di riferimento, '... + 'sono state registrate ' num2str(Att_Loc_Tot(end)) ' attivazioni del dispositivo.' ]); + testo2 = Paragraph(['Il numero di attivazioni totali dalla data di inizio monitoraggio ' char(232) ' pari '... + 'a ' num2str(Att_Cum(end)) '.' ]); + if Att_Loc_Tot(end) > 1 + CT_Att(1,A) = A; + end + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + att_temp = find(Att_Loc); + if isempty(att_temp) == 0 + att{1,A} = splitlines(strjoin(cellstr(Date(att_temp)), '\n')); + end + add(CTS,testo); + add(CTS,testo2); + + %--- ENG --- + if activeEN == 1 + testo = Paragraph(['During the reference time period, '... + 'the Control Tool recorded a total of ' num2str(Att_Loc_Tot(end)) ' activations.' ]); + testo2 = Paragraph(['The total number of activations since the beginning of the monitoring '... + 'activity amounts to ' num2str(Att_Cum(end)) '.' ]); + if Att_Loc_Tot(end) > 1 + CT_Att(1,A) = A; + end + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + add(CTS_ENG,testo); + add(CTS_ENG,testo2); + att_temp = find(Att_Loc); + if isempty(att_temp) == 0 + att{1,A} = splitlines(strjoin(cellstr(Date(att_temp)), '\n')); + end + end + end + % elseif + else + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + add(CTS,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(CTS,testo); + end + end + br = PageBreak(); + add(CTS,br); + add(CT,CTS); +end +clear A +A = find(CT_Att); % Cerco eventuali attivazioni nei singoli dispositivi CT +if isempty(A) == 0 + colonna1(1,1) = {'ID'}; + colonna2(1,1) = {'Tipologia di dispositivo'}; + colonna3(1,1) = {'Attivazioni [gg-mm-aaaa OO:MM:SS]'}; + disp = c1trigger(A); + type = c6trigger(A); + [num,~] = size(disp); + for n = 1:num + colonna1(n+1,1) = {disp}; + colonna2(n+1,1) = {type}; + colonna3(n+1,1) = {att}; + end + tab = FormalTable([colonna1,colonna2,colonna3]); + % formattazione tabella + tab.TableEntriesStyle = {HAlign('center'),VAlign('middle'),FontSize(Font_table),InnerMargin('0.5mm')}; + tab.Style = {ResizeToFitContents(true),Width("100%"),RowSep('solid','black','1px'),... + ColSep('solid','black','1px'),Hyphenation(false),BackgroundColor('#E0F1FF')}; + tab.Border = 'single'; + tabCaption = Paragraph('Tab. 2 - Tipologia di control tools e relative attivazioni durante il periodo analizzato'); + tabCaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + bodyFirstRow = tab.Body.Children(1); + bodyFirstRow.Style = [bodyFirstRow.Style {Bold()}]; + + add(CT,tabCaption); + add(CT,tab); + % --- ENG --- + if activeEN == 1 + colonna1_ENG(1,1) = {'ID'}; + colonna2_ENG(1,1) = {'Control Tool typology'}; + colonna3_ENG(1,1) = {'Activation [dd-mm-yyyy HH:MM:SS]'}; + disp = c1trigger(A); + type = c6trigger(A); + [num,~] = size(disp); + for n = 1:num + colonna1_ENG(n+1,1) = {disp}; + colonna2_ENG(n+1,1) = {type}; + colonna3_ENG(n+1,1) = {att}; + end + tab_ENG = FormalTable([colonna1_ENG,colonna2_ENG,colonna3_ENG]); + % formattazione tabella + tab_ENG.TableEntriesStyle = {HAlign('center'),VAlign('middle'),FontSize(Font_table),InnerMargin('0.5mm')}; + tab_ENG.Style = {ResizeToFitContents(true),Width("100%"),RowSep('solid','black','1px'),... + ColSep('solid','black','1px'),Hyphenation(false),BackgroundColor('#E0F1FF')}; + tab_ENG.Border = 'single'; + tabCaption_ENG = Paragraph('Tab. 2 - Control Tools typology and relative activations recorded during the reference time period'); + tabCaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + bodyFirstRow = tab_ENG.Body.Children(1); + bodyFirstRow.Style = [bodyFirstRow.Style {Bold()}]; + + add(CT_ENG,tabCaption_ENG); + add(CT_ENG,tab_ENG); + end +end + +add(rpt,CT); +template(rpt); + +text = 'report_CT function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_CU.m b/Tilt/report_CU.m new file mode 100755 index 0000000..3d08970 --- /dev/null +++ b/Tilt/report_CU.m @@ -0,0 +1,430 @@ +function [FIG,FIG_ENG,datarif,contunit,IDscaduta] = report_CU(unitID,chainID,adesso,datainvio,numgiorni,... + datasample,tipoarray,firstdata_num,siteID,datalogger,datalogger_ENG,FIG,FIG_ENG,rpt,rpt_ENG,... + Font_caption,Font_section,activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_CU function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +br = PageBreak(); +[rC,~] = size(unitID); +[rAR,~] = size(chainID); +activeT = 1; +if numgiorni == 30 % report mensile + day = '01'; + if adesso == 1 % gennaio + month = '12-'; + year = datestr(today-31,'yyyy-'); % anno precedente + else % altri mesi + month = strcat(num2str(adesso-1),'-'); % Report del mese precedente a quello attuale + year = datestr(today,'yyyy-'); + IDscaduta = zeros(rC,1); + end +else % report con cadenza personalizzata + day = datestr(datainvio,'dd'); + month = datestr(datainvio,'mm-'); + year = datestr(datainvio,'yyyy-'); +end +ar_tot = 1; +UNIT = zeros(rC,1); % Metto uno zero se la centralina ha solo ANALOG ARRAY, 1 se ha almeno un MUMS +for G = 1:rC % creo una sottosezione per ciascuna centralina + lastsample = 0; % inizializzo con data "nulla" (ultima lettura) + firstsample = 9*10^10; %inizializzo con data "lontanissima" (prima lettura) + contunit = unitID(G,2); + IDcentralina = char(contunit); + + % Cerco la data di scadenza della centralina + comando = ['select duedate from units where name = ''' IDcentralina ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Date = curs.Data; + Check = cell2mat(Date); + if strcmp(Check,'null') || strcmp(Check,'No Data') + analisi = 1; % La data di scadenza centralina non è impostata + else + if datenum(Date) < now % Centralina scaduta + analisi = 0; + else + analisi = 1; + end + end + + ID = Section(); + app = Heading2(['Centralina ', IDcentralina]); + app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + ID.Title = app; + if activeEN == 1 + ID_ENG = Section(); + app_ENG = Heading2(['Control Unit ', IDcentralina]); + app_ENG.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + ID_ENG.Title = app_ENG; + end + num_array = zeros(rC,1); + if analisi == 0 + testo = Paragraph(['I dati della centralina ' IDcentralina ' non '... + 'sono disponibili in quanto ' char(232) ' scaduto l''abbonamento ai dati della stessa. '... + 'I dati torneranno ad essere disponibili non appena sar' char(224) ... + ' rinnovato il canone annuo.']); + testo.HAlign = 'justify'; + add(ID,testo); + add(datalogger,ID) + IDscaduta(G,1) = 1; + datarif = strcat(year, month, day); + UNIT(G,1) = 99999; + if activeEN == 1 + testo = Paragraph(['Data recorded by control unit' IDcentralina ' are not '... + 'available due to the expiration of the data management subscription for this data logger. '... + 'Access to monitoring data will be resumed following the payment of the annual fee. ']); + testo.HAlign = 'justify'; + add(ID_ENG,testo); + add(datalogger_ENG,ID_ENG) + end + else + contunitID = num2str(cell2mat(unitID(G,1))); + IDscaduta(G,1) = 0; + datarif = strcat(year, month, day); + cen = 1; + for kk = 1:rAR + comando = ['select prod_date from tools where unit_ID like ''' contunitID ''' and name like ''' char(chainID(kk,4)) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + data_ini = curs.Data; + stringa = cell2mat(data_ini); + [~,cst] = size(stringa); + if cst > 10 + date = stringa(1,1:10); + time = stringa(1,11:21); + dataora_sito(1,1) = cellstr(date); + dataora_sito(1,2) = cellstr(time); + datasito{cen,1} = datestr(data_ini, 'yyyy-mm-dd HH:MM'); % Data definita sul sito + cen = cen+1; + end + end + datasito801 = min(datenum(datasito)); + if datenum(datasito801) > datenum(datarif) + datarif = datestr(datenum(datasito801),'yyyy-mm-dd'); + end + + Indici = []; + for rr = 1:rAR + if strcmp(char(chainID(rr,2)),char(unitID(G,2))) == 1 + Indici = [Indici; rr]; + end + end + IN = size(Indici); + num_array(G) = IN(1); + ARRAY = tipoarray(Indici,1); + for NUM = 1:num_array(G) + if strcmp(ARRAY(NUM,1),'Analog Array') == 1 + UNIT(G,1) = 0; + elseif strcmp(ARRAY(NUM,1),'MUSA') == 1 || strcmp(ARRAY(NUM,1),'RSN') == 1 || strcmp(ARRAY(NUM,1),'Klino Array D2W') == 1 + UNIT(G,1) = 0.5; + else + UNIT(G,1) = 1; + break + end + end + end + + if UNIT(G,1) == 1 + for arr = 1:num_array(G) + datasample_num = cell2mat(datasample(ar_tot+arr,1)); + if datasample_num ~= 9999 + if datasample_num >= lastsample && cell2mat(firstdata_num(arr+1)) <= firstsample || ... + datasample_num >= lastsample && firstsample == 0 % ultima lettura più recente, prima lettura più vecchia + Indici = []; + for rr = 1:rAR + if strcmp(char(chainID(rr,2)),char(unitID(G,2))) == 1 + Indici = [Indici; rr]; + end + end + catenarif = char(chainID(Indici(arr),4)); + lastsample = datasample_num; + firstsample = cell2mat(firstdata_num(arr+1)); + end + end + end + + if exist('catenarif','var') + % Scarico dati batteria + comando = ['select Date, Time, UnitName, ToolNameID, BatLevel, Temperature from RawDataView where Date >= ''' ... + datarif ''' and UnitName = ''' char(contunit) ''' and ToolNameID = '''... + catenarif ''' and NodeNum = 1 ']; + curs = exec(conn,comando); + curs = fetch(curs); + BatTemp = curs.Data; + [~,cc] = size(BatTemp); + else + cc = 1; + end + 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 + testo = Paragraph(['Di seguito sono riportati i valori di tensione '... + 'di alimentazione registrati durante il periodo di riferimento. '... + 'L''ultimo dato disponibile ' char(232) ' pari '... + 'a ' num2str(Batteria(end,1)) ' V.']); + if activeT == 1 + testo = Paragraph(['Di seguito sono riportati i valori di tensione '... + 'di alimentazione registrati durante il periodo di riferimento. '... + '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.']); + testo2 = Paragraph(['La medesima centralina dispone al proprio interno '... + 'di un termometro per monitorare la temperatura di esercizio ed identificare '... + 'eventuali anomalie. I dati di temperatura registrati sono riportati di seguito.']); + testo2.HAlign = 'justify'; + end + testo.HAlign = 'justify'; + % grafico batteria + figure(1) + plot(Date,Batteria); + hold on + title('Livello di carica e temperatura'); + xlabel('Data [gg/mm/aaaa]'); + ylabel('Livello della Batteria [V]'); + xlim([Date(1)-1 Date(end)+1]); + ylim([floor(min(Batteria(:,1))) ceil(max(Batteria(:,1)))]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + yyaxis right + CEN = 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,'.png')); + saveas(CEN,TempName); + Chart = Image(TempName); + Chart.Style = {Height('7.5cm'),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); + Batt2 = Image(TempName); + Batt.Style = {Height('4cm'),HAlign('center')}; + Batt2.Style = {Height('4cm'),HAlign('center')}; + + lot = Table({Chart, 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 della '... + 'centralina registrati durante il periodo di riferimento']); + FIG = FIG+1; + lot_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + close(figure(1)); + + add(ID,testo); + if cc ~= 1 + if activeT == 1 + add(ID,testo2); + end + add(ID,lot); + add(ID,lot_cap); + if G == rC || activeT == 1 + add(ID,br); + activeT = 0; + end + add(datalogger,ID) + end + else + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + add(ID,testo); + if G == rC + add(ID,br); + end + add(datalogger,ID) + end + + if activeEN == 1 % --- INGLESE --- + if cc ~= 1 + % testo introduttivo + testo = Paragraph(['The following chart reports the battery level trend recorded '... + 'during the reference time period. The last available data is equal to ' num2str(Batteria(end,1)) ' V.']); + if activeT == 1 + testo = Paragraph(['The following chart reports the 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.']); + testo2 = Paragraph(['The control unit 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 control unit.']); + testo2.HAlign = 'justify'; + end + testo.HAlign = 'justify'; + % grafico batteria + figure(1) + plot(Date,Batteria); + hold on + title('Battery level and temperature'); + xlabel('Date [dd/mm/yyyy]'); + ylabel('Level [V]'); + xlim([Date(1)-1 Date(end)+1]); + ylim([floor(min(Batteria(:,1))) ceil(max(Batteria(:,1)))]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + yyaxis right + CEN = 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,'_ENG.png')); + saveas(CEN,TempName); + Chart = Image(TempName); + Chart.Style = {Height('7.5cm'),HAlign('center')}; + + lot = Table({Chart, Batt2}); + 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 control unit temperature recorded '... + 'during the reference time period']); + FIG_ENG = FIG_ENG+1; + lot_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + close(figure(1)); + + add(ID_ENG,testo); + if cc ~= 1 + if activeT == 1 + add(ID_ENG,testo2); + end + add(ID_ENG,lot); + add(ID_ENG,lot_cap); + if G == rC || activeT == 1 + add(ID_ENG,br); + activeT = 0; + end + add(datalogger_ENG,ID_ENG) + end + else + testo = Paragraph('No data available for the reference time period.'); + add(ID_ENG,testo); + if G == rC + add(ID_ENG,br); + end + add(datalogger_ENG,ID_ENG) + end + end + elseif UNIT(G,1) == 0 % SOLO Analog Array + testo = Paragraph(['Questa centralina legge solo sensori analogici (Analog Array): i dati di batteria e temperatura '... + 'faranno quindi riferimento ai valori registrati dai singoli moduli GMUX e verranno pertanto '... + 'riportati nelle apposite sezioni.']); + testo.Style = {HAlign('justify')}; + add(ID,testo); + if G == rC + add(ID,br); + end + add(datalogger,ID) + if activeEN == 1 % SOLO Analog Array + testo = Paragraph(['This control unit read Analog Arrays only: for this reason, '... + 'battery level and temperature data should be referred to each single GMUX '... + 'module, and they will be presented in the appropriate section of the report.']); + testo.Style = {HAlign('justify')}; + add(ID_ENG,testo); + if G == rC + add(ID_ENG,br); + end + add(datalogger_ENG,ID_ENG) + end + elseif UNIT(G,1) == 0.5 % SOLO MUSA o RSN + testo = Paragraph(['Questa centralina legge solo sensori MUSA, RSN o D2W: i dati di batteria e temperatura '... + 'presentati in questo report faranno riferimento ai singoli moduli e verranno '... + 'riportati nelle apposite sezioni.']); + testo.Style = {HAlign('justify')}; + add(ID,testo); + if G == rC + add(ID,br); + end + add(datalogger,ID) + if activeEN == 1 + testo = Paragraph(['This control unit read MUSA, RSN or D2W sensors: for this reason, '... + 'battery level and temperature data should be referred to each single module, '... + 'and they will be presented in the appropriate section of the report.']); + testo.Style = {HAlign('justify')}; + add(ID_ENG,testo); + if G == rC + add(ID_ENG,br); + end + add(datalogger_ENG,ID_ENG) + end + end + ar_tot = ar_tot+num_array(G); +end +add(rpt,datalogger); +template(rpt); +add(rpt_ENG,datalogger_ENG); +template(rpt_ENG); + +text = 'report_CU function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_CrL.m b/Tilt/report_CrL.m new file mode 100755 index 0000000..4dd69a4 --- /dev/null +++ b/Tilt/report_CrL.m @@ -0,0 +1,412 @@ +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 \ No newline at end of file diff --git a/Tilt/report_CrossGraphs.m b/Tilt/report_CrossGraphs.m new file mode 100755 index 0000000..3649559 --- /dev/null +++ b/Tilt/report_CrossGraphs.m @@ -0,0 +1,3102 @@ +function [Site,Site_ENG,FIG,FIG_ENG] = report_CrossGraphs(rTL,rIPL,rTuL,rRaL,... + rPCL,rPL,rRL,rKL,rCrL,rMPBEL,GI_Disp_TL,GI_Date_TL,GI_Prof_TL,GI_Disp_IPL,... + GI_Date_IPL,GI_Prof_IPL,GI_Level_PL,GI_Prof_PL,GI_Date_PL,GI_Rain_RL,GI_Date_RL,... + GI_Angolo_KL,GI_Num_KL,GI_Date_KL,GI_Disp_CrL,GI_Num_CrL,GI_Date_CrL,GI_Q1_TuL,... + GI_Q2_TuL,GI_Q3_TuL,GI_Q4_TuL,GI_Q1_Num_TuL,GI_Q2_Num_TuL,GI_Q3_Num_TuL,... + GI_Q4_Num_TuL,GI_Z_TuL,GI_Seg_TuL,GI_NumSeg_TuL,GI_Date_TuL,GI_Z_PCL,GI_Date_PCL,... + GI_XYZ_Rad,GI_Num_Rad,GI_dS_RL_MPB,GI_dS_RL_TuL,GI_dS_TuL_RL,GI_Date_Rad,... + GI_Date_MPB,GI_dS_MPB,GI_MPB_Base,GI_dS_MPB_RL,siteID,toolrif,chainID,Font_Chapter,... + Font_caption,Font_tools,m,rAR,br,FIG,FIG_ENG,DT,DT_ENG,activeEN,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_CrossGraphs function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +%% --- TILT LINK + PIEZO LINK --- +% Tilt Link V + Piezo Link : Spostamento massimo locale vs Falda +if rTL(m,1) > 0 && rPL(m,1) > 0 && exist( 'GI_Disp_TL','var') + if isempty(GI_Level_PL(:,m)) == 0 && GI_Date_PL(1,m) ~= 0 && isempty(GI_Disp_TL(:,m)) == 0 && GI_Date_TL(1,m) ~= 0 + ind_PL = find(GI_Date_PL(:,m)); + ind_TL = find(GI_Date_TL(:,m)); + sezGrafTLvsPL = Paragraph('Correlazioni tra sensori - Tilt Link vs Piezo Link'); + sezGrafTLvsPL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + GI_VarFaldaPL = GI_Level_PL(:,m)-GI_Level_PL(1,m); + figure(21) + yyaxis left + GI_TiltLink = plot(GI_Date_TL(1:ind_TL(end),m),GI_Disp_TL(1:ind_TL(end),m),'Color','red'); + set(gca,'YColor','k') + LIM = ylim; + if max(GI_Disp_TL(:,m)) < 10 + ylim([-inf 10]); + elseif 1-max(GI_Disp_TL(:,m))/LIM(1,2) < 0.2 + if max(GI_Disp_TL(:,m)) < 1 + newlim = LIM(1,2)+LIM(1,2)*0.3; + else + newlim = LIM(1,2)+LIM(1,2)*0.1; + end + ylim([-inf newlim]); + end + ylabel('Spostamento [mm]'); + yyaxis right + GI_PiezoLink = plot(GI_Date_PL(1:ind_PL(end),m),GI_VarFaldaPL(1:ind_PL(end)),':','Color','blue'); + var = max(abs(GI_VarFaldaPL(1:ind_PL(end)))); + media = mean(GI_VarFaldaPL(1:ind_PL(end))); + LIM = ylim; + if var < 0.7 + ylim([media-0.5 media+0.5]); + elseif 1-max(GI_VarFaldaPL(1:ind_PL(end)))/LIM(1,2) < 0.2 + if max(GI_VarFaldaPL(1:ind_PL(end))) < 1 + newlim = LIM(1,2)+LIM(1,2)*0.3; + else + newlim = LIM(1,2)+LIM(1,2)*0.1; + end + ylim([-inf newlim]); + end + ylabel('Variazione del livello idrico [m]'); + set(gca,'YColor','k') + title('Correlazione spostamenti - variazioni di falda'); + xlabel('Data [gg/mm/aaaa]'); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + yyaxis left + lgdTL = (['Spostamenti (' num2str(GI_Prof_TL(1,m)) ' m)']); + lgdPL = ('Variazione Falda'); + str(1,1) = {['Spostamenti (' num2str(GI_Prof_TL(1,m)) ' m)']}; + str(2,1) = {'Variazione Falda'}; + lgd = legend(lgdTL,lgdPL, 'Location','north'); + numcolumns = 2; + [legend_h,object_h,plot_h,text_strings] = columnlegend(numcolumns,str); + clear str + + testoTLvsPL = Paragraph(['Il grafico seguente ha l''obiettivo di evidenziare '... + 'eventuali correlazioni presenti tra variazioni del livello di falda e '... + 'spostamenti registrati dai sensori di tipo inclinometrico. '... + 'In particolare, con riferimento al periodo temporale considerato, '... + 'vengono presi in considerazione il nodo che ha registrato '... + 'il maggior spostamento differenziale locale in direzione di massima pendenza '... + 'ed il piezometro che ha misurato una variazione di falda maggiore '... + '(nel caso la catena presenti un singolo piezometro, i dati riportati sono riferiti '... + 'all''unico sensore disponibile).']); + testoTLvsPL2 = Paragraph(['In questo caso, gli spostamenti riportati nel grafico '... + 'si riferiscono al sensore posizionato a ' num2str(GI_Prof_TL(1,m)) ' m di profondit' char(224) ', '... + 'mentre l''andamento della falda ' char(232) ' riferito alle misure del piezometro ' ... + 'collocato ad una profondit' char(224) ' di ' num2str((GI_Prof_PL(1,m))) ' metri.']); + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-TLvsPL.png')); + saveas(GI_PiezoLink,TempName); + ChartTLvsPL = Image(TempName); + ChartTLvsPL.Style = {ScaleToFit}; + ChartTLvsPL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto tra i dati di massimo '... + 'spostamento differenziale locale in direzione di massima pendenza e variazione '... + 'del livello idrico nel periodo temporale di riferimento']); + FIG = FIG+1; + ChartTLvsPL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testoTLvsPL.HAlign = 'justify'; + testoTLvsPL2.HAlign = 'justify'; + add(DT,sezGrafTLvsPL); + add(DT,testoTLvsPL); + add(DT,testoTLvsPL2); + add(DT,ChartTLvsPL); + add(DT,ChartTLvsPL_cap); + add(DT,br); + close(figure(21)); + + %--ENG-- + if activeEN == 1 + sezGrafTLvsPL_ENG = Paragraph('Correlations between sensors - Tilt Link vs Piezo Link'); + sezGrafTLvsPL_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + GI_VarFaldaPL = GI_Level_PL(:,m)-GI_Level_PL(1,m); + figure(22) + yyaxis left + GI_TiltLink = plot(GI_Date_TL(1:ind_TL(end),m),GI_Disp_TL(1:ind_TL(end),m),'Color','red'); + set(gca,'YColor','k') + LIM = ylim; + if max(GI_Disp_TL(:,m)) < 10 + ylim([-inf 10]); + elseif 1-max(GI_Disp_TL(:,m))/LIM(1,2) < 0.2 + if max(GI_Disp_TL(:,m)) < 1 + newlim = LIM(1,2)+LIM(1,2)*0.3; + else + newlim = LIM(1,2)+LIM(1,2)*0.1; + end + ylim([-inf newlim]); + end + ylabel('Displacement [mm]'); + yyaxis right + GI_PiezoLink = plot(GI_Date_PL(1:ind_PL(end),m),GI_VarFaldaPL(1:ind_PL(end)),':','Color','blue'); + var = max(abs(GI_VarFaldaPL(1:ind_PL(end)))); + media = mean(GI_VarFaldaPL(1:ind_PL(end))); + LIM = ylim; + if var < 0.7 + ylim([media-0.5 media+0.5]); + elseif 1-max(GI_VarFaldaPL(1:ind_PL(end)))/LIM(1,2) < 0.2 + if max(GI_VarFaldaPL(1:ind_PL(end))) < 1 + newlim = LIM(1,2)+LIM(1,2)*0.3; + else + newlim = LIM(1,2)+LIM(1,2)*0.1; + end + ylim([-inf newlim]); + end + ylabel('Water level variation [m]'); + set(gca,'YColor','k') + title('Correlation between displacements and water level variation'); + xlabel('Date [dd/mm/yyyy]'); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + yyaxis left + lgdTL = (['Displacements (' num2str(GI_Prof_TL(1,m)) ' m)']); + lgdPL = ('Water level variation'); + str(1,1) = {['Displacements (' num2str(GI_Prof_TL(1,m)) ' m)']}; + str(2,1) = {'Water level variation'}; + lgd = legend(lgdTL,lgdPL, 'Location','north'); + numcolumns = 2; + [legend_h,object_h,plot_h,text_strings] = columnlegend(numcolumns,str); + clear str + + testoTLvsPL = Paragraph(['The following graph aims to highlight the presence of '... + 'correlations between displacement data and water level variations. '... + 'In particular, for what concern the reference time period, the comparison '... + 'will focus on the sensor that measured the maximum local differential '... + 'displacement and the piezometer that recorded the largest water level variation. '... + 'If the Array includes only one piezometer, the graph is going to include monitoring '... + 'data measured by the only sensor available.']); + + testoTLvsPL2 = Paragraph(['In this case, displacement data reported in the graph '... + 'refer to the sensor located at ' num2str(GI_Prof_TL(1,m)) ' m of depth, while '... + 'the represented water level variation derives from the piezometer installed ' ... + 'at ' num2str((GI_Prof_PL(1,m))) ' m of depth.']); + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-TLvsPL_ENG.png')); + saveas(GI_PiezoLink,TempName); + ChartTLvsPL_ENG = Image(TempName); + ChartTLvsPL_ENG.Style = {ScaleToFit}; + ChartTLvsPL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between the '... + 'maximum local differential displacement and the water level variation '... + 'measured during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartTLvsPL_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testoTLvsPL.HAlign = 'justify'; + testoTLvsPL2.HAlign = 'justify'; + add(DT_ENG,sezGrafTLvsPL_ENG); + add(DT_ENG,testoTLvsPL); + add(DT_ENG,testoTLvsPL2); + add(DT_ENG,ChartTLvsPL_ENG); + add(DT_ENG,ChartTLvsPL_ENG_cap); + add(DT_ENG,br); + close(figure(22)); + end + % pulisco variabili da riutilizzare per catena successiva + clear GI_VarFaldaPL; + end +end + +%% --- IN PLACE LINK + PIEZO LINK --- +% In Place Link + Piezo Link : Spostamento massimo locale vs Falda +if rIPL(m,1) > 0 && rPL(m,1) > 0 && exist( 'GI_Disp_IPL','var') + if isempty(GI_Level_PL(:,m)) == 0 && GI_Date_PL(1,m) ~= 0 && ... + isempty(GI_Disp_IPL(:,m)) == 0 && GI_Date_IPL(1,m) ~= 0 + ind_PL = find(GI_Date_PL(:,m)); + ind_IPL = find(GI_Date_IPL(:,m)); + sezGrafIPLvsPL = Paragraph('Correlazioni tra sensori - In Place Link vs Piezo Link'); + sezGrafIPLvsPL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + GI_VarFaldaPL = GI_Level_PL(:,m)-GI_Level_PL(1,m); + figure(21) + yyaxis left + GI_InPlaceLink = plot(GI_Date_IPL(1:ind_IPL(end),m),GI_Disp_IPL(1:ind_IPL(end),m),'Color','red'); + set(gca,'YColor','k') + LIM = ylim; + if max(GI_Disp_IPL(:,m)) < 10 + ylim([-inf 10]); + elseif 1-max(GI_Disp_IPL(:,m))/LIM(1,2) < 0.2 + if max(GI_Disp_IPL(:,m)) < 1 + newlim = LIM(1,2)+LIM(1,2)*0.3; + else + newlim = LIM(1,2)+LIM(1,2)*0.1; + end + ylim([-inf newlim]); + end + ylabel('Spostamento [mm]'); + yyaxis right + GI_PiezoLink = plot(GI_Date_PL(1:ind_PL(end),m),GI_VarFaldaPL(1:ind_PL(end)),':','Color','blue'); + var = max(abs(GI_VarFaldaPL(1:ind_PL(end)))); + media = mean(GI_VarFaldaPL(1:ind_PL(end))); + LIM = ylim; + if var < 0.7 + ylim([media-0.5 media+0.5]); + elseif 1-max(GI_VarFaldaPL(1:ind_PL(end)))/LIM(1,2) < 0.2 + if max(GI_VarFaldaPL(1:ind_PL(end))) < 1 + newlim = LIM(1,2)+LIM(1,2)*0.3; + else + newlim = LIM(1,2)+LIM(1,2)*0.1; + end + ylim([-inf newlim]); + end + ylabel('Variazione del livello idrico [m]'); + set(gca,'YColor','k') + title('Correlazione spostamenti - variazioni di falda'); + xlabel('Data [gg/mm/aaaa]'); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + lgdIPL = (['Spostamenti (' num2str(GI_Prof_IPL(1,m)) ' m)']); + lgdPL = ('Variazione Falda'); + str(1,1) = {['Spostamenti (' num2str(GI_Prof_IPL(1,m)) ' m)']}; + str(2,1) = {'Variazione Falda'}; + lgd = legend(lgdIPL,lgdPL, 'Location','north'); + numcolumns = 2; + [legend_h,object_h,plot_h,text_strings] = columnlegend(numcolumns,str); + clear str + + testoIPLvsPL = Paragraph(['Il grafico seguente ha l''obiettivo di evidenziare '... + 'eventuali correlazioni presenti tra variazioni del livello di falda e '... + 'spostamenti registrati dai sensori di tipo inclinometrico. '... + 'In particolare, con riferimento al periodo temporale considerato, '... + 'vengono presi in considerazione il nodo che ha registrato '... + 'il maggior spostamento differenziale locale in direzione di massima pendenza '... + 'ed il piezometro che ha misurato una variazione di falda maggiore '... + '(nel caso la catena presenti un singolo piezometro, i dati riportati sono riferiti '... + 'all''unico sensore disponibile).']); + testoIPLvsPL2 = Paragraph(['In questo caso, gli spostamenti riportati nel grafico '... + 'si riferiscono al sensore posizionato a ' num2str(GI_Prof_IPL(1,m)) ... + ' m di profondit' char(224) ', mentre l''andamento della falda ' ... + char(232) ' riferito alle misure del piezometro collocato ad una '... + 'profondit' char(224) ' di ' num2str((GI_Prof_PL(1,m))) ' metri.']); + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-IPLvsPL.png')); + saveas(GI_PiezoLink,TempName); + ChartIPLvsPL = Image(TempName); + ChartIPLvsPL.Style = {ScaleToFit}; + ChartIPLvsPL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto tra i dati di massimo '... + 'spostamento differenziale locale in direzione di massima pendenza e variazione '... + 'del livello idrico nel periodo temporale di riferimento']); + FIG = FIG+1; + ChartIPLvsPL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testoIPLvsPL.HAlign = 'justify'; + testoIPLvsPL2.HAlign = 'justify'; + add(DT,sezGrafIPLvsPL); + add(DT,testoIPLvsPL); + add(DT,testoIPLvsPL2); + add(DT,ChartIPLvsPL); + add(DT,ChartIPLvsPL_cap); + add(DT,br); + close(figure(21)); + + %--ENG-- + if activeEN == 1 + sezGrafIPLvsPL_ENG = Paragraph('Correlations between sensors - In Place Link vs Piezo Link'); + sezGrafIPLvsPL_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + GI_VarFaldaPL = GI_Level_PL(:,m)-GI_Level_PL(1,m); + figure(22) + yyaxis left + GI_InPlaceLink = plot(GI_Date_IPL(1:ind_IPL(end),m),GI_Disp_IPL(1:ind_IPL(end),m),'Color','red'); + set(gca,'YColor','k') + LIM = ylim; + if max(GI_Disp_IPL(:,m)) < 10 + ylim([-inf 10]); + elseif 1-max(GI_Disp_IPL(:,m))/LIM(1,2) < 0.2 + if max(GI_Disp_IPL(:,m)) < 1 + newlim = LIM(1,2)+LIM(1,2)*0.3; + else + newlim = LIM(1,2)+LIM(1,2)*0.1; + end + ylim([-inf newlim]); + end + ylabel('Displacement [mm]'); + yyaxis right + GI_PiezoLink = plot(GI_Date_PL(1:ind_PL(end),m),GI_VarFaldaPL(1:ind_PL(end)),':','Color','blue'); + var = max(abs(GI_VarFaldaPL(1:ind_PL(end)))); + media = mean(GI_VarFaldaPL(1:ind_PL(end))); + LIM = ylim; + if var < 0.7 + ylim([media-0.5 media+0.5]); + elseif 1-max(GI_VarFaldaPL(1:ind_PL(end)))/LIM(1,2) < 0.2 + if max(GI_VarFaldaPL(1:ind_PL(end))) < 1 + newlim = LIM(1,2)+LIM(1,2)*0.3; + else + newlim = LIM(1,2)+LIM(1,2)*0.1; + end + ylim([-inf newlim]); + end + ylabel('Water level variation [m]'); + set(gca,'YColor','k') + title('Correlation between displacements and water level variation'); + xlabel('Date [dd/mm/yyyy]'); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + lgdIPL = (['Displacements (' num2str(GI_Prof_IPL(1,m)) ' m)']); + lgdPL = ('Water level variation'); + str(1,1) = {['Displacements (' num2str(GI_Prof_IPL(1,m)) ' m)']}; + str(2,1) = {'Water level variation'}; + lgd = legend(lgdIPL,lgdPL, 'Location','north'); + numcolumns = 2; + [legend_h,object_h,plot_h,text_strings] = columnlegend(numcolumns,str); + clear str + + testoIPLvsPL = Paragraph(['The following graph aims to highlight the presence of '... + 'correlations between displacement data and water level variations. '... + 'In particular, for what concern the reference time period, the comparison '... + 'will focus on the sensor that measured the maximum local differential '... + 'displacement and the piezometer that recorded the largest water level variation. '... + 'If the Array includes only one piezometer, the graph is going to include monitoring '... + 'data measured by the only sensor available.']); + + testoIPLvsPL2 = Paragraph(['In this case, displacement data reported in the graph '... + 'refer to the sensor located at ' num2str(GI_Prof_IPL(1,m)) ' m of depth, while '... + 'the represented water level variation derives from the piezometer installed ' ... + 'at ' num2str((GI_Prof_PL(1,m))) ' m of depth.']); + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-IPLvsPL_ENG.png')); + saveas(GI_PiezoLink,TempName); + ChartIPLvsPL_ENG = Image(TempName); + ChartIPLvsPL_ENG.Style = {ScaleToFit}; + ChartIPLvsPL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between the '... + 'maximum local differential displacement and the water level variation '... + 'measured during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartIPLvsPL_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testoIPLvsPL.HAlign = 'justify'; + testoIPLvsPL2.HAlign = 'justify'; + add(DT_ENG,sezGrafIPLvsPL_ENG); + add(DT_ENG,testoIPLvsPL); + add(DT_ENG,testoIPLvsPL2); + add(DT_ENG,ChartIPLvsPL_ENG); + add(DT_ENG,ChartIPLvsPL_ENG_cap); + add(DT_ENG,br); + close(figure(22)); + end + % pulisco variabili da riutilizzare per catena successiva + clear GI_VarFaldaPL; + end +end + +Site = Chapter; +if activeEN == 1 + Site_ENG = Chapter; +else + Site_ENG = []; +end +%% Grafici riassuntivi del SITO +if m == rAR && rAR > 1 + titleCha = 0; + % --- Piogge vs falda --- + if sum(rRL) > 0 && sum(rPL) > 0 && exist('GI_Rain_RL','var') && exist('GI_Level_PL','var') + if isempty(GI_Level_PL) == 0 && isempty(GI_Rain_RL) == 0 + if titleCha == 0 + sezSITE = Heading1('Correlazioni fra i diversi sensori presenti in sito'); + sezSITE.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site.Title = sezSITE; + spazio = Paragraph(''); + add(Site,spazio); + if activeEN == 1 + sezSITE_ENG = Heading1('Correlations between different sensors installed on site'); + sezSITE_ENG.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site_ENG.Title = sezSITE_ENG; + spazio = Paragraph(''); + add(Site_ENG,spazio); + end + titleCha = 1; + end + sezGrafRLvsPL = Heading2('Correlazioni tra sensori - Rain Link vs Piezo Link'); + sezGrafRLvsPL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + GI_VarFaldaPL = GI_Level_PL-GI_Level_PL(1,:); + testoRLvsPL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra il piezometro '... + 'che ha registrato le maggiori variazioni di falda per ogni Array '... + 'presente in sito e le precipitazioni locali rilevate dal pluviometro.']); + add(Site,sezGrafRLvsPL); + add(Site,testoRLvsPL); + testoRLvsPL.HAlign = 'justify'; + figure(22) + GI_RainLink = bar(GI_Date_RL,GI_Rain_RL,75,'k'); + yyaxis left + ylabel('Precipitazioni [mm]'); + set(gca,'YColor','k') + yyaxis right + ylabel('Variazione di falda [m]'); + set(gca,'YColor','k') + title('Correlazione piogge - variazioni di falda'); + xlabel('Data [gg/mm/aaaa]'); + strRL(1,1) = cellstr('Precipitazioni'); + legend(strRL,'Location','northwest'); + [~,colPL] = size(GI_Level_PL); + num = 2; + index = []; + hold on + grid on + cmap = lines(colPL); + for p = 1:colPL + if GI_Date_PL(1,p) ~= 0 + ind_PL = find(GI_Date_PL(:,p)); + index = [index; p]; + GI_RainLink = plot(GI_Date_PL(1:ind_PL(end),p),GI_VarFaldaPL(1:ind_PL(end),p),'-','Color',cmap(p,:)); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(p,4)) ' -' num2str(GI_Prof_PL(1,p)) 'm']); + str(1,1) = cellstr('Precipitazioni'); + legend(str,'Location','northwest'); + num = num+1; + end + end + leg = legend(str,'Location','best'); + clear str + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-RLvsPL.png')); + saveas(GI_RainLink,TempName); + ChartRLvsPL = Image(TempName); + ChartRLvsPL.Style = {ScaleToFit}; + ChartRLvsPL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto tra i dati di precipitazione e variazione '... + 'di falda registrati nel periodo temporale di riferimento']); + FIG = FIG+1; + ChartRLvsPL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = (['In questo caso, l''andamento della falda ' char(232) ' riferito alle misure dei sensori riportati di seguito: ']); + testoRLvsPL2 = Paragraph(text); + testoRLvsPL2.HAlign = 'justify'; + add(Site,testoRLvsPL2); + I = size(index); + for a = 1:I(1) + text = ['- Array ',char(chainID(index(a),4)),' - Piezometro a ',num2str(GI_Prof_PL(1,index(a))),' m da P.C.']; + testoRLvsPL2 = Paragraph(text); + add(Site,testoRLvsPL2); + end + add(Site,ChartRLvsPL); + add(Site,ChartRLvsPL_cap); + add(Site,br); + close(figure(22)); + % -- ENG -- + if activeEN == 1 + sezGrafRLvsPL_ENG = Heading2('Correlation between sensors - Rain Link vs Piezo Link'); + sezGrafRLvsPL_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + GI_VarFaldaPL = GI_Level_PL-GI_Level_PL(1,:); + testoRLvsPL = Paragraph(['The following graph aims to highlight '... + 'the presence of correlations between the piezometer that recorded the '... + 'the maximum water level variation for each Array present on site, and the '... + 'local rainfall data measured by the rain gauge.']); + add(Site_ENG,sezGrafRLvsPL_ENG); + add(Site_ENG,testoRLvsPL); + testoRLvsPL.HAlign = 'justify'; + figure(23) + GI_RainLink = bar(GI_Date_RL,GI_Rain_RL,75,'k'); + yyaxis left + ylabel('Rainfall [mm]'); + set(gca,'YColor','k') + yyaxis right + ylabel('Water level variation [m]'); + set(gca,'YColor','k') + title('Correlations between rainfall and water level variation'); + xlabel('Date [dd/mm/yyyy]'); + strRL(1,1) = cellstr('Rainfall'); + legend(strRL,'Location','northwest'); + [~,colPL] = size(GI_Level_PL); + num = 2; + index = []; + hold on + grid on + cmap = lines(colPL); + for p = 1:colPL + if GI_Date_PL(1,p) ~= 0 + ind_PL = find(GI_Date_PL(:,p)); + index = [index; p]; + GI_RainLink = plot(GI_Date_PL(1:ind_PL(end),p),GI_VarFaldaPL(1:ind_PL(end),p),'-','Color',cmap(p,:)); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(p,4)) ' -' num2str(GI_Prof_PL(1,p)) 'm']); + str(1,1) = cellstr('Rainfall'); + legend(str,'Location','northwest'); + num = num+1; + end + end + leg = legend(str,'Location','best'); + clear str + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-RLvsPL_ENG.png')); + saveas(GI_RainLink,TempName); + ChartRLvsPL_ENG = Image(TempName); + ChartRLvsPL_ENG.Style = {ScaleToFit}; + ChartRLvsPL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between '... + 'rainfall data and water level variation during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartRLvsPL_ENG_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = ('In this case, the water level variation data derive from the sensors listed below: '); + testoRLvsPL2 = Paragraph(text); + testoRLvsPL2.HAlign = 'justify'; + add(Site_ENG,testoRLvsPL2); + I = size(index); + for a = 1:I(1) + text = ['- Array ',char(chainID(index(a),4)),' - Piezometer located ',num2str(GI_Prof_PL(1,index(a))),' m b.g.l.']; + testoRLvsPL2 = Paragraph(text); + add(Site_ENG,testoRLvsPL2); + end + add(Site_ENG,ChartRLvsPL_ENG); + add(Site_ENG,ChartRLvsPL_ENG_cap); + add(Site_ENG,br); + close(figure(23)); + end + end + end + + escludiTL = 0; + escludiIPL = 0; + % --- Piogge vs Max Spostamento Tilt Link --- + if sum(rRL) > 0 && sum(rTL) > 0 && exist('GI_Rain_RL','var') && exist('GI_Disp_TL','var') + if isempty(GI_Disp_TL) == 0 && isempty(GI_Rain_RL) == 0 + if titleCha == 0 + sezSITE = Heading1('Correlazioni fra i diversi sensori presenti in sito'); + sezSITE.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site.Title = sezSITE; + spazio = Paragraph(''); + add(Site,spazio); + if activeEN == 1 + sezSITE_ENG = Heading1('Correlations between different sensors installed on site'); + sezSITE_ENG.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site_ENG.Title = sezSITE_ENG; + spazio = Paragraph(''); + add(Site_ENG,spazio); + end + titleCha = 1; + end + sezGrafRLvsTL = Heading2('Correlazioni tra sensori - Rain Link vs Tilt Link V'); + sezGrafRLvsTL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoRLvsTL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra il sensore MEMS 3D '... + 'che ha registrato i maggiori spostamenti per ogni Array '... + 'presente in sito e le precipitazioni locali rilevate dal pluviometro.']); + add(Site,sezGrafRLvsTL); + add(Site,testoRLvsTL); + testoRLvsTL.HAlign = 'justify'; + figure(23) + GI_RainLink = bar(GI_Date_RL,GI_Rain_RL,75,'k'); + yyaxis left + ylabel('Precipitazioni [mm]'); + set(gca,'YColor','k') + yyaxis right + ylabel('Spostamento [mm]'); + set(gca,'YColor','k') + title('Correlazione piogge - spostamenti'); + xlabel('Data [gg/mm/aaaa]'); + strRL(1,1) = cellstr('Precipitazioni'); + legend(strRL,'Location','northwest'); + [~,colTL] = size(GI_Disp_TL); + num = 2; + hold on + grid on + index = []; + cmap = lines(colTL); + for t = 1:colTL + if GI_Date_TL(1,t) ~= 0 + ind_TL = find(GI_Date_TL(:,t)); + index = [index; t]; + GI_RainLink = plot(GI_Date_TL(1:ind_TL(end),t),GI_Disp_TL(1:ind_TL(end),t),'-','Color',cmap(t,:)); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,1) = cellstr('Precipitazioni'); + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_TL(1,t)) 'm']); + legend(str,'Location','northwest'); + num = num+1; + end + end + clear str + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-RLvsTL.png')); + saveas(GI_RainLink,TempName); + ChartRLvsTL = Image(TempName); + ChartRLvsTL.Style = {ScaleToFit}; + ChartRLvsTL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'tra i dati di precipitazione e spostamento registrati nel periodo temporale di riferimento']); + FIG = FIG+1; + ChartRLvsTL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = 'Gli spostamenti sono riferiti alle misure dei sensori riportati di seguito: '; + testoRLvsTL2 = Paragraph(text); + testoRLvsTL2.HAlign = 'justify'; + add(Site,testoRLvsTL2); + I = size(index); + for a = 1:I(1) + text = ['- Array ',char(chainID(index(a),4)),' - MEMS a ',num2str(abs(GI_Prof_TL(1,index(a)))),' m da P.C.']; + testoRLvsTL2 = Paragraph(text); + add(Site,testoRLvsTL2); + end + add(Site,ChartRLvsTL); + add(Site,ChartRLvsTL_cap); + add(Site,br); + close(figure(23)); + + % -- ENG -- + if activeEN == 1 + sezGrafRLvsTL_ENG = Heading2('Correlation between sensors - Rain Link vs Tilt Link V'); + sezGrafRLvsTL_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoRLvsTL = Paragraph(['The following graph aims to highlight the presence '... + 'of correlations between the maximum displacement measured by the MEMS 3D '... + 'sensors for each Array installed on site, and the local rainfall data recorded '... + 'by the rain gauge.']); + add(Site_ENG,sezGrafRLvsTL_ENG); + add(Site_ENG,testoRLvsTL); + testoRLvsTL.HAlign = 'justify'; + figure(24) + GI_RainLink = bar(GI_Date_RL,GI_Rain_RL,75,'k'); + yyaxis left + ylabel('Rainfall [mm]'); + set(gca,'YColor','k') + yyaxis right + ylabel('Displacement [mm]'); + set(gca,'YColor','k') + title('Correlation between rainfall and displacements'); + xlabel('Date [dd/mm/yyyy]'); + strRL(1,1) = cellstr('Rainfall'); + legend(strRL,'Location','northwest'); + [~,colTL] = size(GI_Disp_TL); + num = 2; + hold on + grid on + index = []; + cmap = lines(colTL); + for t = 1:colTL + if GI_Date_TL(1,t) ~= 0 + ind_TL = find(GI_Date_TL(:,t)); + index = [index; t]; + GI_RainLink = plot(GI_Date_TL(1:ind_TL(end),t),GI_Disp_TL(1:ind_TL(end),t),'-','Color',cmap(t,:)); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,1) = cellstr('Rainfall'); + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_TL(1,t)) 'm']); + legend(str,'Location','northwest'); + num = num+1; + end + end + clear str + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-RLvsTL_ENG.png')); + saveas(GI_RainLink,TempName); + ChartRLvsTL_ENG = Image(TempName); + ChartRLvsTL_ENG.Style = {ScaleToFit}; + ChartRLvsTL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between '... + 'rainfall and displacement data recorded during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartRLvsTL_ENG_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = 'The analyzed displacements refer to monitoring data recorded by the following sensors: '; + testoRLvsTL2 = Paragraph(text); + testoRLvsTL2.HAlign = 'justify'; + add(Site_ENG,testoRLvsTL2); + I = size(index); + for a = 1:I(1) + text = ['- Array ',char(chainID(index(a),4)),' - MEMS located ',num2str(abs(GI_Prof_TL(1,index(a)))),' m b.g.l.']; + testoRLvsTL2 = Paragraph(text); + add(Site_ENG,testoRLvsTL2); + end + add(Site_ENG,ChartRLvsTL_ENG); + add(Site_ENG,ChartRLvsTL_ENG_cap); + add(Site_ENG,br); + close(figure(24)); + end + escludiTL = 1; + end + end + % --- Piogge vs Max Spostamento In Place Link --- + if sum(rRL) > 0 && sum(rIPL) > 0 && exist('GI_Rain_RL','var') && exist('GI_Disp_IPL','var') + if isempty(GI_Disp_IPL) == 0 && isempty(GI_Rain_RL) == 0 + if titleCha == 0 + sezSITE = Heading1('Correlazioni fra i diversi sensori presenti in sito'); + sezSITE.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site.Title = sezSITE; + spazio = Paragraph(''); + add(Site,spazio); + if activeEN == 1 + sezSITE_ENG = Heading1('Correlations between different sensors installed on site'); + sezSITE_ENG.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site_ENG.Title = sezSITE_ENG; + spazio = Paragraph(''); + add(Site_ENG,spazio); + end + titleCha = 1; + end + sezGrafRLvsIPL = Heading2('Correlazioni tra sensori - Rain Link vs In Place Link'); + sezGrafRLvsIPL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoRLvsIPL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra il sensore MEMS 3D '... + 'che ha registrato i maggiori spostamenti per ogni Array '... + 'presente in sito e le precipitazioni locali rilevate dal pluviometro.']); + add(Site,sezGrafRLvsIPL); + add(Site,testoRLvsIPL); + testoRLvsIPL.HAlign = 'justify'; + figure(23) + GI_RainLink = bar(GI_Date_RL,GI_Rain_RL,75,'k'); + yyaxis left + ylabel('Precipitazioni [mm]'); + set(gca,'YColor','k') + yyaxis right + ylabel('Spostamento [mm]'); + set(gca,'YColor','k') + title('Correlazione piogge - spostamenti'); + xlabel('Data [gg/mm/aaaa]'); + strRL(1,1) = cellstr('Precipitazioni'); + legend(strRL,'Location','northwest'); + [~,colIPL] = size(GI_Disp_IPL); + num = 2; + hold on + grid on + index = []; + cmap = lines(colIPL); + for t = 1:colIPL + if GI_Date_IPL(1,t) ~= 0 + ind_IPL = find(GI_Date_IPL(:,t)); + index = [index; t]; + GI_RainLink = plot(GI_Date_IPL(1:ind_IPL(end),t),GI_Disp_IPL(1:ind_IPL(end),t),'-','Color',cmap(t,:)); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_IPL(1,t)) 'm']); + num = num+1; + end + end + leg = legend(str,'Location','northwest'); + clear str + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-RLvsIPL.png')); + saveas(GI_RainLink,TempName); + ChartRLvsIPL = Image(TempName); + ChartRLvsIPL.Style = {ScaleToFit}; + ChartRLvsIPL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'tra i dati di precipitazione e spostamento registrati nel periodo '... + 'temporale di riferimento']); + FIG = FIG+1; + ChartRLvsIPL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = 'Gli spostamenti sono riferiti alle misure dei sensori riportati di seguito: '; + testoRLvsIPL2 = Paragraph(text); + testoRLvsIPL2.HAlign = 'justify'; + add(Site,testoRLvsIPL2); + I = size(index); + for a = 1:I(1) + text = ['- Array ',char(chainID(index(a),4)),' - MEMS a ',num2str(abs(GI_Prof_IPL(1,index(a)))),' m da P.C.']; + testoRLvsIPL2 = Paragraph(text); + add(Site,testoRLvsIPL2); + end + add(Site,ChartRLvsIPL); + add(Site,ChartRLvsIPL_cap); + add(Site,br); + close(figure(23)); + + % -- ENG -- + if activeEN == 1 + sezGrafRLvsIPL_ENG = Heading2('Correlation between sensors - Rain Link vs In Place Link'); + sezGrafRLvsIPL_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoRLvsIPL = Paragraph(['The following graph aims to highlight the presence '... + 'of correlations between the maximum displacement measured by the MEMS 3D '... + 'sensors for each Array installed on site, and the local rainfall data recorded '... + 'by the rain gauge.']); + add(Site_ENG,sezGrafRLvsIPL_ENG); + add(Site_ENG,testoRLvsIPL); + testoRLvsIPL.HAlign = 'justify'; + figure(23) + GI_RainLink = bar(GI_Date_RL,GI_Rain_RL,75,'k'); + yyaxis left + ylabel('Rainfall [mm]'); + set(gca,'YColor','k') + yyaxis right + ylabel('Displacement [mm]'); + set(gca,'YColor','k') + title('Correlation between rainfall and displacements'); + xlabel('Date [dd/mm/yyyy]'); + strRL(1,1) = cellstr('Rainfall'); + legend(strRL,'Location','northwest'); + [~,colIPL] = size(GI_Disp_IPL); + num = 2; + hold on + grid on + index = []; + cmap = lines(colIPL); + for t = 1:colIPL + if GI_Date_IPL(1,t) ~= 0 + ind_IPL = find(GI_Date_IPL(:,t)); + index = [index; t]; + GI_RainLink = plot(GI_Date_IPL(1:ind_IPL(end),t),GI_Disp_IPL(1:ind_IPL(end),t),'-','Color',cmap(t,:)); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_IPL(1,t)) 'm']); + num = num+1; + end + end + leg = legend(str,'Location','northwest'); + clear str + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-RLvsIPL_ENG.png')); + saveas(GI_RainLink,TempName); + ChartRLvsIPL_ENG = Image(TempName); + ChartRLvsIPL_ENG.Style = {ScaleToFit}; + ChartRLvsIPL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between '... + 'rainfall and displacement data recorded during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartRLvsIPL_ENG_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = 'The analyzed displacements refer to monitoring data recorded by the following sensors: '; + testoRLvsIPL2 = Paragraph(text); + testoRLvsIPL2.HAlign = 'justify'; + add(Site_ENG,testoRLvsIPL2); + I = size(index); + for a = 1:I(1) + text = ['- Array ',char(chainID(index(a),4)),' - MEMS located ',num2str(abs(GI_Prof_IPL(1,index(a)))),' m b.g.l.']; + testoRLvsIPL2 = Paragraph(text); + add(Site_ENG,testoRLvsIPL2); + end + add(Site_ENG,ChartRLvsIPL_ENG); + add(Site_ENG,ChartRLvsIPL_ENG_cap); + add(Site_ENG,br); + close(figure(23)); + end + escludiIPL = 1; + end + end + % --- Spostamenti Tilt Link o In Place Link - clinometri - fessurimetri --- + if sum(rTL) > 0 && exist('GI_Disp_TL','var') && sum(rKL) > 0 && exist('GI_Angolo_KL','var') || ... + sum(rIPL) > 0 && exist('GI_Disp_IPL','var') && sum(rKL) > 0 && exist('GI_Angolo_KL','var') || ... + sum(rTL) > 0 && exist('GI_Disp_TL','var') && sum(rCrL) > 0 && exist('GI_Disp_CrL','var') || ... + sum(rIPL) > 0 && exist('GI_Disp_IPL','var') && sum(rCrL) > 0 && exist('GI_Disp_CrL','var') || ... + sum(rCrL) > 0 && exist('GI_Disp_CrL','var') && sum(rKL) > 0 && exist('GI_Angolo_KL','var') + if isempty(GI_Disp_TL) == 0 && isempty(GI_Angolo_KL) == 0 || ... + isempty(GI_Disp_IPL) == 0 && isempty(GI_Angolo_KL) == 0 || ... + isempty(GI_Disp_TL) == 0 && isempty(GI_Disp_CrL) == 0 || ... + isempty(GI_Disp_IPL) == 0 && isempty(GI_Disp_CrL) == 0 || ... + isempty(GI_Disp_CrL) == 0 && isempty(GI_Angolo_KL) == 0 + figure(25) + hold on + grid on + if sum(rTL) > 0 && sum(rKL) > 0 && sum(rCrL) > 0 % Ci sono Tilt + Klino + Crack + sezGrafTLvsKL = Heading2('Correlazioni tra sensori Tilt Link V, Klino Link e Crack Link'); + testoTLvsKL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra '... + 'i maggiori spostamenti differenziali registrati per ogni Array dai sensori MEMS 3D, '... + 'la massima inclinazione differenziale lungo gli assi strumentali registrata '... + 'dai clinometri e la maggior apertura o chiusura rilevata dai fessurimetri presenti in sito.']); + title('Valori massimi dei sensori Tilt, Klino e Crack Link'); + ChartTLvsKL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'tra i dati differenziali massimi di spostamento, inclinazione ed apertura '... + 'o chiusura di fessure registrati rispettivamente dai sensori inclinometrici, '... + 'clinometrici e fessurimetri di ogni singolo Array, nel periodo temporale di riferimento']); + elseif sum(rIPL) > 0 && sum(rKL) > 0 && sum(rCrL) > 0 % Ci sono In Place + Klino + Crack + sezGrafTLvsKL = Heading2('Correlazioni tra sensori In Place Link, Klino Link e Crack Link'); + testoTLvsKL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra '... + 'i maggiori spostamenti differenziali registrati per ogni Array dai sensori MEMS 3D, '... + 'la massima inclinazione differenziale lungo gli assi strumentali registrata '... + 'dai clinometri e la maggior apertura o chiusura rilevata dai fessurimetri presenti in sito.']); + title('Valori massimi dei sensori In Place, Klino e Crack Link'); + ChartTLvsKL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'tra i dati differenziali massimi di spostamento, inclinazione ed apertura '... + 'o chiusura di fessure registrati rispettivamente dai sensori inclinometrici, '... + 'clinometrici e fessurimetri di ogni singolo Array, nel periodo temporale di riferimento']); + elseif sum(rTL) > 0 && sum(rKL) > 0 % Tilt + Klino + sezGrafTLvsKL = Heading2('Correlazioni tra sensori Tilt Link V e Klino Link'); + testoTLvsKL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra '... + 'i maggiori spostamenti differenziali registrati per ogni Array dai sensori MEMS 3D '... + 'e la massima inclinazione differenziale lungo gli assi strumentali registrata '... + 'dai clinometri presenti in sito.']); + title('Valori massimi dei sensori Tilt e Klino Link'); + ChartTLvsKL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'tra i dati differenziali massimi di spostamento e di inclinazione '... + 'registrati rispettivamente dai sensori inclinometrici e '... + 'clinometrici di ogni singolo Array, nel periodo temporale di riferimento']); + elseif sum(rIPL) > 0 && sum(rKL) > 0 % In Place + Klino + sezGrafTLvsKL = Heading2('Correlazioni tra sensori In Place Link e Klino Link'); + testoTLvsKL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra '... + 'i maggiori spostamenti differenziali registrati per ogni Array dai sensori MEMS 3D '... + 'e la massima inclinazione differenziale lungo gli assi strumentali registrata '... + 'dai clinometri presenti in sito.']); + title('Valori massimi dei sensori In Place e Klino Link'); + ChartTLvsKL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'tra i dati differenziali massimi di spostamento e di inclinazione '... + 'registrati rispettivamente dai sensori inclinometrici e '... + 'clinometrici di ogni singolo Array, nel periodo temporale di riferimento']); + elseif sum(rTL) > 0 && sum(rCrL) > 0 % Tilt e Crack + sezGrafTLvsKL = Heading2('Correlazioni tra sensori Tilt Link V e Crack Link'); + testoTLvsKL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra '... + 'i maggiori spostamenti differenziali registrati per ogni Array dai sensori MEMS 3D '... + 'e la maggior apertura o chiusura rilevata dai fessurimetri presenti in sito.']); + title('Valori massimi dei sensori Tilt e Crack Link'); + ChartTLvsKL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'tra i dati differenziali massimi di spostamento ed apertura '... + 'o chiusura di fessure registrati rispettivamente dai sensori inclinometrici '... + 'e fessurimetri di ogni singolo Array, nel periodo temporale di riferimento']); + elseif sum(rIPL) > 0 && sum(rCrL) > 0 % In Place e Crack + sezGrafTLvsKL = Heading2('Correlazioni tra sensori In Place Link e Crack Link'); + testoTLvsKL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra '... + 'i maggiori spostamenti differenziali registrati per ogni Array dai sensori MEMS 3D '... + 'e la maggior apertura o chiusura rilevata dai fessurimetri presenti in sito.']); + title('Valori massimi dei sensori Tilt e Crack Link'); + ChartTLvsKL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'tra i dati differenziali massimi di spostamento ed apertura '... + 'o chiusura di fessure registrati rispettivamente dai sensori inclinometrici '... + 'e fessurimetri di ogni singolo Array, nel periodo temporale di riferimento']); + elseif sum(rKL) > 0 && sum(rCrL) > 0 + sezGrafTLvsKL = Heading2('Correlazioni tra sensori Klino Link e Crack Link'); + testoTLvsKL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra '... + 'la massima inclinazione differenziale rilevata lungo gli assi strumentali '... + 'dei clinometri e la maggior apertura o chiusura rilevata dai fessurimetri presenti in sito.']); + title('Valori massimi dei sensori Klino e Crack Link'); + ChartTLvsKL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'tra i dati differenziali massimi di inclinazione ed apertura '... + 'o chiusura di fessure registrati rispettivamente dai sensori '... + 'clinometrici e fessurimetri di ogni singolo Array, nel periodo temporale di riferimento']); + end + sezGrafTLvsKL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoTLvsKL.HAlign = 'justify'; + + yyaxis left + ylabel('Spostamento [mm]'); + set(gca,'YColor','k') + yyaxis right + ylabel(['Inclinazione [' char(176) ']']); + set(gca,'YColor','k') + xlabel('Data [gg/mm/aaaa]'); + [~,colTL] = size(GI_Disp_TL); + [~,colIPL] = size(GI_Disp_IPL); + [~,colKL] = size(GI_Date_KL); + [~,colCrL] = size(GI_Date_CrL); + num = 1; + cmap = lines(2*colKL+colTL+colIPL+colCrL); + cont = 1; + % Tilt Link V + indexTL = []; + if sum(rTL) > 0 + yyaxis left + for t = 1:colTL + if GI_Date_TL(1,t) ~= 0 + ind_TL = find(GI_Date_TL(:,t)); + indexTL = [indexTL; t]; + plot(GI_Date_TL(1:ind_TL(end),t),GI_Disp_TL(1:ind_TL(end),t),'-','Color',cmap(cont,:)); + cont = cont+1; + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_TL(1,t)) ' m']); + num = num+1; + end + end + MIN(1) = min(min(GI_Disp_TL)); + MAX(1) = max(max(GI_Disp_TL)); + end + % In Place Link + indexIPL = []; + if sum(rIPL) > 0 + yyaxis left + for t = 1:colIPL + if GI_Date_IPL(1,t) ~= 0 + ind_IPL = find(GI_Date_IPL(:,t)); + indexIPL = [indexIPL; t]; + plot(GI_Date_IPL(1:ind_IPL(end),t),GI_Disp_IPL(1:ind_IPL(end),t),'-','Color',cmap(cont,:)); + cont = cont+1; + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_IPL(1,t)) ' m']); + num = num+1; + end + end + MIN(2) = min(min(GI_Disp_IPL)); + MAX(2) = max(max(GI_Disp_IPL)); + end + % Crack Link + indexCrL = []; + if sum(rCrL) > 0 + yyaxis left + for c = 1:colCrL + if GI_Date_CrL(1,c) ~= 0 + var = GI_Disp_CrL-GI_Disp_CrL(1,:); + ind_CrL = find(GI_Date_CrL(:,c)); + indexCrL = [indexCrL; c]; + if sum(rKL) > 0 + plot(GI_Date_CrL(1:ind_CrL(end),c),var(1:ind_CrL(end),c),'-','Color',cmap(cont,:)); + else + GI_KlinoLink = plot(GI_Date_CrL(1:ind_CrL(end),c),var(1:ind_CrL(end),c),'-','Color',cmap(cont,:)); + end + cont = cont+1; + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(c,4)) ' nodo ' num2str(GI_Num_CrL(1,c))]); + num = num+1; + end + end + MIN(3) = min(min(var)); + MAX(3) = max(max(var)); + ylim([floor(min(min(MIN))) ceil(max(max(MAX)))]); + end + + % Klino Link + indexKL = []; + if sum(rKL) > 0 + yyaxis right + kk = 1; + for k = 1:colKL + if GI_Date_KL(1,k) ~= 0 + ind_KL = find(GI_Date_KL(:,k)); + indexKL = [indexKL; k]; + plot(GI_Date_KL(1:ind_KL(end),k),GI_Angolo_KL(1:ind_KL(end),kk)... + -GI_Angolo_KL(1,kk),'-','Color',cmap(cont,:)); + GI_KlinoLink = plot(GI_Date_KL(1:ind_KL(end),k),GI_Angolo_KL(1:ind_KL(end)... + ,kk+1)-GI_Angolo_KL(1,kk+1),'-','Color',cmap(cont+1,:)); + cont = cont+2; + kk = kk+2; + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(k,4)) ' nodo ' num2str(GI_Num_KL(1,k)) ' asse X']); + str(1,num+1) = cellstr([char(chainID(k,4)) ' nodo ' num2str(GI_Num_KL(1,k)) ' asse Y']); + num = num+2; + end + end + yyaxis right + ylim([floor(min(min(GI_Angolo_KL))) ceil(max(max(GI_Angolo_KL)))]); + end + + numcolumns = 1; + [legend_h,object_h,plot_h,text_strings] = columnlegend(numcolumns,str,'Location','NorthWest'); + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-TLvsKL.png')); + if titleCha == 0 + sezSITE = Heading1('Correlazioni fra i diversi sensori presenti in sito'); + sezSITE.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site.Title = sezSITE; + spazio = Paragraph(''); + add(Site,spazio); + if activeEN == 1 + sezSITE_ENG = Heading1('Correlations between different sensors installed on site'); + sezSITE_ENG.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site_ENG.Title = sezSITE_ENG; + spazio = Paragraph(''); + add(Site_ENG,spazio); + end + titleCha = 1; + end + add(Site,sezGrafTLvsKL); + add(Site,testoTLvsKL); + saveas(GI_KlinoLink,TempName); + ChartTLvsKL = Image(TempName); + ChartTLvsKL.Style = {ScaleToFit}; + + FIG = FIG+1; + ChartTLvsKL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = 'I dati sono riferiti alle misure dei sensori riportati di seguito: '; + testoTL2 = Paragraph(text); + testoTL2.HAlign = 'justify'; + add(Site,testoTL2); + % Tilt Link + I = size(indexTL); + for a = 1:I(1) + text = ['- Array ',char(chainID(indexTL(a),4)),' - MEMS a ',num2str(abs(GI_Prof_TL(1,indexTL(a)))),' m da P.C.']; + testoTL2 = Paragraph(text); + add(Site,testoTL2); + end + % In Place Link + I = size(indexIPL); + for a = 1:I(1) + text = ['- Array ',char(chainID(indexIPL(a),4)),' - MEMS a ',num2str(abs(GI_Prof_IPL(1,indexIPL(a)))),' m da P.C.']; + testoTL2 = Paragraph(text); + add(Site,testoTL2); + end + % Klino Link + I = size(indexKL); + for a = 1:I(1) + text = ['- Array ',char(chainID(indexKL(a),4)),' - Clinometro numero ',num2str(GI_Num_KL(1,indexKL(a)))]; + testoTL2 = Paragraph(text); + add(Site,testoTL2); + end + % Crack Link + I = size(indexCrL); + for a = 1:I(1) + text = ['- Array ',char(chainID(indexCrL(a),4)),' - Fessurimetro numero ',num2str(GI_Num_CrL(1,indexCrL(a)))]; + testoTL2 = Paragraph(text); + add(Site,testoTL2); + end + add(Site,ChartTLvsKL); + add(Site,ChartTLvsKL_cap); + add(Site,br); + close(figure(25)); + + % --- ENG --- + if activeEN == 1 + figure(35) + hold on + grid on + if sum(rTL) > 0 && sum(rKL) > 0 && sum(rCrL) > 0 % Ci sono Tilt + Klino + Crack + sezGrafTLvsKL_ENG = Heading2('Correlation between sensors: Tilt Link V, Klino Link, and Crack Link'); + testoTLvsKL = Paragraph(['The following graph has the objective to '... + 'highlight the presence of correlations between '... + 'the maximum differential displacements recorded for each Array by 3D MEMS sensors, '... + 'the maximum differential tilt recorded by tilt meters along the instrumental axes, '... + 'and the maximum crack opening variation measured by crack meters installed on site.']); + title('Maximum values recorded by Tilt, Klino, and Crack Links'); + ChartTLvsKL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between '... + 'maximum differential displacements, tilt, and crack opening data'... + 'recorded during the reference time period respectively by '... + 'Tilt Link, Klino Link, and Crack Link sensors integrated in each single Array']); + elseif sum(rIPL) > 0 && sum(rKL) > 0 && sum(rCrL) > 0 % Ci sono In Place + Klino + Crack + sezGrafTLvsKL_ENG = Heading2('Correlation between sensors: In Place Link, Klino Link, and Crack Link'); + testoTLvsKL = Paragraph(['The following graph has the objective to '... + 'highlight the presence of correlations between '... + 'the maximum differential displacements recorded for each Array by 3D MEMS sensors, '... + 'the maximum differential tilt recorded by tilt meters along the instrumental axes, '... + 'and the maximum crack opening variation measured by crack meters installed on site.']); + title('Maximum values recorded by In Place, Klino, and Crack Links'); + ChartTLvsKL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between '... + 'maximum differential displacements, tilt, and crack opening data'... + 'recorded during the reference time period respectively by '... + 'In Place Link, Klino Link, and Crack Link sensors integrated in each single Array']); + elseif sum(rTL) > 0 && sum(rKL) > 0 % Tilt + Klino + sezGrafTLvsKL_ENG = Heading2('Correlation between sensors: Tilt Link V and Klino Link'); + testoTLvsKL = Paragraph(['The following graph has the objective to '... + 'highlight the presence of correlations between '... + 'the maximum differential displacements recorded for each Array by 3D MEMS sensors, and '... + 'the maximum differential tilt recorded along the instrumental axes by the tilt meters '... + 'installed on site.']); + title('Maximum values recorded by Tilt Link and Klino Link'); + ChartTLvsKL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between '... + 'maximum differential displacements and tilt data'... + 'recorded during the reference time period respectively by '... + 'Tilt Link and Klino Link sensors integrated in each single Array']); + elseif sum(rIPL) > 0 && sum(rKL) > 0 % In Place + Klino + sezGrafTLvsKL_ENG = Heading2('Correlation between sensors: In Place Link and Klino Link'); + testoTLvsKL = Paragraph(['The following graph has the objective to '... + 'highlight the presence of correlations between '... + 'the maximum differential displacements recorded for each Array by 3D MEMS sensors, and '... + 'the maximum differential tilt recorded along the instrumental axes by the tilt meters '... + 'installed on site.']); + title('Maximum values recorded by In Place Link and Klino Link'); + ChartTLvsKL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between '... + 'maximum differential displacements and tilt data'... + 'recorded during the reference time period respectively by '... + 'In Place Link and Klino Link sensors integrated in each single Array']); + elseif sum(rTL) > 0 && sum(rCrL) > 0 % Tilt e Crack + sezGrafTLvsKL_ENG = Heading2('Correlation between sensors: Tilt Link V and Crack Link'); + testoTLvsKL = Paragraph(['The following graph has the objective to '... + 'highlight the presence of correlations between '... + 'the maximum differential displacements recorded for each Array by 3D MEMS sensors, '... + 'and the maximum crack opening variation measured by crack meters installed on site.']); + title('Maximum values recorded by Tilt and Crack Links'); + ChartTLvsKL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between '... + 'maximum differential displacements and crack opening data'... + 'recorded during the reference time period respectively by '... + 'Tilt Link and Crack Link sensors integrated in each single Array']); + elseif sum(rIPL) > 0 && sum(rCrL) > 0 % In Place e Crack + sezGrafTLvsKL_ENG = Heading2('Correlation between sensors: In Place and Crack Link'); + testoTLvsKL = Paragraph(['The following graph has the objective to '... + 'highlight the presence of correlations between '... + 'the maximum differential displacements recorded for each Array by 3D MEMS sensors, '... + 'and the maximum crack opening variation measured by crack meters installed on site.']); + title('Maximum values recorded by In Place and Crack Links'); + ChartTLvsKL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between '... + 'maximum differential displacements and crack opening data'... + 'recorded during the reference time period respectively by '... + 'In Place Link and Crack Link sensors integrated in each single Array']); + elseif sum(rKL) > 0 && sum(rCrL) > 0 + sezGrafTLvsKL_ENG = Heading2('Correlation between sensors: Klino Link and Crack Link'); + testoTLvsKL = Paragraph(['The following graph has the objective to '... + 'highlight the presence of correlations between '... + 'the maximum differential tilt recorded by tilt meters along the instrumental axes '... + 'and the maximum crack opening variation measured by crack meters installed on site.']); + title('Maximum values recorded by Klino and Crack Links'); + ChartTLvsKL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between '... + 'tilt and crack opening data'... + 'recorded during the reference time period respectively by '... + 'Klino Link and Crack Link sensors integrated in each single Array']); + end + sezGrafTLvsKL_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoTLvsKL.HAlign = 'justify'; + + yyaxis left + ylabel('Displacement [mm]'); + set(gca,'YColor','k') + yyaxis right + ylabel(['Tilt [' char(176) ']']); + set(gca,'YColor','k') + xlabel('Date [dd/mm/yyyy]'); + [~,colTL] = size(GI_Disp_TL); + [~,colIPL] = size(GI_Disp_IPL); + [~,colKL] = size(GI_Date_KL); + [~,colCrL] = size(GI_Date_CrL); + num = 1; + cmap = lines(2*colKL+colTL+colIPL+colCrL); + cont = 1; + % Tilt Link V + indexTL = []; + if sum(rTL) > 0 + yyaxis left + for t = 1:colTL + if GI_Date_TL(1,t) ~= 0 + ind_TL = find(GI_Date_TL(:,t)); + indexTL = [indexTL; t]; + plot(GI_Date_TL(1:ind_TL(end),t),GI_Disp_TL(1:ind_TL(end),t),'-','Color',cmap(cont,:)); + cont = cont+1; + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_TL(1,t)) ' m']); + num = num+1; + end + end + MIN(1) = min(min(GI_Disp_TL)); + MAX(1) = max(max(GI_Disp_TL)); + end + % In Place Link + indexIPL = []; + if sum(rIPL) > 0 + yyaxis left + for t = 1:colIPL + if GI_Date_IPL(1,t) ~= 0 + ind_IPL = find(GI_Date_IPL(:,t)); + indexIPL = [indexIPL; t]; + plot(GI_Date_IPL(1:ind_IPL(end),t),GI_Disp_IPL(1:ind_IPL(end),t),'-','Color',cmap(cont,:)); + cont = cont+1; + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_IPL(1,t)) ' m']); + num = num+1; + end + end + MIN(2) = min(min(GI_Disp_IPL)); + MAX(2) = max(max(GI_Disp_IPL)); + end + % Crack Link + indexCrL = []; + if sum(rCrL) > 0 + yyaxis left + for c = 1:colCrL + if GI_Date_CrL(1,c) ~= 0 + var = GI_Disp_CrL-GI_Disp_CrL(1,:); + ind_CrL = find(GI_Date_CrL(:,c)); + indexCrL = [indexCrL; c]; + if sum(rKL) > 0 + plot(GI_Date_CrL(1:ind_CrL(end),c),var(1:ind_CrL(end),c),'-','Color',cmap(cont,:)); + else + GI_KlinoLink = plot(GI_Date_CrL(1:ind_CrL(end),c),var(1:ind_CrL(end),c),'-','Color',cmap(cont,:)); + end + cont = cont+1; + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(c,4)) ' node ' num2str(GI_Num_CrL(1,c))]); + num = num+1; + end + end + MIN(3) = min(min(var)); + MAX(3) = max(max(var)); + ylim([floor(min(min(MIN))) ceil(max(max(MAX)))]); + end + + % Klino Link + indexKL = []; + if sum(rKL) > 0 + yyaxis right + kk = 1; + for k = 1:colKL + if GI_Date_KL(1,k) ~= 0 + ind_KL = find(GI_Date_KL(:,k)); + indexKL = [indexKL; k]; + plot(GI_Date_KL(1:ind_KL(end),k),GI_Angolo_KL(1:ind_KL(end),kk)... + -GI_Angolo_KL(1,kk),'-','Color',cmap(cont,:)); + GI_KlinoLink = plot(GI_Date_KL(1:ind_KL(end),k),GI_Angolo_KL(1:ind_KL(end)... + ,kk+1)-GI_Angolo_KL(1,kk+1),'-','Color',cmap(cont+1,:)); + cont = cont+2; + kk = kk+2; + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(1,num) = cellstr([char(chainID(k,4)) ' node ' num2str(GI_Num_KL(1,k)) ' - X axis']); + str(1,num+1) = cellstr([char(chainID(k,4)) ' node ' num2str(GI_Num_KL(1,k)) ' - Y axis']); + num = num+2; + end + end + yyaxis right + ylim([floor(min(min(GI_Angolo_KL))) ceil(max(max(GI_Angolo_KL)))]); + end + + numcolumns = 1; + [legend_h,object_h,plot_h,text_strings] = columnlegend(numcolumns,str,'Location','NorthWest'); + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-TLvsKL_ENG.png')); + + add(Site_ENG,sezGrafTLvsKL_ENG); + add(Site_ENG,testoTLvsKL); + saveas(GI_KlinoLink,TempName); + ChartTLvsKL_ENG = Image(TempName); + ChartTLvsKL_ENG.Style = {ScaleToFit}; + + FIG_ENG = FIG_ENG+1; + ChartTLvsKL_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = 'Monitoring data refer to the sensors listed below: '; + testoTL2 = Paragraph(text); + testoTL2.HAlign = 'justify'; + add(Site_ENG,testoTL2); + % Tilt Link + I = size(indexTL); + for a = 1:I(1) + text = ['- Array ',char(chainID(indexTL(a),4)),' - MEMS located ',num2str(abs(GI_Prof_TL(1,indexTL(a)))),' m b.g.l.']; + testoTL2 = Paragraph(text); + add(Site_ENG,testoTL2); + end + % In Place Link + I = size(indexIPL); + for a = 1:I(1) + text = ['- Array ',char(chainID(indexIPL(a),4)),' - MEMS located ',num2str(abs(GI_Prof_IPL(1,indexIPL(a)))),' m b.g.l.']; + testoTL2 = Paragraph(text); + add(Site_ENG,testoTL2); + end + % Klino Link + I = size(indexKL); + for a = 1:I(1) + text = ['- Array ',char(chainID(indexKL(a),4)),' - Tilt meter ',num2str(GI_Num_KL(1,indexKL(a)))]; + testoTL2 = Paragraph(text); + add(Site_ENG,testoTL2); + end + % Crack Link + I = size(indexCrL); + for a = 1:I(1) + text = ['- Array ',char(chainID(indexCrL(a),4)),' - Crack meter ',num2str(GI_Num_CrL(1,indexCrL(a)))]; + testoTL2 = Paragraph(text); + add(Site_ENG,testoTL2); + end + add(Site_ENG,ChartTLvsKL_ENG); + add(Site_ENG,ChartTLvsKL_ENG_cap); + add(Site_ENG,br); + close(figure(35)); + end + end + escludiTL = 1; + end + + % --- Spostamenti a confronto --- + % ---> Tilt Link + if sum(rTL) > 0 && exist('GI_Disp_TL','var') + if isempty(GI_Disp_TL) == 0 + if escludiTL == 0 + sezGrafTL = Heading2('Correlazioni tra sensori Tilt Link V'); + sezGrafTL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoTL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra '... + 'i maggiori spostamenti registrati per ogni Array dai sensori MEMS 3D '... + 'presenti in sito.']); + testoTL.HAlign = 'justify'; + figure(24) + ylabel('Spostamento [mm]'); + set(gca,'YColor','k') + title('Correlazione fra gli spostamenti massimi di ogni Array'); + xlabel('Data [gg/mm/aaaa]'); + [~,colTL] = size(GI_Disp_TL); + num = 1; + index = []; + for t = 1:colTL + if GI_Date_TL(1,t) ~= 0 + ind_TL = find(GI_Date_TL(:,t)); + index = [index; t]; + hold on + grid on + GI_TiltLink = plot(GI_Date_TL(1:ind_TL(end),t),GI_Disp_TL(1:ind_TL(end),t)); + h = gca; + h.XAxis.MinorTick = 'on'; + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_TL(1,t)) ' m']); + num = num+1; + end + end + Max = max(GI_Disp_TL(1:ind_TL(end),:)); + MAX = max(Max); + if MAX < 10 % mm + ylim([0 10]); + end + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + legend(str,'Location','northwest'); + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-TL.png')); + if num >= 3 + if titleCha == 0 + sezSITE = Heading1('Correlazioni fra i diversi sensori presenti in sito'); + sezSITE.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site.Title = sezSITE; + spazio = Paragraph(''); + add(Site,spazio); + if activeEN == 1 + sezSITE_ENG = Heading1('Correlations between different sensors installed on site'); + sezSITE_ENG.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site_ENG.Title = sezSITE_ENG; + spazio = Paragraph(''); + add(Site_ENG,spazio); + end + titleCha = 1; + end + add(Site,sezGrafTL); + add(Site,testoTL); + saveas(GI_TiltLink,TempName); + ChartTL = Image(TempName); + ChartTL.Style = {ScaleToFit}; + ChartTL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'tra i dati massimi di spostamento registrati da ogni singolo Array nel periodo temporale di riferimento']); + FIG = FIG+1; + ChartTL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = 'Gli spostamenti sono riferiti alle misure dei sensori riportati di seguito: '; + testoTL2 = Paragraph(text); + testoTL2.HAlign = 'justify'; + add(Site,testoTL2); + I = size(index); + for a = 1:I(1) + text = ['- Array ',char(chainID(index(a),4)),' - MEMS a ',num2str(abs(GI_Prof_TL(1,index(a)))),' m da P.C.']; + testoTL2 = Paragraph(text); + add(Site,testoTL2); + end + add(Site,ChartTL); + add(Site,ChartTL_cap); + add(Site,br); + end + close(figure(24)); + + % -- ENG -- + if activeEN == 1 + sezGrafTL_ENG = Heading2('Correlation between Tilt Link V sensors'); + sezGrafTL_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoTL = Paragraph(['The following graph aims to highlight the presence '... + 'of correlations between the most relevant displacements recorded by '... + '3D MEMS sensors for each single Array installed on site.']); + testoTL.HAlign = 'justify'; + figure(34) + ylabel('Displacement [mm]'); + set(gca,'YColor','k') + title('Correlation between maximum displacements recorded by each Array'); + xlabel('Date [dd/mm/yyyy]'); + [~,colTL] = size(GI_Disp_TL); + num = 1; + index = []; + for t = 1:colTL + if GI_Date_TL(1,t) ~= 0 + ind_TL = find(GI_Date_TL(:,t)); + index = [index; t]; + hold on + grid on + GI_TiltLink = plot(GI_Date_TL(1:ind_TL(end),t),GI_Disp_TL(1:ind_TL(end),t)); + h = gca; + h.XAxis.MinorTick = 'on'; + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_TL(1,t)) ' m']); + num = num+1; + end + end + Max = max(GI_Disp_TL(1:ind_TL(end),:)); + MAX = max(Max); + if MAX < 10 % mm + ylim([0 10]); + end + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + legend(str,'Location','northwest'); + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-TL_ENG.png')); + if num >= 3 + add(Site_ENG,sezGrafTL_ENG); + add(Site_ENG,testoTL); + saveas(GI_TiltLink,TempName); + ChartTL_ENG = Image(TempName); + ChartTL_ENG.Style = {ScaleToFit}; + ChartTL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between maximum '... + 'displacement data recorded by each Array during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartTL_ENG_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = 'Displacement data refers to the 3D MEMS sensors listed below: '; + testoTL2 = Paragraph(text); + testoTL2.HAlign = 'justify'; + add(Site_ENG,testoTL2); + I = size(index); + for a = 1:I(1) + text = ['- Array ',char(chainID(index(a),4)),' - MEMS located ',num2str(abs(GI_Prof_TL(1,index(a)))),' m b.g.l.']; + testoTL2 = Paragraph(text); + add(Site_ENG,testoTL2); + end + add(Site_ENG,ChartTL_ENG); + add(Site_ENG,ChartTL_ENG_cap); + add(Site_ENG,br); + end + close(figure(34)); + end + end + end + end + % ---> In Place Link + if sum(rIPL) > 0 && exist('GI_Disp_IPL','var') + if isempty(GI_Disp_IPL) == 0 + if escludiIPL == 0 + sezGrafIPL = Heading2('Correlazioni tra sensori In Place Link'); + sezGrafIPL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoIPL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra '... + 'i maggiori spostamenti registrati per ogni Array dai sensori MEMS 3D '... + 'presenti in sito.']); + testoIPL.HAlign = 'justify'; + figure(24) + ylabel('Spostamento [mm]'); + set(gca,'YColor','k') + title('Correlazione fra gli spostamenti massimi di ogni Array'); + xlabel('Data [gg/mm/aaaa]'); + [~,colIPL] = size(GI_Disp_IPL); + num = 1; + index = []; + for t = 1:colIPL + if GI_Date_IPL(1,t) ~= 0 + ind_IPL = find(GI_Date_IPL(:,t)); + index = [index; t]; + hold on + grid on + GI_InPlaceLink = plot(GI_Date_IPL(1:ind_IPL(end),t),GI_Disp_IPL(1:ind_IPL(end),t)); + h = gca; + h.XAxis.MinorTick = 'on'; + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_IPL(1,t)) ' m']); + num = num+1; + end + end + Max = max(GI_Disp_IPL(1:ind_IPL(end),:)); + MAX = max(Max); + if MAX < 10 % mm + ylim([0 10]); + end + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + legend(str,'Location','northwest'); + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-IPL.png')); + if num >= 3 + if titleCha == 0 + sezSITE = Heading1('Correlazioni fra i diversi sensori presenti in sito'); + sezSITE.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site.Title = sezSITE; + spazio = Paragraph(''); + add(Site,spazio); + if activeEN == 1 + sezSITE_ENG = Heading1('Correlations between different sensors installed on site'); + sezSITE_ENG.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site_ENG.Title = sezSITE_ENG; + spazio = Paragraph(''); + add(Site_ENG,spazio); + end + titleCha = 1; + end + add(Site,sezGrafIPL); + add(Site,testoIPL); + saveas(GI_InPlaceLink,TempName); + ChartIPL = Image(TempName); + ChartIPL.Style = {ScaleToFit}; + ChartIPL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'tra i dati massimi di spostamento registrati da ogni '... + 'singolo Array nel periodo temporale di riferimento']); + FIG = FIG+1; + ChartIPL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = 'Gli spostamenti sono riferiti alle misure dei sensori riportati di seguito: '; + testoIPL2 = Paragraph(text); + testoIPL2.HAlign = 'justify'; + add(Site,testoIPL2); + I = size(index); + for a = 1:I(1) + text = ['- Array ',char(chainID(index(a),4)),' - MEMS a ',num2str(abs(GI_Prof_IPL(1,index(a)))),' m da P.C.']; + testoIPL2 = Paragraph(text); + add(Site,testoIPL2); + end + add(Site,ChartIPL); + add(Site,ChartIPL_cap); + add(Site,br); + end + close(figure(24)); + + % --- ENG --- + if activeEN == 1 + sezGrafIPL_ENG = Heading2('Correlation between Tilt Link V sensors'); + sezGrafIPL_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoIPL = Paragraph(['The following graph aims to highlight the presence '... + 'of correlations between the most relevant displacements recorded by '... + '3D MEMS sensors for each single Array installed on site.']); + testoIPL.HAlign = 'justify'; + figure(34) + ylabel('Displacement [mm]'); + set(gca,'YColor','k') + title('Correlation between maximum displacements recorded by each Array'); + xlabel('Date [dd/mm/yyyy]'); + [~,colIPL] = size(GI_Disp_IPL); + num = 1; + index = []; + for t = 1:colIPL + if GI_Date_IPL(1,t) ~= 0 + ind_IPL = find(GI_Date_IPL(:,t)); + index = [index; t]; + hold on + grid on + GI_InPlaceLink = plot(GI_Date_IPL(1:ind_IPL(end),t),GI_Disp_IPL(1:ind_IPL(end),t)); + h = gca; + h.XAxis.MinorTick = 'on'; + str(1,num) = cellstr([char(chainID(t,4)) ' ' num2str(GI_Prof_IPL(1,t)) ' m']); + num = num+1; + end + end + Max = max(GI_Disp_IPL(1:ind_IPL(end),:)); + MAX = max(Max); + if MAX < 10 % mm + ylim([0 10]); + end + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + legend(str,'Location','northwest'); + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-IPL_ENG.png')); + if num >= 3 + add(Site_ENG,sezGrafIPL_ENG); + add(Site_ENG,testoIPL); + saveas(GI_InPlaceLink,TempName); + ChartIPL_ENG = Image(TempName); + ChartIPL_ENG.Style = {ScaleToFit}; + ChartIPL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between maximum '... + 'displacement data recorded by each Array during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartIPL_ENG_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + text = 'Displacement data refers to the 3D MEMS sensors listed below: '; + testoIPL2 = Paragraph(text); + testoIPL2.HAlign = 'justify'; + add(Site_ENG,testoIPL2); + I = size(index); + for a = 1:I(1) + text = ['- Array ',char(chainID(index(a),4)),' - MEMS located ',num2str(abs(GI_Prof_IPL(1,index(a)))),' m b.g.l.']; + testoIPL2 = Paragraph(text); + add(Site_ENG,testoIPL2); + end + add(Site_ENG,ChartIPL_ENG); + add(Site_ENG,ChartIPL_ENG_cap); + add(Site_ENG,br); + end + close(figure(34)); + end + end + end + end + %---> Quadranti Tunnel Link + if sum(rTuL) > 0 && exist('GI_Q1_TuL','var') + if isempty(GI_Q1_TuL) == 0 && isempty(GI_Q2_TuL) == 0 && isempty(GI_Q3_TuL) == 0 ... + && isempty(GI_Q4_TuL) == 0 + if titleCha == 0 + sezSITE = Heading1('Correlazioni fra i diversi sensori presenti in sito'); + sezSITE.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site.Title = sezSITE; + spazio = Paragraph(''); + add(Site,spazio); + if activeEN == 1 + sezSITE_ENG = Heading1('Correlations between different sensors installed on site'); + sezSITE_ENG.Style = {OuterMargin('0in','0in','0in','0in'),FontSize(Font_Chapter),HAlign('justify')}; + Site_ENG.Title = sezSITE_ENG; + spazio = Paragraph(''); + add(Site_ENG,spazio); + end + titleCha = 1; + end + sezGrafTuL = Heading2('Correlazioni tra sensori Tunnel Link'); + sezGrafTuL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoTuL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra '... + 'i maggiori spostamenti 2D registrati nel piano della sezione '... + 'dai sensori MEMS 3D installati in sito, per ogni quadrante '... + 'delle sezioni monitorate. Si ricorda che '... + 'i quadranti sono definiti suddividendo la sezione in quattro '... + 'zone, considerando le linee di mezzeria e mezza altezza. '... + 'L''ordine dei quadranti segue il principio della circonferenza '... + 'goniometrica, per cui il primo quadrante ' char(232) ' quello presente in alto '... + 'a destra e gli altri sono numerati in senso antiorario. '... + 'A titolo di esempio, la figura successiva identifica i 4 quadranti '... + 'per una sezione tipo.']); + testoTuL.HAlign = 'justify'; + img = Image(('Quadranti.png')); + img.Style = {Height('6cm'),HAlign('center')}; + imgcaption = Paragraph(['Fig. ' num2str(FIG) ' - Esempio di sezione tipo con relativi quadranti']); + FIG = FIG+1; + imgcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + % Quadrante 1 + figure(25) + set(gca,'YColor','k') + [~,colTuL] = size(GI_Q1_TuL); + num = 1; + for t = 1:colTuL + if GI_Date_TuL(1,t) ~= 0 + y1(num) = GI_Q1_TuL(1,t); + y2(num) = GI_Q2_TuL(1,t); + y3(num) = GI_Q3_TuL(1,t); + y4(num) = GI_Q4_TuL(1,t); + y5(num) = 0; + str(1,num) = chainID(t,4); + num = num+1; + end + end + y = [y1;y2;y3;y4;y5]; + x = [1;2;3;4;5]; + Quadranti = barh(x,y); + grid on + + title('Correlazione fra gli spostamenti dei singoli quadranti'); + xlabel('Spostamento [mm]'); + ylabel('Quadrante [-]'); + ylim([0 5]); % Con 5, metto la legenda in alto a sx (il valore 5 è pieno di 0) + % Stimo limiti asse X + ini1 = min(GI_Q1_TuL); + ini2 = min(GI_Q2_TuL); + ini3 = min(GI_Q3_TuL); + ini4 = min(GI_Q4_TuL); + Min = [ini1; ini2; ini3; ini4]; + C = min(Min); + end1 = max(GI_Q1_TuL); + end2 = max(GI_Q2_TuL); + end3 = max(GI_Q3_TuL); + end4 = max(GI_Q4_TuL); + Max = [end1; end2; end3; end4]; + B = max(Max); + A = [abs(C),abs(B)]; + LIM = max(A); + POS = find(A == LIM); + if -LIM > -2.5 % mm + ini = -2.5; + else + ini = -LIM; + end + if LIM < 2.5 + End = 2.5; + else + End = LIM; + end + xlim([ini End]); + if num-1 == 1 % 1 solo array + ylim([0 5]); + else + ylim([0 6]); + end + yticks(1:4); + if POS == 1 % Legenda a DX + legend(str,'Location','northeast'); + else % SX + legend(str,'Location','northwest'); + end + + add(Site,sezGrafTuL); + add(Site,testoTuL); + add(Site,img); + add(Site,imgcaption); + + TempName1 = char(strcat('Report',siteID,'-', char(toolrif),'-Quadranti.png')); + saveas(Quadranti(1),TempName1); + ChartTuL = Image(TempName1); + ChartTuL.Style = {ScaleToFit}; + close(figure(25)) + Quadranti_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'tra i dati massimi di spostamento 2D, registrati per ogni singolo '... + 'quadrante della sezione nel periodo temporale di riferimento, '... + 'dai sensori dei Cir Array presenti in sito']); + FIG = FIG+1; + Quadranti_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + text = 'Gli spostamenti sono riferiti alle misure dei sensori riportati di seguito: '; + testoTuL2 = Paragraph(text); + testoTuL2.HAlign = 'justify'; + add(Site,testoTuL2); + text = 'Quadrante 1'; + testoTuL1 = Paragraph(text); + testoTuL1.Style = {HAlign('justify'),FontSize(Font_caption),Bold(1),Color('midnightblue')}; + add(Site,testoTuL1); + for a = 1:colTuL + if GI_Date_TuL(1,a) ~= 0 + text1 = ['- Array ',char(chainID(a,4)),' - nodo numero ',num2str(abs(GI_Q1_Num_TuL(1,a))),'']; + testoTuL2 = Paragraph(text1); + add(Site,testoTuL2); + end + end + text = 'Quadrante 2'; + testoTuL3 = Paragraph(text); + testoTuL3.Style = {HAlign('justify'),FontSize(Font_caption),Bold(1),Color('midnightblue')}; + add(Site,testoTuL3); + for a = 1:colTuL + if GI_Date_TuL(1,a) ~= 0 + text2 = ['- Array ',char(chainID(a,4)),' - nodo numero ',num2str(abs(GI_Q2_Num_TuL(1,a))),'']; + testoTuL4 = Paragraph(text2); + add(Site,testoTuL4); + end + end + text = 'Quadrante 3'; + testoTuL5 = Paragraph(text); + testoTuL5.Style = {HAlign('justify'),FontSize(Font_caption),Bold(1),Color('midnightblue')}; + add(Site,testoTuL5); + for a = 1:colTuL + if GI_Date_TuL(1,a) ~= 0 + text3 = ['- Array ',char(chainID(a,4)),' - nodo numero ',num2str(abs(GI_Q3_Num_TuL(1,a))),'']; + testoTuL6 = Paragraph(text3); + add(Site,testoTuL6); + end + end + text = 'Quadrante 4'; + testoTuL7 = Paragraph(text); + testoTuL7.Style = {HAlign('justify'),FontSize(Font_caption),Bold(1),Color('midnightblue')}; + add(Site,testoTuL7); + for a = 1:colTuL + if GI_Date_TuL(1,a) ~= 0 + text4 = ['- Array ',char(chainID(a,4)),' - nodo numero ',num2str(abs(GI_Q4_Num_TuL(1,a))),'']; + testoTuL8 = Paragraph(text4); + add(Site,testoTuL8); + end + end + add(Site,ChartTuL); + add(Site,Quadranti_cap); + + % --- ENG --- + if activeEN == 1 + sezGrafTuL_ENG = Heading2('Correlation between Tunnel Link sensors'); + sezGrafTuL_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoTuL = Paragraph(['The following graph aims to highlight any correlation between '... + 'highest 2D displacement values recorded by 3D MEMS for each single Cir Array installed on-site. '... + 'Displacements are compared according to the corresponding sector, defined by dividing the monitored '... + 'section in four separated areas that are numbered as explained in the following figure. ']); + testoTuL.HAlign = 'justify'; + img = Image(('Quadranti.png')); + img.Style = {Height('6cm'),HAlign('center')}; + imgcaption = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Sectors numbering in a tunnel section']); + FIG_ENG = FIG_ENG+1; + imgcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + % Quadrante 1 + figure(35) + set(gca,'YColor','k') + [~,colTuL] = size(GI_Q1_TuL); + num = 1; + for t = 1:colTuL + if GI_Date_TuL(1,t) ~= 0 + y1(num) = GI_Q1_TuL(1,t); + y2(num) = GI_Q2_TuL(1,t); + y3(num) = GI_Q3_TuL(1,t); + y4(num) = GI_Q4_TuL(1,t); + y5(num) = 0; + str(1,num) = chainID(t,4); + num = num+1; + end + end + y = [y1;y2;y3;y4;y5]; + x = [1;2;3;4;5]; + Quadranti = barh(x,y); + grid on + + title('Correlation between displacements recorded in different sectors'); + xlabel('Displacement [mm]'); + ylabel('Sector [-]'); + ylim([0 5]); % Con 5, metto la legenda in alto a sx (il valore 5 è pieno di 0) + % Stimo limiti asse X + ini1 = min(GI_Q1_TuL); + ini2 = min(GI_Q2_TuL); + ini3 = min(GI_Q3_TuL); + ini4 = min(GI_Q4_TuL); + Min = [ini1; ini2; ini3; ini4]; + C = min(Min); + end1 = max(GI_Q1_TuL); + end2 = max(GI_Q2_TuL); + end3 = max(GI_Q3_TuL); + end4 = max(GI_Q4_TuL); + Max = [end1; end2; end3; end4]; + B = max(Max); + A = [abs(C),abs(B)]; + LIM = max(A); + POS = find(A == LIM); + if -LIM > -2.5 % mm + ini = -2.5; + else + ini = -LIM; + end + if LIM < 2.5 + End = 2.5; + else + End = LIM; + end + xlim([ini End]); + if num-1 == 1 % 1 solo array + ylim([0 5]); + else + ylim([0 6]); + end + yticks(1:4); + if POS == 1 % Legenda a DX + legend(str,'Location','northeast'); + else % SX + legend(str,'Location','northwest'); + end + + add(Site_ENG,sezGrafTuL_ENG); + add(Site_ENG,testoTuL); + add(Site_ENG,img); + add(Site_ENG,imgcaption); + + TempName1 = char(strcat('Report',siteID,'-', char(toolrif),'-Quadranti_ENG.png')); + saveas(Quadranti(1),TempName1); + ChartTuL_ENG = Image(TempName1); + ChartTuL_ENG.Style = {ScaleToFit}; + close(figure(35)) + Quadranti_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison '... + 'between highest 2D displacement values '... + 'recorded by each single Array in the corresponding '... + 'sector of the monitored tunnel section '... + 'during the reference time period']); + FIG_ENG = FIG_ENG+1; + Quadranti_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + text = 'Displacement data refer to the sensors listed below: '; + testoTuL2 = Paragraph(text); + testoTuL2.HAlign = 'justify'; + add(Site_ENG,testoTuL2); + text = 'Sector 1'; + testoTuL1 = Paragraph(text); + testoTuL1.Style = {HAlign('justify'),FontSize(Font_caption),Bold(1),Color('midnightblue')}; + add(Site_ENG,testoTuL1); + for a = 1:colTuL + if GI_Date_TuL(1,a) ~= 0 + text1 = ['- Array ',char(chainID(a,4)),' - node ',num2str(abs(GI_Q1_Num_TuL(1,a))),'']; + testoTuL2 = Paragraph(text1); + add(Site_ENG,testoTuL2); + end + end + text = 'Sector 2'; + testoTuL3 = Paragraph(text); + testoTuL3.Style = {HAlign('justify'),FontSize(Font_caption),Bold(1),Color('midnightblue')}; + add(Site_ENG,testoTuL3); + for a = 1:colTuL + if GI_Date_TuL(1,a) ~= 0 + text2 = ['- Array ',char(chainID(a,4)),' - node ',num2str(abs(GI_Q2_Num_TuL(1,a))),'']; + testoTuL4 = Paragraph(text2); + add(Site_ENG,testoTuL4); + end + end + text = 'Sector 3'; + testoTuL5 = Paragraph(text); + testoTuL5.Style = {HAlign('justify'),FontSize(Font_caption),Bold(1),Color('midnightblue')}; + add(Site_ENG,testoTuL5); + for a = 1:colTuL + if GI_Date_TuL(1,a) ~= 0 + text3 = ['- Array ',char(chainID(a,4)),' - node ',num2str(abs(GI_Q3_Num_TuL(1,a))),'']; + testoTuL6 = Paragraph(text3); + add(Site_ENG,testoTuL6); + end + end + text = 'Sector 4'; + testoTuL7 = Paragraph(text); + testoTuL7.Style = {HAlign('justify'),FontSize(Font_caption),Bold(1),Color('midnightblue')}; + add(Site_ENG,testoTuL7); + for a = 1:colTuL + if GI_Date_TuL(1,a) ~= 0 + text4 = ['- Array ',char(chainID(a,4)),' - node ',num2str(abs(GI_Q4_Num_TuL(1,a))),'']; + testoTuL8 = Paragraph(text4); + add(Site_ENG,testoTuL8); + end + end + add(Site_ENG,ChartTuL_ENG); + add(Site_ENG,Quadranti_ENG_cap); + end + end + end + % ---> Confronti variazioni segmenti Stella + if sum(rTuL) > 0 && exist('GI_Seg_TuL','var') + if isempty(GI_Seg_TuL) == 0 + testoStar = Paragraph(['Il grafico seguente confronta nella medesima '... + 'rappresentazione le variazioni di lunghezza dei segmenti di convergenza '... + 'delle sezioni monitorate da ciascun Cir Array. Nel rispettivo capitolo '... + 'di ogni catena ' char(232) ' riportata la stella di convergenza per ogni '... + 'sezione.']); + testoStar.HAlign = 'justify'; + figure(26) + set(gca,'YColor','k') + s = 1; + num = 1; + [~,colTuL] = size(GI_Date_TuL); + for t = 1:colTuL + if GI_Date_TuL(1,t) ~= 0 % Esistono dati per quell'array + % Segmento 1 + s1(num) = GI_Seg_TuL(1,s); + s = s+1; + % Segmento 2 + if GI_NumSeg_TuL(t,1) > 1 + s2(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s2(num) = 0; + end + % Segmento 3 + if GI_NumSeg_TuL(t,1) > 2 + s3(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s3(num) = 0; + end + % Segmento 4 + if GI_NumSeg_TuL(t,1) > 3 + s4(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s4(num) = 0; + end + % Segmento 5 + if GI_NumSeg_TuL(t,1) > 4 + s5(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s5(num) = 0; + end + % Segmento 6 + if GI_NumSeg_TuL(t,1) > 5 + s6(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s6(num) = 0; + end + % Segmento 7 + if GI_NumSeg_TuL(t,1) > 6 + s7(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s7(num) = 0; + end + str(1,num) = chainID(t,4); + num = num+1; + end + end + y = [s1;s2;s3;s4;s5;s6;s7]; + x = [1;2;3;4;5;6;7]; + yticklabels({'S1','S2','S3','S4','S5','S6','S7'}) + Stella = barh(x,y); + grid on + + title('Correlazione fra le variazioni di lunghezza dei segmenti di convergenza'); + xlabel('Spostamento [mm]'); + ylabel('Segmento [-]'); + % Stimo limiti asse X + ini = min(y); + ini = min(ini); + End = max(y); + End = max(End); + A = [abs(ini),End]; + RIF = max(A); + ind = find(A == RIF); + if ind == 1 + legend(str,'Location','northeast'); + else + legend(str,'Location','northwest'); + end + if -RIF > -2.5 % mm + ini = -2.5; + else + ini = -RIF; + end + if RIF < 2.5 + End = 2.5; + else + End = RIF; + end + xlim([ini End]); + yticks(1:7); + if num-1 == 1 % Numero Array + ylim([0 7]); + else + ylim([0 8]); + end + add(Site,testoStar); + + TempName1 = char(strcat('Report',siteID,'-', char(toolrif),'-Stella.png')); + saveas(Stella(1),TempName1); + ChartStella = Image(TempName1); + ChartStella.Style = {ScaleToFit}; + add(Site,ChartStella); + close(figure(26)) + Quadranti_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'tra le variazioni di lunghezza dei segmenti di convergenza, registrati '... + 'per le sezioni monitorate nel periodo temporale di riferimento, '... + 'dai sensori degli Array presenti in sito']); + FIG = FIG+1; + Quadranti_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Site,Quadranti_cap); + add(Site,br); + + % --- ENG --- + if activeEN == 1 + testoStar = Paragraph(['The following graph aims to compare the length variation of '... + 'each convergence segment referred to tunnel sections monitored with a Cir Array. '... + 'Please refer to the corresponding Array section of this Report for additional'... + 'information regarding each specific convergence star.']); + testoStar.HAlign = 'justify'; + figure(36) + set(gca,'YColor','k') + s = 1; + num = 1; + [~,colTuL] = size(GI_Date_TuL); + for t = 1:colTuL + if GI_Date_TuL(1,t) ~= 0 % Esistono dati per quell'array + % Segmento 1 + s1(num) = GI_Seg_TuL(1,s); + s = s+1; + % Segmento 2 + if GI_NumSeg_TuL(t,1) > 1 + s2(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s2(num) = 0; + end + % Segmento 3 + if GI_NumSeg_TuL(t,1) > 2 + s3(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s3(num) = 0; + end + % Segmento 4 + if GI_NumSeg_TuL(t,1) > 3 + s4(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s4(num) = 0; + end + % Segmento 5 + if GI_NumSeg_TuL(t,1) > 4 + s5(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s5(num) = 0; + end + % Segmento 6 + if GI_NumSeg_TuL(t,1) > 5 + s6(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s6(num) = 0; + end + % Segmento 7 + if GI_NumSeg_TuL(t,1) > 6 + s7(num) = GI_Seg_TuL(1,s); + s = s+1; + else + s7(num) = 0; + end + str(1,num) = chainID(t,4); + num = num+1; + end + end + y = [s1;s2;s3;s4;s5;s6;s7]; + x = [1;2;3;4;5;6;7]; + yticklabels({'S1','S2','S3','S4','S5','S6','S7'}) + Stella = barh(x,y); + grid on + + title('Correlation between convergence segments length variation'); + xlabel('Displacement [mm]'); + ylabel('Segment number [-]'); + % Stimo limiti asse X + ini = min(y); + ini = min(ini); + End = max(y); + End = max(End); + A = [abs(ini),End]; + RIF = max(A); + ind = find(A == RIF); + if ind == 1 + legend(str,'Location','northeast'); + else + legend(str,'Location','northwest'); + end + if -RIF > -2.5 % mm + ini = -2.5; + else + ini = -RIF; + end + if RIF < 2.5 + End = 2.5; + else + End = RIF; + end + xlim([ini End]); + yticks(1:7); + if num-1 == 1 % Numero Array + ylim([0 7]); + else + ylim([0 8]); + end + add(Site_ENG,testoStar); + + TempName1 = char(strcat('Report',siteID,'-', char(toolrif),'-Stella_ENG.png')); + saveas(Stella(1),TempName1); + ChartStella_ENG = Image(TempName1); + ChartStella_ENG.Style = {ScaleToFit}; + add(Site_ENG,ChartStella_ENG); + close(figure(36)) + Quadranti_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison '... + 'between length variations of each convergence segment, '... + 'recorded in the corresponding tunnel section by each single Array '... + 'during the reference time period']); + FIG_ENG = FIG_ENG+1; + Quadranti_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Site_ENG,Quadranti_ENG_cap); + add(Site_ENG,br); + end + end + end + % ---> Grafici spostamento in calotta PreConv vs Cir + if sum(rTuL) > 0 && exist('GI_Z_TuL','var') && sum(rPCL) > 0 && exist('GI_Z_PCL','var') + if isempty(GI_Z_TuL) == 0 && isempty(GI_Z_PCL) == 0 + sezGrafTuLvsPCL = Heading2('Correlazioni tra PreConv Array e Cir Array'); + sezGrafTuLvsPCL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoTuLvsPCL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra gli spostamenti '... + 'locali registrati in calotta dal PreConv Array e dai corrispondenti '... + 'Cir Array, con riferimento ai sensori installati nei medesimi punti '... + '(o in quelli pi' char(249) ' prossimi tra di loro).']); + testoTuLvsPCL.HAlign = 'justify'; + + % Cerco eventuali correlazioni con Cir Array + NomeFile = strcat('Report',siteID,'-PCLvsTuL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + num = 1; + sen = 1; + SensoriTuL = zeros(1,1); + SensoriPCL = zeros(1,1); + CatenaTuL = cell(1,1); + CatenaPCL = cell(1,1); + colCIR = 0; + while AAA < rF % A un PreConv possono competere più Cir + PCL = 0; + Cir = 0; + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono PreConv Array o non ci sono Cir + break + else + check2 = Filetesto(AAA+1,1); + for nn = 1:rAR + chain = char(chainID(nn,4)); + if check1 == str2num(chain(end-2:end)) + PCL = nn; + NodoPCL = Filetesto(AAA+2,1); + SensoriPCL(sen,1) = NodoPCL; + CatenaPCL(sen,1) = chainID(nn,4); + end + if check2 == str2num(chain(end-2:end)) + Cir = nn; + NodoTuL = Filetesto(AAA+3,1); + SensoriTuL(sen,1) = NodoTuL; + CatenaTuL(sen,1) = chainID(nn,4); + colCIR = colCIR+1; + end + if PCL > 0 && Cir > 0 + figure(27) + ylabel('Spostamento [mm]'); + xlabel('Data [gg/mm/aaaa]'); + set(gca,'YColor','k') + title('Correlazione fra gli spostamenti corrispondenti'); + grid on + hold on + dim1 = find(GI_Z_PCL(:,PCL)); + dim2 = find(GI_Z_TuL(:,colCIR)); + if isempty(dim1) == 0 && isempty(dim2) == 0 + plot(GI_Date_PCL(1:dim1(end),PCL),GI_Z_PCL(1:dim1(end),PCL)); + GI_TuLvsPCL = plot(GI_Date_TuL(1:dim2(end),Cir),GI_Z_TuL(1:dim2(end),colCIR)); + MIN1 = min(GI_Z_PCL(:,PCL)); + MIN2 = min(GI_Z_TuL(:,colCIR)); + MIN = min(MIN1,MIN2); + MAX1 = max(GI_Z_PCL(:,PCL)); + MAX2 = max(GI_Z_TuL(:,colCIR)); + MAX = max(MAX1,MAX2); + if MAX < 5 && MIN > -5 % mm + ylim([-5 5]); + elseif MAX < 5 + ylim([MIN-1 5]); + elseif MIN > -5 + ylim([-5 MAX+1]); + end + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + h = gca; + h.XAxis.MinorTick = 'on'; + xtickangle(20); + str(1,1) = cellstr([char(CatenaPCL(sen,1)) ' Nodo ' num2str(NodoPCL) '']); + str(1,2) = cellstr([char(CatenaTuL(sen,1)) ' Nodo ' num2str(NodoTuL) '']); + legend(str,'Location','northwest'); + TempName = char(strcat('Report',siteID,'-PCLvsTuL',num2str(num),'.png')); + saveas(GI_TuLvsPCL,TempName); + num = num+1; + end + close(figure(27)); + sen = sen+1; + AAA = AAA+4; + break + end + end + end + end + num = num-1; + if num ~= 0 % Non ci sono legami + add(Site,sezGrafTuLvsPCL); + add(Site,testoTuLvsPCL); + if num == 1 + TempName = char(strcat('Report',siteID,'-PCLvsTuL',num2str(num),'.png')); + Chart1 = Image(TempName); + Chart1.Style = {ScaleToFit}; + add(Site,Chart1); + else + n = 1; + while n <= num + TempName = char(strcat('Report',siteID,'-PCLvsTuL',num2str(n),'.png')); + Chart1 = Image(TempName); + Chart1.Style = {Height('7cm')}; + if n+1 <= num + TempName = char(strcat('Report',siteID,'-PCLvsTuL',num2str(n+1),'.png')); + Chart2 = Image(TempName); + Chart2.Style = {Height('7cm')}; + lot = Table({Chart1, Chart2}); + lot.Style = {ResizeToFitContents(false), Width('100%')}; + n = n+2; + add(Site,lot); + else + n = n+1; + add(Site,Chart1); + end + end + end + ChartPCLvsTuL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'tra i dati di spostamento locale registrati dal nodo '... + 'del Cir Array installato in calotta ed il corrispondente '... + 'sensore PreConv Link pi' char(249) ' in prossimit' char(224) ', nel '... + 'periodo temporale di riferimento']); + FIG = FIG+1; + ChartPCLvsTuL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Site,ChartPCLvsTuL_cap); + + text = 'Gli spostamenti sono riferiti alle misure dei sensori riportati di seguito: '; + testoPCLvsTuL2 = Paragraph(text); + testoPCLvsTuL2.HAlign = 'justify'; + add(Site,testoPCLvsTuL2); + I = size(SensoriPCL); + for a = 1:I(1) + textPC = ['- PreConv Array ' char(CatenaPCL(a,1)) ' - Nodo numero ' num2str(SensoriPCL(a,1)) ';']; + textCA = ['- Cir Array ' char(CatenaTuL(a,1)),' - Nodo numero ' num2str(SensoriTuL(a,1)) '.']; + spazio = Paragraph(''); + testoPCLvsTuL2 = Paragraph(textPC); + testoPCLvsTuL3 = Paragraph(textCA); + add(Site,testoPCLvsTuL2); + add(Site,testoPCLvsTuL3); + add(Site,spazio); + end + add(Site,br); + end + + % --- ENG --- + if activeEN == 1 + sezGrafTuLvsPCL_ENG = Heading2('Correlation between PreConv Array and Cir Array'); + sezGrafTuLvsPCL_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoTuLvsPCL = Paragraph(['The following graph aims to highlight any correlation '... + 'between local displacements recorded by PreConv Array and Cir Array sensors. The comparison '... + 'takes into account two nodes, one for each Array, installed approximately '... + 'in the same place of the upper part of the monitored section.']); + testoTuLvsPCL.HAlign = 'justify'; + + % Cerco eventuali correlazioni con Cir Array + NomeFile = strcat('Report',siteID,'-PCLvsTuL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + num = 1; + sen = 1; + SensoriTuL = zeros(1,1); + SensoriPCL = zeros(1,1); + CatenaTuL = cell(1,1); + CatenaPCL = cell(1,1); + colCIR = 0; + while AAA < rF % A un PreConv possono competere più Cir + PCL = 0; + Cir = 0; + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono PreConv Array o non ci sono Cir + break + else + check2 = Filetesto(AAA+1,1); + for nn = 1:rAR + chain = char(chainID(nn,4)); + if check1 == str2num(chain(end-2:end)) + PCL = nn; + NodoPCL = Filetesto(AAA+2,1); + SensoriPCL(sen,1) = NodoPCL; + CatenaPCL(sen,1) = chainID(nn,4); + end + if check2 == str2num(chain(end-2:end)) + Cir = nn; + NodoTuL = Filetesto(AAA+3,1); + SensoriTuL(sen,1) = NodoTuL; + CatenaTuL(sen,1) = chainID(nn,4); + colCIR = colCIR+1; + end + if PCL > 0 && Cir > 0 + figure(37) + ylabel('Displacement [mm]'); + xlabel('Date [dd/mm/yyyy]'); + set(gca,'YColor','k') + title('Correlation between corresponding sensors'); + grid on + hold on + dim1 = find(GI_Z_PCL(:,PCL)); + dim2 = find(GI_Z_TuL(:,colCIR)); + if isempty(dim1) == 0 && isempty(dim2) == 0 + plot(GI_Date_PCL(1:dim1(end),PCL),GI_Z_PCL(1:dim1(end),PCL)); + GI_TuLvsPCL = plot(GI_Date_TuL(1:dim2(end),Cir),GI_Z_TuL(1:dim2(end),colCIR)); + MIN1 = min(GI_Z_PCL(:,PCL)); + MIN2 = min(GI_Z_TuL(:,colCIR)); + MIN = min(MIN1,MIN2); + MAX1 = max(GI_Z_PCL(:,PCL)); + MAX2 = max(GI_Z_TuL(:,colCIR)); + MAX = max(MAX1,MAX2); + if MAX < 5 && MIN > -5 % mm + ylim([-5 5]); + elseif MAX < 5 + ylim([MIN-1 5]); + elseif MIN > -5 + ylim([-5 MAX+1]); + end + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + h = gca; + h.XAxis.MinorTick = 'on'; + xtickangle(20); + str(1,1) = cellstr([char(CatenaPCL(sen,1)) ' Node ' num2str(NodoPCL) '']); + str(1,2) = cellstr([char(CatenaTuL(sen,1)) ' Node ' num2str(NodoTuL) '']); + legend(str,'Location','northwest'); + TempName = char(strcat('Report',siteID,'-PCLvsTuL',num2str(num),'_ENG.png')); + saveas(GI_TuLvsPCL,TempName); + num = num+1; + end + close(figure(37)); + sen = sen+1; + AAA = AAA+4; + break + end + end + end + end + num = num-1; + if num ~= 0 % Non ci sono legami + add(Site_ENG,sezGrafTuLvsPCL_ENG); + add(Site_ENG,testoTuLvsPCL); + if num == 1 + TempName = char(strcat('Report',siteID,'-PCLvsTuL',num2str(num),'_ENG.png')); + Chart1_ENG = Image(TempName); + Chart1_ENG.Style = {ScaleToFit}; + add(Site_ENG,Chart1_ENG); + else + n = 1; + while n <= num + TempName = char(strcat('Report',siteID,'-PCLvsTuL',num2str(n),'_ENG.png')); + Chart1_ENG = Image(TempName); + Chart1_ENG.Style = {Height('7cm')}; + if n+1 <= num + TempName = char(strcat('Report',siteID,'-PCLvsTuL',num2str(n+1),'_ENG.png')); + Chart2_ENG = Image(TempName); + Chart2_ENG.Style = {Height('7cm')}; + lot = Table({Chart1_ENG, Chart2_ENG}); + lot.Style = {ResizeToFitContents(false), Width('100%')}; + n = n+2; + add(Site_ENG,lot); + else + n = n+1; + add(Site_ENG,Chart1_ENG); + end + end + end + ChartPCLvsTuL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison between '... + 'local displacements recorded during the reference time period by the '... + 'Cir Array sensor installed on the upper part of '... + 'the tunnel section, and the corresponding PreConv Array sensor']); + FIG_ENG = FIG_ENG+1; + ChartPCLvsTuL_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Site_ENG,ChartPCLvsTuL_ENG_cap); + + text = 'Dsiplacement data refer to the sensors listed below: '; + testoPCLvsTuL2 = Paragraph(text); + testoPCLvsTuL2.HAlign = 'justify'; + add(Site,testoPCLvsTuL2); + I = size(SensoriPCL); + for a = 1:I(1) + textPC = ['- PreConv Array ' char(CatenaPCL(a,1)) ' - Node ' num2str(SensoriPCL(a,1)) ';']; + textCA = ['- Cir Array ' char(CatenaTuL(a,1)),' - Node ' num2str(SensoriTuL(a,1)) '.']; + spazio = Paragraph(''); + testoPCLvsTuL2 = Paragraph(textPC); + testoPCLvsTuL3 = Paragraph(textCA); + add(Site_ENG,testoPCLvsTuL2); + add(Site_ENG,testoPCLvsTuL3); + add(Site_ENG,spazio); + end + add(Site_ENG,br); + end + end + end + end + + % ---> Grafici spostamento Cir vs Rad + if sum(rRaL) > 0 && exist('GI_dS_RL_TuL','var') && sum(rRaL) > 0 && exist('GI_dS_TuL_RL','var') + if isempty(GI_dS_RL_TuL) == 0 && isempty(GI_dS_TuL_RL) == 0 + sezGrafTuLvsRL = Heading2('Correlazioni tra Cir Array e Rad Array'); + sezGrafTuLvsRL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoTuLvsRL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra l''andamento nel tempo '... + 'della risultante degli spostamenti 2D differenziali locali registrati '... + 'dal sensore Radial Link prossimo alla sezione monitorata e dal '... + 'corrispondente sensore Tunnel Link.']); + testoTuLvsRL.HAlign = 'justify'; + + % Cerco eventuali correlazioni con Cir Array + NomeFile = strcat('Report',siteID,'-TuLvsRL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + num = 1; + sen = 1; + SensoriTuL = zeros(1,1); + SensoriRL = zeros(1,1); + CatenaTuL = cell(1,1); + CatenaRL = cell(1,1); + colCIR = 0; + while AAA < rF + Rad = 0; + Cir = 0; + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono Rad Array o non ci sono Cir + break + else + check2 = Filetesto(AAA+1,1); + for nn = 1:rAR + chain = char(chainID(nn,4)); + if check1 == str2num(chain(end-2:end)) % Il primo deve sempre essere il Cir + Cir = nn; + NodoTuL = Filetesto(AAA+2,1); + SensoriTuL(sen,1) = NodoTuL; + CatenaTuL(sen,1) = chainID(nn,4); + colCIR = colCIR+1; + end + if check2 == str2num(chain(end-2:end)) + Rad = nn; + NodoRL = Filetesto(AAA+3,1); + SensoriRL(sen,1) = NodoRL; + CatenaRL(sen,1) = chainID(nn,4); + end + if Rad > 0 && Cir > 0 + figure(28) + ylabel('Spostamento [mm]'); + xlabel('Data [gg/mm/aaaa]'); + set(gca,'YColor','k') + title('Correlazione fra gli spostamenti corrispondenti'); + grid on + hold on + dim1 = find(GI_dS_RL_TuL(:,Rad)); + dim2 = find(GI_dS_TuL_RL(:,colCIR)); + if isempty(dim1) == 0 && isempty(dim2) == 0 + plot(GI_Date_Rad(1:dim1(end),Rad),GI_dS_RL_TuL(1:dim1(end),Rad)); + GI_TuLvsRL = plot(GI_Date_TuL(1:dim2(end),Cir),GI_dS_TuL_RL(1:dim2(end),colCIR)); + MAX1 = max(GI_dS_RL_TuL(:,Rad)); + MAX2 = max(GI_dS_TuL_RL(:,colCIR)); + MAX = max(MAX1,MAX2); + if MAX < 5 % mm + ylim([0 5]); + end + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + h = gca; + h.XAxis.MinorTick = 'on'; + xtickangle(20); + str(1,1) = cellstr([char(CatenaTuL(sen,1)) ' Nodo ' num2str(NodoTuL) '']); + str(1,2) = cellstr([char(CatenaRL(sen,1)) ' Nodo ' num2str(NodoRL) '']); + legend(str,'Location','northwest'); + TempName = char(strcat('Report',siteID,'-TuLvsRL',num2str(num),'.png')); + saveas(GI_TuLvsRL,TempName); + num = num+1; + end + close(figure(28)); + sen = sen+1; + AAA = AAA+4; + break + end + end + end + end + num = num-1; + if num ~= 0 % Non ci sono legami + add(Site,sezGrafTuLvsRL); + add(Site,testoTuLvsRL); + if num == 1 + TempName = char(strcat('Report',siteID,'-TuLvsRL',num2str(num),'.png')); + Chart1 = Image(TempName); + Chart1.Style = {ScaleToFit}; + add(Site,Chart1); + else + n = 1; + while n <= num + TempName = char(strcat('Report',siteID,'-TuLvsRL',num2str(n),'.png')); + Chart1 = Image(TempName); + Chart1.Style = {Height('7cm')}; + if n+1 <= num + TempName = char(strcat('Report',siteID,'-TuLvsRL',num2str(n+1),'.png')); + Chart2 = Image(TempName); + Chart2.Style = {Height('7cm')}; + lot = Table({Chart1, Chart2}); + lot.Style = {ResizeToFitContents(false), Width('100%')}; + n = n+2; + add(Site,lot); + else + n = n+1; + add(Site,Chart1); + end + end + end + ChartTuLvsRL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'relativo al periodo temporale di riferimento, tra i dati di '... + 'spostamento locale 2D registrati dal nodo '... + 'del Cir Array installato nella sezione ed il corrispondente '... + 'sensore Radial Link pi' char(249) ' in prossimit' char(224) '']); + FIG = FIG+1; + ChartTuLvsRL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Site,ChartTuLvsRL_cap); + + text = 'Gli spostamenti sono riferiti alle misure dei sensori riportati di seguito: '; + testoTuL2vsRL = Paragraph(text); + testoTuL2vsRL.HAlign = 'justify'; + add(Site,testoTuL2vsRL); + I = size(SensoriRL); + for a = 1:I(1) + text = ['- Rad Array ' char(CatenaRL(a,1)) ' - Nodo numero ' num2str(SensoriRL(a,1)) ... + ', Cir Array ' char(CatenaTuL(a,1)),' - Nodo numero ' num2str(SensoriTuL(a,1)) '']; + testoTuL2vsRL = Paragraph(text); + add(Site,testoTuL2vsRL); + end + add(Site,br); + end + + % --- ENG --- + if activeEN == 1 + sezGrafTuLvsRL_ENG = Heading2('Correlation between Cir Array and Rad Array'); + sezGrafTuLvsRL_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoTuLvsRL = Paragraph(['The following graph aims to highlight the presence of '... + 'correlations between 2D local differential displacements recorded by the Radial Link '... + 'located closer to the monitored section, and the corresponding Tunnel Link sensor.']); + testoTuLvsRL.HAlign = 'justify'; + + % Cerco eventuali correlazioni con Cir Array + NomeFile = strcat('Report',siteID,'-TuLvsRL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + num = 1; + sen = 1; + SensoriTuL = zeros(1,1); + SensoriRL = zeros(1,1); + CatenaTuL = cell(1,1); + CatenaRL = cell(1,1); + colCIR = 0; + while AAA < rF + Rad = 0; + Cir = 0; + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono Rad Array o non ci sono Cir + break + else + check2 = Filetesto(AAA+1,1); + for nn = 1:rAR + chain = char(chainID(nn,4)); + if check1 == str2num(chain(end-2:end)) % Il primo deve sempre essere il Cir + Cir = nn; + NodoTuL = Filetesto(AAA+2,1); + SensoriTuL(sen,1) = NodoTuL; + CatenaTuL(sen,1) = chainID(nn,4); + colCIR = colCIR+1; + end + if check2 == str2num(chain(end-2:end)) + Rad = nn; + NodoRL = Filetesto(AAA+3,1); + SensoriRL(sen,1) = NodoRL; + CatenaRL(sen,1) = chainID(nn,4); + end + if Rad > 0 && Cir > 0 + figure(38) + ylabel('Displacement [mm]'); + xlabel('Date [dd/mm/yyyy]'); + set(gca,'YColor','k') + title('Correlation between corresponding sensors'); + grid on + hold on + dim1 = find(GI_dS_RL_TuL(:,Rad)); + dim2 = find(GI_dS_TuL_RL(:,colCIR)); + if isempty(dim1) == 0 && isempty(dim2) == 0 + plot(GI_Date_Rad(1:dim1(end),Rad),GI_dS_RL_TuL(1:dim1(end),Rad)); + GI_TuLvsRL = plot(GI_Date_TuL(1:dim2(end),Cir),GI_dS_TuL_RL(1:dim2(end),colCIR)); + MAX1 = max(GI_dS_RL_TuL(:,Rad)); + MAX2 = max(GI_dS_TuL_RL(:,colCIR)); + MAX = max(MAX1,MAX2); + if MAX < 5 % mm + ylim([0 5]); + end + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + h = gca; + h.XAxis.MinorTick = 'on'; + xtickangle(20); + str(1,1) = cellstr([char(CatenaTuL(sen,1)) ' Node ' num2str(NodoTuL) '']); + str(1,2) = cellstr([char(CatenaRL(sen,1)) ' Node ' num2str(NodoRL) '']); + legend(str,'Location','northwest'); + TempName = char(strcat('Report',siteID,'-TuLvsRL',num2str(num),'_ENG.png')); + saveas(GI_TuLvsRL,TempName); + num = num+1; + end + close(figure(38)); + sen = sen+1; + AAA = AAA+4; + break + end + end + end + end + num = num-1; + if num ~= 0 % Non ci sono legami + add(Site_ENG,sezGrafTuLvsRL_ENG); + add(Site_ENG,testoTuLvsRL); + if num == 1 + TempName = char(strcat('Report',siteID,'-TuLvsRL',num2str(num),'_ENG.png')); + Chart1_ENG = Image(TempName); + Chart1_ENG.Style = {ScaleToFit}; + add(Site_ENG,Chart1_ENG); + else + n = 1; + while n <= num + TempName = char(strcat('Report',siteID,'-TuLvsRL',num2str(n),'_ENG.png')); + Chart1_ENG = Image(TempName); + Chart1_ENG.Style = {Height('7cm')}; + if n+1 <= num + TempName = char(strcat('Report',siteID,'-TuLvsRL',num2str(n+1),'_ENG.png')); + Chart2_ENG = Image(TempName); + Chart2_ENG.Style = {Height('7cm')}; + lot = Table({Chart1_ENG, Chart2_ENG}); + lot.Style = {ResizeToFitContents(false), Width('100%')}; + n = n+2; + add(Site_ENG,lot); + else + n = n+1; + add(Site_ENG,Chart1_ENG); + end + end + end + ChartTuLvsRL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison '... + 'between 2D local displacement data recorded by the Radial Link sensor closer to '... + 'the monitored section, and the corresponding Tunnel Link sensor']); + FIG_ENG = FIG_ENG+1; + ChartTuLvsRL_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Site_ENG,ChartTuLvsRL_ENG_cap); + + text = 'Displacement data refer to the sensors listed below: '; + testoTuL2vsRL = Paragraph(text); + testoTuL2vsRL.HAlign = 'justify'; + add(Site_ENG,testoTuL2vsRL); + I = size(SensoriRL); + for a = 1:I(1) + text = ['- Rad Array ' char(CatenaRL(a,1)) ' - Node ' num2str(SensoriRL(a,1)) ... + ', Cir Array ' char(CatenaTuL(a,1)),' - Node ' num2str(SensoriTuL(a,1)) '']; + testoTuL2vsRL = Paragraph(text); + add(Site_ENG,testoTuL2vsRL); + end + add(Site_ENG,br); + end + end + end + end + + % ---> Grafici spostamento Rad vs MPB + if sum(rRaL) > 0 && exist('GI_dS_RL_MPB','var') && sum(rMPBEL) > 0 && exist('GI_dS_MPB_RL','var') + if isempty(GI_dS_RL_MPB) == 0 && isempty(GI_dS_MPB_RL) == 0 + sezGrafMPBvsRL = Heading2('Correlazioni tra Rad Array ed estensimetro multibase'); + sezGrafMPBvsRL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoMPBvsRL = Paragraph(['Il grafico seguente ha l''obiettivo di '... + 'evidenziare eventuali correlazioni presenti tra l''andamento nel tempo '... + 'della risultante degli spostamenti 3D differenziali locali registrati '... + 'dal sensore Radial Link e la relativa deformazione radiale misurata '... + 'dalla base pi' char(250) ' lunga dell''estensimetro multibase.']); + testoMPBvsRL.HAlign = 'justify'; + + % Cerco eventuali correlazioni con Estensimetro multibase + NomeFile = strcat('Report',siteID,'-RLvsMPBEL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + num = 1; + sen = 1; + SensoriRL = zeros(1,1); + SensoriMPB = zeros(1,1); + CatenaRL = cell(1,1); + CatenaMPB = cell(1,1); + colMPB = 0; + while AAA < rF + Rad = 0; + MPB = 0; + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono Rad Array o estensimetri multibase + break + else + check2 = Filetesto(AAA+1,1); + for nn = 1:rAR + chain = char(chainID(nn,4)); + if check1 == str2num(chain(end-2:end)) % Il primo deve sempre essere il Rad + Rad = nn; + NodoRL = Filetesto(AAA+2,1); + SensoriRL(sen,1) = NodoRL; + CatenaRL(sen,1) = chainID(nn,4); + end + if check2 == str2num(chain(end-2:end)) + MPB = nn; + NodoMPB = Filetesto(AAA+3,1); + SensoriMPB(sen,1) = NodoMPB; + CatenaMPB(sen,1) = chainID(nn,4); + colMPB = colMPB+1; + end + if Rad > 0 && MPB > 0 + figure(29) + ylabel('Spostamento [mm]'); + xlabel('Data [gg/mm/aaaa]'); + set(gca,'YColor','k') + title('Correlazione fra gli spostamenti corrispondenti'); + grid on + hold on + dim1 = find(GI_dS_RL_MPB(:,Rad)); + dim2 = find(GI_dS_MPB_RL(:,colMPB)); + if isempty(dim1) == 0 && isempty(dim2) == 0 + plot(GI_Date_Rad(1:dim1(end),Rad),GI_dS_RL_MPB(1:dim1(end),Rad)); + GI_MPBvsRL = plot(GI_Date_MPB(1:dim2(end),MPB),GI_dS_MPB_RL(1:dim2(end),colMPB)); + MAX1 = max(GI_dS_RL_MPB(:,Rad)); + MAX2 = max(GI_dS_MPB_RL(:,colMPB)); + MAX = max(MAX1,MAX2); + if MAX < 5 % mm + ylim([-5 5]); + end + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + h = gca; + h.XAxis.MinorTick = 'on'; + xtickangle(20); + str(1,1) = cellstr([char(CatenaRL(sen,1)) ' Nodo ' num2str(NodoRL) '']); + str(1,2) = cellstr([char(CatenaMPB(sen,1)) ' Estensimetro ' num2str(NodoMPB) '']); + legend(str,'Location','northwest'); + TempName = char(strcat('Report',siteID,'-RLvsMPB',num2str(num),'.png')); + saveas(GI_MPBvsRL,TempName); + num = num+1; + end + close(figure(29)) + sen = sen+1; + AAA = AAA+4; + break + end + end + end + end + num = num-1; + if num ~= 0 % Non ci sono legami + add(Site,sezGrafMPBvsRL); + add(Site,testoMPBvsRL); + if num == 1 + TempName = char(strcat('Report',siteID,'-RLvsMPB',num2str(num),'.png')); + Chart1 = Image(TempName); + Chart1.Style = {ScaleToFit}; + add(Site,Chart1); + else + n = 1; + while n <= num + TempName = char(strcat('Report',siteID,'-RLvsMPB',num2str(n),'.png')); + Chart1 = Image(TempName); + Chart1.Style = {Height('7cm')}; + if n+1 <= num + TempName = char(strcat('Report',siteID,'-RLvsMPB',num2str(n+1),'.png')); + Chart2 = Image(TempName); + Chart2.Style = {Height('7cm')}; + lot = Table({Chart1, Chart2}); + lot.Style = {ResizeToFitContents(false), Width('100%')}; + n = n+2; + add(Site,lot); + else + n = n+1; + add(Site,Chart1); + end + end + end + ChartMPBvsRL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Confronto '... + 'relativo al periodo temporale di riferimento, tra i dati di '... + 'spostamento locale 3D registrati dal nodo Radial Link pi' char(249) ... + ' in prossimit' char(224) ' della sezione e la base pi' char(249) ... + ' lunga dell''estensimetro multibase']); + FIG = FIG+1; + ChartMPBvsRL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Site,ChartMPBvsRL_cap); + + text = 'Gli spostamenti sono riferiti alle misure dei sensori riportati di seguito: '; + testoMPB2vsRL = Paragraph(text); + testoMPB2vsRL.HAlign = 'justify'; + add(Site,testoMPB2vsRL); + I = size(SensoriRL); + for a = 1:I(1) + text = ['- Rad Array ' char(CatenaRL(a,1)) ' - Nodo numero ' num2str(SensoriRL(a,1)) ... + ', Analog Array ' char(CatenaMPB(a,1)),' - Estensimetro Multibase numero ' num2str(SensoriMPB(a,1)) '']; + testoMPB2vsRL = Paragraph(text); + add(Site,testoMPB2vsRL); + end + + add(Site,br); + end + + %--- ENG --- + if activeEN == 1 + sezGrafMPBvsRL_ENG = Heading2('Correlation between Rad Array and Multipoint Borehole Extensometer (MPBE)'); + sezGrafMPBvsRL_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + testoMPBvsRL = Paragraph(['The following graph aims to highlight the presence of correlations '... + 'between 3D local differential displacements recorded by the Radial Link sensor, and the '... + 'corresponding radial deformation measured by the longest rod of the MPBE.']); + testoMPBvsRL.HAlign = 'justify'; + + % Cerco eventuali correlazioni con Estensimetro multibase + NomeFile = strcat('Report',siteID,'-RLvsMPBEL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + num = 1; + sen = 1; + SensoriRL = zeros(1,1); + SensoriMPB = zeros(1,1); + CatenaRL = cell(1,1); + CatenaMPB = cell(1,1); + colMPB = 0; + while AAA < rF + Rad = 0; + MPB = 0; + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono Rad Array o estensimetri multibase + break + else + check2 = Filetesto(AAA+1,1); + for nn = 1:rAR + chain = char(chainID(nn,4)); + if check1 == str2num(chain(end-2:end)) % Il primo deve sempre essere il Rad + Rad = nn; + NodoRL = Filetesto(AAA+2,1); + SensoriRL(sen,1) = NodoRL; + CatenaRL(sen,1) = chainID(nn,4); + end + if check2 == str2num(chain(end-2:end)) + MPB = nn; + NodoMPB = Filetesto(AAA+3,1); + SensoriMPB(sen,1) = NodoMPB; + CatenaMPB(sen,1) = chainID(nn,4); + colMPB = colMPB+1; + end + if Rad > 0 && MPB > 0 + figure(39) + ylabel('Displacement [mm]'); + xlabel('Date [d/mm/yyyy]'); + set(gca,'YColor','k') + title('Correlation between corresponding sensors'); + grid on + hold on + dim1 = find(GI_dS_RL_MPB(:,Rad)); + dim2 = find(GI_dS_MPB_RL(:,colMPB)); + if isempty(dim1) == 0 && isempty(dim2) == 0 + plot(GI_Date_Rad(1:dim1(end),Rad),GI_dS_RL_MPB(1:dim1(end),Rad)); + GI_MPBvsRL = plot(GI_Date_MPB(1:dim2(end),MPB),GI_dS_MPB_RL(1:dim2(end),colMPB)); + MAX1 = max(GI_dS_RL_MPB(:,Rad)); + MAX2 = max(GI_dS_MPB_RL(:,colMPB)); + MAX = max(MAX1,MAX2); + if MAX < 5 % mm + ylim([-5 5]); + end + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + h = gca; + h.XAxis.MinorTick = 'on'; + xtickangle(20); + str(1,1) = cellstr([char(CatenaRL(sen,1)) ' Node ' num2str(NodoRL) '']); + str(1,2) = cellstr([char(CatenaMPB(sen,1)) ' Extensometer ' num2str(NodoMPB) '']); + legend(str,'Location','northwest'); + TempName = char(strcat('Report',siteID,'-RLvsMPB',num2str(num),'_ENG.png')); + saveas(GI_MPBvsRL,TempName); + num = num+1; + end + close(figure(39)) + sen = sen+1; + AAA = AAA+4; + break + end + end + end + end + num = num-1; + if num ~= 0 % Non ci sono legami + add(Site_ENG,sezGrafMPBvsRL_ENG); + add(Site_ENG,testoMPBvsRL); + if num == 1 + TempName = char(strcat('Report',siteID,'-RLvsMPB',num2str(num),'_ENG.png')); + Chart1_ENG = Image(TempName); + Chart1_ENG.Style = {ScaleToFit}; + add(Site_ENG,Chart1_ENG); + else + n = 1; + while n <= num + TempName = char(strcat('Report',siteID,'-RLvsMPB',num2str(n),'_ENG.png')); + Chart1_ENG = Image(TempName); + Chart1_ENG.Style = {Height('7cm')}; + if n+1 <= num + TempName = char(strcat('Report',siteID,'-RLvsMPB',num2str(n+1),'_ENG.png')); + Chart2_ENG = Image(TempName); + Chart2_ENG.Style = {Height('7cm')}; + lot = Table({Chart1_ENG, Chart2_ENG}); + lot.Style = {ResizeToFitContents(false), Width('100%')}; + n = n+2; + add(Site_ENG,lot); + else + n = n+1; + add(Site_ENG,Chart1_ENG); + end + end + end + ChartMPBvsRL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Comparison '... + 'between 3D local differential displacements recorded by the Radial Link sensor, and the '... + 'corresponding radial deformation measured by the longest rod of the MPBE.']); + FIG_ENG = FIG_ENG+1; + ChartMPBvsRL_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Site_ENG,ChartMPBvsRL_ENG_cap); + + text = 'Displacement data refer to the sensors listed below: '; + testoMPB2vsRL = Paragraph(text); + testoMPB2vsRL.HAlign = 'justify'; + add(Site_ENG,testoMPB2vsRL); + I = size(SensoriRL); + for a = 1:I(1) + text = ['- Rad Array ' char(CatenaRL(a,1)) ' - Node ' num2str(SensoriRL(a,1)) ... + ', Analog Array ' char(CatenaMPB(a,1)),' - MPBE ' num2str(SensoriMPB(a,1)) '']; + testoMPB2vsRL = Paragraph(text); + add(Site_ENG,testoMPB2vsRL); + end + + add(Site_ENG,br); + end + end + end + end +end + +text = 'report_CrossGraphs function executed correctly. report_CrossGraphs function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_EL.m b/Tilt/report_EL.m new file mode 100755 index 0000000..5684fbe --- /dev/null +++ b/Tilt/report_EL.m @@ -0,0 +1,420 @@ +function [FIG,FIG_ENG,battANALOG,ATTIVA] = report_EL(rEL,m,NodoExtensometerLink,toolrif,... + unitrif,contunit,datarif,Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,... + DT_ENG,FIG,FIG_ENG,activeEN,br,status,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_EL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() +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 + EE = Section(); + sezExtensometer = Heading3('Extensometer Link'); + sezExtensometer.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE.Title = sezExtensometer; + 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 + EE_ENG = Section(); + sezExtensometer_ENG = Heading3('Extensometer Link'); + sezExtensometer_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE_ENG.Title = sezExtensometer_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,sezExtensometer); + if activeEN == 1 + add(DT_ENG,sezExtensometer_ENG); + end + + for ex = 1:rEL(m,1) + NodeNum = num2str(NodoExtensometerLink(ex,m)); + comando = ['select EventDate, EventTime, XShift, T_node 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 + deform = cell2mat(Dati(:,3)); % deformazioni + TempEL = cell2mat(Dati(:,4)); % temperatura + + % grafico deformazioni NELL'ULTIMO MESE + figure(5); + if isnan(TempEL(1)) == 0 + yyaxis left + end + dE = deform-deform(1); + extens = plot(Date,dE); + Min = min(dE); + Max = max(dE); + if Min > -50 && Max < 50 + ylim([-50 50]) + end + hold on + ylabel('Deformazione [{\mu}{\epsilon}]'); + xlabel('Data [gg/mm/aaaa]'); + set(gca,'YColor','k'); + if isnan(TempEL(1)) == 0 + yyaxis right + plot(Date,TempEL,':','LineWidth',1.1); + ylabel(['Temperatura [' char(176) 'C]']); + set(gca,'YColor','k'); + str(1,1) = cellstr('Deformazione'); + str(2,1) = cellstr('Temperatura'); + MX(1) = max(TempEL(1:10)); + MX(2) = min(TempEL(1:10)); + MAX = max(abs(MX)); + IN = find(abs(MX)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + end + title(['Deformazioni misurate dal nodo numero ' NodeNum]); + xlim([Date(1)-1 Date(end)+1]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + hold off + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-Ext', NodeNum, '.png')); + saveas(extens,TempName); + ChartEL = Image(TempName); + ChartEL.Style = {Height('7.3cm'),HAlign('center')}; + % ChartEL.Style = {ScaleToFit}; + ChartEL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Deformazioni '... + 'differenziali misurate dall''estensimetro, nodo numero ' NodeNum... + ', nel periodo temporale di riferimento']); + FIG = FIG+1; + ChartEL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['Nei grafici seguenti sono rappresentati i dati relativi '... + 'alle deformazioni registrate dalle barrette estensimetriche appartenenti all''Analog Array.']); + testo2 = Paragraph(['Durante il periodo temporale di riferimento, il nodo numero ' NodeNum ... + ' ha registrato valori massimi e minimi di deformazione assoluta pari a '... + num2str(round(max(deform),2),'%0.2f') ' ' char(181) '' char(949) ' e ' num2str(round(min(deform),2),'%0.2f')... + ' ' char(181) '' char(949) ', con una variazione massima di '... + num2str(round(max(deform),2)-round(min(deform),2),'%0.2f') ' ' char(181) '' char(949) '.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if ex == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,ChartEL); + add(DT,ChartEL_cap); + if ex == rEL(m,1) + add(DT,br); + end + close(figure(5)); + + %--ENG-- + + if activeEN == 1 + % grafico deformazioni NELL'ULTIMO MESE + figure(15); + if isnan(TempEL(1)) == 0 + yyaxis left + end + dE = deform-deform(1); + extens = plot(Date,dE); + Min = min(dE); + Max = max(dE); + if Min > -50 && Max < 50 + ylim([-50 50]) + end + hold on + ylabel('Deformation [{\mu}{\epsilon}]'); + xlabel('Date [dd/mm/yyyy]'); + set(gca,'YColor','k'); + if isnan(TempEL(1)) == 0 + yyaxis right + plot(Date,TempEL,':','LineWidth',1.1); + ylabel(['Temperature [' char(176) 'C]']); + set(gca,'YColor','k'); + str(1,1) = cellstr('Deformation'); + str(2,1) = cellstr('Temperature'); + MX(1) = max(TempEL(1:10)); + MX(2) = min(TempEL(1:10)); + MAX = max(abs(MX)); + IN = find(abs(MX)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + end + title(['Deformation - Node ' NodeNum]); + xlim([Date(1)-1 Date(end)+1]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + hold off + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-Ext', NodeNum, '_ENG.png')); + saveas(extens,TempName); + ChartEL_ENG = Image(TempName); + ChartEL_ENG.Style = {Height('7.3cm'),HAlign('center')}; + % ChartEL.Style = {ScaleToFit}; + ChartEL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Differential '... + 'deformations measured by extensometer ' NodeNum... + ' during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartEL_ENG_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graphs display deformation data '... + 'recorded by extensometers integrated in the Analog Array.']); + testo2 = Paragraph(['During the reference time period, node ' NodeNum ... + ' measured maximum and minimum deformation values of respectively '... + num2str(round(max(deform),2),'%0.2f') ' ' char(181) '' char(949) ' and ' num2str(round(min(deform),2),'%0.2f')... + ' ' char(181) '' char(949) ', with a maximum variation of '... + num2str(round(max(deform),2)-round(min(deform),2),'%0.2f') ' ' char(181) '' char(949) '.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if ex == 1 + add(DT_ENG,testo); + end + add(DT_ENG,testo2); + add(DT_ENG,ChartEL_ENG); + add(DT_ENG,ChartEL_ENG_cap); + if ex == rEL(m,1) + add(DT_ENG,br); + end + close(figure(15)) + end + + %pulisco variabili da riutilizzare per catena successiva + clear deform; + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + end + end + end + end +end + +text = 'report_EL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_IPL.m b/Tilt/report_IPL.m new file mode 100755 index 0000000..2222f86 --- /dev/null +++ b/Tilt/report_IPL.m @@ -0,0 +1,561 @@ +function [GI_MaxDispMESE,GI_DateIPL,GI_MaxDispProf,ATTIVA,FIG,FIG_ENG] = report_IPL(... + rIPL,rIPLHR,m,NodoInPlaceLink,toolrif,unitrif,datarif,firstdata_num,Font_caption,... + Font_tools,siteID,toolrifID,DT,DT_ENG,FIG,FIG_ENG,br,colonna2,colonna2bis,status,... + ATTIVA,activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_IPL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +GI_MaxDispMESE = []; +GI_DateIPL = []; +GI_MaxDispProf = []; +check = 0; +NODATA(m,1) = 0; +while check == 0 + if status(m,1) == 1 + if ATTIVA == 1 + testo = Paragraph('Catena non ancora installata o inattiva.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array not installed or inactive.'); + add(DT_ENG,testo); + end + end + check = 1; + 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 + check = 1; + else + for n = 1:rIPL(m,1) + NodeNum = num2str(NodoInPlaceLink(n,m)); + comando = ['select EventDate, EventTime, HShift_local, HShift, NodeDepth, '... + 'XShift, YShift, X, Y, HShiftDir 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 + if n == 1 % Il primo lo scrivo e creo la variabile di controllo + else + [rS,~] = size(Spost_local); + if rD ~= rS + NODATA(m,1) = 2; + check = 0; + break + else + check = 1; + end + end + % dall'inizio + Spost_local(:,n) = cell2mat((Dati(:,3)))*1000; % Loc 2D + Spost(:,n) = (cell2mat(Dati(:,4)))*1000; % Cum 2D + Prof(:,n) = -(cell2mat(Dati(1,5))); % Profondità + % Locali ultimo mese + Spost_Local_MeseX(:,n) = cell2mat(Dati(:,6)); % Loc X ultimo mese + Spost_Local_MeseY(:,n) = cell2mat(Dati(:,7)); % Loc Y ultimo mese + diffMeseX_Local(1,n) = Spost_Local_MeseX(end,n)-Spost_Local_MeseX(1,n); + diffMeseY_Local(1,n) = Spost_Local_MeseY(end,n)-Spost_Local_MeseY(1,n); + DispMese_Local(1,n) = sqrt(diffMeseX_Local(1,n)^2 + diffMeseY_Local(1,n)^2)*1000; + % Cumulati ultimo mese + Spost_MeseX(:,n) = cell2mat(Dati(:,8)); % Cum X ultimo mese + Spost_MeseY(:,n) = cell2mat(Dati(:,9)); % Cum Y ultimo mese + diffMeseX(1,n) = Spost_MeseX(end,n)-Spost_MeseX(1,n); + diffMeseY(1,n) = Spost_MeseY(end,n)-Spost_MeseY(1,n); + DispMese(1,n) = sqrt(diffMeseX(1,n)^2 + diffMeseY(1,n)^2)*1000; + Azim(:,n) = cell2mat(Dati(:,10)); % Azimuth totale + else + NODATA(m,1) = 1; + check = 1; + end + end + if NODATA(m,1) == 0 + if strcmp(colonna2bis(m+1,1),colonna2(m+1,1)) == 0 % data zero = data riferimento + clear Spost; + clear Spost_local; + clear Azimuth; + datarifNEW = datestr(firstdata_num{m+1,1},'yyyy-mm-dd'); % data riferimento definita sul sito + for nw = 1:rIPL(m,1) + NodeNum = num2str(NodoInPlaceLink(nw,m)); + comando = ['select EventDate, EventTime, HShift_local, HShift, NodeDepth, XShift, YShift, X, Y, HShiftDir '... + 'from ElabDataView where EventDate = ''' datarifNEW ''' and ToolNameID = ''' char(toolrif) ... + ''' and UnitName = ''' char(unitrif) ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DatiNEW = curs.Data; % dati registrati alla data di riferimento + [~,rC] = size(DatiNEW); + if rC ~= 1 + % dalla data di riferimento + Spost_Local_X_RIF(:,nw) = cell2mat(DatiNEW(:,6)); %Loc X data rif + Spost_Local_Y_RIF(:,nw) = cell2mat(DatiNEW(:,7)); %Loc Y data rif + diffX_Local_RIF(1,nw) = Spost_Local_MeseX(end,nw)-Spost_Local_X_RIF(1,nw); + diffY_Local_RIF(1,nw) = Spost_Local_MeseY(end,nw)-Spost_Local_Y_RIF(1,nw); + Spost_local(1,nw) = sqrt(diffX_Local_RIF(1,nw)^2 + diffY_Local_RIF(1,nw)^2)*1000; + + Spost_X_RIF(:,nw) =cell2mat(DatiNEW(:,8)); % Cum X data rif + Spost_Y_RIF(:,nw) =cell2mat(DatiNEW(:,9)); % Cum Y data rif + diffX_RIF(1,nw) = Spost_MeseX(end,nw)-Spost_X_RIF(1,nw); + diffY_RIF(1,nw) = Spost_MeseY(end,nw)-Spost_Y_RIF(1,nw); + Spost(1,nw) = sqrt(diffX_RIF(1,nw)^2 + diffY_RIF(1,nw)^2)*1000; + + azim(1,nw) = (acos(abs(diffX_RIF(1,nw)*1000)/Spost(1,nw)))*180/pi(); % Angolo Teta in gradi 0° - 90° + segnoNS = sign(diffX_RIF(1,nw)); + segnoEO = sign(diffY_RIF(1,nw)); + % L'azimuth si calcola con NS = 0, positivo in senso orario + % (90° = Est) + if segnoNS == 1 && segnoEO == 1 % quadrante 1 + Azimuth(1,nw) = azim(1,nw); % Teta lo tengo come è (1 quadrante) + elseif segnoNS == -1 && segnoEO == 1 % quadrante 2 + Azimuth(1,nw) = 180 - azim(1,nw); % 180-teta + elseif segnoNS == -1 && segnoEO == -1 % quadrante 3 + Azimuth(1,nw) = 180 + azim(1,nw); % 180+teta + elseif segnoNS == 1 && segnoEO == -1 % quadrante 4 + Azimuth(1,nw) = 360 - azim(1,nw); % 360-teta + elseif segnoNS == 0 && segnoEO == -1 % 270° + Azimuth(1,nw) = 270; + elseif segnoNS == -1 && segnoEO == 0 % 180° + Azimuth(1,nw) = 180; + elseif segnoNS == 0 && segnoEO == 1 % 90° + Azimuth(1,nw) = 90; + elseif segnoNS == 1 && segnoEO == 0 % 0° + Azimuth(1,nw) = 0; + else % non c'è nessuno spostamento da nessuna parte + if nw == 1 + Azimuth(1,nw) = 0; + else + Azimuth(1,nw) = Azimuth(1,nw-1); + end + end + Azimuth(1,nw) = real(Azimuth(1,nw)); + else + NODATA(m,1) = 1; + end + end + % Approssimo gli spostamenti al decimo di millimetro + conv = Spost*10; + conv = round(conv); + Spost = conv/10; + end + + MaxDisp = max(Spost_local(end,:)); + Index = find(Spost_local(end,:) == MaxDisp); + MaxDispProf = Prof(1,Index(1)); + + MaxDispMESE = max(DispMese_Local(end,:)); + IndexMESE = find(DispMese_Local(end,:) == MaxDispMESE); + MaxDispProfMESE = Prof(1,IndexMESE(1)); + + % aggiungo ancora + comando = ['select nodetype_id, depth, num from nodes where tool_id = ''' num2str(cell2mat(toolrifID)) ... + ''' and nodetype_id = 9 order by num']; + Anc = fetch(conn,comando); + ProfAnc = -(cell2mat((Anc(:,2)))); + Prof = [ProfAnc Prof]; + [rt,~] = size(Spost_local); + ancoraTL = zeros(rt,1); + Spost_local = [ancoraTL Spost_local]; + Spost = [ancoraTL Spost]; + DispMese_Local = [0 DispMese_Local]; + DispMese = [0 DispMese]; + + % per grafici integrati + GI_MaxDispMESE_x = Spost_Local_MeseX(:,IndexMESE(1)); % x del nodo a maggior spostamento + GI_diff_x = GI_MaxDispMESE_x(:,:)- GI_MaxDispMESE_x(1,1); % differenza + GI_MaxDispMESE_y = Spost_Local_MeseY(:,IndexMESE(1));% y del nodo a maggior spostamento + GI_diff_y = GI_MaxDispMESE_y(:,:)- GI_MaxDispMESE_y(1,1); % differenza + GI_MaxDispMESE = sqrt((GI_diff_x).^2 + (GI_diff_y).^2)*1000; % risultante + GI_DateIPL = Date; + GI_MaxDispProf = MaxDispProfMESE; + + % --- grafico locali-profondità DALL'INIZIO --- + figure(1) + subplot(1,2,1); + plot(DispMese_Local,Prof); + hold on + plot(Spost_local(end,:),Prof); + title('Spostamenti Locali 2D'); + xlabel('Spostamento [mm]'); + ylabel(['Profondit' char(224) ' [m]']); + h = gca; + h.XAxis.MinorTick = 'on'; + if MaxDisp < 10 % mm + xlim([-inf 10]); + end + grid on + grid minor + legend('Periodo di riferimento','Intero periodo','Location','southeast'); + + % Grafico Cumulati + subplot(1,2,2); + plot(DispMese,Prof); + hold on + DispCum = plot(Spost(end,:),Prof); + title('Spostamenti Cumulati 2D'); + xlabel('Spostamento [mm]'); + ylabel(['Profondit' char(224) ' [m]']); + h = gca; + h.XAxis.MinorTick = 'on'; + if max(Spost(end,:)) < 10 + xlim([-inf 10]); + end + grid on + grid minor + legend('Periodo di riferimento','Intero periodo','Location','southeast'); + lgd.FontSize = 6; + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'DispIPL.png')); + saveas(DispCum,TempName); + Chart = Image(TempName); + if m > 1 + for C = 1:m-1 + if status(C,1) == 3 || status(C,1) == 1 + Chart.Style = {Height('10cm'),HAlign('center')}; + break + else + Chart.Style = {ScaleToFit}; + end + end + else + Chart.Style = {ScaleToFit}; + end + Chart.Style = {ScaleToFit}; + Chart_capM = Paragraph(['Fig. ' num2str(FIG) ' - Spostamenti differenziali locali e cumulati in '... + 'direzione di massima pendenza registrati dalla catena '... + 'durante il periodo temporale di riferimento e a partire '... + 'dalla data di riferimento riportata in Tabella 1']); + FIG = FIG+1; + Chart_capM.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + close(figure(1)) + + % ENG + if activeEN == 1 + figure(1) + subplot(1,2,1); + plot(DispMese_Local,Prof); + hold on + plot(Spost_local(end,:),Prof); + title('2D Local Displacements'); + xlabel('Displacement [mm]'); + ylabel('Depth [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + if MaxDisp < 10 % mm + xlim([-inf 10]); + end + grid on + grid minor + + subplot(1,2,2); + plot(DispMese,Prof); + hold on + DispCum = plot(Spost(end,:),Prof); + title('2D Cumulative Displacements'); + xlabel('Displacements [mm]'); + ylabel('Depth [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + if max(Spost(end,:)) < 10 + xlim([-inf 10]); + end + grid on + grid minor + lgd = legend('Last period','Entire period','Location','southeast'); + lgd.FontSize = 6; + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Disp_ENG.png')); + saveas(DispCum,TempName); + Chart = Image(TempName); + if m > 1 + for C = 1:m-1 + if status(C,1) == 3 || status(C,1) == 1 + Chart.Style = {Height('10cm'),HAlign('center')}; + break + else + Chart.Style = {ScaleToFit}; + end + end + else + Chart.Style = {ScaleToFit}; + end + Chart.Style = {ScaleToFit}; + Chart_capM = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Local and cumulative '... + 'differential displacements along maximum grade direction, '... + 'recorded during the monitoring reference period and starting from the '... + 'reported in Tab. 1']); + FIG_ENG = FIG_ENG+1; + Chart_capM.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + close(figure(1)) + end + + % grafico azimuth DALL'INIZIO + Azim_grafico = deg2rad(Azim(end,:)); + Azim_grafico = [0 Azim_grafico]; %aggiungo ancora + figure(2) + azimuth = polarscatter(Azim_grafico,flip(abs(Prof)),'filled'); + title('Azimut'); + h = gca; + h.ThetaDir = 'clockwise'; + h.ThetaZeroLocation = 'top'; + angles = 0:45:360; + h.ThetaTick = angles; + labels = {'N','NE','E','SE','S','SO','O','NO'}; + h.ThetaTickLabel = labels; + grid on + + Testa = Azim(end,end); + if Testa > 11.25 && Testa <= 33.75 + DirAzim = 'Nord-Nord-Est'; + elseif Testa > 33.75 && Testa <= 56.25 + DirAzim = 'Nord-Est'; + elseif Testa > 56.25 && Testa <= 78.75 + DirAzim = 'Est-Nord-Est'; + elseif Testa > 78.75 && Testa <= 101.25 + DirAzim = 'Est'; + elseif Testa > 101.25 && Testa <= 123.75 + DirAzim = 'Est-Sud-Est'; + elseif Testa > 123.75 && Testa <= 146.25 + DirAzim = 'Sud-Est'; + elseif Testa > 146.25 && Testa <= 168.75 + DirAzim = 'Sud-Sud-Est'; + elseif Testa > 168.75 && Testa <= 191.25 + DirAzim = 'Sud'; + elseif Testa > 191.25 && Testa <= 213.75 + DirAzim = 'Sud-Sud-Ovest'; + elseif Testa > 213.75 && Testa <= 236.25 + DirAzim = 'Sud-Ovest'; + elseif Testa > 236.25 && Testa <= 258.75 + DirAzim = 'Ovest-Sud-Ovest'; + elseif Testa > 258.75 && Testa <= 281.25 + DirAzim = 'Ovest'; + elseif Testa > 281.25 && Testa <= 303.75 + DirAzim = 'Ovest-Nord-Ovest'; + elseif Testa > 303.75 && Testa <= 326.25 + DirAzim = 'Nord-Ovest'; + elseif Testa > 326.25 && Testa <= 348.75 + DirAzim = 'Nord-Nord-Ovest'; + else + DirAzim = 'Nord'; + end + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Azimuth.png')); + saveas(azimuth,TempName); + ChartAZ = Image(TempName); + ChartAZ.Style = {ScaleToFit}; + ChartAZ_cap = Paragraph(['Fig. ' num2str(FIG) ' - Azimut degli spostamenti '... + 'differenziali cumulati secondo la profondit' char(224) ', registrato '... + 'a partire dalla lettura di riferimento']); + FIG = FIG+1; + ChartAZ_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + SE = Section(); + if rIPLHR(m,1) > 0 + sezTilt = Heading3('In Place Link HR 3D'); + else + sezTilt = Heading3('In Place Link'); + end + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SE.Title = sezTilt; + close(figure(2)) + + % ENG + if activeEN == 1 + Azim_grafico = deg2rad(Azim(end,:)); + Azim_grafico = [0 Azim_grafico]; %aggiungo ancora + figure(2) + azimuth = polarscatter(Azim_grafico,flip(abs(Prof)),'filled'); + title('Azimuth'); + h = gca; + h.ThetaDir = 'clockwise'; + h.ThetaZeroLocation = 'top'; + angles = 0:45:360; + h.ThetaTick = angles; + labels = {'N','NE','E','SE','S','SW','W','NW'}; + h.ThetaTickLabel = labels; + grid on + + Testa = Azim(end,end); + if Testa > 11.25 && Testa <= 33.75 + DirAzim = 'North-North-East'; + elseif Testa > 33.75 && Testa <= 56.25 + DirAzim = 'North-East'; + elseif Testa > 56.25 && Testa <= 78.75 + DirAzim = 'East-North-East'; + elseif Testa > 78.75 && Testa <= 101.25 + DirAzim = 'East'; + elseif Testa > 101.25 && Testa <= 123.75 + DirAzim = 'East-South-East'; + elseif Testa > 123.75 && Testa <= 146.25 + DirAzim = 'South-East'; + elseif Testa > 146.25 && Testa <= 168.75 + DirAzim = 'South-South-East'; + elseif Testa > 168.75 && Testa <= 191.25 + DirAzim = 'South'; + elseif Testa > 191.25 && Testa <= 213.75 + DirAzim = 'South-South-West'; + elseif Testa > 213.75 && Testa <= 236.25 + DirAzim = 'South-West'; + elseif Testa > 236.25 && Testa <= 258.75 + DirAzim = 'West-South-West'; + elseif Testa > 258.75 && Testa <= 281.25 + DirAzim = 'West'; + elseif Testa > 281.25 && Testa <= 303.75 + DirAzim = 'West-North-West'; + elseif Testa > 303.75 && Testa <= 326.25 + DirAzim = 'North-West'; + elseif Testa > 326.25 && Testa <= 348.75 + DirAzim = 'North-North-West'; + else + DirAzim = 'North'; + end + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Azimuth_ENG.png')); + saveas(azimuth,TempName); + ChartAZ = Image(TempName); + ChartAZ.Style = {ScaleToFit}; + ChartAZ_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Azimuth of cumulative differential '... + 'displacements vs depth, recorded starting from the monitoring reference date']); + FIG_ENG = FIG_ENG+1; + ChartAZ_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + SE_ENG = Section(); + SE_ENG.Title = sezTilt; + close(figure(2)) + end + + testo = Paragraph(['I grafici seguenti riportano i valori di spostamento differenziale locale e cumulato '... + 'misurati dal sensore MEMS 3D lungo la direzione di massima pendenza, '... + 'registrati durante il periodo temporale di riferimento e calcolati a partire dalla lettura di '... + 'riferimento riportata in Tabella 1. ']); + testo2 = Paragraph(['In particolare, il massimo spostamento differenziale locale registrato durante il periodo '... + 'temporale di riferimento ' char(232) ' pari a ' num2str((MaxDispMESE), '%0.1f') ' mm alla profondit' char(224) ... + ' di ' num2str(MaxDispProfMESE) ' metri. Lo spostamento cumulato in testa risulta pari a ' num2str(DispMese(end,end),'%0.1f') ' mm.']); + testo3 = Paragraph(['Gli stessi dati relativi all''intero periodo di monitoraggio rilevano un massimo spostamento '... + 'differenziale locale pari a ' num2str((MaxDisp), '%0.1f') ' mm, in corrispondenza di una profondit' char(224) ... + ' di ' num2str(MaxDispProf) ' metri. Lo spostamento cumulato in testa risulta pari a ' num2str(Spost(end,end)) ' mm.']); + testo4 = Paragraph(['Il grafico seguente mostra l''andamento dell''azimut ottenuto a partire dai dati cumulati '... + 'al variare della profondit' char(224) ', calcolati a partire dalla lettura di riferimento. Attualmente, il valore ' ... + 'rilevato in testa allo strumento indica uno spostamento in direzione ' DirAzim '.']); + testo5 = Paragraph(['Si ricorda che l''azimut ' char(232) ' una rappresentazione della direzione '... + 'di movimento del singolo sensore, calcolato a partire dai dati cumulati. '... + 'Il parametro viene calcolato indipendentemente dall''ordine di grandezza '... + 'dello spostamento misurato: ad esempio, uno spostamento sub-millimetrico '... + 'e uno centimetrico nella stessa direzione saranno caratterizzati dallo stesso '... + 'valore di azimut. Per questo motivo, ' char(232) ' opportuno considerare tale '... + 'grandezza come significativa solo nel caso di spostamenti di entit' char(224) ... + ' rilevante.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + testo3.HAlign = 'justify'; + testo4.HAlign = 'justify'; + testo5.HAlign = 'justify'; + add(DT,sezTilt); + add(DT,testo); + add(DT,testo2); + add(DT,testo3); + add(DT,Chart); + add(DT,Chart_capM); + add(DT,testo4); + add(DT,testo5); + add(DT,ChartAZ); + add(DT,ChartAZ_cap); + add(DT,br); + % ENG + if activeEN == 1 + testo = Paragraph(['The following graphs shows the local and differential cumulative displacements '... + 'recorded by 3D MEMS sensor along the maximum grade direction during the reference monitoring period '... + 'and starting from the reference date reported in Tab. 1. The maximum local differential displacement '... + 'recorded during the reference time period equals ' num2str((MaxDispMESE),'%0.1f') ' mm at a depth of '... + num2str(abs(MaxDispProfMESE)) ' m. The cumulative displacements at the ground level is '... + num2str(DispMese(end,end),'%0.1f') ' mm.']); + testo2 = Paragraph(['The same analysis related to the whole monitoring period highlights a maximum local '... + 'differential displacement of ' num2str((MaxDisp), '%0.1f') ' mm, at a depth of ' num2str(abs(MaxDispProf)) ... + ' m. The cumulative displacement equals ' num2str(Spost(end,end)) ' mm.']); + testo3 = Paragraph(['The following graph shows the azimuth obtained through cumulative displacements, '... + 'starting from the reference date. The direction identified is ' DirAzim '.']); + testo4 = Paragraph(['It is necessary to underline that the azimuth represents the movement direction '... + 'of every single sensor, calculated starting from differential cumulative displacements. '... + 'The parameter is always processed, regardless of the displacement measured: a sub-millimeters '... + 'or a centimeters movements in the same direction will show the same azimuth. '... + 'For this reason, it is appropriate to consider the result as significant only for relevant '... + 'displacements.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + testo3.HAlign = 'justify'; + testo4.HAlign = 'justify'; + add(DT_ENG,sezTilt); + add(DT_ENG,testo); + add(DT_ENG,testo2); + add(DT_ENG,Chart); + add(DT_ENG,Chart_capM); + add(DT_ENG,testo3); + add(DT_ENG,testo4); + add(DT_ENG,ChartAZ); + add(DT_ENG,ChartAZ_cap); + add(DT_ENG,br); + end + %pulisco variabili da riutilizzare per catena successiva + clear Spost; + clear Spost_local; + clear Spost_mese; + clear Spost_local_mese; + clear Prof; + clear Azim; + clear DirAzim; + clear Spost_Local_MeseX; + clear Spost_Local_MeseY; + clear diffMeseX_Local; + clear diffMeseY_Local; + clear DispMese_Local; + clear Spost_MeseX; + clear Spost_MeseY; + clear diffMeseX; + clear diffMeseY; + clear DispMese; + clear GI_MaxDispMESE_x; + clear GI_diff_x; + clear GI_MaxDispMESE_y; + clear GI_diff_y; + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + check = 1; + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + if m == 1 + add(DT_ENG,br); + end + end + end + end + end +end + +text = 'report_IPL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_IPLHR.m b/Tilt/report_IPLHR.m new file mode 100755 index 0000000..b43d494 --- /dev/null +++ b/Tilt/report_IPLHR.m @@ -0,0 +1,379 @@ +function [GI_MaxDispMESE,GI_DateIPLHR,GI_MaxDispProf,ATTIVA,FIG,FIG_ENG] = report_IPLHR(... + rIPLHR,m,NodoInPlaceLinkHR,toolrif,unitrif,datarif,firstdata_num,Font_caption,... + Font_tools,siteID,toolrifID,DT,DT_ENG,FIG,FIG_ENG,br,colonna2,colonna2bis,status,... + ATTIVA,activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_IPLHR function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +GI_MaxDispMESE = []; +GI_DateIPLHR = []; +GI_MaxDispProf = []; +check = 0; +NODATA(m,1) = 0; +while check == 0 + if status(m,1) == 1 + if ATTIVA == 1 + testo = Paragraph('Catena non ancora installata o inattiva.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array not installed or inactive.'); + add(DT_ENG,testo); + end + end + check = 1; + 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 + check = 1; + else + for n = 1:rIPLHR(m,1) + NodeNum = num2str(NodoInPlaceLinkHR(n,m)); + comando = ['select EventDate, EventTime, HShift_local, HShift, NodeDepth, '... + 'XShift, YShift, X, Y 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 + if n == 1 % Il primo lo scrivo e creo la variabile di controllo + else + [rS,~] = size(Spost_local); + if rD ~= rS + NODATA(m,1) = 2; + check = 0; + break + else + check = 1; + end + end + % dall'inizio + Spost_local(:,n) = cell2mat((Dati(:,3)))*1000; % Loc 2D + Spost(:,n) = (cell2mat(Dati(:,4)))*1000; % Cum 2D + Prof(:,n) = -(cell2mat(Dati(1,5))); % Profondità + % Locali ultimo mese + Spost_Local_MeseX(:,n) = cell2mat(Dati(:,6)); % Loc X ultimo mese + Spost_Local_MeseY(:,n) = cell2mat(Dati(:,7)); % Loc Y ultimo mese + diffMeseX_Local(1,n) = Spost_Local_MeseX(end,n)-Spost_Local_MeseX(1,n); + diffMeseY_Local(1,n) = Spost_Local_MeseY(end,n)-Spost_Local_MeseY(1,n); + DispMese_Local(1,n) = sqrt(diffMeseX_Local(1,n)^2 + diffMeseY_Local(1,n)^2)*1000; + % Cumulati ultimo mese + Spost_MeseX(:,n) = cell2mat(Dati(:,8)); % Cum X ultimo mese + Spost_MeseY(:,n) = cell2mat(Dati(:,9)); % Cum Y ultimo mese + diffMeseX(1,n) = Spost_MeseX(end,n)-Spost_MeseX(1,n); + diffMeseY(1,n) = Spost_MeseY(end,n)-Spost_MeseY(1,n); + DispMese(1,n) = sqrt(diffMeseX(1,n)^2 + diffMeseY(1,n)^2)*1000; + else + NODATA(m,1) = 1; + check = 1; + end + end + if NODATA(m,1) == 0 + if strcmp(colonna2bis(m+1,1),colonna2(m+1,1)) == 0 % data zero = data riferimento + clear Spost; + clear Spost_local; + clear Azimuth; + datarifNEW = datestr(firstdata_num{m+1,1},'yyyy-mm-dd'); % data riferimento definita sul sito + for nw = 1:rIPLHR(m,1) + NodeNum = num2str(NodoInPlaceLinkHR(nw,m)); + comando = ['select EventDate, EventTime, HShift_local, HShift, NodeDepth, XShift, YShift, X, Y '... + 'from ElabDataView where EventDate = ''' datarifNEW ''' and ToolNameID = ''' char(toolrif) ... + ''' and UnitName = ''' char(unitrif) ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DatiNEW = curs.Data; % dati registrati alla data di riferimento + [~,rC] = size(DatiNEW); + if rC ~= 1 + % dalla data di riferimento + Spost_Local_X_RIF(:,nw) = cell2mat(DatiNEW(:,6)); %Loc X data rif + Spost_Local_Y_RIF(:,nw) = cell2mat(DatiNEW(:,7)); %Loc Y data rif + diffX_Local_RIF(1,nw) = Spost_Local_MeseX(end,nw)-Spost_Local_X_RIF(1,nw); + diffY_Local_RIF(1,nw) = Spost_Local_MeseY(end,nw)-Spost_Local_Y_RIF(1,nw); + Spost_local(1,nw) = sqrt(diffX_Local_RIF(1,nw)^2 + diffY_Local_RIF(1,nw)^2)*1000; + + Spost_X_RIF(:,nw) =cell2mat(DatiNEW(:,8)); % Cum X data rif + Spost_Y_RIF(:,nw) =cell2mat(DatiNEW(:,9)); % Cum Y data rif + diffX_RIF(1,nw) = Spost_MeseX(end,nw)-Spost_X_RIF(1,nw); + diffY_RIF(1,nw) = Spost_MeseY(end,nw)-Spost_Y_RIF(1,nw); + Spost(1,nw) = sqrt(diffX_RIF(1,nw)^2 + diffY_RIF(1,nw)^2)*1000; + else + NODATA(m,1) = 1; + end + end + % Approssimo gli spostamenti al decimo di millimetro + conv = Spost*10; + conv = round(conv); + Spost = conv/10; + end + + MaxDisp = max(Spost_local(end,:)); + Index = find(Spost_local(end,:) == MaxDisp); + MaxDispProf = Prof(1,Index(1)); + + MaxDispMESE = max(DispMese_Local(end,:)); + IndexMESE = find(DispMese_Local(end,:) == MaxDispMESE); + MaxDispProfMESE = Prof(1,IndexMESE(1)); + + % aggiungo ancora + comando = ['select nodetype_id, depth, num from nodes where tool_id = ''' num2str(cell2mat(toolrifID)) ... + ''' and nodetype_id = 9 order by num']; + Anc = fetch(conn,comando); + ProfAnc = -(cell2mat((Anc(:,2)))); + Prof = [ProfAnc Prof]; + [rt,~] = size(Spost_local); + ancoraTL = zeros(rt,1); + Spost_local = [ancoraTL Spost_local]; + Spost = [ancoraTL Spost]; + DispMese_Local = [0 DispMese_Local]; + DispMese = [0 DispMese]; + + % per grafici integrati + GI_MaxDispMESE_x = Spost_Local_MeseX(:,IndexMESE(1)); % x del nodo a maggior spostamento + GI_diff_x = GI_MaxDispMESE_x(:,:)- GI_MaxDispMESE_x(1,1); % differenza + GI_MaxDispMESE_y = Spost_Local_MeseY(:,IndexMESE(1));% y del nodo a maggior spostamento + GI_diff_y = GI_MaxDispMESE_y(:,:)- GI_MaxDispMESE_y(1,1); % differenza + GI_MaxDispMESE = sqrt((GI_diff_x).^2 + (GI_diff_y).^2)*1000; % risultante + GI_DateIPLHR = Date; + GI_MaxDispProf = MaxDispProfMESE; + + % --- grafico locali-profondità DALL'INIZIO --- + figure(1) + subplot(1,2,1); + plot(DispMese_Local,Prof); + hold on + plot(Spost_local(end,:),Prof); + title('Spostamenti Locali 2D'); + xlabel('Spostamento [mm]'); + ylabel(['Profondit' char(224) ' [m]']); + h = gca; + h.XAxis.MinorTick = 'on'; + if MaxDisp < 10 % mm + xlim([-inf 10]); + end + grid on + grid minor + lgd = legend('Periodo di riferimento','Intero periodo','Location','southeast'); + lgd.FontSize = 6; + + % Grafico Cumulati + subplot(1,2,2); + plot(DispMese,Prof); + hold on + DispCum = plot(Spost(end,:),Prof); + title('Spostamenti Cumulati 2D'); + xlabel('Spostamento [mm]'); + ylabel(['Profondit' char(224) ' [m]']); + h = gca; + h.XAxis.MinorTick = 'on'; + if max(Spost(end,:)) < 10 + xlim([-inf 10]); + end + grid on + grid minor +% legend('Periodo di riferimento','Intero periodo','Location','southeast','FontSize',8); +% lgd.FontSize = 6; +% + TempName = char(strcat('Report',siteID,'-', char(toolrif),'DispIPL.png')); + saveas(DispCum,TempName); + Chart = Image(TempName); + if m > 1 + for C = 1:m-1 + if status(C,1) == 3 || status(C,1) == 1 + Chart.Style = {Height('10cm'),HAlign('center')}; + break + else + Chart.Style = {ScaleToFit}; + end + end + else + Chart.Style = {ScaleToFit}; + end + Chart.Style = {ScaleToFit}; + Chart_capM = Paragraph(['Fig. ' num2str(FIG) ' - Spostamenti differenziali locali e cumulati in '... + 'direzione di massima pendenza registrati dalla catena '... + 'durante il periodo temporale di riferimento e a partire '... + 'dalla data di riferimento riportata in Tabella 1']); + FIG = FIG+1; + Chart_capM.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + close(figure(1)) + + SE = Section(); + sezTilt = Heading3('In Place Link HR'); + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SE.Title = sezTilt; + + % ENG + if activeEN == 1 + figure(1) + subplot(1,2,1); + plot(DispMese_Local,Prof); + hold on + plot(Spost_local(end,:),Prof); + title('2D Local Displacements'); + xlabel('Displacement [mm]'); + ylabel('Depth [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + if MaxDisp < 10 % mm + xlim([-inf 10]); + end + grid on + grid minor + + subplot(1,2,2); + plot(DispMese,Prof); + hold on + DispCum = plot(Spost(end,:),Prof); + title('2D Cumulative Displacements'); + xlabel('Displacements [mm]'); + ylabel('Depth [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + if max(Spost(end,:)) < 10 + xlim([-inf 10]); + end + grid on + grid minor + lgd = legend('Last period','Entire period','Location','southeast'); + lgd.FontSize = 6; + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Disp_ENG.png')); + saveas(DispCum,TempName); + Chart = Image(TempName); + if m > 1 + for C = 1:m-1 + if status(C,1) == 3 || status(C,1) == 1 + Chart.Style = {Height('10cm'),HAlign('center')}; + break + else + Chart.Style = {ScaleToFit}; + end + end + else + Chart.Style = {ScaleToFit}; + end + Chart.Style = {ScaleToFit}; + Chart_capM = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Local and cumulative '... + 'differential displacements along maximum grade direction, '... + 'recorded during the monitoring reference period and starting from the '... + 'reported in Tab. 1']); + FIG_ENG = FIG_ENG+1; + Chart_capM.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + close(figure(1)) + + SE_ENG = Section(); + sezTilt_ENG = Heading3('In Place Link HR'); + sezTilt_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SE_ENG.Title = sezTilt; + end + + testo = Paragraph(['I grafici seguenti riportano i valori di spostamento differenziale locale e cumulato '... + 'misurati dal sensore elettrolitico 2D lungo la direzione di massima pendenza, '... + 'registrati durante il periodo temporale di riferimento e calcolati a partire dalla lettura di '... + 'riferimento riportata in Tabella 1. ']); + testo2 = Paragraph(['In particolare, il massimo spostamento differenziale locale registrato durante il periodo '... + 'temporale di riferimento ' char(232) ' pari a ' num2str((MaxDispMESE), '%0.1f') ' mm alla profondit' char(224) ... + ' di ' num2str(MaxDispProfMESE) ' metri. Lo spostamento cumulato in testa risulta pari a ' num2str(DispMese(end,end),'%0.1f') ' mm.']); + testo3 = Paragraph(['Gli stessi dati relativi all''intero periodo di monitoraggio rilevano un massimo spostamento '... + 'differenziale locale pari a ' num2str((MaxDisp), '%0.1f') ' mm, in corrispondenza di una profondit' char(224) ... + ' di ' num2str(MaxDispProf) ' metri. Lo spostamento cumulato in testa risulta pari a ' num2str(Spost(end,end)) ' mm.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + testo3.HAlign = 'justify'; + add(DT,sezTilt); + add(DT,testo); + add(DT,testo2); + add(DT,testo3); + add(DT,Chart); + add(DT,Chart_capM); + add(DT,br); + % ENG + if activeEN == 1 + testo = Paragraph(['The following graphs shows the local and differential cumulative displacements '... + 'recorded by 3D MEMS sensor along the maximum grade direction during the reference monitoring period '... + 'and starting from the reference date reported in Tab. 1. The maximum local differential displacement '... + 'recorded during the reference time period equals ' num2str((MaxDispMESE),'%0.1f') ' mm at a depth of '... + num2str(abs(MaxDispProfMESE)) ' m. The cumulative displacements at the ground level is '... + num2str(DispMese(end,end),'%0.1f') ' mm.']); + testo2 = Paragraph(['The same analysis related to the whole monitoring period highlights a maximum local '... + 'differential displacement of ' num2str((MaxDisp), '%0.1f') ' mm, at a depth of ' num2str(abs(MaxDispProf)) ... + ' m. The cumulative displacement equals ' num2str(Spost(end,end)) ' mm.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + add(DT_ENG,sezTilt); + add(DT_ENG,testo); + add(DT_ENG,testo2); + add(DT_ENG,Chart); + add(DT_ENG,Chart_capM); + add(DT_ENG,br); + end + %pulisco variabili da riutilizzare per catena successiva + clear Spost; + clear Spost_local; + clear Spost_mese; + clear Spost_local_mese; + clear Prof; + clear Azim; + clear DirAzim; + clear Spost_Local_MeseX; + clear Spost_Local_MeseY; + clear diffMeseX_Local; + clear diffMeseY_Local; + clear DispMese_Local; + clear Spost_MeseX; + clear Spost_MeseY; + clear diffMeseX; + clear diffMeseY; + clear DispMese; + clear GI_MaxDispMESE_x; + clear GI_diff_x; + clear GI_MaxDispMESE_y; + clear GI_diff_y; + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + check = 1; + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + if m == 1 + add(DT_ENG,br); + end + end + end + end + end +end + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_IPLHR function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_KL.m b/Tilt/report_KL.m new file mode 100755 index 0000000..d5b3235 --- /dev/null +++ b/Tilt/report_KL.m @@ -0,0 +1,530 @@ +function [GI_AngoloKL,GI_NumKL,GI_DateKL,ATTIVA,FIG,FIG_ENG] = report_KL(rKL,m,... + NodoKlinoLink,toolrif,unitrif,datarif,contunit,Font_caption,Font_tools,... + siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,activeEN,colonna4,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_KL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +GI_AngoloXKL = []; +GI_AngoloYKL = []; +GI_AngoloKL = []; +GI_NumKL = []; +GI_DateKL = []; +NODATA(m,1) = 0; +check = 0; +while check == 0 + if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('Catena non ancora installata o inattiva.'); + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array not installed or inactive.'); + add(DT_ENG,testo); + end + end + check = 1; + elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoraggio completato. Invitiamo a visitare la '... + 'piattaforma web per la visione dei dati storici.']); + 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 + check = 1; + else + KE = Section(); + if activeEN == 1 + KE_EN = Section(); + end + titolo = 1; + + if strcmp(char(colonna4(m+1,1)),'Klino Array D2W') == 1 % Clinometro Wi-Fi + 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 modulo Wi-Fi registrati '... + 'durante il periodo di monitoraggio sono riportati di seguito. Il corretto funzionamento '... + 'del sistema ' char(232) ' assicurato per una carica superiore a 7 V. L''ultimo dato '... + 'disponibile ' char(232) ' pari a ' num2str(Batteria(end,1)) ' V.']); + testoB2 = Paragraph(['Il modulo 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 D2W'); + 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,'-', num2str(m) ,'-D2W.png')); + saveas(GMUX,TempName); + ChartGMUX = Image(TempName); + ChartGMUX.Style = {Height('8cm'),HAlign('center')}; + if Batteria(end,1) > 6.5 + TempNameB = char(strcat('B_13.jpg')); + elseif Batteria(end,1) > 6 + TempNameB = char(strcat('B_12.jpg')); + elseif Batteria(end,1) > 5.8 + TempNameB = char(strcat('B_115.jpg')); + elseif Batteria(end,1) > 5.6 + TempNameB = char(strcat('B_11.jpg')); + else + TempNameB = char(strcat('B_10.jpg')); + end + 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) ' - Livello di carica della batteria e temperatura del '... + 'D2W registrati durante il periodo di riferimento']); + FIG = FIG+1; + lot_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + Batt = Section(); + sezBATT = Heading3('D2W - 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)); + + if activeEN == 1 + testoB1 = Paragraph(['The following chart reports the D2W battery level trend recorded '... + 'during the reference time period. '... + 'The correct functioning of the data acquisition system is guaranteed for a '... + 'minimum level of 7 V. The last available data is equal to ' num2str(Batteria(end,1)) ' V.']); + testoB2 = Paragraph(['The module 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.']); + testoB1.HAlign = 'justify'; + testoB2.HAlign = 'justify'; + + % grafico batteria + figure(19) + plot(Date,Batteria); + hold on + title('D2W 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,'-D2W_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 D2W 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('D2W - 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 + end + end + + for k = 1:rKL(m,1) + NodeNum = num2str(NodoKlinoLink(k,m)); + comando = ['select EventDate, EventTime, XShift, YShift, T_node 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 + TiltX(:,k) = cell2mat(Dati(:,3)); % asse x + TiltY(:,k) = cell2mat(Dati(:,4)); % asse y + TempKL(:,k) = cell2mat(Dati(:,5)); % temperatura + if k == 1 % Il primo lo scrivo e creo la variabile di controllo + check = 1; + else + [rS,~] = size(TiltX(:,k-1)); + if rD ~= rS + NODATA(m,1) = 2; + check = 0; + break + else + check = 1; + end + end + else + NODATA(m,1) = 1; + check = 1; + end + if NODATA(m,1) == 0 + % grafico inclinazione-tempo asse X,Y NELL'ULTIMO MESE + figure(1) + subplot(2,1,1); % (righe colonne posizione) + pbaspect([3 1 1]); + yyaxis left + plot(Date,TiltX(:,k)); + MAX = max(TiltX(:,k)); + MIN = min(TiltX(:,k)); + if MIN > -0.1 && MAX < 0.1 + ylim([-0.1 0.1]); + end + if isnan(TempKL(:,k)) == 0 + yyaxis right + hold on + plot(Date,TempKL,':','LineWidth',1.1); + yyaxis right + ylabel(['Temperatura [' char(176) 'C]']); + set(gca,'YColor','k'); + end + xlim([Date(1)-1 Date(end)+1]); + title(['Inclinazione clinometro ' NodeNum ' - asse X']); + xlabel('Data [gg/mm/aaaa]'); + yyaxis left + ylabel(['Inclinazione [' char(176) ']']); + set(gca,'YColor','k'); + +% str(1,1) = cellstr('Tilt X'); +% str(2,1) = cellstr('Temperature'); +% legend(str,'Location','southwest','FontSize',9); + + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + + hold off + subplot(2,1,2) + pbaspect([3 1 1]); + yyaxis left + InclY = plot(Date,TiltY(:,k)); + MAX = max(TiltY(:,k)); + MIN = min(TiltY(:,k)); + if MIN > -0.1 && MAX < 0.1 + ylim([-0.1 0.1]); + end + if isnan(TempKL) == 0 + yyaxis right + hold on + InclY = plot(Date,TempKL(:,k),':','LineWidth',1.1); + yyaxis right + ylabel(['Temperatura [' char(176) 'C]']); + set(gca,'YColor','k'); + end + xlim([Date(1)-1 Date(end)+1]); + title(['Inclinazione clinometro ' NodeNum ' - asse Y']); + xlabel('Data [gg/mm/aaaa]'); + yyaxis left + ylabel(['Inclinazione [' char(176) ']']); + set(gca,'YColor','k'); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + +% str(1,1) = cellstr('Tilt Y'); +% str(2,1) = cellstr('Temperature'); +% legend(str,'Location','southwest'); + + legendaKL = Image(('legendaKL.png')); + legendaKL.Style = {Height('0.4cm'),HAlign('center')}; + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-Klino', NodeNum, '.png')); + saveas(InclY,TempName); + ChartKL = Image(TempName); + ChartKL.Style = {ScaleToFit}; + ChartKL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Inclinazione in direzione '... + 'strumentale X e Y registrata dal sensore MEMS '... + 'del nodo ' NodeNum ' durante il periodo temporale di riferimento']); + FIG = FIG+1; + ChartKL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + if titolo == 1 + sezKlino = Heading3('Klino Link'); + sezKlino.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KE.Title = sezKlino; + add(DT,sezKlino); + if activeEN == 0 + titolo = 0; + end + end + if k == 1 + testo = Paragraph(['I grafici seguenti riportano i valori di inclinazione assoluta misurati '... + 'nel periodo temporale di riferimento lungo gli assi strumentali X e Y dai clinometri '... + 'presenti in sito.']); + testo.HAlign = 'justify'; + add(DT,testo); + end + testo2 = Paragraph(['Il nodo numero ' NodeNum ' ha rilevato un''inclinazione massima lungo l''asse X '... + 'pari a ' num2str(round(max(TiltX(:,k)),2),'%0.2f') '' char(176) ' ed un valore minimo pari a '... + num2str(round(min(TiltX(:,k)),2), '%0.2f') '' char(176) ', per una variazione massima uguale a '... + num2str(round(max(TiltX(:,k)),2)-round(min(TiltX(:,k)),2), '%0.2f')... + char(176) '. Per quanto riguarda l''asse Y, i valori massimi e minimi sono rispettivamente '... + ' pari a ' num2str(round(max(TiltY(:,k)),2), '%0.2f') '' char(176) ' e ' num2str(round(min(TiltY(:,k)),2), '%0.2f')... + char(176) ', con una variazione massima di ' num2str(round(max(TiltY(:,k)),2)-round(min(TiltY(:,k)),2), '%0.2f')... + char(176) ' di inclinazione.']); + testo2.HAlign = 'justify'; + add(DT,testo2); + add(DT,ChartKL); + add(DT,legendaKL); + add(DT,ChartKL_cap); + add(DT,br); + close(figure(1)); + + if activeEN == 1 + % grafico inclinazione-tempo asse X,Y NELL'ULTIMO MESE + figure(1) + subplot(2,1,1); % (righe colonne posizione) + pbaspect([3 1 1]); + yyaxis left + plot(Date,TiltX(:,k)); + if isnan(TempKL(:,k)) == 0 + yyaxis right + hold on + plot(Date,TempKL,':','LineWidth',1.1); + yyaxis right + ylabel(['Temperature [' char(176) 'C]']); + set(gca,'YColor','k'); + end +% str(1,1) = cellstr('Tilt X'); +% str(2,1) = cellstr('Temperature'); +% legend(str,'Location','southwest'); + + xlim([Date(1)-1 Date(end)+1]); + title(['Tilt ' NodeNum ' - X axis']); + xlabel('Date [dd/mm/yyyy]'); + yyaxis left + ylabel(['Tilt [' char(176) ']']); + set(gca,'YColor','k'); + + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + + hold off + subplot(2,1,2) + pbaspect([3 1 1]); + yyaxis left + InclY = plot(Date,TiltY(:,k)); + if isnan(TempKL) == 0 + yyaxis right + hold on + InclY = plot(Date,TempKL(:,k),':','LineWidth',1.1); + yyaxis right + ylabel(['Temperature [' char(176) 'C]']); + set(gca,'YColor','k'); + end + xlim([Date(1)-1 Date(end)+1]); + title(['Tilt ' NodeNum ' - Y axis']); + xlabel('Date [dd/mm/yyyy]'); + yyaxis left + ylabel(['Tilt [' char(176) ']']); +% str(1,1) = cellstr('Tilt Y'); +% str(2,1) = cellstr('Temperature'); +% legend(str,'Location','southwest'); + + set(gca,'YColor','k'); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-Klino', NodeNum, '_ENG.png')); + saveas(InclY,TempName); + ChartKL = Image(TempName); + ChartKL.Style = {ScaleToFit}; + ChartKL_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Tilt recorded by MEMS sensor '... + 'during the reference monitoring period along X and Y instrumental axes of node '... + NodeNum '']); + FIG_ENG = FIG_ENG+1; + ChartKL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + if titolo == 1 + if activeEN == 0 + KE_ENG.Title = sezKlino; + add(DT_ENG,sezKlino); + titolo = 0; + end + end + if k == 1 + testo = Paragraph(['The following graphs show the tilt angles recorded along X and Y '... + 'instrumental axes during the reference monitoring period.']); + testo.HAlign = 'justify'; + add(DT_ENG,testo); + end + testo2 = Paragraph(['Node number ' NodeNum ' highlighted a maximum and a minimum tilt of '... + num2str(round(max(TiltX(:,k)),2),'%0.2f') '' char(176) ' and '... + num2str(round(min(TiltX(:,k)),2),'%0.2f') '' char(176) ' respectively, along X axis. '... + 'The angle variation equals ' num2str(round(max(TiltX(:,k)),2)-round(min(TiltX(:,k)),2), '%0.2f')... + char(176) '. Y axis showed maximum and minimum values equal to '... + num2str(round(max(TiltY(:,k)),2), '%0.2f') '' char(176) ' and ' num2str(round(min(TiltY(:,k)),2), '%0.2f')... + char(176) '. The variation is ' num2str(round(max(TiltY(:,k)),2)-round(min(TiltY(:,k)),2), '%0.2f')... + char(176) '.']); + testo2.HAlign = 'justify'; + add(DT_ENG,testo2); + add(DT_ENG,ChartKL); + add(DT_ENG,legendaKL); + add(DT_ENG,ChartKL_cap); + add(DT_ENG,br); + close(figure(1)); + end + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + if m == 1 + add(DT_ENG,br); + end + end + check = 1; + end + end + end + if rC ~= 1 + var1 = max(abs(TiltX-TiltX(1,:))); + varX = max(var1); + indX = find(var1 == varX); + var2 = max(abs(TiltX-TiltX(1,:))); + varY = max(var2); + indY = find(var2 == varX); + MAX = max(varX,varY); + indM = find(max(varX,varY)==MAX); + if indM == 1 % X + GI_AngoloXKL = TiltX(:,indX)-TiltX(1,indX); + GI_AngoloYKL = TiltY(:,indX)-TiltY(1,indX); + GI_NumKL = NodoKlinoLink(indX,m); + GI_DateKL = Date; + else % Y + GI_AngoloXKL = TiltX(:,indY)-TiltX(1,indY); + GI_AngoloYKL = TiltY(:,indY)-TiltY(1,indY); + GI_NumKL = NodoKlinoLink(indY,m); + GI_DateKL = Date; + end + end + end +end +if isempty(GI_AngoloXKL) == 0 + GI_AngoloKL(:,1) = GI_AngoloXKL; + GI_AngoloKL(:,2) = GI_AngoloYKL; +end + +text = 'report_KL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_KLHR.m b/Tilt/report_KLHR.m new file mode 100755 index 0000000..b82df67 --- /dev/null +++ b/Tilt/report_KLHR.m @@ -0,0 +1,283 @@ +function [ATTIVA,FIG,FIG_ENG] = report_KLHR(rKLHR,m,NodoKlinoLinkHR,toolrif,unitrif,... + datarif,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,... + activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_KLHR function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('Catena non ancora installata o inattiva.'); + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array not installed or inactive.'); + add(DT_ENG,testo); + end + end +elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoraggio completato. Invitiamo a visitare la '... + 'piattaforma web per la visione dei dati storici.']); + 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 + KL = Section(); + if activeEN == 1 + KL_EN = Section(); + end + titolo = 1; + + for k = 1:rKLHR(m,1) + NodeNum = num2str(NodoKlinoLinkHR(k,m)); + comando = ['select EventDate, EventTime, XShift, YShift, T_node 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 + TiltX = cell2mat(Dati(:,3)); % asse x + TiltY = cell2mat(Dati(:,4)); % asse y + TempKLHR = cell2mat(Dati(:,5)); % temperatura + + % grafico inclinazione-tempo asse X,Y NELL'ULTIMO MESE + figure(1) + subplot(2,1,1); % (righe colonne posizione) + pbaspect([3 1 1]); + yyaxis left + InclX = plot(Date,TiltX); + if isnan(TempKLHR) == 0 + yyaxis right + TempKLHR_X = plot(Date,TempKLHR,':','LineWidth',1.1); + yyaxis right + ylabel(['Temperatura [' char(176) 'C]']); + set(gca,'YColor','k'); + end + title(['Inclinazione clinometro ' NodeNum ' - asse X']); + xlabel('Data [gg/mm/aaaa]'); + yyaxis left + ylabel(['Inclinazione [' char(176) ']']); + set(gca,'YColor','k'); + + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(12); + grid on + grid minor + + hold off + subplot(2,1,2) + pbaspect([3 1 1]); + yyaxis left + InclY = plot(Date,TiltY); + if isnan(TempKLHR) == 0 + yyaxis right + TempKLHR_Y = plot(Date,TempKLHR,':','LineWidth',1.1); + yyaxis right + ylabel(['Temperatura [' char(176) 'C]']); + set(gca,'YColor','k'); + end + title(['Inclinazione clinometro ' NodeNum ' - asse Y']); + xlabel('Data [gg/mm/aaaa]'); + yyaxis left + ylabel(['Inclinazione [' char(176) ']']); + set(gca,'YColor','k'); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(12); + grid on + grid minor + + legendaKL = Image(('legendaKL.png')); + legendaKL.Style = {Height('0.7cm'),HAlign('center')}; + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-KlinoHR', NodeNum, '.png')); + saveas(InclY,TempName); + ChartKLHR = Image(TempName); + ChartKLHR.Style = {ScaleToFit}; + ChartKLHR_cap = Paragraph(['Fig. ' num2str(FIG) ' - Inclinazione in direzione strumentale X e Y '... + 'registrata dal sensore elettrolitico durante il periodo temporale di riferimento']); + FIG = FIG+1; + ChartKLHR_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + if titolo == 1 + sezKlinoHR = Heading3('Klino Link HR'); + sezKlinoHR.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KL.Title = sezKlinoHR; + add(DT,sezKlinoHR); + if activeEN == 0 + titolo = 0; + end + end + + testo = Paragraph(['I grafici seguenti riportano i valori di inclinazione assoluta misurati dal Nodo ' NodeNum ... + ' lungo gli assi strumentali X e Y del sensore elettrolitico nell''ultimo mese di monitoraggio. ']); + testo2 = Paragraph(['In questo periodo di tempo, il sensore ha rilevato un''inclinazione massima lungo l''asse X '... + 'pari a ' num2str(round(max(TiltX),2), '%0.2f') '' char(176) ' ed un valore minimo pari a '... + num2str(round(min(TiltX),2), '%0.2f') '' char(176) ', per una variazione massima uguale a '... + num2str(round(max(TiltX)-min(TiltX),2), '%0.2f')... + char(176) '. Per quanto riguarda l''asse Y, i valori massimi e minimi sono rispettivamente '... + ' pari a ' num2str(round(max(TiltY),2), '%0.2f') '' char(176) ' e ' num2str(round(min(TiltY),2), '%0.2f')... + char(176) ', con una variazione massima di ' num2str(round(max(TiltY)-min(TiltY),2), '%0.2f')... + char(176) ' di inclinazione.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if titolo == 1 + sezKlinoHR = Heading3('Klino Link HR'); + sezKlinoHR.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + KL = Section(); + KL.Title = sezKlinoHR; + add(DT,sezKlinoHR); + titolo = 0; + end + add(DT,testo); + add(DT,testo2); + add(DT,ChartKLHR); + add(DT,legendaKL); + add(DT,ChartKLHR_cap); + add(DT,br); + close(figure(1)); + + if activeEN == 1 + % grafico inclinazione-tempo asse X,Y NELL'ULTIMO MESE + figure(1) + subplot(2,1,1); % (righe colonne posizione) + pbaspect([3 1 1]); + yyaxis left + InclX = plot(Date,TiltX); + if isnan(TempKLHR) == 0 + yyaxis right + TempKLHR_X = plot(Date,TempKLHR,':','LineWidth',1.1); + yyaxis right + ylabel(['Temperature [' char(176) 'C]']); + set(gca,'YColor','k'); + end + title(['Tilt ' NodeNum ' - X axis']); + xlabel('Date [dd/mm/yyyy]'); + yyaxis left + ylabel(['Tilt [' char(176) ']']); + set(gca,'YColor','k'); + + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(12); + grid on + grid minor + + hold off + subplot(2,1,2) + pbaspect([3 1 1]); + yyaxis left + InclY = plot(Date,TiltY); + if isnan(TempKLHR) == 0 + yyaxis right + TempKLHR_Y = plot(Date,TempKLHR,':','LineWidth',1.1); + yyaxis right + ylabel(['Temperature [' char(176) 'C]']); + set(gca,'YColor','k'); + end + title(['Tilt ' NodeNum ' - Y axis']); + xlabel('Date [dd/mm/yyyy]'); + yyaxis left + ylabel(['Tilt [' char(176) ']']); + set(gca,'YColor','k'); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(12); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-KlinoHR', NodeNum, '_ENG.png')); + saveas(InclY,TempName); + ChartKLHR = Image(TempName); + ChartKLHR.Style = {ScaleToFit}; + ChartKLHR_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Tilt recorded by electrolytic tilt sensor '... + 'during the reference monitoring period along X and Y instrumental axes of node '... + NodeNum '']); + FIG_ENG = FIG_ENG+1; + ChartKLHR_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + if titolo == 1 + if activeEN == 0 + KL_EN.Title = sezKlinoHR; + add(DT_ENG,sezKlinoHR); + titolo = 0; + end + end + + testo = Paragraph(['The following graphs show the absolute tilt angles recorded along X and Y '... + 'instrumental axes during the reference monitoring period.']); + testo2 = Paragraph(['Node number ' NodeNum ' highlighted a maximum and a minimum tilt of '... + num2str(round(max(TiltX),2), '%0.2f') '' char(176) ' and '... + num2str(round(min(TiltX),2), '%0.2f') '' char(176) ' along the X axis. The angle variation equals '... + num2str(round(max(TiltX)-min(TiltX),2), '%0.2f')... + char(176) '. Y axis showed maximum and minimum values equal to '... + num2str(round(max(TiltY),2), '%0.2f') '' char(176) ' and ' num2str(round(min(TiltY),2), '%0.2f')... + char(176) ', while the variation is ' num2str(round(max(TiltY)-min(TiltY),2), '%0.2f')... + char(176) '.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if titolo == 1 + sezKlinoHR = Heading3('Klino Link HR'); + sezKlinoHR.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + KL = Section(); + KL.Title = sezKlinoHR; + add(DT_ENG,sezKlinoHR); + titolo = 0; + end + add(DT_ENG,testo); + add(DT_ENG,testo2); + add(DT_ENG,ChartKLHR); + add(DT_ENG,legendaKL); + add(DT_ENG,ChartKLHR_cap); + add(DT_ENG,br); + close(figure(1)); + end + + %pulisco variabili da riutilizzare per catena successiva + clear TiltX; + clear TiltY; + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + if m == 1 + add(DT_ENG,br); + end + end + end + end + end +end + +text = 'report_KLHR function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_LL.m b/Tilt/report_LL.m new file mode 100755 index 0000000..92f87ec --- /dev/null +++ b/Tilt/report_LL.m @@ -0,0 +1,404 @@ +function [FIG,FIG_ENG,battANALOG,ATTIVA] = report_LL(rLL,m,NodoLoadLink,toolrif,... + unitrif,datarif,contunit,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,... + br,colonna4,status,ATTIVA,battANALOG,activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_LL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +if status(m,1) == 1 + if strcmp(char(colonna4(m+1,1)),'Analog Array') == 1 % cella Analog Link + 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 + else + if ATTIVA == 1 + testo = Paragraph('Catena non ancora installata o inattiva.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array not installed or inactive.'); + add(DT_ENG,testo); + end + 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 + if strcmp(char(colonna4(m+1,1)),'Analog Array') == 1 % cella Analog Link + 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 registrati 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 registrati 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)); + + if activeEN == 1 + 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 + end + + sezLL = Heading3('Load Link'); + sezLL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + LL = Section(); + LL.Title = sezLL; + add(DT,sezLL); + if activeEN == 1 + add(DT_ENG,sezLL); + end + + for ld = 1:rLL(m,1) + NodeNum = num2str(NodoLoadLink(ld,m)); + comando = ['select EventDate, EventTime, load_value 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 + carico = cell2mat(Dati(:,3)); % carico cella + var_carico = carico-carico(1); % variazione carico + + % grafico carico + figure(5); + load = plot(Date,var_carico); + title(['Variazione di Carico - Nodo numero ' NodeNum '']); + xlabel('Data [gg/mm/aaaa]'); + ylabel('Variazione di carico [kN]'); + if strcmp(char(colonna4(m+1,1)),'Analog Array') == 1 % cella Analog Link + if max(var_carico) < 15 && min(var_carico) > -15 + ylim([-15 15]); + elseif max(var_carico) > 15 && min(var_carico) > -15 + ylim([-15 inf+1]); + elseif max(var_carico) < 15 && min(var_carico) < -15 + ylim([-inf-1 15]); + end + else % cella RSN + if max(var_carico) < 10 && min(var_carico) > -10 + ylim([-10 10]); + elseif max(var_carico) > 10 && min(var_carico) > -10 + ylim([-10 inf+1]); + elseif max(var_carico) < 20 && min(var_carico) < -10 + ylim([-inf-1 10]); + end + end + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + + hold off + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-CellaCarico', NodeNum, '.png')); + saveas(load,TempName); + ChartLL = Image(TempName); + ChartLL.Style = {Height('7.3cm'),HAlign('center')}; + ChartLL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Variazione di carico'... + ' registrato dalla cella di carico, sensore numero ' NodeNum... + ', nel periodo temporale di riferimento']); + FIG = FIG+1; + ChartLL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['Nel grafico seguente sono rappresentati i dati relativi '... + 'alla variazione di carico (in kN) registrata dai sensori appartenenti all''Analog Array.']); + testo2 = Paragraph(['Durante il periodo temporale di riferimento, il nodo numero ' NodeNum ... + ' ha rilevato una massima variazione di carico pari a '... + num2str(round(max(abs(var_carico)),2), '%0.2f') ' kN, mentre il valore di '... + 'massimo carico assoluto ' char(232) ' pari a ' num2str(round(max(carico),2), '%0.2f') ' kN.' ]); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if ld == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,ChartLL); + add(DT,ChartLL_cap); + if ld == rLL(m,1) + add(DT,br); + end + close(figure(5)); + + if activeEN == 1 + % grafico carico + figure(5); + load = plot(Date,var_carico); + title(['Load variation - Node number ' NodeNum '']); + xlabel('Date [dd/mm/yyyy]'); + ylabel('Load variation [kN]'); + if strcmp(char(colonna4(m+1,1)),'Analog Array') == 1 % cella Analog Link + if max(var_carico) < 15 && min(var_carico) > -15 + ylim([-15 15]); + elseif max(var_carico) > 15 && min(var_carico) > -15 + ylim([-15 inf+1]); + elseif max(var_carico) < 15 && min(var_carico) < -15 + ylim([-inf-1 15]); + end + else % cella RSN + if max(var_carico) < 10 && min(var_carico) > -10 + ylim([-10 10]); + elseif max(var_carico) > 10 && min(var_carico) > -10 + ylim([-10 inf+1]); + elseif max(var_carico) < 20 && min(var_carico) < -10 + ylim([-inf-1 10]); + end + end + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + hold off + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-CellaCarico', NodeNum, '_ENG.png')); + saveas(load,TempName); + ChartLL = Image(TempName); + ChartLL.Style = {Height('7.3cm'),HAlign('center')}; + ChartLL_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Load variation'... + ' recorded by the load cell, node number ' NodeNum... + ', during the reference monitoring period']); + FIG_ENG = FIG_ENG+1; + ChartLL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graph represents the load variations recorded by the sensors '... + 'that compose the Analog Array.']); + testo2 = Paragraph(['During the reference time period, node number ' NodeNum ... + ' highlighted a maximum load variations of '... + num2str(round(max(abs(var_carico)),2), '%0.2f') ' kN, while the maximum absolute load '... + 'recorded is ' num2str(round(max(carico),2), '%0.2f') ' kN.' ]); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if ld == 1 + add(DT_ENG,testo); + end + add(DT_ENG,testo2); + add(DT_ENG,ChartLL); + add(DT_ENG,ChartLL_cap); + if ld == rLL(m,1) + add(DT_ENG,br); + end + close(figure(5)); + end + + % pulisco variabili da riutilizzare per catena successiva + clear carico; + clear var_carico; + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + add(DT,br); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + if m == 1 + add(DT_ENG,br); + end + end + end + end + end +end + +text = 'report_LL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_MPBEL.m b/Tilt/report_MPBEL.m new file mode 100755 index 0000000..993febd --- /dev/null +++ b/Tilt/report_MPBEL.m @@ -0,0 +1,639 @@ +function [GI_MPB_RL,GI_MPB,GI_Base,GI_Date,FIG,FIG_ENG,battANALOG,ATTIVA] = report_MPBEL(DTcatena,... + rMPBEL,m,NodoMultiPointExtensometerLink,toolrif,unitrif,contunit,datarif,... + Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,DT_ENG,FIG,FIG_ENG,br,... + activeEN,status,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_MPBEL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +GI_Date = []; +GI_MPB = []; +GI_Base = []; +GI_MPB_RL = []; +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 + MPBE = Section(); + sezMPBELExtensometer = Heading3('MultiPoint Borehole Extensometer Link'); + sezMPBELExtensometer.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + MPBE.Title = sezMPBELExtensometer; + + 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 + MPBE_ENG = Section(); + sezMPBExt_ENG = Heading3('MultiPoint Borehole Extensometer Link'); + sezMPBExt_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + MPBE_ENG.Title = sezMPBExt_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,sezMPBELExtensometer); + if activeEN == 1 + add(DT_ENG,sezMPBExt_ENG); + end + + for mp = 1:rMPBEL(m,1) + NodeNum = num2str(NodoMultiPointExtensometerLink(mp,m)); + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z 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 + if isnan(cell2mat(Dati(:,3))) == 0 + d1(:,mp) = cell2mat(Dati(:,3)); % deformazioni base 1 + else + d1(:,mp) = 999999; + end + if isnan(cell2mat(Dati(:,4))) == 0 + d2(:,mp) = cell2mat(Dati(:,4)); % deformazioni base 2 + else + d2(:,mp) = 999999; + end + if isnan(cell2mat(Dati(:,5))) == 0 + d3(:,mp) = cell2mat(Dati(:,5)); % deformazioni base 3 + else + d3(:,mp) = 999999; + end + if isnan(cell2mat(Dati(:,6))) == 0 + d4(:,mp) = cell2mat(Dati(:,6)); % deformazioni base 4 + else + d4(:,mp) = 999999; + end + if isnan(cell2mat(Dati(:,7))) == 0 + d5(:,mp) = cell2mat(Dati(:,7)); % deformazioni base 5 + else + d5(:,mp) = 999999; + end + if isnan(cell2mat(Dati(:,8))) == 0 + d6(:,mp) = cell2mat(Dati(:,8)); % deformazioni base 6 + else + d6(:,mp) = 999999; + end + + % grafico deformazioni NELL'ULTIMO MESE + figure(5); + title(['Deformazioni misurate dal nodo numero ' NodeNum]); + d1g(:,mp) = d1(:,mp)-d1(1,mp); + MX(1) = max(d1g(:,mp)); + MN(1) = min(d1g(:,mp)); + MPB = plot(Date,d1g(:,mp)); + M = max(abs(d1g(:,mp))); + S = find(abs(d1g(:,mp))==M(1)); + D = d1g(S(1),mp); + basi = 1; + if d2(1,mp) < 999999 + hold on + d2g(:,mp) = d2(:,mp)-d2(1,mp); + MX(2) = max(d2g(:,mp)); + MN(2) = min(d2g(:,mp)); + MPB = plot(Date,d2g(:,mp)); + M(2) = max(abs(d2g(:,mp))); + S = find(abs(d2g(:,mp))==M(2)); + D(2) = d2g(S(1),mp); + basi = 2; + end + if d3(1,mp) < 999999 + hold on + d3g(:,mp) = d3(:,mp)-d3(1,mp); + MX(3) = max(d3g(:,mp)); + MN(3) = min(d3g(:,mp)); + MPB = plot(Date,d3g(:,mp)); + M(3) = max(abs(d3g(:,mp))); + S = find(abs(d3g(:,mp))==M(3)); + D(3) = d3g(S(1),mp); + basi = 3; + end + if d4(1,mp) < 999999 + hold on + d4g(:,mp) = d4(:,mp)-d4(1,mp); + MX(4) = max(d4g(:,mp)); + MN(4) = min(d4g(:,mp)); + MPB = plot(Date,d4g(:,mp)); + M(4) = max(abs(d4g(:,mp))); + S = find(abs(d4g(:,mp))==M(4)); + D(4) = d4g(S(1),mp); + basi = 4; + end + if d5(1,mp) < 999999 + hold on + d5g(:,mp) = d5(:,mp)-d5(1,mp); + MX(5) = max(d5g(:,mp)); + MN(5) = min(d5g(:,mp)); + MPB = plot(Date,d5g(:,mp)); + M(5) = max(abs(d5g(:,mp))); + S = find(abs(d5g(:,mp))==M(5)); + D(5) = d5g(S(1),mp); + basi = 5; + end + if d6(1,mp) < 999999 + hold on + d6g(:,mp) = d6(:,mp)-d6(1,mp); + MX(6) = max(d6g(:,mp)); + MN(6) = min(d6g(:,mp)); + plot(Date,d6g(:,mp)); + M(6) = max(abs(d6g(:,mp))); + S = find(abs(d6g(:,mp))==M(6)); + D(6) = d6g(S(1),mp); + basi = 6; + end + title(['Deformazioni registrate - Nodo numero ' NodeNum]); + ylabel('Deformazione [mm]'); + xlabel('Data [gg/mm/aaaa]'); + set(gca,'YColor','k'); + str(1,1) = cellstr('Base 1'); + if basi > 1 + str(2,1) = cellstr('Base 2'); + end + if basi > 2 + str(3,1) = cellstr('Base 3'); + end + if basi > 3 + str(4,1) = cellstr('Base 4'); + end + if basi > 4 + str(5,1) = cellstr('Base 5'); + end + if basi > 5 + str(6,1) = cellstr('Base 6'); + end + VAR(1) = max(MX); + VAR(2) = min(MN); + MAX = max(abs(VAR)); + IN = find(abs(VAR)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + + legend(str,'Location','northwest'); + xlim([Date(1)-1 Date(end)+1]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-MPBEL', NodeNum, '.png')); + saveas(MPB,TempName); + ChartMPBEL = Image(TempName); + ChartMPBEL.Style = {Height('7.3cm'),HAlign('center')}; + ChartMPBEL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Deformazioni '... + 'misurate dall''estensimetro multibase, nodo numero ' NodeNum... + ', nel periodo temporale di riferimento']); + FIG = FIG+1; + ChartMPBEL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + %--ENG-- + + if activeEN == 1 + % grafico deformazioni NELL'ULTIMO MESE + figure(15); + title(['Deformations meassured by node ' NodeNum]); + d1g(:,mp) = d1(:,mp)-d1(1,mp); + MX(1) = max(d1g(:,mp)); + MN(1) = min(d1g(:,mp)); + MPB = plot(Date,d1g(:,mp)); + M = max(abs(d1g(:,mp))); + S = find(abs(d1g(:,mp))==M(1)); + D = d1g(S(1),mp); + basi = 1; + if d2(1,mp) < 999999 + hold on + d2g(:,mp) = d2(:,mp)-d2(1,mp); + MX(2) = max(d2g(:,mp)); + MN(2) = min(d2g(:,mp)); + MPB = plot(Date,d2g(:,mp)); + M(2) = max(abs(d2g(:,mp))); + S = find(abs(d2g(:,mp))==M(2)); + D(2) = d2g(S(1),mp); + basi = 2; + end + if d3(1,mp) < 999999 + hold on + d3g(:,mp) = d3(:,mp)-d3(1,mp); + MX(3) = max(d3g(:,mp)); + MN(3) = min(d3g(:,mp)); + MPB = plot(Date,d3g(:,mp)); + M(3) = max(abs(d3g(:,mp))); + S = find(abs(d3g(:,mp))==M(3)); + D(3) = d3g(S(1),mp); + basi = 3; + end + if d4(1,mp) < 999999 + hold on + d4g(:,mp) = d4(:,mp)-d4(1,mp); + MX(4) = max(d4g(:,mp)); + MN(4) = min(d4g(:,mp)); + MPB = plot(Date,d4g(:,mp)); + M(4) = max(abs(d4g(:,mp))); + S = find(abs(d4g(:,mp))==M(4)); + D(4) = d4g(S(1),mp); + basi = 4; + end + if d5(1,mp) < 999999 + hold on + d5g(:,mp) = d5(:,mp)-d5(1,mp); + MX(5) = max(d5g(:,mp)); + MN(5) = min(d5g(:,mp)); + MPB = plot(Date,d5g(:,mp)); + M(5) = max(abs(d5g(:,mp))); + S = find(abs(d5g(:,mp))==M(5)); + D(5) = d5g(S(1),mp); + basi = 5; + end + if d6(1,mp) < 999999 + hold on + d6g(:,mp) = d6(:,mp)-d6(1,mp); + MX(6) = max(d6g(:,mp)); + MN(6) = min(d6g(:,mp)); + plot(Date,d6g(:,mp)); + M(6) = max(abs(d6g(:,mp))); + S = find(abs(d6g(:,mp))==M(6)); + D(6) = d6g(S(1),mp); + basi = 6; + end + title(['Deformations - Node ' NodeNum]); + ylabel('Deformations [mm]'); + xlabel('Date [dd/mm/yyyy]'); + set(gca,'YColor','k'); + str(1,1) = cellstr('Base 1'); + if basi > 1 + str(2,1) = cellstr('Rod 2'); + end + if basi > 2 + str(3,1) = cellstr('Rod 3'); + end + if basi > 3 + str(4,1) = cellstr('Rod 4'); + end + if basi > 4 + str(5,1) = cellstr('Rod 5'); + end + if basi > 5 + str(6,1) = cellstr('Rod 6'); + end + VAR(1) = max(MX); + VAR(2) = min(MN); + MAX = max(abs(VAR)); + IN = find(abs(VAR)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + + legend(str,'Location','northwest'); + xlim([Date(1)-1 Date(end)+1]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-MPBEL', NodeNum, '_ENG.png')); + saveas(MPB,TempName); + ChartMPBEL_ENG = Image(TempName); + ChartMPBEL_ENG.Style = {Height('7.3cm'),HAlign('center')}; + ChartMPBEL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Deformations '... + 'measured by the multipoint extensometer ' NodeNum... + ' during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartMPBEL_ENG_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + end + + MAX = max(M); + IN = find(MAX==M); % Base che ha misurato tale variazione + Massimo = D(IN); % Valore massimo (positivo o negativo) di deformazione misurata + + % Cerco eventuali correlazioni con Rad Array + NomeFile = strcat('Report',siteID,'-RLvsMPBEL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + Nodo = 999; + iNodo = 1; + while AAA <= rF % Cerco la coppia di sensori Rad - Multibase da correlare + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono multibase o non ci sono Rad + AAA = 2; + else + check2 = Filetesto(AAA+1,1); + if check1 == str2num(DTcatena(end-2:end)) % Il Multibase è da prendere in considerazione ed è riportato nella prima riga del file + Nodo(iNodo) = Filetesto(AAA+2,1); + iNodo = iNodo+1; + elseif check2 == str2num(DTcatena(end-2:end)) % Il Multibase è da prendere in considerazione ed è riportato nella seconda riga del file + Nodo(iNodo) = Filetesto(AAA+3,1); + iNodo = iNodo+1; + end + AAA = AAA+4; + end + end + [~,cd] = size(d1g); + if IN == 1 + if Nodo(mp) <= cd + GI_MPB_RL(:,mp) = d1g(:,Nodo(mp)); + end + GI_MPB(:,mp) = d1g(:,mp); + elseif IN == 2 + if Nodo(mp) <= cd + GI_MPB_RL(:,mp) = d2g(:,Nodo(mp)); + end + GI_MPB(:,mp) = d2g(:,mp); + elseif IN == 3 + if Nodo(mp) <= cd + GI_MPB_RL(:,mp) = d3g(:,Nodo(mp)); + end + GI_MPB(:,mp) = d3g(:,mp); + elseif IN == 4 + if Nodo(mp) <= cd + GI_MPB_RL(:,mp) = d4g(:,Nodo(mp)); + end + GI_MPB(:,mp) = d4g(:,mp); + elseif IN == 5 + if Nodo(mp) <= cd + GI_MPB_RL(:,mp) = d5g(:,Nodo(mp)); + end + GI_MPB(:,mp) = d5g(:,mp); + elseif IN == 2 + if Nodo(mp) <= cd + GI_MPB_RL(:,mp) = d6g(:,Nodo(mp)); + end + GI_MPB(:,mp) = d6g(:,mp); + else + + end + GI_Base(:,mp) = IN; + GI_Date(:,mp) = Date; + + testo = Paragraph(['Nei grafici seguenti sono rappresentati i dati relativi '... + 'alle deformazioni registrate dagli estensimetri multibase collegati all''Analog Array.']); + testo2 = Paragraph(['Durante il periodo temporale di riferimento, il nodo numero ' NodeNum... + ' ' char(232) ' stato caratterizzato da un valore massimo di deformazione differenziale pari a '... + num2str(round(Massimo,2), '%0.2f') ' mm, rilevato dalla base numero ' num2str(IN) '. ']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if mp == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,ChartMPBEL); + add(DT,ChartMPBEL_cap); + if mp == rMPBEL(m,1) + add(DT,br); + end + close(figure(5)); + + %--ENG-- + + if activeEN == 1 + testo = Paragraph(['The following graphs present deformations data '... + 'recorded by multipoint borehole extensometers integrated in the Analog Array.']); + testo2 = Paragraph(['During the reference time period, node' NodeNum... + ' measured a maximum differential deformation value of '... + num2str(round(Massimo,2), '%0.2f') ' mm, referred to Rod ' num2str(IN) '. ']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if mp == 1 + add(DT_ENG,testo); + end + add(DT_ENG,testo2); + add(DT_ENG,ChartMPBEL_ENG); + add(DT,ChartMPBEL_ENG_cap); + if mp == rMPBEL(m,1) + add(DT_ENG,br); + end + close(figure(15)); + end + %pulisco variabili da riutilizzare per catena successiva + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + end + end + end + end +end + +text = 'report_MPBEL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_PCL.m b/Tilt/report_PCL.m new file mode 100755 index 0000000..a2825d7 --- /dev/null +++ b/Tilt/report_PCL.m @@ -0,0 +1,1038 @@ +function [GI_PCL_Z,GI_PCL_Date,ATTIVA,FIG,FIG_ENG] = report_PCL(DTcatena,rPCL,m,NodoPreConvLink,... + toolrif,unitrif,datarif,firstdata_num,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,... + colonna2,colonna2bis,status,ATTIVA,activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_PCL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +check = 0; +while check == 0 + if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('Catena non ancora installata o inattiva.'); + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array not installed or inactive.'); + add(DT_ENG,testo); + end + end + check = 1; + elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoraggio completato. Invitiamo a visitare la '... + 'piattaforma web per la visione dei dati storici.']); + add(DT,testo); + if activeEN == 1 + testo = Paragraph(['Monitoring completed. Please log into the web-based platoform '... + 'to access the complete dataset.']); + add(DT_ENG,testo); + end + end + check = 1; + else + NODATAPCL(m,1) = 0; + date = datestr(datenum(colonna2{m+1,1},'dd-mm-yyyy'),'yyyy-mm-dd'); % data riferimento definita sul sito + % posizione di progetto dei nodi + comando = ['select EventDate, EventTime, Y, Z from ElabDataView where EventDate = ''' ... + date ''' and ToolNameID = ''' char(toolrif) ''' and UnitName = ''' char(unitrif) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + SezioneYZ = curs.Data; + Datasez = SezioneYZ(1,1); + Orasez = SezioneYZ(1,2); + [ry,~] = size(SezioneYZ); + scrivi = 1; + % ho scaricato tutti i dati del giorno di installazione, prendo + % i primi in ordine temporale per ciascun nodo + for cc = 1:ry + if strcmp(SezioneYZ(cc,1),Datasez)==1 && strcmp(SezioneYZ(cc,2),Orasez) ==1 + CoordY(scrivi,1) = SezioneYZ(cc,3); + CoordZ(scrivi,1) = SezioneYZ(cc,4); + scrivi = scrivi+1; + end + end + + comando = ['select id from units where name like ''' char(unitrif) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + unitID = curs.Data; + + % Data di fine PreConvergenza + comando = ['select prod_date_node from tools where unit_ID like ''' ... + num2str(cell2mat(unitID)) ''' and name like ''' DTcatena ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + dati = curs.Data; + stringa = cell2mat(dati(1,1)); + if strcmp(stringa,'null') || strcmp(stringa,'No Data') + data_PC = 0; + else + data_PC = stringa(1,1:10); + end + if data_PC ~= 0 + % Scarico dati di Fine PreConvergenza + Num = zeros(rPCL(m,1),1); + for p = 1:rPCL(m,1) + NodeNum = num2str(NodoPreConvLink(p,m)); + comando = ['select EventDate, EventTime, ZShift, Z, Y from ElabDataView where EventDate < ''' ... + data_PC ''' and ToolNameID = ''' char(toolrif) ''' and UnitName = ''' char(unitrif) ... + ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Dati_PC = curs.Data; + + Num(p,1) = NodoPreConvLink(p,m); + + [rD,rC] = size(Dati_PC); + if rC ~= 1 + T = [cell2mat(Dati_PC(:,1)) repmat(' ', [rD,1]) cell2mat(Dati_PC(:,2))]; + Date = datenum(T); % Data + + % Fine Pre-Convergenza + asseZ_PC(:,p) = 1000*cell2mat(Dati_PC(:,3)); + asseZ_Cum_PC(:,p) = 1000*cell2mat(Dati_PC(:,4)); + diffZ_PC(:,p) = asseZ_PC(:,p)-asseZ_PC(1,p); % mm + Z_Loc_PC(1,p) = asseZ_PC(end,p)-asseZ_PC(1,p); + Z_Cum_PC(1,p) = asseZ_Cum_PC(end,p)-asseZ_Cum_PC(1,p); + Y_PC(1,p) = cell2mat(Dati_PC(end,5)); + end + end + end + + % Scarico dati odierni + Num = zeros(rPCL(m,1),1); + for p = 1:rPCL(m,1) + NodeNum = num2str(NodoPreConvLink(p,m)); + comando = ['select EventDate, EventTime, ZShift, Z, Y 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; + Num(p,1) = NodoPreConvLink(p,m); + + [rD,rC] = size(Dati); + if rC ~= 1 + T = [cell2mat(Dati(:,1)) repmat(' ', [rD,1]) cell2mat(Dati(:,2))]; + Date = datenum(T); % Data + if p == 1 % Il primo lo scrivo e creo la variabile di controllo + else + [rS,~] = size(asseZ); + if rD ~= rS + NODATA(m,1) = 1; + check = 0; + break + else + check = 1; + end + end + + % Ultimo mese + asseZ(:,p) = 1000*cell2mat(Dati(:,3)); + asseZ_Cum(:,p) = 1000*cell2mat(Dati(:,4)); + diffZ(:,p) = asseZ(:,p)-asseZ(1,p); % mm + Z_Loc(1,p) = asseZ(end,p)-asseZ(1,p); + Z_Cum(1,p) = asseZ_Cum(end,p)-asseZ_Cum(1,p); + Z_Loc_Tot(1,p) = asseZ(end,p); + Z_Cum_Tot(1,p) = asseZ_Cum(end,p); + Y(1,p) = cell2mat(Dati(end,5)); + + else + NODATAPCL(m,1) = 1; + check = 1; + end + end + + if NODATAPCL(m,1) == 0 + if strcmp(colonna2bis(m+1,1),colonna2(m+1,1)) == 0 % data zero diversa data riferimento + datarifNEW = datestr(firstdata_num{m+1,1},'yyyy-mm-dd'); % data riferimento definita sul sito + for nw = 1:rPCL(m,1) + NodeNum = num2str(NodoPreConvLink(nw,m)); + comando = ['select EventDate, EventTime, ZShift, Z, Y from ElabDataView where EventDate >= ''' ... + datarifNEW ''' and ToolNameID = ''' char(toolrif) ''' and UnitName = ''' char(unitrif) ... + ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DatiNEW = curs.Data; + Num(nw,1) = NodoPreConvLink(nw,m); + + [~,rC] = size(DatiNEW); + if rC ~= 1 + % dalla data di riferimento + % divergenza/convergenza dei singoli nodi dall'inizio + Z_Loc_Tot(1,nw) = asseZ(end,nw)-1000*cell2mat(DatiNEW(1,3)); + Z_Cum_Tot(1,nw) = asseZ_Cum(end,nw)-1000*cell2mat(DatiNEW(1,4)); + if data_PC ~= 0 + % Solo periodo di PreConvergenza + Z_Loc_PC(1,nw) = asseZ_PC(end,nw)-1000*cell2mat(DatiNEW(1,3)); + Z_Cum_PC(1,nw) = asseZ_Cum_PC(end,nw)-1000*cell2mat(DatiNEW(1,4)); + end + else + NODATAPCL(m,1) = 1; + end + end + end + GI_PCL_Date = Date; + % Cerco eventuali correlazioni con Cir Array + NomeFile = strcat('Report',siteID,'-PCLvsTuL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + Var = 0; + while AAA < rF % A un PreConv possono competere più Cir + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono PreConv Array o non ci sono Cir + AAA = 2; + else + check2 = Filetesto(AAA+1,1); + if check1 == str2num(DTcatena(end-2:end)) % Il PreConv è da prendere in considerazione ed è riportato nella prima riga del file + Nodo = Filetesto(AAA+2,1); + Var = 1; + elseif check2 == str2num(DTcatena(end-2:end)) % Il PreConv è da prendere in considerazione ed è riportato nella seconda riga del file + Nodo = Filetesto(AAA+3,1); + Var = 1; + end + AAA = AAA+4; + end + end + if Var == 1 + GI_PCL_Z = diffZ(:,Nodo); + else + GI_PCL_Z = []; + end + + % --- grafico spostamenti locali - Periodi di PreConvergenza --- + figure(1) + Y = round(Y); + if data_PC ~= 0 + Disp_Loc_PC = bar(Y_PC,Z_Loc_PC'); + Z = Z_Loc_PC; + else + Disp_Loc_PC = bar(Y,Z_Loc'); + Z = Z_Loc; + end + title('Spostamenti locali - Periodo di Pre-Convergenza'); + ylabel('Spostamento [mm]'); + xlabel('Progressiva [m]'); + maxY = max(Y); + if maxY > 0 + xticks(0:1:maxY) + else + xticks(Y(end):1:0); + end + h = gca; + h.YAxis.MinorTick = 'on'; + grid on + if maxY < 0 % mm + xlim([Y_PC(end)-1 0]); + else + xlim([0 maxY+1]) + end + grid on + iniY = min(min(Z',Z_Loc')); + endY = max(max(Z',Z_Loc')); + MAX = max(abs(iniY),endY); + if MAX > 2.5 % Limiti Asse Y + ylim([-MAX-1 MAX+1]) + else + ylim([-2.5 +2.5]); + end + TempName1 = char(strcat('Report',siteID,'-', char(toolrif),'Z_Loc_PC_PCL.png')); + saveas(Disp_Loc_PC(1),TempName1); + close(figure(1)) + + % ENG + figure(1) + if data_PC ~= 0 + Disp_Loc_PC = bar(Y_PC,Z_Loc_PC'); + else + Disp_Loc_PC = bar(Y,Z_Loc'); + end + title('Local displacements - Pre-Convergence phase'); + ylabel('Displacement [mm]'); + xlabel('Position [m]'); + if maxY > 0 + xticks(0:1:maxY) + else + xticks(Y(end):1:0); + end + h = gca; + h.YAxis.MinorTick = 'on'; + grid on + if maxY < 0 % mm + xlim([Y_PC(end)-1 0]); + else + xlim([0 maxY+1]) + end + grid on + if MAX > 2.5 % Limiti Asse Y + ylim([-MAX-1 MAX+1]) + else + ylim([-2.5 +2.5]); + end + TempName1_ENG = char(strcat('Report',siteID,'-', char(toolrif),'Z_Loc_PC_PCL_ENG.png')); + saveas(Disp_Loc_PC(1),TempName1_ENG); + close(figure(1)) + + % --- grafico spostamenti locali - Periodi di riferimento --- + figure(2) + Y = round(Y); + Disp_Loc_PCL = bar(Y,Z_Loc'); + title('Spostamenti locali - Periodo di riferimento'); + ylabel('Spostamento [mm]'); + xlabel('Progressiva [m]'); + maxY = max(Y); + minY = min(Y); + MAXY = max(abs(minY),maxY); + IY = find(max(abs(minY),maxY) == MAXY); + maxY = Y(IY); + if maxY > 0 + xticks(0:1:maxY) + else + xticks(Y(end):1:0); + end + h = gca; + h.YAxis.MinorTick = 'on'; + grid on + if MAX > 2.5 % Limiti Asse Y + ylim([-MAX-1 MAX+1]) + else + ylim([-2.5 +2.5]); + end + grid on + if iniY < 2.5 && endY > 2.5 % Limiti Asse Y + elseif iniY < 2.5 + ylim([iniY-1 2.5]); + elseif endY < 2.5 + ylim([-2.5 endY+1]); + end + TempName2 = char(strcat('Report',siteID,'-', char(toolrif),'Z_Loc_PCL.png')); + saveas(Disp_Loc_PCL(1),TempName2); + close(figure(2)) + + ChartPCL = Image(TempName1); + ChartPCL2 = Image(TempName2); + lot1 = Table({ChartPCL, ChartPCL2}); + lot1.Style = {ResizeToFitContents(false), Width('100%')}; + ChartPCL.Style = {Height('6.6cm'),HAlign('center')}; + ChartPCL2.Style = {Height('6.6cm'),HAlign('center')}; + ChartPCL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Spostamenti '... + 'differenziali locali in direzione verticale registrati durante '... + 'il periodo di pre-convergenza e il periodo di riferimento']); + ChartPCL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + FIG = FIG+1; + + if activeEN == 1 + figure(2) + Y = round(Y); + Disp_Loc_PCL = bar(Y,Z_Loc'); + title('Local displacements - Reference time period'); + ylabel('Displacement [mm]'); + xlabel('Position [m]'); + maxY = Y(IY); + if maxY > 0 + xticks(0:1:maxY) + else + xticks(Y(end):1:0); + end + h = gca; + h.YAxis.MinorTick = 'on'; + grid on + if MAX > 2.5 % Limiti Asse Y + ylim([-MAX-1 MAX+1]) + else + ylim([-2.5 +2.5]); + end + grid on + if iniY < 2.5 && endY > 2.5 % Limiti Asse Y + elseif iniY < 2.5 + ylim([iniY-1 2.5]); + elseif endY < 2.5 + ylim([-2.5 endY+1]); + end + TempName2_ENG = char(strcat('Report',siteID,'-', char(toolrif),'Z_Loc_PCL_ENG.png')); + saveas(Disp_Loc_PCL(1),TempName2_ENG); + close(figure(2)) + + ChartPCL_ENG = Image(TempName1_ENG); + ChartPCL2_ENG = Image(TempName2_ENG); + lot1_ENG = Table({ChartPCL_ENG, ChartPCL2_ENG}); + lot1_ENG.Style = {ResizeToFitContents(false), Width('100%')}; + ChartPCL_ENG.Style = {Height('6.6cm'),HAlign('center')}; + ChartPCL2_ENG.Style = {Height('6.6cm'),HAlign('center')}; + ChartPCL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Local differential displacements '... + 'recorded in vertical direction during the pre-convergence phase and the '... + 'reference time period']); + ChartPCL_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + FIG_ENG = FIG_ENG+1; + end + + % ---Grafico Sezione Periodo PreConvergenza--- + figure(3) + contaS = 1; + contaG = 1; + contaF = 1; + for disp = 1:rPCL(m,1) + if diffZ_PC(end,disp)>0.5 + nodisuZ(contaS,1)=CoordZ(disp,1); + nodisuY(contaS,1)=CoordY(disp,1); + contaS = contaS + 1; + elseif diffZ_PC(end,disp)< -0.5 + nodigiuZ(contaG,1)=CoordZ(disp,1); + nodigiuY(contaG,1)=CoordY(disp,1); + contaG = contaG + 1; + else + nodistabZ(contaF,1)=CoordZ(disp,1); + nodistabY(contaF,1)=CoordY(disp,1); + contaF = contaF + 1; + end + end + %aggiungo coordinate ancora + if cell2mat(CoordY(1,1)) > cell2mat(CoordY(end,1)) + plot([cell2mat(CoordY(:,1)); 0],[cell2mat(CoordZ(:,1)); 0],'-','Color','black','MarkerSize' ,7); + else + plot([0; cell2mat(CoordY(:,1))],[0; cell2mat(CoordZ(:,1))],'-','Color','black','MarkerSize' ,7) + end + hold on + if contaS > 1 + sezS = plot(cell2mat(nodisuY(:,1)),cell2mat(nodisuZ(:,1)),'^','Color','red','MarkerSize' ,7); + set(sezS, 'markerfacecolor', get(sezS, 'color')); + end + if contaG > 1 + sezG = plot(cell2mat(nodigiuY(:,1)),cell2mat(nodigiuZ(:,1)),'v','Color',[0.4660 0.6740 0.1880],'MarkerSize' ,7); + set(sezG, 'markerfacecolor', get(sezG, 'color')); + end + if contaF > 1 + sezN = plot(cell2mat(nodistabY(:,1)),cell2mat(nodistabZ(:,1)),'o','Color','black'); + set(sezN, 'markerfacecolor', get(sezN, 'color')); + end + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + if contaS > 1 && contaG > 1 && contaF > 1 + legend('Geometria dello strumento','Innalzamento','Abbassamento','Nodi stabili','Ancora','Location','southoutside'); + elseif contaS > 1 && contaG > 1 && contaF == 1 + legend('Geometria dello strumento','Innalzamento','Abbassamento','Ancora','Location','southoutside'); + elseif contaS > 1 && contaG == 1 && contaF > 1 + legend('Geometria dello strumento','Innalzamento','Nodi stabili','Ancora','Location','southoutside'); + elseif contaS == 1 && contaG > 1 && contaF > 1 + legend('Geometria dello strumento','Abbassamento','Nodi stabili','Ancora','Location','southoutside'); + elseif contaS > 1 && contaG == 1 && contaF == 1 + legend('Geometria dello strumento','Innalzamento','Ancora','Location','southoutside'); + elseif contaS == 1 && contaG > 1 && contaF == 1 + legend('Geometria dello strumento','Abbassamento','Nodi stabili','Ancora','Location','southoutside'); + elseif contaS == 1 && contaG == 1 && contaF > 1 + legend('Geometria dello strumento','Nodi stabili','Ancora','Location','southoutside'); + end + title('Direzione degli spostamenti - periodo di pre-convergenza'); + xlabel('Progressiva [m]'); + ylabel('Direzione verticale'); + set(gca,'YTickLabel',[]); + set(gca,'YTick',[]); + ini = min([0; cell2mat(CoordY)]); + End = max([0; cell2mat(CoordY)]); + h = gca; + if ini >= -15 || End <= 15 + if ini == 0 + xticks(ini:1:End+1); + xlim([ini,End+1]); + elseif End == 0 + xticks(ini-1:1:End); + xlim([ini-1,End]); + end + else + h.XAxis.MinorTick = 'on'; + end + grid off + axes('pos',[0.1 0.8 .3 .1]) + imshow('direzionescavo.png') + hold off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezPCL.png')); + saveas(ancora,TempName); + ChartSEZPC1 = Image(TempName); + ChartSEZPC1.Style = {Height('6.6cm')}; + close(figure(3)) + + % ENG + if activeEN == 1 + % ---Grafico Sezione Periodo PreConvergenza--- + figure(3) + %aggiungo coordinate ancora + if cell2mat(CoordY(1,1)) > cell2mat(CoordY(end,1)) + plot([cell2mat(CoordY(:,1)); 0],[cell2mat(CoordZ(:,1)); 0],'-','Color','black','MarkerSize' ,7); + else + plot([0; cell2mat(CoordY(:,1))],[0; cell2mat(CoordZ(:,1))],'-','Color','black','MarkerSize' ,7) + end + hold on + if contaS > 1 + sezS = plot(cell2mat(nodisuY(:,1)),cell2mat(nodisuZ(:,1)),'^','Color','red','MarkerSize' ,7); + set(sezS, 'markerfacecolor', get(sezS, 'color')); + end + if contaG > 1 + sezG = plot(cell2mat(nodigiuY(:,1)),cell2mat(nodigiuZ(:,1)),'v','Color',[0.4660 0.6740 0.1880],'MarkerSize' ,7); + set(sezG, 'markerfacecolor', get(sezG, 'color')); + end + if contaF > 1 + sezN = plot(cell2mat(nodistabY(:,1)),cell2mat(nodistabZ(:,1)),'o','Color','black'); + set(sezN, 'markerfacecolor', get(sezN, 'color')); + end + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + if contaS > 1 && contaG > 1 && contaF > 1 + legend('Array geometry','Upwards','Downwards','Stable node','Anchor','Location','southoutside'); + elseif contaS > 1 && contaG > 1 && contaF == 1 + legend('Array geometry','Upwards','Downwards','Anchor','Location','southoutside'); + elseif contaS > 1 && contaG == 1 && contaF > 1 + legend('Array geometry','Upwards','Stable node','Anchor','Location','southoutside'); + elseif contaS == 1 && contaG > 1 && contaF > 1 + legend('Array geometry','Downwards','Stable node','Anchor','Location','southoutside'); + elseif contaS > 1 && contaG == 1 && contaF == 1 + legend('Array geometry','Upwards','Anchor','Location','southoutside'); + elseif contaS == 1 && contaG > 1 && contaF == 1 + legend('Array geometry','Downwards','Stable node','Anchor','Location','southoutside'); + elseif contaS == 1 && contaG == 1 && contaF > 1 + legend('Array geometry','Stable node','Anchor','Location','southoutside'); + end + title('Displacement direction - Pre-convergence phase'); + xlabel('Position [m]'); + ylabel('Vertical direction'); + set(gca,'YTickLabel',[]); + set(gca,'YTick',[]); + h = gca; + if ini >= -15 || End <= 15 + if ini == 0 + xticks(ini:1:End+1); + xlim([ini,End+1]); + elseif End == 0 + xticks(ini-1:1:End); + xlim([ini-1,End]); + end + else + h.XAxis.MinorTick = 'on'; + end + grid off + axes('pos',[0.1 0.8 .3 .1]) + imshow('direzionescavoENG.png') + hold off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezPCL_ENG.png')); + saveas(ancora,TempName); + ChartSEZPC1_ENG = Image(TempName); + ChartSEZPC1_ENG.Style = {Height('6.6cm')}; + close(figure(3)) + end + + % ---Grafico Sezione Ultimo Mese--- + figure(4) + clear nodisuZ + clear nodisuY + clear nodigiuZ + clear nodigiuY + clear nodistabZ + clear nodistabY + contaS_2 = 1; + contaG_2 = 1; + contaF_2 = 1; + for disp = 1:rPCL(m,1) + if diffZ(end,disp) > 0.5 % mm + nodisuZ(contaS_2,1) = CoordZ(disp,1); % il +1 salta l'ancora introdotta dopo l'esecuzione della funzione gemella + nodisuY(contaS_2,1) = CoordY(disp,1); + contaS_2 = contaS_2 + 1; + elseif diffZ(end,disp) < -0.5 + nodigiuZ(contaG_2,1) = CoordZ(disp,1); + nodigiuY(contaG_2,1) = CoordY(disp,1); + contaG_2 = contaG_2 + 1; + else + nodistabZ(contaF_2,1) = CoordZ(disp,1); + nodistabY(contaF_2,1) = CoordY(disp,1); + contaF_2 = contaF_2 + 1; + end + end + if cell2mat(CoordY(1,1)) > cell2mat(CoordY(end,1)) + plot([cell2mat(CoordY(:,1)); 0],[cell2mat(CoordZ(:,1)); 0],'-','Color','black','MarkerSize' ,7); + else + plot([0; cell2mat(CoordY(:,1))],[0; cell2mat(CoordZ(:,1))],'-','Color','black','MarkerSize' ,7) + end + hold on + if contaS_2 > 1 + sezS = plot(cell2mat(nodisuY(:,1)),cell2mat(nodisuZ(:,1)),'^','Color','red','MarkerSize' ,7); + set(sezS, 'markerfacecolor', get(sezS, 'color')); + end + if contaG_2 > 1 + sezG = plot(cell2mat(nodigiuY(:,1)),cell2mat(nodigiuZ(:,1)),'v','Color',[0.4660 0.6740 0.1880],'MarkerSize' ,7); + set(sezG, 'markerfacecolor', get(sezG, 'color')); + end + if contaF_2 > 1 + sezN = plot(cell2mat(nodistabY(:,1)),cell2mat(nodistabZ(:,1)),'o','Color','black'); + set(sezN, 'markerfacecolor', get(sezN, 'color')); + end + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + if contaS_2 > 1 && contaG_2 > 1 && contaF_2 > 1 + legend('Geometria dello strumento','Innalzamento','Abbassamento','Nodi stabili','Ancora','Location','southoutside'); + elseif contaS_2 > 1 && contaG_2 > 1 && contaF_2 == 1 + legend('Geometria dello strumento','Innalzamento','Abbassamento','Ancora','Location','southoutside'); + elseif contaS_2 > 1 && contaG_2 == 1 && contaF_2 > 1 + legend('Geometria dello strumento','Innalzamento','Nodi stabili','Ancora','Location','southoutside'); + elseif contaS_2 == 1 && contaG_2 > 1 && contaF_2 > 1 + legend('Geometria dello strumento','Abbassamento','Nodi stabili','Ancora','Location','southoutside'); + elseif contaS_2 > 1 && contaG_2 == 1 && contaF_2 == 1 + legend('Geometria dello strumento','Innalzamento','Ancora','Location','southoutside'); + elseif contaS_2 == 1 && contaG_2 > 1 && contaF_2 == 1 + legend('Geometria dello strumento','Abbassamentoi','Nodi stabili','Ancora','Location','southoutside'); + elseif contaS_2 == 1 && contaG_2 == 1 && contaF_2 > 1 + legend('Geometria dello strumento','Nodi stabili','Ancora','Location','southoutside'); + end + title('Direzione degli spostamenti - periodo di riferimento'); + xlabel('Progressiva [m]'); + ylabel('Direzione verticale'); + set(gca,'YTickLabel',[]); + set(gca,'YTick',[]); + ini = min([0; cell2mat(CoordY)]); + End = max([0; cell2mat(CoordY)]); + h = gca; + if ini >= -15 || End <= 15 + if ini == 0 + xticks(ini:1:End+1); + xlim([ini,End+1]); + elseif End == 0 + xticks(ini-1:1:End); + xlim([ini-1,End]); + end + else + h.XAxis.MinorTick = 'on'; + end + grid off + axes('pos',[0.1 0.8 .3 .1]) + imshow('direzionescavo.png') + hold off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezPCL2.png')); + saveas(ancora,TempName); + + ChartSEZPC2 = Image(TempName); + ChartSEZPC2.Style = {Height('6.6cm')}; + ChartSEZPC2_cap = Paragraph(['Fig. ' num2str(FIG) ' - Direzione degli spostamenti verticali '... + 'registrati durante il periodo di pre-convergenza e l''intervallo temporale di riferimento']); + FIG = FIG+1; + ChartSEZPC2_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + lot2 = Table({ChartSEZPC1, ChartSEZPC2}); + lot2.Style = {ResizeToFitContents(false), Width('100%')}; + close(figure(4)) + + if activeEN == 1 + % ---Grafico Sezione Ultimo Mese--- + figure(4) + if cell2mat(CoordY(1,1)) > cell2mat(CoordY(end,1)) + plot([cell2mat(CoordY(:,1)); 0],[cell2mat(CoordZ(:,1)); 0],'-','Color','black','MarkerSize' ,7); + else + plot([0; cell2mat(CoordY(:,1))],[0; cell2mat(CoordZ(:,1))],'-','Color','black','MarkerSize' ,7) + end + hold on + if contaS_2 > 1 + sezS = plot(cell2mat(nodisuY(:,1)),cell2mat(nodisuZ(:,1)),'^','Color','red','MarkerSize' ,7); + set(sezS, 'markerfacecolor', get(sezS, 'color')); + end + if contaG_2 > 1 + sezG = plot(cell2mat(nodigiuY(:,1)),cell2mat(nodigiuZ(:,1)),'v','Color',[0.4660 0.6740 0.1880],'MarkerSize' ,7); + set(sezG, 'markerfacecolor', get(sezG, 'color')); + end + if contaF_2 > 1 + sezN = plot(cell2mat(nodistabY(:,1)),cell2mat(nodistabZ(:,1)),'o','Color','black'); + set(sezN, 'markerfacecolor', get(sezN, 'color')); + end + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + if contaS_2 > 1 && contaG_2 > 1 && contaF_2 > 1 + legend('Array geometry','Upwards','Downwards','Stable node','Anchor','Location','southoutside'); + elseif contaS_2 > 1 && contaG_2 > 1 && contaF_2 == 1 + legend('Array geometry','Upwards','Downwards','Anchor','Location','southoutside'); + elseif contaS_2 > 1 && contaG_2 == 1 && contaF_2 > 1 + legend('Array geometry','Upwards','Stable node','Anchor','Location','southoutside'); + elseif contaS_2 == 1 && contaG_2 > 1 && contaF_2 > 1 + legend('Array geometry','Downwards','Stable node','Anchor','Location','southoutside'); + elseif contaS_2 > 1 && contaG_2 == 1 && contaF_2 == 1 + legend('Array geometry','Upwards','Anchor','Location','southoutside'); + elseif contaS_2 == 1 && contaG_2 > 1 && contaF_2 == 1 + legend('Array geometry','Downwards','Stable node','Anchor','Location','southoutside'); + elseif contaS_2 == 1 && contaG_2 == 1 && contaF_2 > 1 + legend('Array geometry','Stable node','Anchor','Location','southoutside'); + end + title('Displacement direction - Reference time period'); + xlabel('Position [m]'); + ylabel('Vertical direction'); + set(gca,'YTickLabel',[]); + set(gca,'YTick',[]); + h = gca; + if ini >= -15 || End <= 15 + if ini == 0 + xticks(ini:1:End+1); + xlim([ini,End+1]); + elseif End == 0 + xticks(ini-1:1:End); + xlim([ini-1,End]); + end + else + h.XAxis.MinorTick = 'on'; + end + grid off + axes('pos',[0.1 0.8 .3 .1]) + imshow('direzionescavoENG.png') + hold off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezPCL2_ENG.png')); + saveas(ancora,TempName); + + ChartSEZPC2_ENG = Image(TempName); + ChartSEZPC2_ENG.Style = {Height('6.6cm')}; + ChartSEZPC2_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Vertical displacements direction '... + 'observed during the pre-convergence phase and the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartSEZPC2_ENG_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + lot2_ENG = Table({ChartSEZPC1_ENG, ChartSEZPC2_ENG}); + lot2_ENG.Style = {ResizeToFitContents(false), Width('100%')}; + close(figure(4)) + end + + % --- grafico spostamenti cumulati - periodo di preconvergenza --- + figure(5) + if maxY < 0 + plot([0 Y],[0 Z_Cum_PC],'-','LineWidth',1,'Marker','.',... + 'MarkerSize',15,'MarkerEdgeColor',[0.6350 0.0780 0.1840],'MarkerFaceColor',[0.6350 0.0780 0.1840]); + else + plot([Y 0],[Z_Cum_PC 0],'-','LineWidth',1,'Marker','.',... + 'MarkerSize',15,'MarkerEdgeColor',[0.6350 0.0780 0.1840],'MarkerFaceColor',[0.6350 0.0780 0.1840]); + end + hold on + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + title('Spostamenti cumulati - Periodo di pre-convergenza'); + ylabel('Spostamento [mm]'); + xlabel('Progressiva [m]'); + h = gca; + h.YAxis.MinorTick = 'on'; + grid on + + if maxY > 0 % mm + xlim([0 maxY+1]); + else + xlim([Y(end)-1 0]) + end + grid on + + iniY = min(min(Z_Cum_PC',Z_Cum')); + endY = max(max(Z_Cum_PC',Z_Cum')); + MAX = max(abs(iniY),endY); + if MAX > 2.5 % Limiti Asse Y + ylim([-MAX-1 MAX+1]) + else + ylim([-2.5 +2.5]); + end + + if ini >= -15 || End <= 15 + xticks(ini:1:End); + else + h.XAxis.MinorTick = 'on'; + end + TempName3 = char(strcat('Report',siteID,'-', char(toolrif),'Z_Cum_PC.png')); + saveas(ancora(1),TempName3); + close(figure(5)) + + % ENG + % --- grafico spostamenti cumulati - periodo di preconvergenza --- + if activeEN == 1 + figure(5) + if maxY < 0 + plot([0 Y],[0 Z_Cum_PC],'-','LineWidth',1,'Marker','.',... + 'MarkerSize',15,'MarkerEdgeColor',[0.6350 0.0780 0.1840],'MarkerFaceColor',[0.6350 0.0780 0.1840]); + else + plot([Y 0],[Z_Cum_PC 0],'-','LineWidth',1,'Marker','.',... + 'MarkerSize',15,'MarkerEdgeColor',[0.6350 0.0780 0.1840],'MarkerFaceColor',[0.6350 0.0780 0.1840]); + end + hold on + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + title('Cumulative displacements - Pre-convergence phase'); + ylabel('Displacement [mm]'); + xlabel('Position [m]'); + h = gca; + h.YAxis.MinorTick = 'on'; + grid on + + if MAX > 2.5 % Limiti Asse Y + ylim([-MAX-1 MAX+1]) + else + ylim([-2.5 +2.5]); + end + + if ini >= -15 || End <= 15 + xticks(ini:1:End); + else + h.XAxis.MinorTick = 'on'; + end + TempName3_ENG = char(strcat('Report',siteID,'-', char(toolrif),'Z_Cum_PC_ENG.png')); + saveas(ancora(1),TempName3_ENG); + close(figure(5)) + end + + % --- grafico spostamenti cumulati - Periodo di riferimento --- + figure(6) + if maxY < 0 + plot([0 Y],[0 Z_Cum],'-','LineWidth',1,'Marker','.',... + 'MarkerSize',15,'MarkerEdgeColor','b','MarkerFaceColor',[0.5,0.5,0.5]); + else + plot([Y 0],[Z_Cum 0],'-','LineWidth',1,'Marker','.',... + 'MarkerSize',15,'MarkerEdgeColor','b','MarkerFaceColor',[0.5,0.5,0.5]); + end + hold on + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + title('Spostamenti cumulati - periodo di riferimento'); + ylabel('Spostamento [mm]'); + xlabel('Progressiva [m]'); + h = gca; + h.YAxis.MinorTick = 'on'; + grid on + + if MAX > 2.5 % Limiti Asse Y + ylim([-MAX-1 MAX+1]) + else + ylim([-2.5 +2.5]); + end + if ini >= -15 || End <= 15 + xticks(ini:1:End); + else + h.XAxis.MinorTick = 'on'; + end + TempName4 = char(strcat('Report',siteID,'-', char(toolrif),'Z_Cum_PCL.png')); + saveas(ancora(1),TempName4); + close(figure(6)) + + ChartPCL3 = Image(TempName3); + ChartPCL4 = Image(TempName4); + lot3 = Table({ChartPCL3, ChartPCL4}); + lot3.Style = {ResizeToFitContents(false), Width('100%')}; + ChartPCL3.Style = {Height('6.6cm'),HAlign('center')}; + ChartPCL4.Style = {Height('6.6cm'),HAlign('center')}; + ChartPCL3_cap = Paragraph(['Fig. ' num2str(FIG) ' - Spostamenti '... + 'differenziali cumulati in direzione verticale registrati durante '... + 'il periodo di pre-convergenza e il periodo di riferimento']); + ChartPCL3_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + FIG = FIG+1; + + % ENG + if activeEN == 1 + % --- grafico spostamenti cumulati - Periodo di riferimento --- + figure(6) + if maxY < 0 + plot([0 Y],[0 Z_Cum],'-','LineWidth',1,'Marker','.',... + 'MarkerSize',15,'MarkerEdgeColor','b','MarkerFaceColor',[0.5,0.5,0.5]); + else + plot([Y 0],[Z_Cum 0],'-','LineWidth',1,'Marker','.',... + 'MarkerSize',15,'MarkerEdgeColor','b','MarkerFaceColor',[0.5,0.5,0.5]); + end + hold on + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + title('Cumulative displacements - Reference time period'); + ylabel('Displacement [mm]'); + xlabel('Position [m]'); + h = gca; + h.YAxis.MinorTick = 'on'; + grid on + + if MAX > 2.5 % Limiti Asse Y + ylim([-MAX-1 MAX+1]) + else + ylim([-2.5 +2.5]); + end + if ini >= -15 || End <= 15 + xticks(ini:1:End); + else + h.XAxis.MinorTick = 'on'; + end + TempName4_ENG = char(strcat('Report',siteID,'-', char(toolrif),'Z_Cum_PCL_ENG.png')); + saveas(ancora(1),TempName4_ENG); + close(figure(6)) + + ChartPCL3_ENG = Image(TempName3_ENG); + ChartPCL4_ENG = Image(TempName4_ENG); + lot3_ENG = Table({ChartPCL3_ENG, ChartPCL4_ENG}); + lot3_ENG.Style = {ResizeToFitContents(false), Width('100%')}; + ChartPCL3_ENG.Style = {Height('6.6cm'),HAlign('center')}; + ChartPCL4_ENG.Style = {Height('6.6cm'),HAlign('center')}; + ChartPCL3_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Cumulative differential displacements '... + 'recorded in vertical direction during the pre-convergence phase and '... + 'the reference time period']); + ChartPCL3_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + FIG_ENG = FIG_ENG+1; + end + + % testi + sezPCL = Heading3('PreConv Link'); + sezPCL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + PCL = Section(); + PCL.Title = sezPCL; + testo1 = Paragraph(['I grafici riportati di seguito mostrano l''entit' char(224) ' e il verso degli spostamenti '... + 'locali e cumulati in direzione verticale, misurati dal sensore MEMS 3D nel periodo di pre-convergenza '... + '(ovvero considerando l''intervallo temporale fra la data di riferimento indicata in Tab. 1 '... + 'e il ' datestr(datenum(data_PC),'dd-mm-yyyy') ') e di riferimento. In particolare, valori negativi '... + 'indicano un abbassamento del nodo, mentre spostamenti '... + 'positivi caratterizzano un movimento verso l''alto del sensore in oggetto durante '... + 'l''intervallo di tempo considerato.']); + % Locale ultimo mese + progZ = max(abs(Z_Loc)); + prY = find(abs(Z_Loc)==progZ); + progY = Y(prY(1)); + % Locale da sempre + progZ_Tot = max(abs(Z_Loc_Tot)); + prY_Tot = find(abs(Z_Loc_Tot)==progZ_Tot); + progY_Tot = Y(prY_Tot(1)); + % locale periodo pre-convergenza + progZ_PC = max(abs(Z_Loc_PC)); + prY_PC = find(abs(Z_Loc_PC)==progZ_PC); + progY_PC = Y(prY_PC(1)); + testo2 = Paragraph(['Il massimo valore di spostamento differenziale locale registrato durante il periodo temporale '... + 'di riferimento ' char(232) ' pari a ' num2str(max(abs(round(Z_Loc,1)))) ' mm, rilevato dal nodo '... + 'alla progressiva di ' num2str(progY) ' m. La stessa analisi, condotta relativamente al periodo di pre-convergenza '... + 'e all''intera durata del monitoraggio, evidenzia movimenti differenziali locali pari a ' num2str(max(abs(round(Z_Loc_PC,1)))) ... + ' e ' num2str(max(abs(round(Z_Loc_Tot,1)))) ' mm, registrati rispettivamente dai nodi alla progressiva di ' num2str(progY_PC) ... + ' e ' num2str(progY_Tot) ' m.']); + parte1 = ['La figura associata riassume la direzione di movimento verticale dei singoli nodi '... + 'posizionati secondo la geometria dello strumento. Si noti che, in questa rappresentazione '... + 'vengono considerati stabili i sensori caratterizzati da uno spostamento '... + 'inferiore a 0.5 mm. Nel periodo di pre-convergenza, '... + 'l''analisi ha evidenziato ' num2str(contaS-1) ' ']; + if contaS-1 == 1 + parte2 = 'nodo caratterizzato '; + else + parte2 = 'nodi caratterizzati '; + end + parte3 = ['da movimenti verso l''alto, ' num2str(contaG-1) ' verso il basso e ' num2str(contaF-1) ]; + if contaF-1 == 1 + parte4 = ' nodo stabile. '; + else + parte4 = ' nodi stabili. '; + end + parte5 = ['Le corrispondenti informazioni relative all''intervallo di '... + 'riferimento forniscono ' num2str(contaS_2-1) ]; + if contaS_2-1 == 1 + parte6 = ' sensore che si sposta '; + else + parte6 = ' sensori che si spostano '; + end + parte7 = ['verso l''alto, ' num2str(contaG_2-1) ' verso il basso e ' num2str(contaF_2-1) ]; + if contaF_2-1 == 1 + parte8 = ' stabile.'; + else + parte8 = ' stabili.'; + end + testo3 = Paragraph([parte1 parte2 parte3 parte4 parte5 parte6 parte7 parte8]); + spazio = Paragraph(''); + testo1.HAlign = 'justify'; + testo2.HAlign = 'justify'; + testo3.HAlign = 'justify'; + add(DT,sezPCL); + add(DT,testo1); + add(DT,spazio); + add(DT,testo2); + add(DT,lot1); + add(DT,ChartPCL_cap); + add(DT,testo3); + add(DT,lot2); + add(DT,ChartSEZPC2_cap); + add(DT,lot3); + add(DT,ChartPCL3_cap); + add(DT,br); + + % ENG + if activeEN == 1 + % testi + sezPCL_ENG = Heading3('PreConv Link'); + sezPCL_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + PCL_ENG = Section(); + PCL_ENG.Title = sezPCL_ENG; + testo1 = Paragraph(['Following graphs display the magnitude and direction '... + 'of local and cumulative displacements '... + 'measured along the vertical direction by the 3D MEMS sensor during the pre-convergence phase '... + '(referring to the time interval between the reference date reported in Tab. 1 '... + 'and the following date: ' datestr(datenum(data_PC),'dd-mm-yyyy') ') and the reference time period. '... + 'In particular, negative values correspond to downwards movements of the node, '... + 'while positive ones represent an upward displacement.']); + testo2 = Paragraph(['The maximum local differential displacement value recorded during the reference time period is '... + num2str(max(abs(round(Z_Loc,1)))) ' mm, measured by the node '... + 'located at ' num2str(progY) ' m from the fixed point. The same analysis performed on the pre-convergence phase '... + 'and on the complete monitoring period highlights local differential displacement values of ' num2str(max(abs(round(Z_Loc_PC,1)))) ... + ' and ' num2str(max(abs(round(Z_Loc_Tot,1)))) ' mm, recorded by nodes located respectively at ' num2str(progY_PC) ... + ' m and ' num2str(progY_Tot) ' m from the fixed point.']); + parte1 = ['The corresponding figure summarizes the vertical displacement direction of each single node, according '... + 'to their position along the Array. In this specific representation, sensors featuring displacement values less than 0.5 mm '... + 'are assumed as stable. During the pre-convergence phase, the analysis evidenced ' num2str(contaS-1) ' ']; + if contaS-1 == 1 + parte2 = 'node featuring '; + else + parte2 = 'nodes featuring '; + end + parte3 = ['upward movement, ' num2str(contaG-1) ' in downward direction, and ' num2str(contaF-1) ]; + if contaF-1 == 1 + parte4 = ' stable sensor. '; + else + parte4 = ' stable sensors. '; + end + parte5 = ['By taking into account the reference time period, the '... + 'results show ' num2str(contaS_2-1) ]; + if contaS_2-1 == 1 + parte6 = ' sensor moving '; + else + parte6 = ' sensors moving '; + end + parte7 = ['upwards, ' num2str(contaG_2-1) ' in downward direction, and ' num2str(contaF_2-1) ]; + if contaF_2-1 == 1 + parte8 = ' stable node.'; + else + parte8 = ' stable nodes.'; + end + testo3 = Paragraph([parte1 parte2 parte3 parte4 parte5 parte6 parte7 parte8]); + spazio = Paragraph(''); + testo1.HAlign = 'justify'; + testo2.HAlign = 'justify'; + testo3.HAlign = 'justify'; + add(DT_ENG,sezPCL_ENG); + add(DT_ENG,testo1); + add(DT_ENG,spazio); + add(DT_ENG,testo2); + add(DT_ENG,lot1_ENG); + add(DT_ENG,ChartPCL_ENG_cap); + add(DT_ENG,testo3); + add(DT_ENG,lot2_ENG); + add(DT_ENG,ChartSEZPC2_ENG_cap); + add(DT_ENG,lot3_ENG); + add(DT_ENG,ChartPCL3_ENG_cap); + add(DT_ENG,br); + end + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + check = 1; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + end + end + end + end +end + +text = 'report_PCL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_PE.m b/Tilt/report_PE.m new file mode 100755 index 0000000..5b8acbe --- /dev/null +++ b/Tilt/report_PE.m @@ -0,0 +1,440 @@ +function [battANALOG,ATTIVA,FIG,FIG_ENG] = report_PE(rPE,m,NodoPendulum,toolrif,unitrif,... + datarif,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,battANALOG,ATTIVA,... + activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_PE function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +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 + PEND = Section(); + sezPendulum = Heading3('Pendulum'); + sezPendulum.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PEND.Title = sezPendulum; + 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 + PEND_ENG = Section(); + sezPendulum_ENG = Heading3('Pendulum'); + sezPendulum_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PEND_ENG.Title = sezPendulum_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,sezPendulum); + if activeEN == 1 + add(DT_ENG,sezPendulum_ENG); + end + + for pe = 1:rPE(m,1) + NodeNum = num2str(NodoPendulum(pe,m)); + comando = ['select EventDate, EventTime, XShift, YShift 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 + PX = cell2mat(Dati(:,3)); % asseX + PY = cell2mat(Dati(:,4)); % asseY + + % grafico deformazioni NELL'ULTIMO MESE + figure(5); + plot(Date,PX); + hold on + def = plot(Date,PY); + title(['Deformazioni registrate dal pendolo numero ' NodeNum]); + xlabel('Data [gg/mm/aaaa]'); + ylabel('Deformazione [mm]'); +% controlX = abs(max(PX)-min(PX)); +% controlY = abs(max(PY)-min(PY)); +% controlXY = [controlX; controlY]; +% control = max(controlXY); +% if control < 0.5 % mm +% ylim([-0.5 0.5]); +% 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 + str(1,1) = cellstr('X'); + str(2,1) = cellstr('Y'); + MX(1) = max(PX(1:10)); + MX(2) = max(PY(1:10)); + MN(1) = min(PX(1:10)); + MN(2) = min(PY(1:10)); + VAR(1) = max(PX); + VAR(2) = min(PN); + MAX = max(abs(VAR)); + IN = find(abs(VAR)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-Pendulum', NodeNum, '.png')); + saveas(def,TempName); + ChartPend = Image(TempName); + ChartPend.Style = {Height('7.5cm'),HAlign('center')}; + ChartPend_cap = Paragraph(['Fig. ' num2str(FIG) ' - Andamento '... + 'delle deformazioni registrate '... + 'lungo i due assi strumentali del pendolo, nodo numero ' NodeNum ... + ', durante il periodo temporale di riferimento']); + FIG = FIG+1; + ChartPend_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['Nei grafici seguenti sono rappresentati i dati relativi '... + 'alla deformazione registrata lungo i due assi strumentali '... + 'dai pendoli che compongono l''Analog Array.']); + testo2 = Paragraph(['Durante il periodo temporale di riferimento, il nodo numero ' NodeNum ' ha '... + 'registrato i seguenti valori di deformazione: ']); + testoX = Paragraph(['- Asse X - Valore massimo: ' num2str(round(max(PX),2), '%0.2f') ... + ' mm, valore minimo: ' num2str(round(min(PX),2), '%0.2f') ' mm, variazione: ' ... + num2str(round(max(PX),2)-round(min(PX),2),'%0.2f') ' mm; ']); + testoY = Paragraph(['- Asse Y - Valore massimo: ' num2str(round(max(PY),2), '%0.2f') ... + ' mm, valore minimo: ' num2str(round(min(PY),2), '%0.2f') ' mm, variazione: ' ... + num2str(round(max(PY),2)-round(min(PY),2),'%0.2f') ' mm; ']); + spazio = Paragraph(''); + + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if pe == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,testoX); + add(DT,testoY); + add(DT,ChartPend); + add(DT,ChartPend_cap); + add(DT,spazio); + if pe == rPE(m,1) + add(DT,br); + end + close(figure(19)); + close(figure(5)); + + %---ENG--- + if activeEN == 1 + % grafico deformazioni NELL'ULTIMO MESE + figure(15); + plot(Date,sX); + hold on + plot(Date,sY); + defEN = plot(Date,sZ); + title(['Deformation - node ' NodeNum]); + xlabel('Date [dd/mm/yyyy]'); + ylabel('Deformation [mm]'); +% controlX = abs(max(sX)-min(sX)); +% controlY = abs(max(sY)-min(sY)); +% controlZ = abs(max(sZ)-min(sZ)); +% controlXY = [controlX; controlY; controlZ]; +% control = max(controlXY); +% if control < 0.5 % mm +% ylim([-0.5 0.5]); +% 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 + str(1,1) = cellstr('X'); + str(2,1) = cellstr('Y'); + MX(1) = max(PX(1:10)); + MX(2) = max(PY(1:10)); + MN(1) = min(PX(1:10)); + MN(2) = min(PY(1:10)); + VAR(1) = max(MX); + VAR(2) = min(MN); + MAX = max(abs(VAR)); + IN = find(abs(VAR)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-Pendulum', NodeNum, '_ENG.png')); + saveas(defEN,TempName); + ChartPend_ENG = Image(TempName); + ChartPend_ENG.Style = {Height('7.5cm'),HAlign('center')}; + ChartPend_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - deformations '... + ' measured along the two instrumental axes by node ' ... + NodeNum ' during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartPend_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graphs present deformation data '... + 'recorded along the two instrumental axes by the pendulum systems '... + 'integrated in the Analog Array.']); + testo2 = Paragraph(['During the reference time period, node ' NodeNum ... + ' recorded the following deformation values: ']); + testoX = Paragraph(['- X axis - maximum value: ' num2str(round(max(PX),2), '%0.2f') ... + ' mm, minimum value: ' num2str(round(min(PX),2), '%0.2f') ' mm, variation: ' ... + num2str(round(max(PX),2)-round(min(PX),2),'%0.2f') ' mm; ']); + testoY = Paragraph(['- Y axis - maximum value: ' num2str(round(max(PY),2), '%0.2f') ... + ' mm, minimum value: ' num2str(round(min(PY),2), '%0.2f') ' mm, variation: ' ... + num2str(round(max(PY),2)-round(min(PY),2),'%0.2f') ' mm; ']); + spazio = Paragraph(''); + + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if pe == 1 + add(DT_ENG,testo); + end + add(DT_ENG,testo2); + add(DT_ENG,testoX); + add(DT_ENG,testoY); + add(DT_ENG,ChartPend_ENG); + add(DT_ENG,ChartPend_ENG_cap); + add(DT_ENG,spazio); + if pe == rPE(m,1) + add(DT_ENG,br); + end + close(figure(15)); + end + else + if ATTIVA == 1 + ATTIVA = 0; + PEND = Section(); + sezPendulim = Heading3('Pendulum'); + sezPendulim.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PEND.Title = sezPendulim; + add(DT,sezPendulim); + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + add(DT,testo); + add(DT,br); + if activeEN == 1 + PEND_ENG = Section(); + sezPendulum_ENG = Heading3('Pendulum'); + sezPendulum_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PEND_ENG.Title = sezPendulum_ENG; + add(DT_ENG,sezPendulum_ENG); + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + add(DT_ENG,br); + end + end + end + end +end + +text = 'report_PE function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_PL.m b/Tilt/report_PL.m new file mode 100755 index 0000000..e1dcd6e --- /dev/null +++ b/Tilt/report_PL.m @@ -0,0 +1,370 @@ +function [GI_LivelloFaldaPL,GI_ProfPL,GI_DatePL,PL_A,PL_D,ATTIVA,FIG,FIG_ENG] = report_PL(... + rPL,rTL,rIPL,m,NodoPiezoLink,PL_A,PL_D,toolrif,unitrif,datarif,Font_caption,Font_tools,toolrifID,... + siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_PL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +GI_LivelloFaldaPL = []; +GI_ProfPL = []; +GI_DatePL = []; +titolo = 1; +check = 0; +NODATA(m,1) = 0; +while check == 0 + if status(m,1) == 1 + if ATTIVA == 1 + testo = Paragraph('Catena non ancora installata o inattiva.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array not installed or inactive.'); + add(DT_ENG,testo); + end + misuraPL = cell(1,3); + for p = 1:rPL(m,1) + NodeNum = num2str(NodoPiezoLink(p,m)); + comando = ['select num, depth, measurment from nodes where tool_id = ''' num2str(cell2mat(toolrifID))... + ''' and num = ''' NodeNum ''' and nodetype_id = 2 ']; + curs = exec(conn,comando); + curs = fetch(curs); + Leggo = curs.Data; + misuraPL(1,p) = Leggo(1,3); % unità di misura del piezometro + % pressione assoluta vs relativa + PL_A(p) = 0; + PL_D(p) = 0; + if strcmp(misuraPL(1,p),'VW kPa') == 1 || strcmp(misuraPL(1,p),'VW kg/cm2') == 1 + PL_A(p) = PL_A(p)+1; + else + PL_D(p) = PL_D(p)+1; + end + end + end + check = 1; + 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 + for p = 1:rPL(m,1) + NodeNum = num2str(NodoPiezoLink(p,m)); + comando = ['select num, depth, measurment from nodes where tool_id = ''' num2str(cell2mat(toolrifID))... + ''' and num = ''' NodeNum ''' and nodetype_id = 2 ']; + curs = exec(conn,comando); + curs = fetch(curs); + Leggo = curs.Data; + misuraPL(1,p) = Leggo(1,3); % unità di misura del piezometro + % pressione assoluta vs relativa + PL_A(p) = 0; + PL_D(p) = 0; + if strcmp(misuraPL(1,p),'VW kPa') == 1 || strcmp(misuraPL(1,p),'VW kg/cm2') == 1 + PL_A(p) = PL_A(p)+1; + else + PL_D(p) = PL_D(p)+1; + end + end + end + check = 1; + else + SE = Section(); + if activeEN == 1 + SE_ENG = Section(); + end + for p = 1:rPL(m,1) + NodeNum = num2str(NodoPiezoLink(p,m)); + comando = ['select EventDate, EventTime, water_level, pressure 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; + comando = ['select num, depth, measurment from nodes where tool_id = ''' num2str(cell2mat(toolrifID))... + ''' and num = ''' NodeNum ''' and nodetype_id = 2 ']; + curs = exec(conn,comando); + curs = fetch(curs); + Leggo = curs.Data; + % Modifico il formato di data e ora + [rD,rC] = size(Dati); + [~,PZc] = size(Leggo); + if rC ~= 1 && PZc > 1 + T = [cell2mat(Dati(:,1)) repmat(' ', [rD,1]) cell2mat(Dati(:,2))]; + Date = datenum(T); % Data + if p == 1 % Il primo lo scrivo e creo la variabile di controllo + check = 1; + else + [rS,~] = size(waterlevel); + if rD ~= rS + NODATA(m,1) = 2; + check = 0; + break + else + check = 1; + end + end + waterlevel(:,p) = cell2mat(Dati(:,3)); % altezza falda + pressure(:,p) = cell2mat(Dati(:,4)); % pressione + comando = ['select depth from nodes where tool_id = ''' num2str(cell2mat(toolrifID))... + ''' and num = ''' NodeNum ''' and nodetype_ID = 2 ']; + curs = exec(conn,comando); + curs = fetch(curs); + ProfPL(1,p) = curs.Data; % profondità piezometro + misuraPL(1,p) = Leggo(1,3); % unità di misura del piezometro + + % pressione assoluta vs relativa + tipopressione = 'assoluta '; + if activeEN == 1 + tipopressione = 'absolute '; + end + PL_A(p) = 0; + PL_D(p) = 0; + if strcmp(misuraPL(1,p),'VW kPa') == 1 || strcmp(misuraPL(1,p),'VW kg/cm2') == 1 + tipopressione = 'relativa '; + if activeEN == 1 + tipopressione = 'relative '; + end + PL_A(p) = PL_A(p)+1; + else + PL_D(p) = PL_D(p)+1; + end + + else + NODATA(m,1) = 1; + check = 1; + end + if NODATA(m,1) == 0 + % grafico livello falda e pressione interstiziale NELL'ULTIMO MESE + figure(3) + plot(Date,waterlevel(:,p),'LineWidth',1.5); + yyaxis left + ylabel(['Profondit' char(224) ' [m da p.c.]']); + var = max(abs(waterlevel(:,p)-waterlevel(1,p))); + media = mean(waterlevel(:,p)); + if var < 0.7 + ylim([media-0.5 media+0.5]); + end + title(['Livello idrico e pressione ' tipopressione ' - Sensore a ' num2str(cell2mat(ProfPL(1,p))) ' m da p.c.']); + xlabel('Data [gg/mm/aaaa]'); + hold on + yyaxis right + porepress = plot(Date,pressure(:,p),'--'); + ylabel(['Pressione ' tipopressione ' [Pa]']); + xlim([Date(1)-1 Date(end)+1]); + + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-Piezo',num2str(cell2mat(ProfPL(1,p))), '.png')); + saveas(porepress,TempName); + ChartPL = Image(TempName); + if rPL(p,1) == 1 + ChartPL.Style = {Height('8cm'),HAlign('center')}; + elseif rPL(p,1) == 2 + ChartPL.Style = {Height('7.5cm'),HAlign('center')}; + else + ChartPL.Style = {Height('8cm'),HAlign('center')}; + end + if rPL(p,1) == 2 + ChartPL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Livello idrico e pressione ' tipopressione... + ' registrati dal piezometro posto alla profondit' ... + char(224) ' di ' num2str(cell2mat(ProfPL(1,p))) ' metri']); + ChartPL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + else + ChartPL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Livello idrico e pressione ' tipopressione... + ' registrati durante il periodo temporale di riferimento dal piezometro posto alla profondit' ... + char(224) ' di ' num2str(cell2mat(ProfPL(1,p))) ' metri']); + ChartPL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + end + FIG = FIG+1; + if titolo == 1 + sezPiezo = Heading3('Piezo Link'); + sezPiezo.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SE.Title = sezPiezo; + add(DT,sezPiezo); + titolo = 0; + end + escludi2 = 0; + if rPL(p,1) == 2 + if p == 1 + testo = Paragraph(['I grafici seguenti riportano i valori di livello idrico e pressione ' tipopressione... + ' misurati nel corso del periodo di riferimento dai piezometri presenti nella catena. '... + 'Il sensore situato a una profondit' char(224) ' di ' ... + num2str(cell2mat(ProfPL(1,p))) ' m da p.c. ha rilevato un''altezza '... + 'di falda massima pari a ' num2str(round(max(waterlevel(:,p)),2), '%0.2f') ' m ed un valore minimo pari a '... + num2str(round(min(waterlevel(:,p)),2), '%0.2f') ' m, per una variazione massima di '... + num2str(round(max(waterlevel(:,p)),2)-round(min(waterlevel(:,p)),2),'%0.2f') ' m.']); + testo.HAlign = 'justify'; + escludi2 = 1; + add(DT,testo); + elseif p == 2 + testo = Paragraph(['Il sensore situato a una profondit' char(224) ' di ' ... + num2str(cell2mat(ProfPL(1,p))) ' m da p.c. ha rilevato un''altezza '... + 'di falda massima pari a ' num2str(round(max(waterlevel(:,p)),2), '%0.2f') ' m ed un valore minimo pari a '... + num2str(round(min(waterlevel(:,p)),2), '%0.2f') ' m, per una variazione massima di '... + num2str(round(max(waterlevel(:,p)),2)-round(min(waterlevel(:,p)),2),'%0.2f') ' m.']); + testo.HAlign = 'justify'; + escludi2 = 1; + add(DT,testo); + end + elseif p == 1 + testo = Paragraph(['I grafici seguenti riportano i valori di livello idrico e pressione ' tipopressione... + ' misurati nel corso del periodo di riferimento dai piezometri presenti nella catena.']); + testo.HAlign = 'justify'; + add(DT,testo); + end + if escludi2 == 0 + testo2 = Paragraph(['Il sensore situato a una profondit' char(224) ' di ' ... + num2str(cell2mat(ProfPL(1,p))) ' m da p.c. ha rilevato un''altezza '... + 'di falda massima pari a ' num2str(round(max(waterlevel(:,p)),2), '%0.2f') ' m ed un valore minimo pari a '... + num2str(round(min(waterlevel(:,p)),2), '%0.2f') ' m, per una variazione massima di '... + num2str(round(max(waterlevel(:,p)),2)-round(min(waterlevel(:,p)),2),'%0.2f') ' m.']); + testo2.HAlign = 'justify'; + add(DT,testo2); + end + add(DT,ChartPL); + add(DT,ChartPL_cap); + if p == rPL(m,1) || p == 1 && rPL(m,1) > 2 || rTL(m,1) == 0 && p == 1 && rIPL(m,1) == 0 && p == 1 + add(DT,br); + end + close(figure(3)); + + % Inglese + if activeEN == 1 + % grafico livello falda e pressione interstiziale NELL'ULTIMO MESE + figure(3) + plot(Date,waterlevel(:,p),'LineWidth',1.5); + yyaxis left + ylabel('Depth [m b.g.l.]'); + if var < 1 + ylim([media-0.5 media+0.5]); + end + title(['Water level and ' tipopressione ' pressure - Sensor at ' ... + num2str(cell2mat(ProfPL(1,p))) ' m of depth']); + xlabel('Date [dd/mm/yyyy]'); + hold on + yyaxis right + porepress = plot(Date,pressure(:,p),'--'); + ylabel([tipopressione ' pressure [Pa]']); + xlim([Date(1)-1 Date(end)+1]); + + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-Piezo',num2str(cell2mat(ProfPL(1,p))), '_ENG.png')); + saveas(porepress,TempName); + ChartPL = Image(TempName); + if rPL(p,1) == 1 + ChartPL.Style = {Height('8cm'),HAlign('center')}; + elseif rPL(p,1) == 2 + ChartPL.Style = {Height('7.5cm'),HAlign('center')}; + else + ChartPL.Style = {Height('8cm'),HAlign('center')}; + end + if rPL(p,1) == 2 + ChartPL_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Water level and ' tipopressione... + ' pressure recorded by the piezometer at a depth of ' num2str(cell2mat(ProfPL(1,p))) ' m']); + ChartPL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + else + ChartPL_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Water level and ' tipopressione... + ' pressure recorded during the reference time period by the sensor placed at a depth of ' ... + num2str(cell2mat(ProfPL(1,p))) ' m']); + ChartPL_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + end + FIG_ENG = FIG_ENG+1; + if titolo == 1 + SE_ENG.Title = sezPiezo; + add(DT_ENG,sezPiezo); + titolo = 0; + end + escludi2 = 0; + if rPL(p,1) == 2 + if p == 1 + testo = Paragraph(['The following graphs shows the water level and ' tipopressione... + ' pressure values recorded during the reference time period by the piezometers placed on site. '... + 'Sensor at a depth of ' num2str(cell2mat(ProfPL(1,p))) ' m b.g.l. registered a maximum water level '... + 'that equals ' num2str(round(max(waterlevel(:,p)),2), '%0.2f') ' m. The minimum value is '... + num2str(round(min(waterlevel(:,p)),2), '%0.2f') ' m, while the maximum variation is '... + num2str(round(max(waterlevel(:,p)),2)-round(min(waterlevel(:,p)),2),'%0.2f') ' m.']); + testo.HAlign = 'justify'; + escludi2 = 1; + add(DT_ENG,testo); + elseif p == 2 + testo = Paragraph(['Sensor at a depth of ' num2str(cell2mat(ProfPL(1,p))) ' m b.g.l. registered a maximum water level '... + 'that equals ' num2str(round(max(waterlevel(:,p)),2), '%0.2f') ' m. The minimum value is '... + num2str(round(min(waterlevel(:,p)),2), '%0.2f') ' m, while the maximum variation is '... + num2str(round(max(waterlevel(:,p)),2)-round(min(waterlevel(:,p)),2),'%0.2f') ' m.']); + testo.HAlign = 'justify'; + escludi2 = 1; + add(DT_ENG,testo); + end + elseif p == 1 + testo = Paragraph(['The following graphs shows the water level and ' tipopressione... + ' pressure values recorded during the reference time period by the piezometers placed on the Array. ']); + testo.HAlign = 'justify'; + add(DT_ENG,testo); + end + if escludi2 == 0 + testo2 = Paragraph(['Sensor at a depth of ' num2str(cell2mat(ProfPL(1,p))) ' m b.g.l. registered a maximum water level '... + 'that equals ' num2str(round(max(waterlevel(:,p)),2), '%0.2f') ' m. The minimum value is '... + num2str(round(min(waterlevel(:,p)),2), '%0.2f') ' m, while the maximum variation is '... + num2str(round(max(waterlevel(:,p)),2)-round(min(waterlevel(:,p)),2),'%0.2f') ' m.']); + testo2.HAlign = 'justify'; + add(DT_ENG,testo2); + end + add(DT_ENG,ChartPL); + add(DT_ENG,ChartPL_cap); + if p == rPL(m,1) || p == 1 && rPL(m,1) > 2 || rTL(m,1) == 0 && p == 1 && rIPL(m,1) == 0 && p == 1 + add(DT_ENG,br); + end + close(figure(3)); + end + % per grafici integrati + diffP = waterlevel-waterlevel(1,:); + maxP = max(diffP); + MAX = max(maxP); + ind = find(maxP==MAX); + GI_LivelloFaldaPL = diffP(:,ind); + GI_ProfPL = cell2mat(ProfPL(1,ind)); + GI_DatePL = Date; + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + end + check = 1; + end + end + end + end +end + +text = 'report_PL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_PT100.m b/Tilt/report_PT100.m new file mode 100755 index 0000000..519a012 --- /dev/null +++ b/Tilt/report_PT100.m @@ -0,0 +1,364 @@ +function [FIG,FIG_ENG,battANALOG,ATTIVA] = report_PT100(rPT100,m,NodoPT100Link,... + toolrif,unitrif,datarif,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,... + battANALOG,ATTIVA,activeEN,contunit,br,status,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_PT100 function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('GMUX non ancora installato o canale inattivo.'); + add(DT,testo); + if activeEN == 1 + testo = Paragraph('GMUX not installed or inactive.'); + add(DT_ENG,testo); + end + end +elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoraggio completato. Invitiamo a visitare la '... + 'piattaforma web per la visione dei dati storici.']); + 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 + PTE = Section(); + titolo = 1; + + 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')}; + FIG = FIG+1; + Chart_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + sezBATT = Paragraph('GMUX - Batteria e Temperatura'); + sezBATT.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + add(DT,sezBATT); + add(DT,testoB1); + add(DT,testoB2); + add(DT,lot); + add(DT,lot_cap); + add(DT,br); + close(figure(19)); + + if activeEN == 1 + 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 + + for n = 1:rPT100(m,1) + NodeNum = num2str(NodoPT100Link(n,m)); + comando = ['select EventDate, EventTime, T_node 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 + TempPT100 = cell2mat(Dati(:,3)); % temperatura + MaxTempPT100 = max(TempPT100); + MinTempPT100 = min(TempPT100); + + % grafico temperatura + figure(1) + graficoPT100 = plot(Date,TempPT100); + xlim([Date(1)-1 Date(end)+1]); + title(['Andamento della temperatura registrata dal sensore numero ' NodeNum ]); + xlabel('Data [gg/mm/aaaa]'); + ylabel(['Temperatura [' char(176) 'C]']); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'PT100_',NodeNum,'.png')); + if titolo == 1 + sezPT100 = Heading3('PT100 Link'); + sezPT100.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PTE.Title = sezPT100; + add(DT,sezPT100); + if activeEN == 0 + titolo = 0; + end + end + + saveas(graficoPT100,TempName); + ChartPT100 = Image(TempName); + ChartPT100.Style = {Height('7.3cm'),HAlign('center')}; + ChartPT100_cap = Paragraph(['Fig. ' num2str(FIG) ' - Andamento della'... + ' temperatura misurata dalla sonda PT100 numero ' NodeNum... + ' durante il periodo temporale di riferimento']); + FIG = FIG+1; + ChartPT100_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['I grafici seguenti mostrano i valori di temperatura '... + 'misurati dalle sonde PT100 collegato all''Analog Array.']); + testo2 = Paragraph(['Durante il periodo temporale di riferimento, il nodo '... + 'numero ' NodeNum ' ha registrato valori massimi e minimi di temperatura rispettivamente pari '... + 'a ' num2str(MaxTempPT100,'%0.1f') '' char(176) 'C e ' num2str(MinTempPT100,'%0.1f') '' char(176) 'C.']); + testo.HAlign = 'justify'; + if n == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,ChartPT100); + add(DT,ChartPT100_cap); + if n == rPT100(m,1) + add(DT,br); + end + close(figure(1)); + + if activeEN == 1 + % grafico temperatura + figure(1) + graficoPT100 = plot(Date,TempPT100); + xlim([Date(1)-1 Date(end)+1]); + title(['Temperature recorded by sensor no. ' NodeNum ]); + xlabel('Date [dd/mm/yyyy]'); + ylabel(['Temperature [' char(176) 'C]']); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'PT100_',NodeNum,'_ENG.png')); + if titolo == 1 + sezPT100 = Heading3('PT100 Link'); + sezPT100.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PTE.Title = sezPT100; + add(DT,sezPT100); + titolo = 0; + end + + saveas(graficoPT100,TempName); + ChartPT100 = Image(TempName); + ChartPT100.Style = {Height('7.3cm'),HAlign('center')}; + ChartPT100_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Time evolution of '... + ' the temperature recorded by PT100 sensor number ' NodeNum... + ' during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartPT100_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graphs show the temperature values '... + 'recorded by PT100 sensors.']); + testo2 = Paragraph(['During the reference time period, node number '... + NodeNum ' highlighted maximum and minimum temperature values equal to '... + num2str(MaxTempPT100,'%0.1f') '' char(176) 'C and ' num2str(MinTempPT100,'%0.1f') '' char(176) 'C respectively.']); + testo.HAlign = 'justify'; + if n == 1 + add(DT_ENG,testo); + end + add(DT_ENG,testo2); + add(DT_ENG,ChartPT100); + add(DT_ENG,ChartPT100_cap); + if n == rPT100(m,1) + add(DT_ENG,br); + end + close(figure(1)); + end + %pulisco variabili da riutilizzare per catena successiva + clear TempPT100; + clear MaxTempPT100; + clear MinTempPT100; + else + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + if m == 1 + add(DT_ENG,br); + end + end + end + end + end +end + +text = 'report_PT100 function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_PrL.m b/Tilt/report_PrL.m new file mode 100755 index 0000000..4ce4ec6 --- /dev/null +++ b/Tilt/report_PrL.m @@ -0,0 +1,365 @@ +function [FIG,FIG_ENG,battANALOG,ATTIVA] = report_PrL(rPrL,m,NodoPressureLink,toolrif,... + unitrif,datarif,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,... + battANALOG,activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_PrL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('GMUX non ancora installato o canale inattivo.'); + add(DT,testo); + if activeEN == 1 + testo = Paragraph('GMUX not installed or inactive.'); + add(DT_ENG,testo); + end + end +elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoraggio completato. Invitiamo a visitare la '... + 'piattaforma web per la visione dei dati storici.']); + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array not installed or inactive.'); + add(DT_ENG,testo); + end + end +else + 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 registrati 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(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) ' - Livello di carica della batteria e temperatura del '... + 'GMUX registrati 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)); + if activeEN == 1 + 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 + + sezPrL = Heading3('Pressure Link'); + sezPrL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + PR = Section(); + PR.Title = sezPrL; + add(DT,sezPrL); + if activeEN == 1 + add(DT_ENG,sezPrL); + end + + for ld = 1:rPrL(m,1) + NodeNum = num2str(NodoPressureLink(ld,m)); + comando = ['select EventDate, EventTime, pressure 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 + pressione = cell2mat(Dati(:,3)); % carico cella + var_pressione = pressione-pressione(1); % variazione carico + + % grafico carico + figure(5); + load = plot(Date,var_pressione); + title(['Variazione di Pressione - Nodo numero ' NodeNum '']); + xlabel('Data [gg/mm/aaaa]'); + ylabel('Variazione di pressione [kPa]'); + if max(var_pressione) < 20 && min(var_pressione) > -20 + ylim([-20 20]); + elseif max(var_pressione) > 20 && min(var_pressione) > -20 + ylim([-20 inf]); + elseif max(var_pressione) < 20 && min(var_pressione) < -20 + ylim([-inf 20]); + end + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + hold off + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-CellaPressione', NodeNum, '.png')); + saveas(load,TempName); + ChartPrL = Image(TempName); + ChartPrL.Style = {Height('7.3cm'),HAlign('center')}; + ChartPrL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Variazione di pressione'... + ' registrata dalla cella, nodo numero ' NodeNum... + ', nel periodo temporale di riferimento']); + FIG = FIG+1; + ChartPrL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['I grafici seguenti rappresentato i dati relativi '... + 'alla variazione di pressione (in kPa) rilevata dai sensori collegati all''Analog Array.']); + testo2 = Paragraph(['Durante il periodo temporale di riferimento, il nodo numero ' NodeNum... + ' ha registrato una massima variazione di pressione pari a '... + num2str(round(max(abs(var_pressione)),2), '%0.2f') ' kPa, mentre il massimo '... + 'valore di pressione assoluta ' char(232) ' pari a ' num2str(round(max(pressione),2), '%0.2f') ' kPa.' ]); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if ld == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,ChartPrL); + add(DT,ChartPrL_cap); + if ld == rPrL(m,1) + add(DT,br); + end + close(figure(5)); + if activeEN == 1 + % grafico carico + figure(5); + load = plot(Date,var_pressione); + title(['Pressure variation - Node number ' NodeNum '']); + xlabel('Date [dd/mm/yyyy]'); + ylabel('Pressure variation [kPa]'); + if max(var_pressione) < 20 && min(var_pressione) > -20 + ylim([-20 20]); + elseif max(var_pressione) > 20 && min(var_pressione) > -20 + ylim([-20 inf]); + elseif max(var_pressione) < 20 && min(var_pressione) < -20 + ylim([-inf 20]); + end + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + hold off + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-CellaPressione', NodeNum, '_ENG.png')); + saveas(load,TempName); + ChartPrL = Image(TempName); + ChartPrL.Style = {Height('7.3cm'),HAlign('center')}; + ChartPrL_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Pressure variation '... + 'recorded by the pressure cell, node number ' NodeNum... + ', during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartPrL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following representations show the pressure variation recorded by '... + 'the sensors that equip the Analog Array.']); + testo2 = Paragraph(['During the reference monitoring period, node number ' NodeNum... + ' recorded a maximum pressure variation of '... + num2str(round(max(abs(var_pressione)),2), '%0.2f') ' kPa, while the maximum absolute '... + 'pressure value is ' num2str(round(max(pressione),2), '%0.2f') ' kPa.' ]); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if ld == 1 + add(DT_ENG,testo); + end + add(DT_ENG,testo2); + add(DT_ENG,ChartPrL); + add(DT_ENG,ChartPrL_cap); + if ld == rPrL(m,1) + add(DT_ENG,br); + end + close(figure(5)); + end + % pulisco variabili da riutilizzare per catena successiva + clear carico; + clear var_carico; + else + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + add(DT,testo); + add(DT,br); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + if m == 1 + add(DT_ENG,br); + end + end + end + end + end +end + +text = 'report_PrL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_RL.m b/Tilt/report_RL.m new file mode 100755 index 0000000..3b1db4a --- /dev/null +++ b/Tilt/report_RL.m @@ -0,0 +1,213 @@ +function [GI_rainloc,GI_DateRL,ATTIVA,FIG,FIG_ENG] = report_RL(rRL,m,NodoRainLink,toolrif,... + unitrif,datarif,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,... + activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_RL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +titolo = 1; +GI_rainloc = []; +GI_DateRL = []; + +if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('Catena non ancora installata o inattiva.'); + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array not installed or inactive.'); + add(DT_ENG,testo); + end + end +elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoraggio completato. Invitiamo a visitare la '... + 'piattaforma web per la visione dei dati storici.']); + 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 + for r = 1:rRL(m,1) + NodeNum = num2str(NodoRainLink(r,m)); + comando = ['select EventDate, EventTime, Z, ZShift 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 + pioggiatot = cell2mat(Dati(:,3)); % altezza di pioggia cumulata + pioggialoc = cell2mat(Dati(:,4)); % altezza di pioggia locale + pioggiatot_diff = pioggiatot - pioggiatot(1); + + % per grafici integrati + GI_rainloc = pioggialoc; + GI_DateRL = Date; + + % grafico piogge locali e totali + figure(6) + rain = bar(Date,pioggialoc,65); + title('Precipitazioni'); + yyaxis left + ylabel('Altezza di pioggia [mm]'); + xlabel('Data [gg/mm/aaaa]'); + xlim([Date(1)-1 Date(end)+1]); + ylim([0 max(pioggialoc(:,1))+1]); + + hold on + yyaxis right + raintot = plot(Date,pioggiatot_diff); + ylabel('Altezza di pioggia cumulata [mm]'); + set(gca,'YColor','k'); + if min(pioggiatot_diff(:,1))-2 > 0 + ylim([min(pioggiatot_diff(:,1))-2 max(pioggiatot_diff(:,1))+1]); + else + ylim([0 max(pioggiatot_diff(:,1))+1]); + end + + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(25); + str(1,1) = cellstr('Precipitazioni'); + str(2,1) = cellstr('Precipitazioni cumulate'); + legend(str,'Location','best'); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-RainLink', NodeNum, '.png')); + saveas(raintot,TempName); + ChartRL = Image(TempName); + ChartRL.Style = {ScaleToFit}; + ChartRL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Andamento nel tempo delle precipitazioni misurate dal pluviometro']); + FIG = FIG+1; + ChartRL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['Il grafico seguente riporta i dati di precipitazione '... + 'locale e cumulata registrati nel periodo temporale di riferimento. '... + 'In particolare, l''altezza di pioggia totale registrata '... + 'dal pluviometro in riferimento al solo periodo di riferimento ' char(232) ' pari a ' num2str(sum(pioggiatot_diff(end)))... + ' mm, mentre il valore di pioggia cumulata '... + 'a partire dall''inizio dell''attivit' char(224) ' di monitoraggio ' char(232) ' di ' num2str(pioggiatot(end))... + ' mm (dato aggiornato al ' datestr(Date(end), 'dd/mm/yyyy HH:MM') ').']); + testo.HAlign = 'justify'; + + if titolo == 1 + sezRain = Paragraph('Rain Link'); + sezRain.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + RR = Section(); + RR.Title = sezRain; + add(DT,sezRain); + if activeEN == 1 + sezRain_ENG = Paragraph('Rain Link'); + sezRain_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + RR_ENG = Section(); + RR_ENG.Title = sezRain; + add(DT_ENG,sezRain_ENG); + end + titolo = 0; + end + + add(DT,testo); + add(DT,ChartRL); + add(DT,ChartRL_cap); + add(DT,br); + close(figure(6)); + + %--ENG-- + if activeEN == 1 + % grafico piogge locali e totali + figure(16) + rain = bar(Date,pioggialoc,25); + title('Rainfall'); + yyaxis left + ylabel('Rainfall [mm]'); + xlabel('Date [dd/mm/yyyy]'); + xlim([Date(1)-1 Date(end)+1]); + ylim([0 max(pioggialoc(:,1))+1]); + + hold on + yyaxis right + raintot = plot(Date,pioggiatot_diff); + ylabel('Cumulative rainfall [mm]'); + set(gca,'YColor','k'); + if min(pioggiatot_diff(:,1))-2 > 0 + ylim([min(pioggiatot_diff(:,1))-2 max(pioggiatot_diff(:,1))+1]); + else + ylim([0 max(pioggiatot_diff(:,1))+1]); + end + + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(25); + str(1,1) = cellstr('Rainfall'); + str(2,1) = cellstr('Cumulative rainfall'); + legend(str,'Location','best'); + grid on + grid minor + + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-RainLink', NodeNum, '_ENG.png')); + saveas(raintot,TempName); + ChartRL_ENG = Image(TempName); + ChartRL_ENG.Style = {ScaleToFit}; + ChartRL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Rainfall trend recorded by the rain gauge during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartRL_ENG_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graph shows precipitation data recorded by the rain gauge during the '... + 'reference time period. In particular, the sensor recorded a total rainfall of '... + ' ' num2str(sum(pioggiatot_diff(end)))... + ' mm during the reference time period, while the cumulative rainfall measured since the '... + 'beginning of the monitoring activity amounts to ' num2str(pioggiatot(end))... + ' mm (updated to: ' datestr(Date(end), 'dd/mm/yyyy HH:MM') ').']); + testo.HAlign = 'justify'; + + add(DT_ENG,testo); + add(DT_ENG,ChartRL_ENG); + add(DT_ENG,ChartRL_ENG_cap); + add(DT_ENG,br); + close(figure(16)); + end + + % pulisco variabili da riutilizzare per catena successiva + clear pioggiatot; + clear pioggialoc; + + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + end + end + end + end +end + +text = 'report_RL function executed correctly. report_RL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_RSN.m b/Tilt/report_RSN.m new file mode 100755 index 0000000..99e088c --- /dev/null +++ b/Tilt/report_RSN.m @@ -0,0 +1,262 @@ +function [ATTIVA,FIG,FIG_ENG] = report_RSN(rRSN,m,NodoRSNLink,toolrif,unitrif,datarif,... + Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_RSN function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + + +% Make sure DOM is compilable +makeDOMCompilable() + +if status(m,1) == 1 + if ATTIVA == 1 + testo = Paragraph('Catena non ancora installata o inattiva.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array 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 + titolo = 1; + for b = 1:rRSN(m,1) + NodeNum = num2str(NodoRSNLink(b,m)); + comando = ['select EventDate, EventTime, AlfaX, AlfaY, T_node 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 + AngX = cell2mat(Dati(:,3)); % asse x assoluti + AngY = cell2mat(Dati(:,4)); % asse y assoluti + TempRSN = cell2mat(Dati(:,5)); % temp + [d,~] = size(AngX); + for ind = 2:d + VarAngX(ind,1) = AngX(ind,1)-AngX(ind-1,1); % variazioni asse x + VarAngY(ind,1) = AngY(ind,1)-AngY(ind-1,1); % variazione asse y + end + + % grafico inclinazione-tempo asse X,Y NELL'ULTIMO MESE + figure(1) + yyaxis left + RSN_X = plot(Date,VarAngX,'-','LineWidth',2); + hold on + RSN_Y = plot(Date,VarAngY,'-','Color','red','LineWidth',2); + hold off + yyaxis right + RSN_Temp = plot(Date,TempRSN,':','LineWidth',1.2); + title('Rockfall Safety Network - RSN Link'); + xlabel('Data [gg/mm/aaaa]'); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(12); + lgd = legend('Asse X','Asse Y','Temperatura','Location','south'); + lgd.NumColumns = 3; + yyaxis left + if max(VarAngX) > 1 || max(VarAngY) > 1 + if min(VarAngX) < -1 || max(VarAngY) < -1 + ylim([-inf inf]); + else + ylim([-1 inf]); + end + elseif min(VarAngX) < -1 || max(VarAngY) < -1 + if max(VarAngX) > 1 || max(VarAngY) > 1 + ylim([-inf inf]); + else + ylim([-inf 1]); + end + else + ylim([-1 1]); + end + ylabel(['Variazione di inclinazione [' char(176) ']','Color','k']); + set(gca,'YColor','k'); + yyaxis right + if max(VarAngX) > 1 || max(VarAngY) > 1 + if min(VarAngX) < -1 || max(VarAngY) < -1 + ylim([-inf inf]); + else + ylim([min(TempRSN)-7 inf]); + end + elseif min(VarAngX) < -1 || max(VarAngY) < -1 + if max(VarAngX) > 1 || max(VarAngY) > 1 + ylim([-inf inf]); + else + ylim([-inf max(TempRSN)+7]); + end + else + end + ylabel(['Temperatura [' char(176) 'C]','Color','k']); + set(gca,'YColor','k'); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-RSN.png')); + saveas(RSN_Y,TempName); + ChartRSN = Image(TempName); + ChartRSN.Style = {ScaleToFit}; + ChartRSN_cap = Paragraph(['Fig. ' num2str(FIG) ' - Variazione dell''inclinazione'... + ' in direzione X (perpendicolarmente rispetto alla barriera) e Y (trasversalmente alla barriera)'... + ' registrata dal sensore MEMS, integrato nel '... + 'modulo BPM, durante il periodo temporale di riferimento']); + FIG = FIG+1; + ChartRSN_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['I grafici seguenti riportano le variazioni di inclinazione misurate '... + 'nel periodo temporale di riferimento dal sensore MEMS incluso nel Rockfall Safety Network - RSN Link'... + ', relativamente agli assi strumentali X (perpendicolare alla barriera) e Y (trasversale alla barriera). ']); + testo2 = Paragraph(['In questo periodo di tempo, il sensore ha rilevato una variazione di inclinazione massima lungo l''asse X '... + 'pari a ' num2str(round(max(abs(VarAngX)),2), '%0.2f')... + char(176) '. Per quanto riguarda l''asse Y, la massima variazione risulta '... + ' pari a ' num2str(round(max(abs(VarAngY)),2), '%0.2f') '' char(176) ' di inclinazione.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if titolo == 1 + sezRSN = Paragraph('RSN Link'); + sezRSN.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + add(DT,sezRSN); + end + add(DT,testo); + add(DT,testo2); + add(DT,ChartRSN); + add(DT,ChartRSN_cap); + add(DT,br); + close(figure(1)); + + if activeEN == 1 + % grafico inclinazione-tempo asse X,Y NELL'ULTIMO MESE + figure(11) + yyaxis left + RSN_X = plot(Date,VarAngX,'-','LineWidth',2); + hold on + RSN_Y = plot(Date,VarAngY,'-','Color','red','LineWidth',2); + hold off + yyaxis right + RSN_Temp = plot(Date,TempRSN,':','LineWidth',1.2); + title('Rockfall Safety Network - RSN Link'); + xlabel('Date [dd/mm/yyyy]'); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(12); + lgd = legend('X axis','Y axis','Temperature','Location','south'); + lgd.NumColumns = 3; + yyaxis left + if max(VarAngX) > 1 || max(VarAngY) > 1 + if min(VarAngX) < -1 || max(VarAngY) < -1 + ylim([-inf inf]); + else + ylim([-1 inf]); + end + elseif min(VarAngX) < -1 || max(VarAngY) < -1 + if max(VarAngX) > 1 || max(VarAngY) > 1 + ylim([-inf inf]); + else + ylim([-inf 1]); + end + else + ylim([-1 1]); + end + ylabel(['Tilt variation [' char(176) ']','Color','k']); + set(gca,'YColor','k'); + yyaxis right + if max(VarAngX) > 1 || max(VarAngY) > 1 + if min(VarAngX) < -1 || max(VarAngY) < -1 + ylim([-inf inf]); + else + ylim([min(TempRSN)-7 inf]); + end + elseif min(VarAngX) < -1 || max(VarAngY) < -1 + if max(VarAngX) > 1 || max(VarAngY) > 1 + ylim([-inf inf]); + else + ylim([-inf max(TempRSN)+7]); + end + else + end + ylabel(['Temperature [' char(176) 'C]','Color','k']); + set(gca,'YColor','k'); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-RSN_ENG.png')); + saveas(RSN_Y,TempName); + ChartRSN_ENG = Image(TempName); + ChartRSN_ENG.Style = {ScaleToFit}; + ChartRSN_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Tilt variation along '... + 'X and Y directions (perpendicular and parallel to the barrier, respectively) '... + 'recorded during the reference time period by the MEMS sensor '... + 'integrated in the BPM module']); + FIG_ENG = FIG_ENG+1; + ChartRSN_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graphs display the tilt variation recorded during the '... + 'reference time period by the MEMS sensor integrated in the Rockfall Safety Network - RSN Link'... + ', referring to instrumental axes X (perpendicular to the barrier) and Y (parallel to the barrier). ']); + testo2 = Paragraph(['During the reference time period, the sensors measured a maximum tilt variation along the X axis '... + 'equal to ' num2str(round(max(abs(VarAngX)),2), '%0.2f')... + char(176) '. For what concerns the Y axis, the maximum tilt variation amounts to '... + num2str(round(max(abs(VarAngY)),2), '%0.2f') '' char(176) '.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if titolo == 1 + sezRSN_ENG = Paragraph('RSN Link'); + sezRSN_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + add(DT_ENG,sezRSN_ENG); + end + add(DT_ENG,testo); + add(DT_ENG,testo2); + add(DT_ENG,ChartRSN_ENG); + add(DT_ENG,ChartRSN_ENG_cap); + add(DT_ENG,br); + close(figure(11)); + end + titolo = 0; + % pulisco variabili da riutilizzare per catena successiva + clear AngX; + clear AngY; + clear VarAngX; + clear VarAngY; + clear TempRSN; + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + end + end + end + end +end + +text = 'report_RSN function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_RSNHR.m b/Tilt/report_RSNHR.m new file mode 100755 index 0000000..b1dc666 --- /dev/null +++ b/Tilt/report_RSNHR.m @@ -0,0 +1,258 @@ +function [ATTIVA,FIG,FIG_ENG] = report_RSNHR(rRSNHR,m,NodoRSNHRLink,toolrif,unitrif,... + datarif,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,ATTIVA,activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_RSNHR function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + + +% Make sure DOM is compilable +makeDOMCompilable() + +if status(m,1) == 1 + if ATTIVA == 1 + testo = Paragraph('Catena non ancora installata o inattiva.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array 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 + titolo = 1; + for h = 1:rRSNHR(m,1) + NodeNum = num2str(NodoRSNHRLink(h,m)); + comando = ['select EventDate, EventTime, AlfaX, AlfaY, T_node 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 + AngX_HR = cell2mat(Dati(:,3)); % asse x assoluti + AngY_HR = cell2mat(Dati(:,4)); % asse y assoluti + TempRSNHR = cell2mat(Dati(:,5)); % temp + [d,~] = size(AngX_HR); + for ind = 2:d + VarAngX_HR(ind,1) = AngX_HR(ind,1)-AngX_HR(ind-1,1); % variazioni asse x + VarAngY_HR(ind,1) = AngY_HR(ind,1)-AngY_HR(ind-1,1); % variazione asse y + end + + % grafico inclinazione-tempo asse X,Y NELL'ULTIMO MESE + figure(1) + yyaxis left + RSNHR_X = plot(Date,VarAngX_HR,'-','LineWidth',2); + hold on + RSNHR_Y = plot(Date,VarAngY_HR,'-','Color','red','LineWidth',2); + hold off + yyaxis right + RSNHR_Temp = plot(Date,TempRSNHR,':','LineWidth',1.2); + title('Rockfall Safety Network - RSN Link HR'); + xlabel('Data [gg/mm/aaaa]'); + lgd = legend('Asse X','Asse Y','Temperatura','Location','south'); + lgd.NumColumns = 3; + gra = gca; + gra.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(12); + yyaxis left + if max(VarAngX_HR) > 1 || max(VarAngY_HR) > 1 + if min(VarAngX_HR) < -1 || max(VarAngY_HR) < -1 + ylim([-inf inf]); + else + ylim([-1 inf]); + end + elseif min(VarAngX_HR) < -1 || max(VarAngY_HR) < -1 + if max(VarAngX_HR) > 1 || max(VarAngY_HR) > 1 + ylim([-inf inf]); + else + ylim([-inf 1]); + end + else + ylim([-1 1]); + end + set(gca,'YColor','k'); + ylabel(['Variazione di inclinazione [' char(176) ']','Color','k']); + yyaxis right + if max(VarAngX_HR) > 1 || max(VarAngY_HR) > 1 + if min(VarAngX_HR) < -1 || max(VarAngY_HR) < -1 + else + ylim([min(TempRSNHR)-7 inf]); + end + elseif min(VarAngX_HR) < -1 || max(VarAngY_HR) < -1 + if max(VarAngX_HR) > 1 || max(VarAngY_HR) > 1 + else + ylim([-inf max(TempRSNHR)+7]); + end + end + ylabel(['Temperatura [' char(176) 'C]','Color','k']); + set(gca,'YColor','k'); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-RSNHR.png')); + saveas(RSNHR_Temp,TempName); + ChartRSNHR = Image(TempName); + ChartRSNHR.Style = {ScaleToFit}; + ChartRSNHR_cap = Paragraph(['Fig. ' num2str(FIG) ' - Variazione dell''inclinazione'... + ' in direzione X (perpendicolarmente rispetto alla barriera) e Y (trasversalmente alla barriera)'... + ' registrata dal sensore elettrolitico, integrato nel '... + 'modulo BPM, durante il periodo temporale di riferimento']); + FIG = FIG+1; + ChartRSNHR_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['I grafici seguenti riportano le variazioni di inclinazione misurate '... + 'nel periodo temporale di riferimento dal sensore elettrolitico incluso'... + ' nel Rockfall Safety Network - RSN Link HR, relativamente agli assi strumentali'... + ' X (perpendicolare alla barriera) e Y (trasversale alla barriera). ']); + testo2 = Paragraph(['In questo periodo di tempo, l''ampolla elettrolitica ha'... + ' rilevato una variazione di inclinazione massima lungo l''asse X '... + 'pari a ' num2str(round(max(abs(VarAngX_HR)),2), '%0.2f')... + char(176) '. Per quanto riguarda l''asse Y, la massima variazione risulta '... + ' pari a ' num2str(round(max(abs(VarAngY_HR)),2), '%0.2f') '' char(176) ' di inclinazione.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if titolo == 1 + sezRSNHR = Paragraph('RSN Link HR'); + sezRSNHR.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + add(DT,sezRSNHR); + end + add(DT,testo); + add(DT,testo2); + add(DT,ChartRSNHR); + add(DT,ChartRSNHR_cap); + add(DT,br); + close(figure(1)); + + if activeEN == 1 + % grafico inclinazione-tempo asse X,Y NELL'ULTIMO MESE + figure(1) + yyaxis left + RSNHR_X = plot(Date,VarAngX_HR,'-','LineWidth',2); + hold on + RSNHR_Y = plot(Date,VarAngY_HR,'-','Color','red','LineWidth',2); + hold off + yyaxis right + RSNHR_Temp = plot(Date,TempRSNHR,':','LineWidth',1.2); + title('Rockfall Safety Network - RSN Link HR'); + xlabel('Data [gg/mm/aaaa]'); + lgd = legend('X axis','Y axis','Temperature','Location','south'); + lgd.NumColumns = 3; + gra = gca; + gra.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(12); + yyaxis left + if max(VarAngX_HR) > 1 || max(VarAngY_HR) > 1 + if min(VarAngX_HR) < -1 || max(VarAngY_HR) < -1 + ylim([-inf inf]); + else + ylim([-1 inf]); + end + elseif min(VarAngX_HR) < -1 || max(VarAngY_HR) < -1 + if max(VarAngX_HR) > 1 || max(VarAngY_HR) > 1 + ylim([-inf inf]); + else + ylim([-inf 1]); + end + else + ylim([-1 1]); + end + set(gca,'YColor','k'); + ylabel(['Tilt variation [' char(176) ']','Color','k']); + yyaxis right + if max(VarAngX_HR) > 1 || max(VarAngY_HR) > 1 + if min(VarAngX_HR) < -1 || max(VarAngY_HR) < -1 + else + ylim([min(TempRSNHR)-7 inf]); + end + elseif min(VarAngX_HR) < -1 || max(VarAngY_HR) < -1 + if max(VarAngX_HR) > 1 || max(VarAngY_HR) > 1 + else + ylim([-inf max(TempRSNHR)+7]); + end + end + ylabel(['Temperature [' char(176) 'C]','Color','k']); + set(gca,'YColor','k'); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-RSNHR_ENG.png')); + saveas(RSNHR_Temp,TempName); + ChartRSNHR_ENG = Image(TempName); + ChartRSNHR_ENG.Style = {ScaleToFit}; + ChartRSNHR_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Tilt variation along '... + 'X and Y directions (perpendicular and parallel to the barrier, respectively) '... + 'recorded during the reference time period by the electrolytic sensor '... + 'integrated in the BPM module']); + FIG_ENG = FIG_ENG+1; + ChartRSNHR_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graphs display the tilt variation recorded during the '... + 'reference time period by the electrolytic sensor integrated in the Rockfall Safety Network - RSNHR Link'... + ', referring to instrumental axes X (perpendicular to the barrier) and Y (parallel to the barrier). ']); + testo2 = Paragraph(['During the reference time period, the sensors measured a maximum tilt variation along the X axis '... + 'equal to ' num2str(round(max(abs(VarAngX_HR)),2), '%0.2f')... + char(176) '. For what concerns the Y axis, the maximum tilt variation amounts to '... + num2str(round(max(abs(VarAngY_HR)),2), '%0.2f') '' char(176) '.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if titolo == 1 + sezRSNHR_ENG = Paragraph('RSN Link HR'); + sezRSNHR_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + add(DT_ENG,sezRSNHR_ENG); + end + add(DT_ENG,testo); + add(DT_ENG,testo2); + add(DT_ENG,ChartRSNHR); + add(DT_ENG,ChartRSNHR_cap); + add(DT_ENG,br); + close(figure(1)); + end + titolo = 0; + %pulisco variabili da riutilizzare per catena successiva + clear AngX_HR; + clear AngY_HR; + clear VarAngX_HR; + clear VarAngY_HR; + clear TempRSNHR; + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + end + end + end + end +end + +text = 'report_RSNHR function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_RaL.m b/Tilt/report_RaL.m new file mode 100755 index 0000000..d8613e3 --- /dev/null +++ b/Tilt/report_RaL.m @@ -0,0 +1,1036 @@ +function [GI_Rad_XYZ,GI_Rad_Num,GI_Rad_MPBEL,GI_Rad_Cir,GI_Rad_Date,ATTIVA,FIG,FIG_ENG] = report_RaL(... + DTcatena,rRaL,m,NodoRadialLink,toolrif,unitrif,datarif,firstdata_num,Font_caption,... + Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,colonna2,colonna2bis,status,ATTIVA,activeEN,... + conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_RaL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +GI_Rad_XYZ = []; +GI_Rad_Num = []; +GI_Rad_MPBEL = []; +GI_Rad_Cir = []; +GI_Rad_Date = []; + +check = 0; +while check == 0 + if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('Catena non ancora installata o inattiva.'); + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array not installed or inactive.'); + add(DT_ENG,testo); + end + end + check = 1; + elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoraggio completato. Invitiamo a visitare la '... + 'piattaforma web per la visione dei dati storici.']); + 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 + check = 1; + else + NODATA(m,1) = 0; + date = datestr(datenum(colonna2{m+1,1},'dd-mm-yyyy'),'yyyy-mm-dd'); % data riferimento definita sul sito + % posizione di progetto dei nodi + comando = ['select EventDate, EventTime, X, Y, Z from ElabDataView where EventDate = ''' ... + date ''' and ToolNameID = ''' char(toolrif) ''' and UnitName = ''' char(unitrif) ... + ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + SezioneXYZ = curs.Data; + Datasez = SezioneXYZ(1,1); + Orasez = SezioneXYZ(1,2); + [rz,~] = size(SezioneXYZ); + scrivi = 1; + for rr = 1:rz + if strcmp(SezioneXYZ(rr,1),Datasez)==1 && strcmp(SezioneXYZ(rr,2),Orasez) ==1 + CoordX(scrivi,1) = cell2mat(SezioneXYZ(rr,3)); + CoordY(scrivi,1) = cell2mat(SezioneXYZ(rr,4)); + CoordZ(scrivi,1) = cell2mat(SezioneXYZ(rr,5)); + scrivi = scrivi+1; + end + end + + diffX = zeros(1,rRaL(m,1)); + diffY = zeros(1,rRaL(m,1)); + diffZ = zeros(1,rRaL(m,1)); + RIS_XYZ_Mese = zeros(1,rRaL(m,1)); + RIS_XYZ_Tot = zeros(1,rRaL(m,1)); + Num = zeros(rRaL(m,1),1); + for n = 1:rRaL(m,1) + NodeNum = num2str(NodoRadialLink(n,m)); + % dati del mese + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z '... + '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; + Num(n,1) = NodoRadialLink(n,m); + + [rD,rC] = size(Dati); + if rC ~= 1 + T = [cell2mat(Dati(:,1)) repmat(' ', [rD,1]) cell2mat(Dati(:,2))]; + Date = datenum(T); % Data + if n == 1 % Il primo lo scrivo e creo la variabile di controllo + else + [rS,~] = size(asseX); + if rD ~= rS + NODATA(m,1) = 1; + check = 0; + break + else + check = 1; + end + end + + % spostamenti dei nodi dall'inizio + asseX(:,n) = cell2mat(Dati(:,3)); + asseY(:,n) = cell2mat(Dati(:,4)); + asseZ(:,n) = cell2mat(Dati(:,5)); + X_RL_Tot(:,n) = cell2mat(Dati(:,6)); + Y_RL_Tot(:,n) = cell2mat(Dati(:,7)); + Z_RL_Tot(:,n) = cell2mat(Dati(:,8)); + X_RL_Mese(:,n) = X_RL_Tot(:,n)-X_RL_Tot(1,n)+CoordX(n,1)'; + Y_RL_Mese(:,n) = Y_RL_Tot(:,n)-Y_RL_Tot(1,n)+CoordY(n,1)'; + Z_RL_Mese(:,n) = Z_RL_Tot(:,n)-Z_RL_Tot(1,n)+CoordZ(n,1)'; + diffX(1,n) = asseX(end,n)-asseX(1,n); + diffY(1,n) = asseY(end,n)-asseY(1,n); + diffZ(1,n) = asseZ(end,n)-asseZ(1,n); + dX(:,n) = asseX(:,n)-asseX(:,1); + dY(:,n) = asseY(:,n)-asseY(:,1); + dZ(:,n) = asseZ(:,n)-asseZ(:,1); + + RIS_XYZ_Mese(1,n) = (sqrt(diffX(1,n)^2 + diffY(1,n)^2+diffZ(1,n)^2))*1000; + cX_Mese(1,n) = 100*abs(1000*diffX(1,n))/RIS_XYZ_Mese(1,n); + cY_Mese(1,n) = 100*abs(1000*diffY(1,n))/RIS_XYZ_Mese(1,n); + cZ_Mese(1,n) = 100*abs(1000*diffZ(1,n))/RIS_XYZ_Mese(1,n); + RIS_XYZ_Tot(1,n) = (sqrt(asseX(end,n)^2 + asseY(end,n)^2+asseZ(end,n)^2))*1000; + cX_Tot(1,n) = 100*abs(1000*asseX(1,n))/RIS_XYZ_Tot(1,n); + sigX_Tot(1,n) = sign(asseX(1,n)); + cY_Tot(1,n) = 100*abs(1000*asseY(1,n))/RIS_XYZ_Tot(1,n); + sigY_Tot(1,n) = sign(asseY(1,n)); + cZ_Tot(1,n) = 100*abs(1000*asseZ(1,n))/RIS_XYZ_Tot(1,n); + sigZ_Tot(1,n) = sign(asseZ(1,n)); + else + NODATA(m,1) = 1; + check = 1; + end + end + + if NODATA(m,1) == 0 + if strcmp(colonna2bis(m+1,1),colonna2(m+1,1)) == 0 % data zero diversa data riferimento + clear RIS_XYZ_Tot + datarifNEW = datestr(firstdata_num{m+1,1},'yyyy-mm-dd'); % data riferimento definita sul sito + for nw = 1:rRaL(m,1) + NodeNum = num2str(NodoRadialLink(nw,m)); + comando = ['select EventDate, EventTime, XShift, YShift, ZShift, X, Y, Z, '... + 'from ElabDataView where EventDate = ''' datarifNEW ''' and ToolNameID = ''' char(toolrif) ... + ''' and UnitName = ''' char(unitrif) ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DatiNEW = curs.Data; % dati registrati alla data di riferimento + Num(nw,1) = NodoRadialLink(nw,m); + [~,rC] = size(DatiNEW); + if rC ~= 1 + % dalla data di riferimento + asseX(:,nw) = asseX(:,nw)-cell2mat(DatiNEW(1,3)); + asseY(:,nw) = asseY(:,nw)-cell2mat(DatiNEW(1,4)); + asseZ(:,nw) = asseZ(:,nw)-cell2mat(DatiNEW(1,5)); + X_RL_Tot(:,nw) = X_RL_Tot-cell2mat(DatiNEW(:,6))+CoordX(nw,1)'; + Y_RL_Tot(:,nw) = Y_RL_Tot-cell2mat(DatiNEW(:,7))+CoordY(nw,1)'; + Z_RL_Tot(:,nw) = Z_RL_Tot-cell2mat(DatiNEW(:,8))+CoordZ(nw,1)'; + RIS_XYZ_Tot(1,n) = (sqrt(asseX(end,n)^2 + asseY(end,n)^2+asseZ(end,n)^2))*1000; + cX_Tot(1,n) = 100*abs(1000*diffX(1,n))/RIS_XYZ_Tot(1,n); + cY_Tot(1,n) = 100*abs(1000*diffY(1,n))/RIS_XYZ_Tot(1,n); + cZ_Tot(1,n) = 100*abs(1000*diffZ(1,n))/RIS_XYZ_Tot(1,n); + else + NODATA(m,1) = 1; + end + end + end + + GI_Rad_XYZ = max(RIS_XYZ_Mese); + ind = find(GI_Rad_XYZ==max(RIS_XYZ_Mese(1,:))); + GI_Rad_Num = Num(ind(1)); + GI_Rad_Date = Date; + + % Cerco eventuali correlazioni con Multibase + NomeFile = strcat('Report',siteID,'-RLvsMPBEL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + Var = 0; + while AAA < rF + check1 = Filetesto(AAA,1); + if check1 == 99999 + AAA = 2; + else + check2 = Filetesto(AAA+1,1); + if check1 == str2num(DTcatena(end-2:end)) + Nodo = Filetesto(AAA+2,1); + Var = 1; + elseif check2 == str2num(DTcatena(end-2:end)) + Nodo = Filetesto(AAA+3,1); + Var = 1; + end + AAA = AAA+4; + end + end + if Var == 1 + % Riabilitare le variabili sotto se vogliamo usare i + % cumulati anzichè i locali +% sX = dX'; +% sTX = cumsum(sX); +% sX = sTX'; +% sY = dY'; +% sTY = cumsum(sY); +% sY = sTY'; +% sZ = dZ'; +% sTZ = cumsum(sZ); +% sZ = sTZ'; + GI_Rad_MPBEL = (sqrt(dX(:,Nodo).^2 + dY(:,Nodo).^2 + dZ(:,Nodo).^2))*1000; % ad ogni rad è associato al massimo un solo multibase + end + + % Cerco eventuali correlazioni con Cir + NomeFile = strcat('Report',siteID,'-TuLvsRL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + Var = 0; + while AAA < rF % Cerco coppie Cir - Rad + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono Rad o non ci sono Cir + AAA = 2; + else + check2 = Filetesto(AAA+1,1); + if check1 == str2num(DTcatena(end-2:end)) % Il Cir è da prendere in considerazione ed è riportato nella prima riga del file + Nodo = Filetesto(AAA+2,1); + Var = 1; + elseif check2 == str2num(DTcatena(end-2:end)) % Il Cir è da prendere in considerazione ed è riportato nella seconda riga del file + Nodo = Filetesto(AAA+3,1); + Var = 1; + end + AAA = AAA+4; + end + end + if Var == 1 + GI_Rad_Cir = (sqrt(dX(:,Nodo).^2 + dZ(:,Nodo).^2))*1000; %Più rad possono associarsi allo stesso cir + end + + % Istogramma spostamenti 3D + figure(1) + [~,nn] = size(RIS_XYZ_Mese(end,:)); + for w = 1:nn + nodi_grafico(1,w) = w; + end + RIS_XYZ = [RIS_XYZ_Mese(end,:)' RIS_XYZ_Tot(end,:)']; + Rad_3D = barh(nodi_grafico,RIS_XYZ); + title('Risultante 3D degli spostamenti locali'); + xlabel('Spostamento [mm]'); + ylabel('Nodo [-]'); + h = gca; + h.XAxis.MinorTick = 'on'; + h.YAxis.MinorTick = 'off'; + Max(1) = max(RIS_XYZ_Mese); + Max(2) = max(RIS_XYZ_Tot); + MAX = max(Max); + in = find(Max == MAX); + if in == 1 + POS = find(RIS_XYZ_Mese == Max(1)); + else + POS = find(RIS_XYZ_Tot == Max(2)); + end + if MAX < 10 % mm + xlim([0 10]); + end + yticks(0:1:nn); + grid on + if POS > rRaL(m)/2 % Legenda in basso a dx + legend('Periodo di riferimento','Intero periodo','Location','southeast'); + else % legenda in alto a dx + legend('Periodo di riferimento','Intero periodo','Location','northeast'); + end + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Rad3D.png')); + saveas(Rad_3D(1),TempName); + ChartRad = Image(TempName); + ChartRad.Style = {HAlign('justify'),ScaleToFit}; + ChartRad_cap = Paragraph(['Fig. ' num2str(FIG) ' - Risultante 3D degli '... + 'spostamenti differenziali locali nello spazio, registrati durante '... + 'il periodo temporale di riferimento e l''intero monitoraggio']); + FIG = FIG+1; + ChartRad_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + %--ENG-- + if activeEN == 1 + figure(11) + [~,nn] = size(RIS_XYZ_Mese(end,:)); + for w = 1:nn + nodi_grafico(1,w) = w; + end + RIS_XYZ = [RIS_XYZ_Mese(end,:)' RIS_XYZ_Tot(end,:)']; + Rad_3D = barh(nodi_grafico,RIS_XYZ); + title('3D Local displacements'); + xlabel('Displacement [mm]'); + ylabel('Node [-]'); + h = gca; + h.XAxis.MinorTick = 'on'; + h.YAxis.MinorTick = 'off'; + Max(1) = max(RIS_XYZ_Mese); + Max(2) = max(RIS_XYZ_Tot); + MAX = max(Max); + in = find(Max == MAX); + if in == 1 + POS = find(RIS_XYZ_Mese == Max(1)); + else + POS = find(RIS_XYZ_Tot == Max(2)); + end + if MAX < 10 % mm + xlim([0 10]); + end + yticks(0:1:nn); + grid on + if POS > rRaL(m)/2 % Legenda in basso a dx + legend('Reference time period','Complete period','Location','southeast'); + else % legenda in alto a dx + legend('Reference time period','Complete period','Location','northeast'); + end + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Rad3D_ENG.png')); + saveas(Rad_3D(1),TempName); + ChartRad_ENG = Image(TempName); + ChartRad_ENG.Style = {HAlign('justify'),ScaleToFit}; + ChartRad_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - 3D local differential '... + 'displacements, measured during the reference and '... + 'the complete monitoring period']); + FIG_ENG = FIG_ENG+1; + ChartRad_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + end + + % --- Sezione - MESE --- + contaS_Mese = 1; + conta0_Mese = 1; + for ris = 1:nn + if RIS_XYZ_Mese(end,ris)> 0.5 + nodiSX(contaS_Mese,1) = CoordX(ris,1); + nodiSZ(contaS_Mese,1) = CoordZ(ris,1); + contaS_Mese = contaS_Mese+1; + else + nodi0X(conta0_Mese,1) = CoordX(ris,1); + nodi0Z(conta0_Mese,1) = CoordZ(ris,1); + conta0_Mese = conta0_Mese+1; + end + end + + % Aggiungo ancora + % --- Geometria Strumento - Mese --- + figure(2) + plot([0; CoordX(:,1)],[0;CoordZ(:,1)],'-','Color','black'); + hold on + if contaS_Mese > 1 + sezC = plot(nodiSX(:,1),nodiSZ(:,1),'o','Color','red'); + set(sezC, 'markerfacecolor', get(sezC, 'color')); + end + hold on + if conta0_Mese > 1 + sez0 = plot(nodi0X(:,1),nodi0Z(:,1),'o','Color','black'); + set(sez0, 'markerfacecolor', get(sez0, 'color')); + end + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + if sign(CoordX(ris,1)) == -1 + Location = 'southeast'; + else + Location = 'southwest'; + end + if contaS_Mese > 1 && conta0_Mese > 1 + legend('Geometria della strumentazione','Nodi con spostamenti','Nodi stabili','Location',Location); + elseif contaS_Mese > 1 && conta0_Mese == 1 + legend('Geometria della strumentazione','Nodi con spostamenti','Location',Location); + elseif contaS_Mese == 1 && conta0_Mese > 1 + legend('Geometria della strumentazione','Nodi stabili','Location',Location); + end + title('Spostamenti locali - periodo di riferimento'); + xlabel('X [m]'); + ylabel('Z [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + h.YAxis.MinorTick = 'on'; + grid off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezRAD-Mese.png')); + saveas(ancora,TempName); + ChartSEZ_Mese = Image(TempName); + ChartSEZ_Mese.Style = {HAlign('center'),Height('6.5cm')}; + + %--ENG-- + if activeEN == 1 + figure(22) + plot([0; CoordX(:,1)],[0;CoordZ(:,1)],'-','Color','black'); + hold on + if contaS_Mese > 1 + sezC = plot(nodiSX(:,1),nodiSZ(:,1),'o','Color','red'); + set(sezC, 'markerfacecolor', get(sezC, 'color')); + end + hold on + if conta0_Mese > 1 + sez0 = plot(nodi0X(:,1),nodi0Z(:,1),'o','Color','black'); + set(sez0, 'markerfacecolor', get(sez0, 'color')); + end + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + if sign(CoordX(ris,1)) == -1 + Location = 'southeast'; + else + Location = 'southwest'; + end + if contaS_Mese > 1 && conta0_Mese > 1 + legend('Array geometry','Nodes showing displacement','Stable nodes','Location',Location); + elseif contaS_Mese > 1 && conta0_Mese == 1 + legend('Array geometry','Nodes showing displacement','Location',Location); + elseif contaS_Mese == 1 && conta0_Mese > 1 + legend('Array geometry','Stable nodes','Location',Location); + end + title('Local Displacements - reference time period'); + xlabel('X [m]'); + ylabel('Z [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + h.YAxis.MinorTick = 'on'; + grid off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezRAD-Mese_ENG.png')); + saveas(ancora,TempName); + ChartSEZ_Mese_ENG = Image(TempName); + ChartSEZ_Mese_ENG.Style = {HAlign('center'),Height('6.5cm')}; + end + + % --- Geometria Strumento - Intero periodo --- + % --- Sezione - TOT --- + contaS_Tot = 1; + conta0_Tot = 1; + contaSX = 1; + contaD = 1; + contaT = 1; + contaA = 1; + contaB = 1; + contaXZ = 1; + contaG = 1; + clear nodi0X + clear nodi0Z + clear nodiSX + clear nodiSZ + for ris = 1:nn % Ho aggiunto l'ancora + if RIS_XYZ_Tot(end,ris)> 0.5 + if cX_Tot(1,ris) > 70 % + if sigX_Tot(1,ris) == 1 % Destra + nodiD_X(contaD,1) = CoordX(ris,1); + nodiD_Z(contaD,1) = CoordZ(ris,1); + contaD = contaD+1; + else % sinistra + nodiS_X(contaSX,1) = CoordX(ris,1); + nodiS_Z(contaSX,1) = CoordZ(ris,1); + contaSX = contaSX+1; + end + elseif cY_Tot(1,ris) > 70 % Trasversale + nodiT_X(contaT,1) = CoordX(ris,1); + nodiT_Z(contaT,1) = CoordZ(ris,1); + contaT = contaT+1; + elseif cZ_Tot(1,ris) > 70 + if sigZ_Tot(1,ris) == 1 % Verso l'alto + nodiA_X(contaA,1) = CoordX(ris,1); + nodiA_Z(contaA,1) = CoordZ(ris,1); + contaA = contaA+1; + else % Verso il basso + nodiB_X(contaB,1) = CoordX(ris,1); + nodiB_Z(contaB,1) = CoordZ(ris,1); + contaB = contaB+1; + end + elseif cX_Tot(1,ris)+cZ_Tot(1,ris) > 70 % 45 gradi circa + nodiXZ_X(contaXZ,1) = CoordX(ris,1); + nodiXZ_Z(contaXZ,1) = CoordZ(ris,1); + contaXZ = contaXZ+1; + else % Moto Generico + nodi_X(contaG,1) = CoordX(ris,1); + nodi_Z(contaG,1) = CoordZ(ris,1); + contaG = contaG+1; + end + nodiSX(contaS_Tot,1) = CoordX(ris,1); + nodiSZ(contaS_Tot,1) = CoordZ(ris,1); + contaS_Tot = contaS_Tot+1; + else % Stabili + nodi0X(conta0_Tot,1) = CoordX(ris,1); + nodi0Z(conta0_Tot,1) = CoordZ(ris,1); + conta0_Tot = conta0_Tot+1; + end + end + + figure(3) + plot([0;CoordX(:,1)],[0;CoordZ(:,1)],'-','Color','black'); + hold on + % Spostamenti generici + if contaG > 1 + sezG = plot(nodi_X(:,1),nodi_Z(:,1),'o','Color','red'); + set(sezG, 'markerfacecolor', get(sezG, 'color')); + end + % Spostamenti Alto + if contaA > 1 + sezA = plot(nodiA_X(:,1),nodiA_Z(:,1),'^','Color',[0.4660 0.6740 0.1880],'MarkerSize' ,7); + set(sezA, 'markerfacecolor', get(sezA, 'color')); + end + % Spostamenti Basso + if contaB > 1 + sezB = plot(nodiB_X(:,1),nodiB_Z(:,1),'v','Color',[0.4660 0.6740 0.1880],'MarkerSize' ,7); + set(sezB, 'markerfacecolor', get(sezB, 'color')); + end + % Spostamenti Destra + if contaD > 1 + sezD = plot(nodiD_X(:,1),nodiD_Z(:,1),'>','Color','blue','MarkerSize' ,7); + set(sezD, 'markerfacecolor', get(sezD, 'color')); + end + % Spostamenti Sinistra + if contaSX > 1 + sezSX = plot(nodiS_X(:,1),nodiS_Z(:,1),'<','Color',[0.3010 0.7450 0.9330],'MarkerSize' ,7); + set(sezSX, 'markerfacecolor', get(sezSX, 'color')); + end + % Spostamenti 45° + if contaXZ > 1 + sezXZ = plot(nodiXZ_X(:,1),nodiXZ_Z(:,1),'x','Color',[0.8500 0.3250 0.0980],'MarkerSize' ,13); + set(sezXZ, 'markerfacecolor', get(sezXZ, 'color')); + end + % Sensori Fermi + if conta0_Tot > 1 + sez0 = plot(nodi0X(:,1),nodi0Z(:,1),'o','Color','black'); + set(sez0, 'markerfacecolor', get(sez0, 'color')); + end + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + if sign(CoordX(ris,1)) == -1 + Location = 'southeast'; + else + Location = 'southwest'; + end + if contaG > 1 && contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaG > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti verso destra',... + 'Spostamenti verso sinistra','Nodi stabili','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaD > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto','Spostamenti in basso',... + 'Spostamenti verso destra','Nodi stabili','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto','Spostamenti in basso',... + 'Spostamenti verso sinistra','Nodi stabili','Location',Location); + elseif contaG > 1 && contaA > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Nodi stabili','Location',Location); + elseif contaG > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Nodi stabili','Location',Location); + elseif contaG > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Spostamenti a 2D',... + 'Nodi stabili','Location',Location); + elseif contaG > 1 && contaA > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Spostamenti a 2D',... + 'Nodi stabili','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto','Spostamenti in basso',... + 'Spostamenti verso sinistra','Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Nodi stabili','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Spostamenti a 2D','Location',Location); + elseif contaG > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Spostamenti a 2D','Nodi stabili',... + 'Location',Location); + elseif contaG > 1 && contaB > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in basso',... + 'Spostamenti verso sinistra','Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaG > 1 && contaB > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaG > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Nodi stabili','Location',Location); + elseif contaG > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Spostamenti a 2D','Location',Location); + elseif contaG > 1 && contaA > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto',... + 'Spostamenti verso sinistra','Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaG > 1 && contaA > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto',... + 'Spostamenti verso destra','Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaG > 1 && contaA > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Nodi stabili','Location',Location); + elseif contaG > 1 && contaA > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Spostamenti a 2D','Location',Location); + elseif contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti in alto','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Spostamenti a 2D',... + 'Nodi stabili','Location',Location); + elseif contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Spostamenti a 2D',... + 'Nodi stabili','Location',Location); + elseif contaA > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti in alto',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Spostamenti a 2D',... + 'Nodi stabili','Location',Location); + elseif contaA > 1 && contaB > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti in alto','Spostamenti in basso',... + 'Spostamenti verso sinistra','Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaA > 1 && contaB > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti in alto','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti in alto','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Nodi stabili','Location',Location); + elseif contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Geometria della strumentazione','Spostamenti in alto','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Spostamenti a 2D','Location',Location); + elseif contaB > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti in basso','Spostamenti verso sinistra',... + 'Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaB > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaB > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Nodi stabili','Location',Location); + elseif contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Geometria della strumentazione','Spostamenti in basso',... + 'Spostamenti verso destra','Spostamenti verso sinistra','Spostamenti a 2D','Location',Location); + elseif contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti verso destra','Spostamenti verso sinistra',... + 'Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaG > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti verso sinistra',... + 'Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaG > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti verso destra',... + 'Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaG > 1 && contaB > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in basso','Nodi stabili','Location',Location); + elseif contaG > 1 && contaD > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti verso destra','Nodi stabili','Location',Location); + elseif contaG > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti verso sinistra','Nodi stabili','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto','Spostamenti in basso',... + 'Nodi stabili','Location',Location); + elseif contaG > 1 && contaA > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti in alto','Nodi stabili','Location',Location); + elseif contaG > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti a 2D',... + 'Nodi stabili','Location',Location); + elseif contaG > 1 && contaXZ > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Spostamenti a 2D','Location',Location); + elseif contaG > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Nodi stabili','Location',Location); + elseif contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti verso destra',... + 'Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti verso destra','Spostamenti verso sinistra',... + 'Nodi stabili','Location',Location); + elseif contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Geometria della strumentazione','Spostamenti verso destra','Spostamenti verso sinistra',... + 'Spostamenti a 2D','Location',Location); + elseif contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti verso sinistra',... + 'Spostamenti a 2D','Nodi stabili','Location',Location); + elseif contaSX > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti verso sinistra',... + 'Nodi stabili','Location',Location); + elseif contaSX > 1 && contaXZ > 1 + legend('Geometria della strumentazione','Spostamenti verso sinistra',... + 'Spostamenti a 2D','Location',Location); + elseif contaXZ > 1 && conta0_Tot > 1 + legend('Geometria della strumentazione','Spostamenti a 2D','Nodi stabili','Location',Location); + elseif conta0_Tot > 1 + legend('Geometria della strumentazione','Nodi stabili','Location',Location); + elseif contaG > 1 + legend('Geometria della strumentazione','Spostamenti 3D','Location',Location); + elseif contaA > 1 + legend('Geometria della strumentazione','Spostamenti in alto','Location',Location); + elseif contaB > 1 + legend('Spostamenti in basso','Location',Location); + elseif contaD > 1 + legend('Geometria della strumentazione','Spostamenti verso destra','Location',Location); + elseif contaSX > 1 + legend('Geometria della strumentazione','Spostamenti verso sinistra','Location',Location); + elseif contaXZ > 1 + legend('Geometria della strumentazione','Spostamenti a 2D','Location',Location); + end + + title('Spostamenti locali - intero periodo'); + xlabel('X [m]'); + ylabel('Z [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + h.YAxis.MinorTick = 'on'; + grid off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezRAD-Tot.png')); + saveas(ancora,TempName); + ChartSEZ = Image(TempName); + ChartSEZ.Style = {HAlign('center'),Height('6.5cm')}; + ChartSEZ_cap = Paragraph(['Fig. ' num2str(FIG) ' - Riassunto grafico della '... + 'situazione rilevata dai singoli nodi, con riferimento alla risultante '... + 'del vettore di spostamento 3D differenziale locale, '... + 'registrato durante il periodo temporale di riferimento e l''intero periodo di monitoraggio']); + FIG = FIG+1; + ChartSEZ_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + lot = Table({ChartSEZ_Mese, ChartSEZ}); + lot.Style = {ResizeToFitContents(false), Width('100%')}; + + %--ENG-- + if activeEN == 1 + figure(33) + plot([0;CoordX(:,1)],[0;CoordZ(:,1)],'-','Color','black'); + hold on + % Spostamenti generici + if contaG > 1 + sezG = plot(nodi_X(:,1),nodi_Z(:,1),'o','Color','red'); + set(sezG, 'markerfacecolor', get(sezG, 'color')); + end + % Spostamenti Alto + if contaA > 1 + sezA = plot(nodiA_X(:,1),nodiA_Z(:,1),'^','Color',[0.4660 0.6740 0.1880],'MarkerSize' ,7); + set(sezA, 'markerfacecolor', get(sezA, 'color')); + end + % Spostamenti Basso + if contaB > 1 + sezB = plot(nodiB_X(:,1),nodiB_Z(:,1),'v','Color',[0.4660 0.6740 0.1880],'MarkerSize' ,7); + set(sezB, 'markerfacecolor', get(sezB, 'color')); + end + % Spostamenti Destra + if contaD > 1 + sezD = plot(nodiD_X(:,1),nodiD_Z(:,1),'>','Color','blue','MarkerSize' ,7); + set(sezD, 'markerfacecolor', get(sezD, 'color')); + end + % Spostamenti Sinistra + if contaSX > 1 + sezSX = plot(nodiS_X(:,1),nodiS_Z(:,1),'<','Color',[0.3010 0.7450 0.9330],'MarkerSize' ,7); + set(sezSX, 'markerfacecolor', get(sezSX, 'color')); + end + % Spostamenti 45° + if contaXZ > 1 + sezXZ = plot(nodiXZ_X(:,1),nodiXZ_Z(:,1),'x','Color',[0.8500 0.3250 0.0980],'MarkerSize' ,13); + set(sezXZ, 'markerfacecolor', get(sezXZ, 'color')); + end + % Sensori Fermi + if conta0_Tot > 1 + sez0 = plot(nodi0X(:,1),nodi0Z(:,1),'o','Color','black'); + set(sez0, 'markerfacecolor', get(sez0, 'color')); + end + ancora = plot(0,0,'s','Color','black','MarkerSize' ,13); + set(ancora, 'markerfacecolor', get(ancora, 'color')); + if sign(CoordX(ris,1)) == -1 + Location = 'southeast'; + else + Location = 'southwest'; + end + if contaG > 1 && contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upwards displacements','Downwards displacements',... + 'Rightward displacements','Leftward displacements','2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Rightward displacements',... + 'Leftward displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaD > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upwards displacements','Downwards displacements',... + 'Rightward displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upwards displacements','Downwards displacements',... + 'Leftward displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upwards displacements',... + 'Rightward displacements','Leftward displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Downwards displacements',... + 'Rightward displacements','Leftward displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Downwards displacements',... + 'Rightward displacements','Leftward displacements','2D displacements',... + 'Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upwards displacements',... + 'Rightward displacements','Leftward displacements','2D displacements',... + 'Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upwards displacements','Downwards displacements',... + 'Leftward displacements','2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upwards displacements','Downwards displacements',... + 'Rightward displacements','2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upwards displacements','Downwards displacements',... + 'Rightward displacements','Leftward displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Array geometry','3D displacements','Upwards displacements','Downwards displacements',... + 'Rightward displacements','Leftward displacements','2D displacements','Location',Location); + elseif contaG > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements',... + 'Rightward displacements','Leftward displacements','2D displacements','Stable nodes',... + 'Location',Location); + elseif contaG > 1 && contaB > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Downwards displacements',... + 'Leftward displacements','2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaB > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Downwards displacements',... + 'Rightward displacements','2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Downwards displacements',... + 'Rightward displacements','Leftward displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Array geometry','3D displacements','Downwards displacements',... + 'Rightward displacements','Leftward displacements','2D displacements','Location',Location); + elseif contaG > 1 && contaA > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upwards displacements',... + 'Leftward displacements','2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upwards displacements',... + 'Rightward displacements','2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upwards displacements',... + 'Rightward displacements','Leftward displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Array geometry','3D displacements','Upwards displacements',... + 'Rightward displacements','Leftward displacements','2D displacements','Location',Location); + elseif contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Upwards displacements','Downwards displacements',... + 'Rightward displacements','Leftward displacements','2D displacements',... + 'Stable nodes','Location',Location); + elseif contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Downwards displacements',... + 'Rightward displacements','Leftward displacements','2D displacements',... + 'Stable nodes','Location',Location); + elseif contaA > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Upwards displacements',... + 'Rightward displacements','Leftward displacements','2D displacements',... + 'Stable nodes','Location',Location); + elseif contaA > 1 && contaB > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Upwards displacements','Downwards displacements',... + 'Leftward displacements','2D displacements','Stable nodes','Location',Location); + elseif contaA > 1 && contaB > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Upwards displacements','Downwards displacements',... + 'Rightward displacements','2D displacements','Stable nodes','Location',Location); + elseif contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','Upwards displacements','Downwards displacements',... + 'Rightward displacements','Leftward displacements','Stable nodes','Location',Location); + elseif contaA > 1 && contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Array geometry','Upwards displacements','Downwards displacements',... + 'Rightward displacements','Leftward displacements','2D displacements','Location',Location); + elseif contaB > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Downwards displacements','Leftward displacements',... + '2D displacements','Stable nodes','Location',Location); + elseif contaB > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Downwards displacements',... + 'Rightward displacements','2D displacements','Stable nodes','Location',Location); + elseif contaB > 1 && contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','Downwards displacements',... + 'Rightward displacements','Leftward displacements','Stable nodes','Location',Location); + elseif contaB > 1 && contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Array geometry','Downwards displacements',... + 'Rightward displacements','Leftward displacements','2D displacements','Location',Location); + elseif contaD > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Rightward displacements','Leftward displacements',... + '2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Leftward displacements',... + '2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Rightward displacements',... + '2D displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaB > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Downwards displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaD > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Rightward displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Leftward displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && contaB > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upwards displacements','Downwards displacements',... + 'Stable nodes','Location',Location); + elseif contaG > 1 && contaA > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Upwards displacements','Stable nodes','Location',Location); + elseif contaG > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','2D displacements',... + 'Stable nodes','Location',Location); + elseif contaG > 1 && contaXZ > 1 + legend('Array geometry','3D displacements','2D displacements','Location',Location); + elseif contaG > 1 && conta0_Tot > 1 + legend('Array geometry','3D displacements','Stable nodes','Location',Location); + elseif contaD > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Rightward displacements',... + '2D displacements','Stable nodes','Location',Location); + elseif contaD > 1 && contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','Rightward displacements','Leftward displacements',... + 'Stable nodes','Location',Location); + elseif contaD > 1 && contaSX > 1 && contaXZ > 1 + legend('Array geometry','Rightward displacements','Leftward displacements',... + '2D displacements','Location',Location); + elseif contaSX > 1 && contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','Leftward displacements',... + '2D displacements','Stable nodes','Location',Location); + elseif contaSX > 1 && conta0_Tot > 1 + legend('Array geometry','Leftward displacements',... + 'Stable nodes','Location',Location); + elseif contaSX > 1 && contaXZ > 1 + legend('Array geometry','Leftward displacements',... + '2D displacements','Location',Location); + elseif contaXZ > 1 && conta0_Tot > 1 + legend('Array geometry','2D displacements','Stable nodes','Location',Location); + elseif conta0_Tot > 1 + legend('Array geometry','Stable nodes','Location',Location); + elseif contaG > 1 + legend('Array geometry','3D displacements','Location',Location); + elseif contaA > 1 + legend('Array geometry','Upwards displacements','Location',Location); + elseif contaB > 1 + legend('Downwards displacements','Location',Location); + elseif contaD > 1 + legend('Array geometry','Rightward displacements','Location',Location); + elseif contaSX > 1 + legend('Array geometry','Leftward displacements','Location',Location); + elseif contaXZ > 1 + legend('Array geometry','2D displacements','Location',Location); + end + + title('Local displacements - complete monitoring period'); + xlabel('X [m]'); + ylabel('Z [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + h.YAxis.MinorTick = 'on'; + grid off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezRAD-Tot_ENG.png')); + saveas(ancora,TempName); + ChartSEZ_ENG = Image(TempName); + ChartSEZ_ENG.Style = {HAlign('center'),Height('6.5cm')}; + ChartSEZ_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Graphical summary of '... + 'single nodes behaviour, with reference to 3D local '... + 'differential displacements recorded during the '... + 'reference and the complete monitoring period']); + FIG_ENG = FIG_ENG+1; + ChartSEZ_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + lotEN = Table({ChartSEZ_Mese_ENG, ChartSEZ_ENG}); + lotEN.Style = {ResizeToFitContents(false), Width('100%')}; + end + + sezRAD = Heading3('Radial Link'); + sezRAD.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + RA = Section(); + RA.Title = sezRAD; + % Testi relativi all'ultimo mese + testo1 = Paragraph(['Il grafico riportato di seguito mostra l''entit' char(224) ' '... + 'dei vettori di spostamento differenziale locale 3D, misurati dai sensori Radial Link '... + 'nel periodo temporale di riferimento e nell''intero periodo di monitoraggio. '... + 'Il vettore ' char(232) ' ottenuto come risultante delle componenti nel piano X-Y-Z, '... + 'ovvero larghezza, profondit' char(224) ' ed altezza della sezione. ']); + testo2 = Paragraph(['La figura seguente riassume la situazione registrata dall''Array, con i '... + 'singoli sensori rappresentati sulla geometria di progetto della strumentazione. Nel periodo '... + 'temporale di riferimento, l''analisi degli spostamenti ha evidenziato ' ... + num2str(contaS_Mese-1) ' nodi con spostamenti e ' num2str(conta0_Mese-1) ' nodi stabili. '... + 'Si noti che in questa rappresentazione vengono considerati stabili i nodi caratterizzati '... + 'da uno spostamento con modulo inferiore a 0.5 mm.']); + spazio = Paragraph(''); + testo1.HAlign = 'justify'; + testo2.HAlign = 'justify'; + + add(DT,sezRAD); + add(DT,testo1); + add(DT,ChartRad); + add(DT,ChartRad_cap); + add(DT,testo2); + add(DT,spazio); + add(DT,lot); + add(DT,ChartSEZ_cap); + add(DT,br); + + close(figure(1)); + close(figure(2)); + close(figure(3)); + + if attivaEN == 1 + sezRAD_ENG = Heading3('Radial Link'); + sezRAD_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + RA_ENG = Section(); + RA_ENG.Title = sezRAD; + % Testi relativi all'ultimo mese + testo1 = Paragraph(['The following graph reports the 3D local '... + 'differential displacements measrued by Radial Link sensors '... + 'during the reference and complete monitoring period. '... + 'The 3D displacement vector derives from X-Y-Z displacement components, '... + 'respectively representing length, depth, and height of the section. ']); + testo2 = Paragraph(['The following figure summarized the situation recorded by the Array, '... + 'representing each sensor on the instrumentation non-deformed geometry. During the '... + 'reference time period, the Rad Array presented ' ... + num2str(contaS_Mese-1) ' nodes showing displacements and ' num2str(conta0_Mese-1) ' stable nodes. '... + 'In this specific representation, nodes featuring displacement values less than 0.5 mm '... + 'are assumed to be stable.']); + spazio = Paragraph(''); + testo1.HAlign = 'justify'; + testo2.HAlign = 'justify'; + + add(DT_ENG,sezRAD_ENG); + add(DT_ENG,testo1); + add(DT_ENG,ChartRad_ENG); + add(DT_ENG,ChartRad_ENG_cap); + add(DT_ENG,testo2); + add(DT_ENG,spazio); + add(DT_ENG,lotEN); + add(DT_ENG,ChartSEZ_ENG_cap); + add(DT_ENG,br); + + close(figure(11)); + close(figure(22)); + close(figure(33)); + end + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + check = 1; + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT,testo); + end + end + end + end +end + +text = 'report_RaL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_TL.m b/Tilt/report_TL.m new file mode 100755 index 0000000..369fdc5 --- /dev/null +++ b/Tilt/report_TL.m @@ -0,0 +1,555 @@ +function [GI_MaxDispMESE,GI_DateTL,GI_MaxDispProf,ATTIVA,FIG,FIG_ENG] = report_TL(... + rTL,rTLHR,m,NodoTiltLink,toolrif,unitrif,datarif,firstdata_num,... + Font_caption,Font_tools,siteID,toolrifID,DT,DT_ENG,FIG,FIG_ENG,br,... + colonna2,colonna2bis,status,ATTIVA,activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_TL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +NODATA(m,1) = 0; +GI_MaxDispMESE = []; +GI_DateTL = []; +GI_MaxDispProf = []; +check = 0; +while check == 0 + if status(m,1) == 1 + if ATTIVA == 1 + testo = Paragraph('Catena non ancora installata o inattiva.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array not installed or inactive.'); + add(DT_ENG,testo); + end + end + check = 1; + 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 + check = 1; + else + for n = 1:rTL(m,1) + NodeNum = num2str(NodoTiltLink(n,m)); + comando = ['select EventDate, EventTime, HShift_local, HShift, NodeDepth, XShift, YShift, X, Y, HShiftDir 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 + if n == 1 % Il primo lo scrivo e creo la variabile di controllo + else + [rS,~] = size(Spost_local); + if rD ~= rS + NODATA(m,1) = 2; + check = 0; + break + else + check = 1; + end + end + % dall'inizio + Spost_local(:,n) = cell2mat((Dati(:,3)))*1000; % Loc 2D + Spost(:,n) = (cell2mat(Dati(:,4)))*1000; % Cum 2D + Prof(:,n) = -(cell2mat(Dati(1,5))); % Profondità + % Locali ultimo mese + Spost_Local_MeseX(:,n) = cell2mat(Dati(:,6)); % Loc X ultimo mese + Spost_Local_MeseY(:,n) = cell2mat(Dati(:,7)); % Loc Y ultimo mese + diffMeseX_Local(1,n) = Spost_Local_MeseX(end,n)-Spost_Local_MeseX(1,n); + diffMeseY_Local(1,n) = Spost_Local_MeseY(end,n)-Spost_Local_MeseY(1,n); + DispMese_Local(1,n) = sqrt(diffMeseX_Local(1,n)^2 + diffMeseY_Local(1,n)^2)*1000; + % Cumulati ultimo mese + Spost_MeseX(:,n) = cell2mat(Dati(:,8)); % Cum X ultimo mese + Spost_MeseY(:,n) = cell2mat(Dati(:,9)); % Cum Y ultimo mese + diffMeseX(1,n) = Spost_MeseX(end,n)-Spost_MeseX(1,n); + diffMeseY(1,n) = Spost_MeseY(end,n)-Spost_MeseY(1,n); + DispMese(1,n) = sqrt(diffMeseX(1,n)^2 + diffMeseY(1,n)^2)*1000; + Azim(:,n) = cell2mat(Dati(:,10)); % Azimuth totale + else + NODATA(m,1) = 1; + check = 1; + end + end + if NODATA(m,1) == 0 + if strcmp(colonna2bis(m+1,1),colonna2(m+1,1)) == 0 % data zero diversa data riferimento + clear Spost; + clear Spost_local; + clear Azimuth; + datarifNEW = datestr(firstdata_num{m+1,1},'yyyy-mm-dd'); % data riferimento definita sul sito + for nw = 1:rTL(m,1) + NodeNum = num2str(NodoTiltLink(nw,m)); + comando = ['select EventDate, EventTime, HShift_local, HShift, NodeDepth, XShift, YShift, X, Y, HShiftDir '... + 'from ElabDataView where EventDate = ''' datarifNEW ''' and ToolNameID = ''' char(toolrif) ... + ''' and UnitName = ''' char(unitrif) ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DatiNEW = curs.Data; % dati registrati alla data di riferimento + [~,rC] = size(DatiNEW); + if rC ~= 1 + % dalla data di riferimento + Spost_Local_X_RIF(:,nw) = cell2mat(DatiNEW(:,6)); %Loc X data rif + Spost_Local_Y_RIF(:,nw) = cell2mat(DatiNEW(:,7)); %Loc Y data rif + diffX_Local_RIF(1,nw) = Spost_Local_MeseX(end,nw)-Spost_Local_X_RIF(1,nw); + diffY_Local_RIF(1,nw) = Spost_Local_MeseY(end,nw)-Spost_Local_Y_RIF(1,nw); + Spost_local(1,nw) = sqrt(diffX_Local_RIF(1,nw)^2 + diffY_Local_RIF(1,nw)^2)*1000; + + Spost_X_RIF(:,nw) =cell2mat(DatiNEW(:,8)); % Cum X data rif + Spost_Y_RIF(:,nw) =cell2mat(DatiNEW(:,9)); % Cum Y data rif + diffX_RIF(1,nw) = Spost_MeseX(end,nw)-Spost_X_RIF(1,nw); + diffY_RIF(1,nw) = Spost_MeseY(end,nw)-Spost_Y_RIF(1,nw); + Spost(1,nw) = sqrt(diffX_RIF(1,nw)^2 + diffY_RIF(1,nw)^2)*1000; + + azim(1,nw) = (acos(abs(diffX_RIF(1,nw)*1000)/Spost(1,nw)))*180/pi(); % Angolo Teta in gradi 0° - 90° + segnoNS = sign(diffX_RIF(1,nw)); + segnoEO = sign(diffY_RIF(1,nw)); + % L'azimuth si calcola con NS = 0, positivo in senso orario + % (90° = Est) + if segnoNS == 1 && segnoEO == 1 % quadrante 1 + Azimuth(1,nw) = azim(1,nw); % Teta lo tengo come è (1 quadrante) + elseif segnoNS == -1 && segnoEO == 1 % quadrante 2 + Azimuth(1,nw) = 180 - azim(1,nw); % 180-teta + elseif segnoNS == -1 && segnoEO == -1 % quadrante 3 + Azimuth(1,nw) = 180 + azim(1,nw); % 180+teta + elseif segnoNS == 1 && segnoEO == -1 % quadrante 4 + Azimuth(1,nw) = 360 - azim(1,nw); % 360-teta + elseif segnoNS == 0 && segnoEO == -1 % 270° + Azimuth(1,nw) = 270; + elseif segnoNS == -1 && segnoEO == 0 % 180° + Azimuth(1,nw) = 180; + elseif segnoNS == 0 && segnoEO == 1 % 90° + Azimuth(1,nw) = 90; + elseif segnoNS == 1 && segnoEO == 0 % 0° + Azimuth(1,nw) = 0; + else % non c'è nessuno spostamento da nessuna parte + if nw == 1 + Azimuth(1,nw) = 0; + else + Azimuth(1,nw) = Azimuth(1,nw-1); + end + end + Azimuth(1,nw) = real(Azimuth(1,nw)); + else + NODATA(m,1) = 1; + end + end + % Approssimo gli spostamenti al decimo di millimetro + conv = Spost*10; + conv = round(conv); + Spost = conv/10; + end + + MaxDisp = max(Spost_local(end,:)); + Index = find(Spost_local(end,:) == MaxDisp); + MaxDispProf = Prof(1,Index(1)); + + MaxDispMESE = max(DispMese_Local(end,:)); + IndexMESE = find(DispMese_Local(end,:) == MaxDispMESE); + MaxDispProfMESE = Prof(1,IndexMESE(1)); + + % aggiungo ancora + comando = ['select nodetype_id, depth, num from nodes where tool_id = ''' num2str(cell2mat(toolrifID)) ... + ''' and nodetype_id = 9 order by num']; + Anc = fetch(conn,comando); + ProfAnc = -(cell2mat((Anc(:,2)))); + Prof = [ProfAnc Prof]; + [rt,~] = size(Spost_local); + ancoraTL = zeros(rt,1); + Spost_local = [ancoraTL Spost_local]; + Spost = [ancoraTL Spost]; + DispMese_Local = [0 DispMese_Local]; + DispMese = [0 DispMese]; + + % per grafici integrati + GI_MaxDispMESE_x = Spost_Local_MeseX(:,IndexMESE(1)); % x del nodo a maggior spostamento + GI_diff_x = GI_MaxDispMESE_x(:,:)- GI_MaxDispMESE_x(1,1); % differenza + GI_MaxDispMESE_y = Spost_Local_MeseY(:,IndexMESE(1));% y del nodo a maggior spostamento + GI_diff_y = GI_MaxDispMESE_y(:,:)- GI_MaxDispMESE_y(1,1); % differenza + GI_MaxDispMESE = sqrt((GI_diff_x).^2 + (GI_diff_y).^2)*1000; % risultante + GI_DateTL = Date; + GI_MaxDispProf = MaxDispProfMESE; + + % Grafico Locali + figure(1) + subplot(1,2,1); + plot(DispMese_Local,Prof); + hold on + plot(Spost_local(end,:),Prof); + title('Spostamenti Locali 2D'); + xlabel('Spostamento [mm]'); + ylabel(['Profondit' char(224) ' [m]']); + h = gca; + h.XAxis.MinorTick = 'on'; + if MaxDisp < 10 % mm + xlim([-inf 10]); + end + grid on + grid minor + + % Grafico Cumulati + subplot(1,2,2); + plot(DispMese,Prof); + hold on + DispCum = plot(Spost(end,:),Prof); + title('Spostamenti Cumulati 2D'); + xlabel('Spostamento [mm]'); + ylabel(['Profondit' char(224) ' [m]']); + h = gca; + h.XAxis.MinorTick = 'on'; + if max(Spost(end,:)) < 10 + xlim([-inf 10]); + end + grid on + grid minor + lgd = legend('Ultimo periodo','Intero periodo','Location','southeast'); + lgd.FontSize = 6; + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Disp.png')); + saveas(DispCum,TempName); + Chart = Image(TempName); + if m > 1 + for C = 1:m-1 + if status(C,1) == 3 || status(C,1) == 1 + Chart.Style = {Height('10cm'),HAlign('center')}; + break + else + Chart.Style = {ScaleToFit}; + end + end + else + Chart.Style = {ScaleToFit}; + end + Chart_capM = Paragraph(['Fig. ' num2str(FIG) ' - Spostamenti differenziali locali e cumulati in '... + 'direzione di massima pendenza registrati dalla catena '... + 'durante il periodo temporale di riferimento e a partire '... + 'dalla data di riferimento riportata in Tabella 1']); + FIG = FIG+1; + Chart_capM.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + close(figure(1)) + + if activeEN == 1 + figure(1) + subplot(1,2,1); + plot(DispMese_Local,Prof); + hold on + plot(Spost_local(end,:),Prof); + title('2D Local Displacements'); + xlabel('Displacement [mm]'); + ylabel('Depth [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + if MaxDisp < 10 % mm + xlim([-inf 10]); + end + grid on + grid minor + + subplot(1,2,2); + plot(DispMese,Prof); + hold on + DispCum = plot(Spost(end,:),Prof); + title('2D Cumulative Displacements'); + xlabel('Displacements [mm]'); + ylabel('Depth [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + if max(Spost(end,:)) < 10 + xlim([-inf 10]); + end + grid on + grid minor + lgd = legend('Last period','Entire period','Location','southeast'); + lgd.FontSize = 6; + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Disp_ENG.png')); + saveas(DispCum,TempName); + Chart = Image(TempName); + if m > 1 + for C = 1:m-1 + if status(C,1) == 3 || status(C,1) == 1 + Chart.Style = {Height('10cm'),HAlign('center')}; + break + else + Chart.Style = {ScaleToFit}; + end + end + else + Chart.Style = {ScaleToFit}; + end + Chart.Style = {ScaleToFit}; + Chart_capM = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Local and cumulative '... + 'differential displacements along maximum grade direction, '... + 'recorded during the monitoring reference period and starting from the '... + 'reported in Tab. 1']); + FIG_ENG = FIG_ENG+1; + Chart_capM.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + close(figure(1)) + end + + % grafico azimuth DALL'INIZIO + Azim_grafico = deg2rad(Azim(end,:)); + Azim_grafico = [0 Azim_grafico]; %aggiungo ancora + figure(2) + azimuth = polarscatter(Azim_grafico,flip(abs(Prof)),'filled'); + title('Azimut'); + h = gca; + h.ThetaDir = 'clockwise'; + h.ThetaZeroLocation = 'top'; + angles = 0:45:360; + h.ThetaTick = angles; + labels = {'N','NE','E','SE','S','SO','O','NO'}; + h.ThetaTickLabel = labels; + grid on + + Testa = Azim(end,end); + if Testa > 11.25 && Testa <= 33.75 + DirAzim = 'Nord-Nord-Est'; + elseif Testa > 33.75 && Testa <= 56.25 + DirAzim = 'Nord-Est'; + elseif Testa > 56.25 && Testa <= 78.75 + DirAzim = 'Est-Nord-Est'; + elseif Testa > 78.75 && Testa <= 101.25 + DirAzim = 'Est'; + elseif Testa > 101.25 && Testa <= 123.75 + DirAzim = 'Est-Sud-Est'; + elseif Testa > 123.75 && Testa <= 146.25 + DirAzim = 'Sud-Est'; + elseif Testa > 146.25 && Testa <= 168.75 + DirAzim = 'Sud-Sud-Est'; + elseif Testa > 168.75 && Testa <= 191.25 + DirAzim = 'Sud'; + elseif Testa > 191.25 && Testa <= 213.75 + DirAzim = 'Sud-Sud-Ovest'; + elseif Testa > 213.75 && Testa <= 236.25 + DirAzim = 'Sud-Ovest'; + elseif Testa > 236.25 && Testa <= 258.75 + DirAzim = 'Ovest-Sud-Ovest'; + elseif Testa > 258.75 && Testa <= 281.25 + DirAzim = 'Ovest'; + elseif Testa > 281.25 && Testa <= 303.75 + DirAzim = 'Ovest-Nord-Ovest'; + elseif Testa > 303.75 && Testa <= 326.25 + DirAzim = 'Nord-Ovest'; + elseif Testa > 326.25 && Testa <= 348.75 + DirAzim = 'Nord-Nord-Ovest'; + else + DirAzim = 'Nord'; + end + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Azimuth.png')); + saveas(azimuth,TempName); + ChartAZ = Image(TempName); + ChartAZ.Style = {ScaleToFit}; + ChartAZ_cap = Paragraph(['Fig. ' num2str(FIG) ' - Azimut degli spostamenti '... + 'differenziali cumulati secondo la profondit' char(224) ', registrato a partire dalla lettura di riferimento']); + FIG = FIG+1; + ChartAZ_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + SE = Section(); + if rTLHR(m,1) > 0 + sezTilt = Heading3('Tilt Link HR 3D V'); + else + sezTilt = Heading3('Tilt Link V'); + end + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SE.Title = sezTilt; + close(figure(2)) + + if activeEN == 1 + Azim_grafico = deg2rad(Azim(end,:)); + Azim_grafico = [0 Azim_grafico]; %aggiungo ancora + figure(2) + azimuth = polarscatter(Azim_grafico,flip(abs(Prof)),'filled'); + title('Azimuth'); + h = gca; + h.ThetaDir = 'clockwise'; + h.ThetaZeroLocation = 'top'; + angles = 0:45:360; + h.ThetaTick = angles; + labels = {'N','NE','E','SE','S','SW','W','NW'}; + h.ThetaTickLabel = labels; + grid on + + Testa = Azim(end,end); + if Testa > 11.25 && Testa <= 33.75 + DirAzim = 'North-North-East'; + elseif Testa > 33.75 && Testa <= 56.25 + DirAzim = 'North-East'; + elseif Testa > 56.25 && Testa <= 78.75 + DirAzim = 'East-North-East'; + elseif Testa > 78.75 && Testa <= 101.25 + DirAzim = 'East'; + elseif Testa > 101.25 && Testa <= 123.75 + DirAzim = 'East-South-East'; + elseif Testa > 123.75 && Testa <= 146.25 + DirAzim = 'South-East'; + elseif Testa > 146.25 && Testa <= 168.75 + DirAzim = 'South-South-East'; + elseif Testa > 168.75 && Testa <= 191.25 + DirAzim = 'South'; + elseif Testa > 191.25 && Testa <= 213.75 + DirAzim = 'South-South-West'; + elseif Testa > 213.75 && Testa <= 236.25 + DirAzim = 'South-West'; + elseif Testa > 236.25 && Testa <= 258.75 + DirAzim = 'West-South-West'; + elseif Testa > 258.75 && Testa <= 281.25 + DirAzim = 'West'; + elseif Testa > 281.25 && Testa <= 303.75 + DirAzim = 'West-North-West'; + elseif Testa > 303.75 && Testa <= 326.25 + DirAzim = 'North-West'; + elseif Testa > 326.25 && Testa <= 348.75 + DirAzim = 'North-North-West'; + else + DirAzim = 'North'; + end + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Azimuth_ENG.png')); + saveas(azimuth,TempName); + ChartAZ = Image(TempName); + ChartAZ.Style = {ScaleToFit}; + ChartAZ_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Azimuth of cumulative differential '... + 'displacements vs depth, recorded starting from the monitoring reference date']); + FIG_ENG = FIG_ENG+1; + ChartAZ_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + SE_ENG = Section(); + SE_ENG.Title = sezTilt; + close(figure(2)) + end + + testo = Paragraph(['I grafici seguenti riportano i valori di spostamento differenziale locale e cumulato '... + 'misurati dal sensore MEMS 3D lungo la direzione di massima pendenza, '... + 'registrati durante il periodo temporale di riferimento e calcolati a partire dalla lettura di '... + 'riferimento riportata in Tabella 1. In particolare, il massimo spostamento differenziale locale '... + 'registrato durante il periodo temporale di riferimento ' char(232) ' pari a ' num2str((MaxDispMESE), ... + '%0.1f') ' mm alla profondit' char(224) ' di ' num2str(abs(MaxDispProfMESE)) ' m. '... + 'Lo spostamento cumulato in testa risulta pari a ' num2str(DispMese(end,end),'%0.1f') ' mm.']); + testo2 = Paragraph(['Gli stessi dati relativi all''intero periodo di monitoraggio rilevano un massimo spostamento '... + 'differenziale locale pari a ' num2str((MaxDisp), '%0.1f') ' mm, in corrispondenza di una profondit' char(224) ... + ' di ' num2str(abs(MaxDispProf)) ' metri. Lo spostamento cumulato in testa risulta pari a ' num2str(Spost(end,end)) ' mm.']); + testo3 = Paragraph(['Il grafico seguente mostra l''andamento dell''azimut ottenuto a partire dai dati cumulati '... + 'al variare della profondit' char(224) ', calcolati a partire dalla lettura di riferimento. Attualmente, il valore ' ... + 'rilevato in testa allo strumento indica uno spostamento in direzione ' DirAzim '.']); + testo4 = Paragraph(['Si ricorda che l''azimut ' char(232) ' una rappresentazione della direzione '... + 'di movimento del singolo sensore, calcolato a partire dai dati cumulati. '... + 'Il parametro viene calcolato indipendentemente dall''ordine di grandezza '... + 'dello spostamento misurato: ad esempio, uno spostamento sub-millimetrico '... + 'e uno centimetrico nella stessa direzione saranno caratterizzati dallo stesso '... + 'valore di azimut. Per questo motivo, ' char(232) ' opportuno considerare tale '... + 'grandezza come significativa solo nel caso di spostamenti di entit' char(224) ... + ' rilevante.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + testo3.HAlign = 'justify'; + testo4.HAlign = 'justify'; + add(DT,sezTilt); + add(DT,testo); + add(DT,testo2); + add(DT,Chart); + add(DT,Chart_capM); + add(DT,testo3); + add(DT,testo4); + add(DT,ChartAZ); + add(DT,ChartAZ_cap); + add(DT,br); + if activeEN == 1 + testo = Paragraph(['The following graphs shows the local and differential cumulative displacements '... + 'recorded by 3D MEMS sensor along the maximum grade direction during the reference monitoring period '... + 'and starting from the reference date reported in Tab. 1. The maximum local differential displacement '... + 'recorded during the reference time period equals ' num2str((MaxDispMESE),'%0.1f') ' mm at a depth of '... + num2str(abs(MaxDispProfMESE)) ' m. The cumulative displacements at the ground level is '... + num2str(DispMese(end,end),'%0.1f') ' mm.']); + testo2 = Paragraph(['The same analysis related to the whole monitoring period highlights a maximum local '... + 'differential displacement of ' num2str((MaxDisp), '%0.1f') ' mm, at a depth of ' num2str(abs(MaxDispProf)) ... + ' m. The cumulative displacement equals ' num2str(Spost(end,end)) ' mm.']); + testo3 = Paragraph(['The following graph shows the azimuth obtained through cumulative displacements, '... + 'starting from the reference date. The direction identified is ' DirAzim '.']); + testo4 = Paragraph(['It is necessary to underline that the azimuth represents the movement direction '... + 'of every single sensor, calculated starting from differential cumulative displacements. '... + 'The parameter is always processed, regardless of the displacement measured: a sub-millimeters '... + 'or a centimeters movements in the same direction will show the same azimuth. '... + 'For this reason, it is appropriate to consider the result as significant only for relevant '... + 'displacements.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + testo3.HAlign = 'justify'; + testo4.HAlign = 'justify'; + add(DT_ENG,sezTilt); + add(DT_ENG,testo); + add(DT_ENG,testo2); + add(DT_ENG,Chart); + add(DT_ENG,Chart_capM); + add(DT_ENG,testo3); + add(DT_ENG,testo4); + add(DT_ENG,ChartAZ); + add(DT_ENG,ChartAZ_cap); + add(DT_ENG,br); + end + %pulisco variabili da riutilizzare per catena successiva + clear Spost; + clear Spost_local; + clear Spost_mese; + clear Spost_local_mese; + clear Prof; + clear Azim; + clear DirAzim; + clear Spost_Local_MeseX; + clear Spost_Local_MeseY; + clear diffMeseX_Local; + clear diffMeseY_Local; + clear DispMese_Local; + clear Spost_MeseX; + clear Spost_MeseY; + clear diffMeseX; + clear diffMeseY; + clear DispMese; + clear GI_MaxDispMESE_x; + clear GI_diff_x; + clear GI_MaxDispMESE_y; + clear GI_diff_y; + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + check = 1; + if m == 1 + add(DT,br); + end + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + if m == 1 + add(DT_ENG,br); + end + end + end + end + end +end + +text = 'report_TL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_ThL.m b/Tilt/report_ThL.m new file mode 100755 index 0000000..794b83e --- /dev/null +++ b/Tilt/report_ThL.m @@ -0,0 +1,474 @@ +function [ATTIVA,FIG,FIG_ENG] = report_ThL(rThL,m,NodoThermLink,tipoCU,toolrif,... + unitrif,datarif,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,... + activeEN,br,status,ATTIVA,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_ThL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +NODATAThL(m,1) = 0; +check = 0; +while check == 0 + if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('Catena non ancora installata o inattiva.'); + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array not installed or inactive.'); + add(DT_ENG,testo); + end + end + check = 1; + elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoraggio completato. Invitiamo a visitare la '... + 'piattaforma web per la visione dei dati storici.']); + 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 + check = 1; + else + titolo = 1; + ThE = Section(); + if activeEN == 1 + ThE_EN = Section(); + end + for n = 1:rThL(m,1) + NodeNum = num2str(NodoThermLink(n,m)); + if tipoCU == 9 % Nesa Evo + comando = ['select EventTimestamp, JSON_VALUE(dataJSON,"$.tempAvg") from elabdatanesaview where EventTimestamp >= ''' ... + datarif ''' and ToolNameID = ''' char(toolrif) ''' and UnitName = ''' char(unitrif) ... + ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Dati = curs.Data; + else + comando = ['select T_node, NodeDepth, EventDate, EventTime 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; + end + + % Modifico il formato di data e ora + [rD,rC] = size(Dati); + if rC == 2 % Nesa Evo + Date = datenum(Dati(:,1)); + datiTemp = (char(Dati(:,2))); + % sostituisco valori fuori scala + for c=1:rD + if c == 1 && strcmp(datiTemp(c),'*') == 1 % forwardfill 1° dato + d = 2; + while d<=rD + if strcmp(datiTemp(d),'*') == 0 + datiTemp(c,:) = datiTemp(d,:); + break + else + d=d+1; + end + end + else % backfill altri dati + if strcmp(datiTemp(c),'*') == 1 + datiTemp(c,:) = datiTemp(c-1,:); + end + end + end + TempHR = str2num(datiTemp); % temperatura + if isempty(TempHR) == 1 + NODATAThL = 1; + check = 1; + else + MaxTempHR = max(TempHR); + MinTempHR = min(TempHR); + end + elseif rC > 2 + T = [cell2mat(Dati(:,3)) repmat(' ', [rD,1]) cell2mat(Dati(:,4))]; + Date = datenum(T); % Data + if n == 1 % Il primo lo scrivo e creo la variabile di controllo + else + [rS,~] = size(TempHR); + if rD ~= rS + NODATAThL(m,1) = 2; + check = 0; + break + else + check = 1; + end + end + TempHR(:,n) = cell2mat(Dati(:,1)); % temperatura + MaxTempHR(1,n) = max(TempHR(:,n)); + MinTempHR(1,n) = min(TempHR(:,n)); + Prof(:,n) = -(cell2mat(Dati(1,2))); % Profondità + else + NODATAThL = 1; + check = 1; + end + end + if NODATAThL == 0 + if rC > 2 + %% Therm Link standard + testo = Paragraph(['I grafici seguenti mostrano i valori di temperatura lungo la verticale '... + 'ed il loro andamento nel tempo, misurati dal termometro ad alta risoluzione '... + 'durante il periodo temporale di riferimento. ']); + testo.HAlign = 'justify'; + + if activeEN == 1 + testo_ENG = Paragraph(['The following graphs show the temperature values recorded at different depths '... + 'and their evolution over time, recorded by the high-resolution thermometer '... + 'during the reference time period. ']); + testo_ENG.HAlign = 'justify'; + end + + % grafico temperatura - profondità + figure(1) + plot(TempHR(end,:),Prof,'-o'); + hold on + plot(MaxTempHR(1,:),Prof,'-o'); + Tmin_nodi = plot(MinTempHR(1,:),Prof,'-o'); + legend('Ultima temperatura','Temperatura massima','Temperatura minima','Location','southeast'); + + title('Temperatura'); + xlabel(['Temperatura [' char(176) 'C]']); + ylabel(['Profondit' char(224) ' [m]']); + h = gca; + h.XAxis.MinorTick = 'on'; + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Therm.png')); + saveas(Tmin_nodi,TempName); + ChartTh = Image(TempName); + ChartTh.Style = {Height('9.5cm'),HAlign('center')}; + ChartTh_cap = Paragraph(['Fig. ' num2str(FIG) ' - Ultimo dato, '... + 'temperatura massima e minima misurate '... + 'durante il periodo temporale di riferimento']); + FIG = FIG+1; + ChartTh_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + if titolo == 1 + sezTherm = Heading3('Therm Link'); + sezTherm.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + ThE.Title = sezTherm; + add(DT,sezTherm); + if activeEN == 1 + else + titolo = 0; + end + end + add(DT,testo); + add(DT,ChartTh); + add(DT,ChartTh_cap); + + % Grafico Temperatura vs Tempo + cont = 1; + num = 2; + tab = 1; + while cont <= rThL(m,1) + figure(num) + if rThL(m,1)-cont > 5 + str = cell(5,1); + else + str = cell(rThL(m,1)-cont+1,1); + end + hold on + grid on + grid minor + xlabel('Data [gg/mm/aaaa]'); + ylabel(['Temperatura [' char(176) 'C]']); + Mx = []; + Mn = []; + for a = 1:5 + if cont > rThL(m,1) + break + end + Tt = plot(Date,TempHR(:,cont)); + Mx = [Mx; ceil(max(TempHR(:,cont)))]; + Mn = [Mn; ceil(min(TempHR(:,cont)))]; + xlim([Date(1)-1 Date(end)+1]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(a,1) = cellstr(['' num2str(Prof(cont)) ' m da P.C.']); + cont = cont+1; + end + ylim([min(Mn)-1 max(Mx)+1]); + lgd = legend(str,'Location','north'); + num = num+1; + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Therm ',num2str(num),'.png')); + saveas(Tt,TempName); + if tab == 2 + TempName1 = char(strcat('Report',siteID,'-', char(toolrif),'Therm ',num2str(num-1),'.png')); + Chart1 = Image(TempName1); + Chart1.Style = {Height('6.8cm'),HAlign('center')}; + Chart2 = Image(TempName); + Chart2.Style = {Height('6.8cm'),HAlign('center')}; + lot = Table({Chart1, Chart2}); + lot.Style = {ResizeToFitContents(false), Width('100%')}; + add(DT,lot); + tab = 1; + elseif rThL <= 5 % Una sola immagine + Chart1 = Image(TempName); + Chart1.Style = {Height('7.5cm'),HAlign('center')}; + add(DT,Chart1); + elseif cont > rThL + Chart2 = Image(TempName); + Chart2.Style = {Height('6.8cm'),HAlign('center')}; + add(DT,Chart2); + else + tab = tab+1; + end + close(figure(num)); + end + + ChartTh2_cap = Paragraph(['Fig. ' num2str(FIG) ' - Andamento nel tempo della temperatura registrata '... + 'dai singoli sensori']); + add(DT,ChartTh2_cap); + FIG = FIG+1; + ChartTh2_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + add(DT,br); + close(figure(1)); + close(figure(2)); + + if activeEN == 1 + % grafico temperatura - profondità + figure(1) + plot(TempHR(end,:),Prof,'-o'); + hold on + plot(MaxTempHR(1,:),Prof,'-o'); + Tmin_nodi = plot(MinTempHR(1,:),Prof,'-o'); + legend('Last value','T max','T min','Location','southeast'); + + title('Temperature'); + xlabel(['Temperature [' char(176) 'C]']); + ylabel('Depth [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Therm_ENG.png')); + saveas(Tmin_nodi,TempName); + ChartTh = Image(TempName); + ChartTh.Style = {Height('9.5cm'),HAlign('center')}; + ChartTh_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Last value, '... + 'maximum and minimum temperature recorded '... + 'during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartTh_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + if titolo == 1 + sezTherm = Heading3('Therm Link'); + sezTherm.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + ThE.Title = sezTherm; + add(DT_ENG,sezTherm); + titolo = 0; + end + add(DT_ENG,testo_ENG); + add(DT_ENG,ChartTh); + add(DT_ENG,ChartTh_cap); + + % Grafico Temperatura vs Tempo + cont = 1; + num = 2; + tab = 1; + while cont <= rThL(m,1) + figure(num) + if rThL(m,1)-cont > 5 + str = cell(5,1); + else + str = cell(rThL(m,1)-cont+1,1); + end + hold on + grid on + grid minor + xlabel('Date [dd/mm/yyyy]'); + ylabel(['Temperature [' char(176) 'C]']); + Mx = []; + Mn = []; + for a = 1:5 + if cont > rThL(m,1) + break + end + Tt = plot(Date,TempHR(:,cont)); + Mx = [Mx; ceil(max(TempHR(:,cont)))]; + Mn = [Mn; ceil(min(TempHR(:,cont)))]; + xlim([Date(1)-1 Date(end)+1]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + str(a,1) = cellstr(['' num2str(Prof(cont)) ' m b.g.l.']); + cont = cont+1; + end + ylim([min(Mn)-1 max(Mx)+1]); + lgd = legend(str,'Location','north'); + num = num+1; + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Therm ',num2str(num),'.png')); + saveas(Tt,TempName); + if tab == 2 + TempName1 = char(strcat('Report',siteID,'-', char(toolrif),'Therm ',num2str(num-1),'.png')); + Chart1 = Image(TempName1); + Chart1.Style = {Height('6.8cm'),HAlign('center')}; + Chart2 = Image(TempName); + Chart2.Style = {Height('6.8cm'),HAlign('center')}; + lot = Table({Chart1, Chart2}); + lot.Style = {ResizeToFitContents(false), Width('100%')}; + add(DT,lot); + tab = 1; + elseif rThL <= 5 % Una sola immagine + Chart1 = Image(TempName); + Chart1.Style = {Height('7.5cm'),HAlign('center')}; + add(DT,Chart1); + elseif cont > rThL + Chart2 = Image(TempName); + Chart2.Style = {Height('6.8cm'),HAlign('center')}; + add(DT,Chart2); + else + tab = tab+1; + end + close(figure(num)); + end + + ChartTh2_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Temporal evolution of the temperature recorded '... + 'by the sensors']); + add(DT_ENG,ChartTh2_cap); + FIG_ENG = FIG_ENG+1; + ChartTh2_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + add(DT_ENG,br); + close(figure(1)); + close(figure(2)); + end + else + %% Nesa Evo + testo = Paragraph(['Il grafico seguente mostra l''andamento deivalori di temperatura '... + 'nel tempo, misurati dal termometro della stazione meteo '... + 'durante il periodo temporale di riferimento. ']); + testo.HAlign = 'justify'; + + if activeEN == 1 + testo_ENG = Paragraph(['The following graph shows the temperature values '... + 'variation over time, recorded by the high-resolution thermometer '... + 'during the reference time period. ']); + testo_ENG.HAlign = 'justify'; + end + + % Grafico Temperatura vs Tempo + figure(5); + Mx = []; + Mn = []; + Tt = plot(Date,TempHR); + title('Temperatura'); + xlabel('Data [gg/mm/aaaa]'); + ylabel(['Temperatura [' char(176) 'C]']); + Mx = [Mx; ceil(max(TempHR))]; + Mn = [Mn; ceil(min(TempHR))]; + xlim([Date(1)-1 Date(end)+1]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + ylim([min(Mn)-1 max(Mx)+1]); + grid on + grid minor + + hold off + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Therm ',num2str(num),'.png')); + saveas(Tt,TempName); + Chart1 = Image(TempName); + Chart1.Style = {Height('7.5cm'),HAlign('center')}; + ChartTh_cap = Paragraph(['Fig. ' num2str(FIG) ' - Andamento nel tempo della temperatura registrata '... + 'dai singoli sensori']); + FIG = FIG+1; + ChartTh_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + add(DT,testo_ENG); + add(DT,Chart1); + add(DT,ChartTh_cap); + add(DT,br); + close(figure(5)); + + if activeEN == 1 + % Grafico Temperatura vs Tempo + figure(5); + Mx = []; + Mn = []; + Tt = plot(Date,TempHR); + title('Temperature'); + xlabel('Date [dd/mm/yyyy]'); + ylabel(['Temperature [' char(176) 'C]']); + Mx = [Mx; ceil(max(TempHR))]; + Mn = [Mn; ceil(min(TempHR))]; + xlim([Date(1)-1 Date(end)+1]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + ylim([min(Mn)-1 max(Mx)+1]); + grid on + grid minor + + hold off + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Therm ',num2str(num),'_ENG.png')); + saveas(Tt,TempName); + Chart1 = Image(TempName); + Chart1.Style = {Height('7.5cm'),HAlign('center')}; + ChartTh_cap = Paragraph(['Fig. ' num2str(FIG) ' - Temporal evolution of the temperature recorded '... + 'by the sensors']); + FIG_ENG = FIG_ENG+1; + ChartTh_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + add(DT,testo); + add(DT,Chart1); + add(DT,ChartTh_cap); + add(DT,br); + close(figure(5)); + end + end + + clear TempHR; + clear MaxTempHR; + clear MinTempHR; + clear Prof; + + elseif NODATAThL(m,1) == 1 + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + if m == 1 + add(DT_ENG,br); + end + end + check = 1; + end + end + end +end + +close all + +text = 'report_ThL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_TrL.m b/Tilt/report_TrL.m new file mode 100755 index 0000000..6508ae7 --- /dev/null +++ b/Tilt/report_TrL.m @@ -0,0 +1,144 @@ +function ATTIVA = report_TrL(NodoTriggerLink,rTrL,m,Font_tools,br,datarif,toolrif,... + unitrif,DT,DT_ENG,activeEN,status,ATTIVA,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_TrL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('Trigger non ancora installato o inattivo.'); + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Trigger not installed or inactive.'); + add(DT_ENG,testo); + end + end +elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoraggio completato. Invitiamo a visitare la '... + 'piattaforma web per la visione dei dati storici.']); + 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 + for t = 1:rTrL(m,1) + NodeNum = num2str(NodoTriggerLink(t,m)); + comando = ['select EventDate, EventTime, X, 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 + Att_Tot = cell2mat(Dati(:,3)); % attivazioni totali da inizio monitoraggio + Att = cell2mat(Dati(:,4)); % attivazioni nel periodo di riferimento + Att_Rif = cumsum(Att); + + sezTrig = Paragraph('Trigger Link'); + sezTrig.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + TR = Section(); + TR.Title = sezTrig; + add(DT,sezTrig); + if activeEN == 1 + sezTrig_ENG = Paragraph('Trigger Link'); + sezTrig_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + TR_ENG = Section(); + TR_ENG.Title = sezTrig_ENG; + add(DT_ENG,sezTrig_ENG); + end + + testo = Paragraph(['Durante il periodo temporale di riferimento, '... + 'sono state registrate ' num2str(Att_Rif(end)) ' attivazioni del sensore Trigger. '... + 'Il numero di attivazioni totali dalla data di inizio monitoraggio ' char(232) ' pari '... + 'a ' num2str(Att_Tot(end)) '.' ]); + testo.HAlign = 'justify'; + add(DT,testo); + + if Att_Rif > 0 % ci sono attivazioni nel periodo di riferimento + testo2 = Paragraph(['Di seguito sono riportate le date, relative al periodo temporale di riferimento, '... + 'nelle quali ' char(232) ' stata identificata un''attivazione del Trigger Link: ']); + testo2.HAlign = 'justify'; + + add(DT,testo2); + nd = size(Date); + for dt = 1:nd + if Att(dt) == 1 + text = ['- ' datestr(Date(dt),'dd/mm/yyyy HH:MM:SS')]; + testodata = Paragraph(text); + add(DT,testodata); + end + end + end + add(DT,br); + + + % -- ENG -- + if activeEN == 1 + testo = Paragraph(['During the reference time period, '... + 'the Trigger sensor activated ' num2str(Att_Rif(end)) ' times. '... + 'The total amount of activations since the beginning of the monitoring activity is '... + 'equal to ' num2str(Att_Tot(end)) '.' ]); + testo.HAlign = 'justify'; + add(DT_ENG,testo); + + if Att_rif > 0 % ci sono attivazioni nel periodo di riferimento + testo2 = Paragraph(['The activation dates for what concern the reference time period '... + 'are reported below: ']); + testo2.HAlign = 'justify'; + add(DT_ENG,testo2); + nd = size(Date); + for dt = 1:nd + if Att(dt) == 1 + textENG = ['- ' datestr(Date(dt),'dd/mm/yyyy HH:MM:SS')]; + testodataENG = Paragraph(textENG); + add(DT_ENG,testodataENG); + end + end + end + add(DT_ENG,br); + end + + % pulisco variabili da riutilizzare per catena successiva + clear Att_Tot + clear Att + clear Att_Rif + + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + end + end + end + end +end + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_TrL function executed correctly. report_TrL function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_TuL.m b/Tilt/report_TuL.m new file mode 100755 index 0000000..867f2fc --- /dev/null +++ b/Tilt/report_TuL.m @@ -0,0 +1,1014 @@ +function [GI_Cir_Q1,GI_Cir_Q2,GI_Cir_Q3,GI_Cir_Q4,GI_Cir_Q1_Num,GI_Cir_Q2_Num,... + GI_Cir_Q3_Num,GI_Cir_Q4_Num,GI_Cir_Seg,GI_Cir_Z,GI_Cir_Date,GI_TuL_RL,... + ATTIVA,FIG,FIG_ENG] = report_TuL(IDcentralina,DTcatena,rTuL,m,NodoTunnelLink,toolrif,... + unitrif,datarif,firstdata_num,Font_caption,Font_tools,siteID,DT,DT_ENG,FIG,FIG_ENG,br,... + colonna2,colonna2bis,status,ATTIVA,activeEN,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_TuL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +GI_Cir_Q1 = []; +GI_Cir_Q2 = []; +GI_Cir_Q3 = []; +GI_Cir_Q4 = []; +GI_Cir_Q1_Num = []; +GI_Cir_Q2_Num = []; +GI_Cir_Q3_Num = []; +GI_Cir_Q4_Num = []; +GI_Cir_Seg = []; +GI_Cir_Z = []; +GI_Cir_Date = []; +GI_TuL_RL = []; + +check = 0; +while check == 0 + if status(m,1) == 1 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph('Catena non ancora installata o inattiva.'); + add(DT,testo); + if activeEN == 1 + testo = Paragraph('Array not installed or inactive.'); + add(DT_ENG,testo); + end + end + check = 1; + elseif status(m,1) == 3 + if ATTIVA == 1 + ATTIVA = 0; + testo = Paragraph(['Monitoraggio completato. Invitiamo a visitare la '... + 'piattaforma web per la visione dei dati storici.']); + 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 + check = 1; + else + [~,Segmenti,~,~,~,Antiorario] = star(IDcentralina,DTcatena,FileName); + [dim,~] = size(Segmenti); % numero di punti per il calcolo della stella + + NODATA(m,1) = 0; + Num = zeros(rTuL(m,1),1); + for n = 1:rTuL(m,1) + NodeNum = num2str(NodoTunnelLink(n,m)); + % dati del mese + comando = ['select EventDate, EventTime, XShift, ZShift, HShift, '... + 'HShift_local, X, Z 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; + Num(n,1) = NodoTunnelLink(n,m); + + datarifNEW = datestr(firstdata_num{m+1,1},'yyyy-mm-dd'); % data riferimento definita sul sito + temporifNEW = datestr(firstdata_num{m+1,1},'HH:MM:SS'); + % primo dato per la stella + comando = ['select HShift from ElabDataView where EventDate = ''' ... + datarifNEW ''' and EventTime >= ''' temporifNEW ''' and '... + 'ToolNameID = ''' char(toolrif) ''' and UnitName = ''' ... + char(unitrif) ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Stella1 = cell2mat(curs.Data); + + % Scarico ay che mi serve per orientare gli spostamenti in + % convergenze/divergenza a seconda del quadrante - Inizio mese + comando = ['select Val1, Val6 from RawDataView where Date >= ''' datarif ... + ''' and UnitName = ''' char(unitrif) ''' and ToolNameID = ''' char(toolrif) ... + ''' and NodeNum = ' NodeNum ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DatiaccY_Mese = curs.Data; + + % Scarico i parametri di calibrazione di ay + comando = ['select Cal0, Cal1, Cal2, Cal3, Cal4, Cal5, Cal6, Cal7, Cal8, '... + 'CalA, CalB from CalibrationView where UnitName = ''' char(unitrif) ... + ''' and ToolNameID = ''' char(toolrif) ''' and NodeNum = ''' NodeNum '''']; + curs = exec(conn,comando); + curs = fetch(curs); + DCalTuL = curs.Data; + [r,c] = size(DCalTuL); + MATconv = zeros(r,c); + for ii = 1:r + for jj = 1:c + MATconv(ii,jj) = DCalTuL{ii,jj}; + end + end + DCalTuL = MATconv; + caY_Tu = DCalTuL(:,4); + pIntY_Tu = DCalTuL(:,5); + iIntY_Tu = DCalTuL(:,6); + + [rD,rC] = size(Dati); + if rC ~= 1 + T = [cell2mat(Dati(:,1)) repmat(' ', [rD,1]) cell2mat(Dati(:,2))]; + Date = datenum(T); % Data + if n == 1 % Il primo lo scrivo e creo la variabile di controllo + else + [rS,~] = size(asseX); + if rD ~= rS + NODATA(m,1) = 1; + check = 0; + break + else + check = 1; + end + end + + % divergenza/convergenza dei singoli nodi dall'inizio + asseX(:,n) = cell2mat((Dati(:,3))); + asseZ(:,n) = cell2mat(Dati(:,4)); + X_TuL_Mese(:,n) = cell2mat(Dati(:,7)); + Z_TuL_Mese(:,n) = cell2mat(Dati(:,8)); + accY_raw(:,n) = str2double(DatiaccY_Mese(:,1)); + t_TuL(:,n) = str2double(DatiaccY_Mese(:,2)); + accY_Mese(:,n) = accY_raw(:,n)*caY_Tu+(t_TuL(:,n)*pIntY_Tu+iIntY_Tu); + diffX(:,n) = asseX(:,n)-asseX(1,n); + diffZ(:,n) = asseZ(:,n)-asseZ(1,n); + RIS_XZ(:,n) = 1000*cell2mat((Dati(:,6))); + if n <= dim + stella_Rif(:,n) = 1000*(cell2mat(Dati(:,5))-Stella1(1,1)); + stella_Mese(:,n) = 1000*(cell2mat(Dati(:,5))-cell2mat(Dati(1,5))); + end + + % dati relativi al mese + RIS_XZ_Mese(1,n) = sqrt(diffX(end,n)^2 + diffZ(end,n)^2)*1000; + [rAY,~] = size(accY_Mese); + if isnan(accY_Mese(end,n)) == 1 + for d = 1:rAY + if isnan(accY_Mese(end-d+1,n)) == 0 + diffaccY(1,n) = accY_Mese(end-d+1,n)-accY_Mese(1,n); + break + end + end + else + diffaccY(1,n) = accY_Mese(end,n)-accY_Mese(1,n); + end + % correggo segno risultante + if diffaccY(1,n) < 0 + if Antiorario(n,1) == 1 || Antiorario(n,1) == 4 + RIS_XZ_Mese(1,n) = -1*RIS_XZ_Mese(1,n); + end + elseif diffaccY(1,n) > 0 + if Antiorario(n,1) == 2 || Antiorario(n,1) == 3 + RIS_XZ_Mese(1,n) = -1*RIS_XZ_Mese(1,n); + end + end + else + NODATA(m,1) = 1; + check = 1; + end + end + + if NODATA(m,1) == 0 + date = datestr(datenum(colonna2{m+1,1},'dd-mm-yyyy'),'yyyy-mm-dd'); % data riferimento definita sul sito + % posizione di progetto dei nodi + comando = ['select EventDate, EventTime, X, Z from ElabDataView where EventDate >= ''' ... + date ''' and ToolNameID = ''' char(toolrif) ''' and UnitName = ''' char(unitrif) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + SezioneXZ = curs.Data; + Datasez = SezioneXZ(1,1); + Orasez = SezioneXZ(1,2); + [rz,~] = size(SezioneXZ); + scrivi = 1; + for rr = 1:rz + if strcmp(SezioneXZ(rr,1),Datasez)==1 && strcmp(SezioneXZ(rr,2),Orasez) ==1 + CoordX(scrivi,1) = SezioneXZ(rr,3); + CoordZ(scrivi,1) = SezioneXZ(rr,4); + scrivi = scrivi+1; + end + end + if strcmp(colonna2bis(m+1,1),colonna2(m+1,1)) == 0 % data zero diversa data riferimento + datarifNEW = datestr(firstdata_num{m+1,1},'yyyy-mm-dd'); % data riferimento definita sul sito + for nw = 1:rTuL(m,1) + NodeNum = num2str(NodoTunnelLink(nw,m)); + comando = ['select EventDate, EventTime, XShift, ZShift, X, Z, '... + 'from ElabDataView where EventDate = ''' datarifNEW ''' and ToolNameID = ''' char(toolrif) ... + ''' and UnitName = ''' char(unitrif) ''' and NodeNum = ''' NodeNum ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DatiNEW = curs.Data; % dati registrati alla data di riferimento + Num(nw,1) = NodoTunnelLink(nw,m); + [~,rC] = size(DatiNEW); + if rC ~= 1 + % dalla data di riferimento + % divergenza/convergenza dei singoli nodi dall'inizio + asseX(:,nw) = asseX(:,nw)-cell2mat(DatiNEW(1,3)); + asseZ(:,nw) = asseZ(:,nw)-cell2mat(DatiNEW(1,4)); + X_TuL_Rif(:,nw) = cell2mat(DatiNEW(1,5)); + Z_TuL_Rif(:,nw) = cell2mat(DatiNEW(1,6)); + + % Scarico ay che mi serve per orientare gli spostamenti in + % convergenze/divergenza a seconda del quadrante - dati + % dalla data di riferimento + comando = ['select Val1, Val6 from RawDataView where Date >= ''' datarifNEW ... + ''' and UnitName = ''' char(unitrif) ''' and ToolNameID = ''' char(toolrif) ... + ''' and NodeNum = ' NodeNum ' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DatiaccY_Rif = curs.Data; + + accY_raw(:,n) = str2double(DatiaccY(:,1)); + t_TuL(:,n) = str2double(DatiaccY(:,2)); + accY_Rif(:,n) = accY_raw(:,n)*caY_Tu+(t_TuL(:,n)*pIntY_Tu+iIntY_Tu); + + diffX(:,n) = asseX(:,n)-asseX(1,n); + diffZ(:,n) = asseZ(:,n)-asseZ(1,n); + + % Risultati dalla data di riferimento + RIS_XZ(:,n) = 1000*((asseX(:,n).^2+asseZ(:,n).^2).^0.5); + diffaccY_Rif(1,n) = accY_Mese(end,n)-accY_Rif(1,n); + % correggo segno risultante + if diffaccY_Rif(1,n) < 0 + if Antiorario(n,1) == 1 || Antiorario(n,1) == 4 + RIS_XZ(1,n) = -1*RIS_XZ(1,n); + end + elseif diffaccY_Rif(1,n) > 0 + if Antiorario(n,1) == 2 || Antiorario(n,1) == 3 + RIS_XZ(1,n) = -1*RIS_XZ(1,n); + end + end + + % dati relativi al mese + RIS_XZ_Mese(:,n) = sqrt(diffX(end,n).^2 + diffZ(end,n)^2)*1000; + diffaccY_Mese(:,n) = accY_Mese(:,n)-accY_Mese(1,n); + % correggo segno risultante + [rA,~] = size(accY_Mese); + for aa = 1:rA + if diffaccY_Mese(1,n) < 0 + if Antiorario(n,1) == 1 || Antiorario(n,1) == 4 + RIS_XZ_Mese(aa,n) = -1*RIS_XZ_Mese(aa,n); + end + elseif diffaccY_Mese(1,n) > 0 + if Antiorario(n,1) == 2 || Antiorario(n,1) == 3 + RIS_XZ_Mese(aa,n) = -1*RIS_XZ_Mese(aa,n); + end + end + end + else + NODATA(m,1) = 1; + end + end + end + + q1 = find(Antiorario==1); + q2 = find(Antiorario==2); + q3 = find(Antiorario==3); + q4 = find(Antiorario==4); + m1 = max(abs(RIS_XZ_Mese(end,q1))); + g1 = find(m1==abs(RIS_XZ_Mese)); + GI_Cir_Q1 = RIS_XZ_Mese(end,g1(1)); + m2 = max(abs(RIS_XZ_Mese(end,q2))); + g2 = find(m2==abs(RIS_XZ_Mese)); + GI_Cir_Q2 = RIS_XZ_Mese(end,g2(1)); + m3 = max(abs(RIS_XZ_Mese(end,q3))); + g3 = find(m3==abs(RIS_XZ_Mese)); + GI_Cir_Q3 = RIS_XZ_Mese(end,g3(1)); + m4 = max(abs(RIS_XZ_Mese(end,q4))); + g4 = find(m4==abs(RIS_XZ_Mese)); + GI_Cir_Q4 = RIS_XZ_Mese(end,g4(1)); + GI_Cir_Q1_Num = Num(g1(1)); + GI_Cir_Q2_Num = Num(g2(1)); + GI_Cir_Q3_Num = Num(g3(1)); + GI_Cir_Q4_Num = Num(g4(1)); + GI_Cir_Seg = stella_Mese(end,:); + GI_Cir_Date = Date; + + % Cerco eventuali correlazioni con PreConv Array + NomeFile = strcat('Report',siteID,'-PCLvsTuL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + Var = 0; + ind = 1; + while AAA < rF % A un Cir compete (se c'è) uno ed un solo PreConv. Lo vado a cercare + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono PreConv Array o non ci sono Cir + AAA = 2; + else + check2 = Filetesto(AAA+1,1); + if check1 == str2num(DTcatena(end-2:end)) % Il Cir è da prendere in considerazione ed è riportato nella prima riga del file + Nodo = Filetesto(AAA+2,1); + Var = 1; + elseif check2 == str2num(DTcatena(end-2:end)) % Il Cir è da prendere in considerazione ed è riportato nella seconda riga del file + Nodo = Filetesto(AAA+3,1); + Var = 1; + end + AAA = AAA+4; + end + end + if Var == 1 + GI_Cir_Z(:,ind) = (asseZ(:,Nodo)-asseZ(1,Nodo))*1000; + ind = ind+1; + Var = 0; + end + + % Cerco eventuali correlazioni con Rad Array + NomeFile = strcat('Report',siteID,'-TuLvsRL.txt'); + Filetesto = importdata(NomeFile); + [rF,~] = size(Filetesto); + AAA = 1; + Var = 0; + ind = 1; + while AAA < rF % A un Cir compete un Rad Array. Lo vado a cercare + check1 = Filetesto(AAA,1); + if check1 == 99999 % Non ci sono Rad Array o non ci sono Cir + AAA = 2; + else + check2 = Filetesto(AAA+1,1); + if check1 == str2num(DTcatena(end-2:end)) % Il Cir è da prendere in considerazione ed è riportato nella prima riga del file + Nodo = Filetesto(AAA+2,1); + Var = 1; + elseif check2 == str2num(DTcatena(end-2:end)) % Il Cir è da prendere in considerazione ed è riportato nella seconda riga del file + Nodo = Filetesto(AAA+3,1); + Var = 1; + end + AAA = AAA+4; + end + if Var == 1 + GI_TuL_RL(:,ind) = sqrt(diffX(:,Nodo).^2 + diffZ(:,Nodo).^2)*1000; % ad un Cir possono competere più Rad. Il cir è unico + ind = ind+1; + Var = 0; + end + end + + % Istogramma convergenza/divergenza dei singoli nodi + figure(1) + [~,nn] = size(RIS_XZ_Mese(end,:)); + for w = 1:nn + nodi_grafico(1,w) = w; + end + RIS = [RIS_XZ_Mese(end,:)' RIS_XZ(end,:)']; + div_conv = barh(nodi_grafico,RIS); + title('Risultante 2D degli spostamenti locali'); + xlabel('Spostamento [mm]'); + ylabel('Nodo [-]'); + h = gca; + h.XAxis.MinorTick = 'on'; + h.YAxis.MinorTick = 'off'; + Max(1) = max(RIS_XZ_Mese(end,:)); + Max(2) = max(RIS_XZ(end,:)); + MAX = max(Max); + Min(1) = min(RIS_XZ_Mese(end,:)); + Min(2) = min(RIS_XZ(end,:)); + MIN = min(Min); + in1 = find(Max == MAX); + in2 = find(Min == MIN); + MM = [abs(MIN) MAX]; + MAXX = max(MM); + in3 = find(MM == MAXX); + if in3 == 1 % DX + if in2 == 1 + POS = find(RIS_XZ_Mese == Min(1)); + else + POS = find(RIS_XZ == Min(2)); + end + else % SX + if in1 == 1 + POS = find(RIS_XZ_Mese == Max(1)); + else + POS = find(RIS_XZ == Max(2)); + end + end + if MAXX < 10 % mm + xlim([-10 10]); + else + xlim([-MAXX MAXX]) + end + ylim([0 nn+2]); + yticks(0:1:nn); + grid on + if in3 == 1 % DX + legend('Periodo di riferimento','Intero periodo','Location','northeast'); + else % SX + legend('Periodo di riferimento','Intero periodo','Location','northwest'); + end + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Convergenza.png')); + saveas(div_conv(1),TempName); + ChartCIR = Image(TempName); + ChartCIR.Style = {HAlign('justify'),ScaleToFit}; + ChartCIR_cap = Paragraph(['Fig. ' num2str(FIG) ' - Risultante 2D degli '... + 'spostamenti differenziali locali nel piano della sezione registrati durante '... + 'il periodo temporale di riferimento e l''intero periodo di monitoraggio']); + FIG = FIG+1; + ChartCIR_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + close(figure(1)) + + % ENG + if activeEN == 1 + % Istogramma convergenza/divergenza dei singoli nodi + figure(2) + div_conv = barh(nodi_grafico,RIS); + title('2D local displacements'); + xlabel('Displacement [mm]'); + ylabel('Node [-]'); + h = gca; + h.XAxis.MinorTick = 'on'; + h.YAxis.MinorTick = 'off'; + if MAXX < 10 % mm + xlim([-10 10]); + else + xlim([-MAXX MAXX]) + end + ylim([0 nn+2]); + yticks(0:1:nn); + grid on + if in3 == 1 % DX + legend('Reference time period','Complete monitoring period','Location','northeast'); + else % SX + legend('Reference time period','Complete monitoring period','Location','northwest'); + end + TempName = char(strcat('Report',siteID,'-', char(toolrif),'Convergenza_ENG.png')); + saveas(div_conv(1),TempName); + ChartCIR_ENG = Image(TempName); + ChartCIR_ENG.Style = {HAlign('justify'),ScaleToFit}; + ChartCIR_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - 2D Local differential displacements '... + 'recorded in the section plane by the 3D MEMS sensors during the reference and the '... + 'complete monitoring period']); + FIG_ENG = FIG_ENG+1; + ChartCIR_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + end + close(figure(2)) + + % --- Sezione - MESE --- + contaC_Mese = 1; + contaD_Mese = 1; + conta0_Mese = 1; + for ris = 1:nn + if RIS_XZ_Mese(end,ris)< -0.5 + nodiCX_Mese(contaC_Mese,1) = CoordX(ris,1); + nodiCZ_Mese(contaC_Mese,1) = CoordZ(ris,1); + contaC_Mese = contaC_Mese + 1; + elseif RIS_XZ_Mese(end,ris)> 0.5 + nodiDX_Mese(contaD_Mese,1) = CoordX(ris,1); + nodiDZ_Mese(contaD_Mese,1) = CoordZ(ris,1); + contaD_Mese = contaD_Mese + 1; + else + nodiFX_Mese(conta0_Mese,1) = CoordX(ris,1); + nodiFZ_Mese(conta0_Mese,1) = CoordZ(ris,1); + conta0_Mese = conta0_Mese + 1; + end + end + + % --- Sezione - GLOBALI --- + contaC = 1; + contaD = 1; + conta0 = 1; + for ris = 1:nn + if RIS_XZ(end,ris)< -0.5 + nodiCX_tot(contaC,1) = CoordX(ris,1); + nodiCZ_tot(contaC,1) = CoordZ(ris,1); + contaC = contaC + 1; + elseif RIS_XZ(end,ris)> 0.5 + nodiDX_tot(contaD,1) = CoordX(ris,1); + nodiDZ_tot(contaD,1) = CoordZ(ris,1); + contaD = contaD + 1; + else + nodiFX_tot(conta0,1) = CoordX(ris,1); + nodiFZ_tot(conta0,1) = CoordZ(ris,1); + conta0 = conta0 + 1; + end + end + + % Grafico Sezione Mese + figure(3) + CoordX = [CoordX(:,1); CoordX(1,1); CoordX(1,1)]; + CoordZ = [CoordZ(:,1); CoordZ(end,1); CoordZ(1,1)]; + sez = plot(cell2mat(CoordX(:,1)),cell2mat(CoordZ(:,1)),'-','Color','black'); + hold on + if contaC_Mese > 1 + sezC = plot(cell2mat(nodiCX_Mese(:,1)),cell2mat(nodiCZ_Mese(:,1)),'o','Color','red'); + set(sezC, 'markerfacecolor', get(sezC, 'color')); + end + if contaD_Mese > 1 + sezD = plot(cell2mat(nodiDX_Mese(:,1)),cell2mat(nodiDZ_Mese(:,1)),'o','Color',[0.4660 0.6740 0.1880]); + set(sezD, 'markerfacecolor', get(sezD, 'color')); + end + if conta0_Mese > 1 + sezF = plot(cell2mat(nodiFX_Mese(:,1)),cell2mat(nodiFZ_Mese(:,1)),'o','Color','black'); + set(sezF, 'markerfacecolor', get(sezF, 'color')); + end + if contaC_Mese > 1 && contaD_Mese > 1 && conta0_Mese > 1 + legend({'Geometria della sezione','Nodi convergenti','Nodi divergenti','Nodi stabili'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese > 1 && contaD_Mese > 1 && conta0_Mese == 1 + legend({'Geometria della sezione','Nodi convergenti','Nodi divergenti'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese > 1 && contaD_Mese == 1 && conta0_Mese > 1 + legend({'Geometria della sezione','Nodi convergenti','Nodi stabili'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese == 1 && contaD_Mese > 1 && conta0_Mese > 1 + legend({'Geometria della sezione','Nodi divergenti','Nodi stabili'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese > 1 && contaD_Mese == 1 && conta0_Mese == 1 + legend({'Geometria della sezione','Nodi convergenti'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese == 1 && contaD_Mese > 1 && conta0_Mese == 1 + legend({'Geometria della sezione','Nodi divergenti','Nodi stabili'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese == 1 && contaD_Mese == 1 && conta0_Mese > 1 + legend({'Geometria della sezione','Nodi stabili'},'Position',[0.37 0.37 0.3 0.2]); + end + title('Spostamenti Locali - Periodo di riferimento'); + xlabel('X [m]'); + ylabel('Z [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + grid off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezCIR.png')); + saveas(sez,TempName); + ChartSEZ = Image(TempName); + ChartSEZ.Style = {HAlign('center'),Height('6.5cm')}; + close(figure(3)) + + % ENG + if activeEN == 1 + % Grafico Sezione Mese + figure(4) + sez = plot(cell2mat(CoordX(:,1)),cell2mat(CoordZ(:,1)),'-','Color','black'); + hold on + if contaC_Mese > 1 + sezC = plot(cell2mat(nodiCX_Mese(:,1)),cell2mat(nodiCZ_Mese(:,1)),'o','Color','red'); + set(sezC, 'markerfacecolor', get(sezC, 'color')); + end + if contaD_Mese > 1 + sezD = plot(cell2mat(nodiDX_Mese(:,1)),cell2mat(nodiDZ_Mese(:,1)),'o','Color',[0.4660 0.6740 0.1880]); + set(sezD, 'markerfacecolor', get(sezD, 'color')); + end + if conta0_Mese > 1 + sezF = plot(cell2mat(nodiFX_Mese(:,1)),cell2mat(nodiFZ_Mese(:,1)),'o','Color','black'); + set(sezF, 'markerfacecolor', get(sezF, 'color')); + end + if contaC_Mese > 1 && contaD_Mese > 1 && conta0_Mese > 1 + legend({'Array geometry','Convergent nodes','Divergent nodes','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese > 1 && contaD_Mese > 1 && conta0_Mese == 1 + legend({'Array geometry','Convergent nodes','Divergent nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese > 1 && contaD_Mese == 1 && conta0_Mese > 1 + legend({'Array geometry','Convergent nodes','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese == 1 && contaD_Mese > 1 && conta0_Mese > 1 + legend({'Array geometry','Divergent nodes','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese > 1 && contaD_Mese == 1 && conta0_Mese == 1 + legend({'Array geometry','Convergent nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese == 1 && contaD_Mese > 1 && conta0_Mese == 1 + legend({'Array geometry','Divergent nodes','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC_Mese == 1 && contaD_Mese == 1 && conta0_Mese > 1 + legend({'Array geometry','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + end + title('Local displacements - Reference time period'); + xlabel('X [m]'); + ylabel('Z [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + grid off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezCIR_ENG.png')); + saveas(sez,TempName); + ChartSEZ_ENG = Image(TempName); + ChartSEZ_ENG.Style = {HAlign('center'),Height('6.5cm')}; + end + close(figure(4)) + + % Grafico Sezione Globali + figure(5) + sez = plot(cell2mat(CoordX(:,1)),cell2mat(CoordZ(:,1)),'-','Color','black'); + hold on + if contaC > 1 + sezC = plot(cell2mat(nodiCX_tot(:,1)),cell2mat(nodiCZ_tot(:,1)),'o','Color','red'); + set(sezC, 'markerfacecolor', get(sezC, 'color')); + end + if contaD > 1 + sezD = plot(cell2mat(nodiDX_tot(:,1)),cell2mat(nodiDZ_tot(:,1)),'o','Color',[0.4660 0.6740 0.1880]); + set(sezD, 'markerfacecolor', get(sezD, 'color')); + end + if conta0 > 1 + sezF = plot(cell2mat(nodiFX_tot(:,1)),cell2mat(nodiFZ_tot(:,1)),'o','Color','black'); + set(sezF, 'markerfacecolor', get(sezF, 'color')); + end + if contaC > 1 && contaD > 1 && conta0 > 1 + legend({'Geometria della sezione','Nodi convergenti','Nodi divergenti','Nodi stabili'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC > 1 && contaD > 1 && conta0 == 1 + legend({'Geometria della sezione','Nodi convergenti','Nodi divergenti'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC > 1 && contaD == 1 && conta0 > 1 + legend({'Geometria della sezione','Nodi convergenti','Nodi stabili'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC == 1 && contaD > 1 && conta0 > 1 + legend({'Geometria della sezione','Nodi divergenti','Nodi stabili'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC > 1 && contaD == 1 && conta0 == 1 + legend({'Geometria della sezione','Nodi convergenti'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC == 1 && contaD > 1 && conta0 == 1 + legend({'Geometria della sezione','Nodi divergenti','Nodi stabili'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC == 1 && contaD == 1 && conta0 > 1 + legend({'Geometria della sezione','Nodi stabili'},'Position',[0.37 0.37 0.3 0.2]); + end + title('Spostamenti Locali - Intero periodo'); + xlabel('X [m]'); + ylabel('Z [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + grid off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezCIR2.png')); + saveas(sez,TempName); + + ChartSEZ2 = Image(TempName); + ChartSEZ2.Style = {HAlign('center'),Height('6.5cm')}; + ChartSEZ_cap = Paragraph(['Fig. ' num2str(FIG) ' - Direzione della '... + 'risultante del vettore di spostamento 2D differenziale locale '... + 'registrata durante il periodo temporale di riferimento e a '... + 'partire dalla data di riferimento definita in Tabella 1']); + FIG = FIG+1; + ChartSEZ_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + lot = Table({ChartSEZ, ChartSEZ2}); + lot.Style = {ResizeToFitContents(false), Width('100%')}; + close(figure(5)) + + if activeEN == 1 + % Grafico Sezione Globali + figure(6) + sez = plot(cell2mat(CoordX(:,1)),cell2mat(CoordZ(:,1)),'-','Color','black'); + hold on + if contaC > 1 + sezC = plot(cell2mat(nodiCX_tot(:,1)),cell2mat(nodiCZ_tot(:,1)),'o','Color','red'); + set(sezC, 'markerfacecolor', get(sezC, 'color')); + end + if contaD > 1 + sezD = plot(cell2mat(nodiDX_tot(:,1)),cell2mat(nodiDZ_tot(:,1)),'o','Color',[0.4660 0.6740 0.1880]); + set(sezD, 'markerfacecolor', get(sezD, 'color')); + end + if conta0 > 1 + sezF = plot(cell2mat(nodiFX_tot(:,1)),cell2mat(nodiFZ_tot(:,1)),'o','Color','black'); + set(sezF, 'markerfacecolor', get(sezF, 'color')); + end + if contaC > 1 && contaD > 1 && conta0 > 1 + legend({'Array geometry','Convergent nodes','Divergent nodes','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC > 1 && contaD > 1 && conta0 == 1 + legend({'Array geometry','Convergent nodes','Divergent nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC > 1 && contaD == 1 && conta0 > 1 + legend({'Array geometry','Convergent nodes','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC == 1 && contaD > 1 && conta0 > 1 + legend({'Array geometry','Divergent nodes','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC > 1 && contaD == 1 && conta0 == 1 + legend({'Array geometry','Convergent nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC == 1 && contaD > 1 && conta0 == 1 + legend({'Array geometry','Divergent nodes','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + elseif contaC == 1 && contaD == 1 && conta0 > 1 + legend({'Array geometry','Stable nodes'},'Position',[0.37 0.37 0.3 0.2]); + end + title('Local displacements - Complete monitoring period'); + xlabel('X [m]'); + ylabel('Z [m]'); + h = gca; + h.XAxis.MinorTick = 'on'; + grid off + TempName = char(strcat('Report',siteID,'-', char(toolrif),'SezCIR2_ENG.png')); + saveas(sez,TempName); + + ChartSEZ2_ENG = Image(TempName); + ChartSEZ2_ENG.Style = {HAlign('center'),Height('6.5cm')}; + ChartSEZ_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Direction of the '... + '2D local differential displacement vector '... + 'observed during the reference time period and strarting from the reference date '... + 'reported in Table 1']); + FIG_ENG = FIG_ENG+1; + ChartSEZ_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + lot_ENG = Table({ChartSEZ_ENG, ChartSEZ2_ENG}); + lot_ENG.Style = {ResizeToFitContents(false), Width('100%')}; + end + close(figure(6)) + + % immagine stella di convergenza + nome = char(strcat(char(unitrif),'-', char(toolrif),'-Star.png')); + Star = Image(nome); + Star.Style = {Height('6.5cm')}; + Star_ENG = Image(nome); + Star_ENG.Style = {Height('6.5cm')}; + + % --- Segmenti di convergenza MESE --- + [~,cs] = size(stella_Mese); + for y = 1:cs + varseg_Mese(y,1) = stella_Mese(end,y); + end + maxseg_Mese = max(abs(varseg_Mese)); + maxsegindex_Mese = find(abs(varseg_Mese) == maxseg_Mese); + maxseg_Mese = varseg_Mese(maxsegindex_Mese); + + % --- Segmenti di convergenza Globale --- + [~,cs] = size(stella_Rif); + for y = 1:cs + varseg_tot(y,1) = stella_Rif(end,y); + numseg(y,1) = y; + end + maxseg = max(abs(varseg_tot)); + maxsegindex = find(abs(varseg_tot) == maxseg); + maxseg = varseg_tot(maxsegindex); + + figure(7) + Seg = [varseg_Mese varseg_tot]; + segmenti = barh(numseg,Seg); + title('Variazione dei segmenti di convergenza'); + ylabel('Segmento [-]'); + xlabel('Variazione di lunghezza [mm]'); + h = gca; + h.XAxis.MinorTick = 'on'; + Max(1) = max(varseg_Mese); + Max(2) = max(varseg_tot); + MAX = max(Max); + Min(1) = min(varseg_Mese); + Min(2) = min(varseg_tot); + MIN = min(Min); + MAXX = max(abs(MIN),MAX); + MM = [abs(MIN) MAX]; + in3 = find(MM == MAXX); % Dx-Sx + if in3 == 1 % DX + legend('Periodo di riferimento','Intero periodo','Location','northeast'); + else % SX + legend('Periodo di riferimento','Intero periodo','Location','northwest'); + end + ylim([0 cs+2]); + yticks(0:1:nn); + if MAXX < 10 % mm + xlim([-10 10]); + else + xlim([-MAXX MAXX]) + end + + grid on + grid minor + TempName = char(strcat('Report',siteID,'-', char(toolrif),'StarSeg.png')); + saveas(segmenti(1),TempName); + ChartSEG = Image(TempName); + ChartSEG.Style = {Height('6.8cm')}; + ChartSEG_cap = Paragraph(['Fig. ' num2str(FIG) ' - Variazione della '... + 'lunghezza dei segmenti di convergenza durante il periodo temporale '... + 'di riferimento e l''intero periodo di monitoraggio']); + FIG = FIG+1; + ChartSEG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + lot2 = Table({Star, ChartSEG}); + lot2.Style = {ResizeToFitContents(false), Width('100%')}; + close(figure(7)) + + if activeEN == 1 + figure(8) + segmenti = barh(numseg,Seg); + title('Convergence segments variation'); + ylabel('Segment [-]'); + xlabel('Length variation [mm]'); + h = gca; + h.XAxis.MinorTick = 'on'; + in3 = find(MM == MAXX); % Dx-Sx + if in3 == 1 % DX + legend('Reference time period','Complete monitoring period','Location','northeast'); + else % SX + legend('Reference time period','Complete monitoring period','Location','northwest'); + end + ylim([0 cs+2]); + yticks(0:1:nn); + if MAXX < 10 % mm + xlim([-10 10]); + else + xlim([-MAXX MAXX]) + end + + grid on + grid minor + TempName = char(strcat('Report',siteID,'-', char(toolrif),'StarSeg_ENG.png')); + saveas(segmenti(1),TempName); + ChartSEG_ENG = Image(TempName); + ChartSEG_ENG.Style = {Height('6.8cm')}; + ChartSEG_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Length variations of each convergence segment '... + 'recorded during the reference and the complete monitoring periods']); + FIG_ENG = FIG_ENG+1; + ChartSEG_ENG_cap.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + lot2_ENG = Table({Star_ENG, ChartSEG_ENG}); + lot2_ENG.Style = {ResizeToFitContents(false), Width('100%')}; + end + close(figure(8)) + + sezCIR = Heading3('Tunnel Link'); + sezCIR.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + CC = Section(); + CC.Title = sezCIR; + % Testi relativi all'ultimo mese + testo1M = Paragraph(['Il grafico riportato di seguito mostra l''entit' char(224) ' e '... + 'la direzione dei vettori di spostamento differenziale locale nel piano '... + 'della sezione, misurati dai sensori Tunnel Link '... + 'relativamente al periodo temporale di riferimento e all''intero periodo di monitoraggio. '... + 'Il vettore ' char(232) ' ottenuto come risultante '... + 'delle componenti nel piano X-Z, ovvero larghezza ed altezza della sezione. '... + 'In particolare, valori negativi di spostamento indicano una convergenza '... + 'del nodo verso il centro della sezione, mentre spostamenti '... + 'positivi caratterizzano una divergenza del sensore in oggetto.']); + parte1 = ['La figura seguente riassume la direzione dei singoli nodi '... + 'rappresentati sulla geometria di progetto della sezione. Nel periodo '... + 'temporale di riferimento, l''analisi degli spostamenti ha evidenziato ' ... + num2str(contaC_Mese-1) ]; + if contaC_Mese-1 == 1 + parte2 = ' nodo convergente'; + else + parte2 = ' nodi convergenti'; + end + parte3 = [', ' num2str(contaD_Mese-1) ]; + if contaD_Mese-1 == 1 + parte4 = ' nodo divergente '; + else + parte4 = ' nodi divergenti '; + end + parte5 = ['e ' num2str(conta0_Mese-1) ]; + if conta0_Mese-1 == 1 + parte6 = ' nodo stabile. '; + else + parte6 = ' nodi stabili. '; + end + parte7 = ['La medesima analisi con riferimento all''intero '... + 'periodo di monitoraggio mostra ' num2str(contaC-1) ]; + if conta0-1 == 0 + if contaC-1 == 1 + parte8 = [' nodo convergente e ' num2str(contaD-1)]; + else + parte8 = [' nodi convergenti e ' num2str(contaD-1)]; + end + if contaD-1 == 1 + parte9 = ' nodo divergente. '; + else + parte9 = ' nodi divergenti. '; + end + else + if contaC-1 == 1 + parte8 = [' nodo convergente, ' num2str(contaD-1)]; + else + parte8 = [' nodi convergenti, ' num2str(contaD-1)]; + end + if contaD-1 == 1 + parte9 = ' nodo divergente '; + else + parte9 = ' nodi divergenti '; + end + parte10 = ['e ' num2str(conta0-1)]; + if conta0-1 == 1 + parte11 = ' nodo stabile. '; + else + parte11 = ' nodi stabili. '; + end + end + parte12 = ['Si noti che in questa rappresentazione vengono '... + 'considerati stabili i nodi caratterizzati da uno spostamento con '... + 'modulo inferiore a 0.5 mm.']; + if conta0-1 == 0 + testo2M = Paragraph([parte1 parte2 parte3 parte4 parte5 parte6 parte7 parte8 ... + parte9 parte12]); + else + testo2M = Paragraph([parte1 parte2 parte3 parte4 parte5 parte6 parte7 parte8 ... + parte9 parte10 parte11 parte12]); + end + testo3M = Paragraph(['Vengono inoltre riportate le variazioni di lunghezza '... + 'dei segmenti di convergenza durante il periodo temporale di riferimento '... + 'e l''intero periodo di monitoraggio. I segmenti sono definiti con '... + 'l''ausilio della stella topografica riportata in figura. ' ... + 'In particolare, la maggior variazione relativa al periodo di riferimento ' ... + char(232) ' osservabile nel segmento S' num2str(maxsegindex_Mese(1,1)) ... + ' ed ' char(232) ' pari a ' num2str(round(maxseg_Mese(1,1),1)) ' mm. '... + 'Facendo riferimento all''intero periodo, S' num2str(maxsegindex(1,1)) ... + ' risulta essere il segmento maggiormente attivo, con uno spostamento pari a '... + num2str(round(maxseg(1,1),1)) ' mm.']); + spazio = Paragraph(''); + testo1M.HAlign = 'justify'; + testo2M.HAlign = 'justify'; + testo3M.HAlign = 'justify'; + + add(DT,sezCIR); + add(DT,testo1M); + add(DT,ChartCIR); + add(DT,ChartCIR_cap); + add(DT,testo2M); + add(DT,spazio); + add(DT,lot); + add(DT,ChartSEZ_cap); + add(DT,testo3M); + add(DT,lot2); + add(DT,ChartSEG_cap); + add(DT,br); + + if activeEN == 1 + sezCIR_ENG = Heading3('Tunnel Link'); + sezCIR_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + CC_ENG = Section(); + CC_ENG.Title = sezCIR_ENG; + % Testi relativi all'ultimo mese + testo1M = Paragraph(['Following graphs display the magnitude and direction of local differential displacements in the section plane '... + 'measured by the 3D MEMS sensors, both during the reference and complete monitoring period. '... '... + 'The 2D vector is the resultant of displacement components in the X-Z plane, representing the section width and '... + 'height, respectively. In particular, negative values indicate that the node is converging towards the centre of '... + 'the section, while positive ones correspond to a divergent movement.']); + parte1 = ['The following figure summarizes the displacement direction of each single node, '... + 'which are represented on the section geometry. During the reference time period, the analysis evidenced '... + num2str(contaC_Mese-1) ]; + if contaC_Mese-1 == 1 + parte2 = ' convergent node'; + else + parte2 = ' convergent nodes'; + end + parte3 = [', ' num2str(contaD_Mese-1) ]; + if contaD_Mese-1 == 1 + parte4 = ' divergent sensor '; + else + parte4 = ' divergent sensors '; + end + parte5 = ['and ' num2str(conta0_Mese-1) ]; + if conta0_Mese-1 == 1 + parte6 = ' stable one. '; + else + parte6 = ' stable ones. '; + end + parte7 = ['The same analysis performed on the complete monitoring period '... + 'resulted in ' num2str(contaC-1) ]; + if conta0-1 == 0 + if contaC-1 == 1 + parte8 = [' convergent node and ' num2str(contaD-1)]; + else + parte8 = [' convergent nodes and ' num2str(contaD-1)]; + end + if contaD-1 == 1 + parte9 = ' divergent sensor. '; + else + parte9 = ' divergent sensors. '; + end + else + if contaC-1 == 1 + parte8 = [' convergent node, ' num2str(contaD-1)]; + else + parte8 = [' convergent nodes, ' num2str(contaD-1)]; + end + if contaD-1 == 1 + parte9 = ' divergent sensor '; + else + parte9 = ' divergent sensors '; + end + parte10 = ['and ' num2str(conta0-1)]; + if conta0-1 == 1 + parte11 = ' stable one. '; + else + parte11 = ' stable ones. '; + end + end + parte12 = ['In this specific representation, nodes featuring displacement values less than 0.5 mm '... + 'are assumed to be stable.']; + if conta0-1 == 0 + testo2M = Paragraph([parte1 parte2 parte3 parte4 parte5 parte6 parte7 parte8 ... + parte9 parte12]); + else + testo2M = Paragraph([parte1 parte2 parte3 parte4 parte5 parte6 parte7 parte8 ... + parte9 parte10 parte11 parte12]); + end + testo3M = Paragraph(['Moreover, the following graph reports the length variation of '... + 'each convergence segment referred to the monitored tunnel section, both during the reference '... + 'and complete monitoring periods. Segments definition is based on the topographic star displayed ' ... + 'in the corresponding figure. In this case, segment S' num2str(maxsegindex_Mese(1,1)) ' presented the '... + 'maximum length variation observed during the reference time period, ' ... + 'with a difference of ' num2str(round(maxseg_Mese(1,1),1)) ' mm. '... + 'Taking into account the complete monitoring period, the maximum variation is obsverved on segment S' num2str(maxsegindex(1,1)) ... + ', with a difference of '... + num2str(round(maxseg(1,1),1)) ' mm.']); + spazio = Paragraph(''); + testo1M.HAlign = 'justify'; + testo2M.HAlign = 'justify'; + testo3M.HAlign = 'justify'; + + add(DT_ENG,sezCIR_ENG); + add(DT_ENG,testo1M); + add(DT_ENG,ChartCIR_ENG); + add(DT_ENG,ChartCIR_ENG_cap); + add(DT_ENG,testo2M); + add(DT_ENG,spazio); + add(DT_ENG,lot); + add(DT_ENG,ChartSEZ_ENG_cap); + add(DT_ENG,testo3M); + add(DT_ENG,lot2); + add(DT_ENG,ChartSEG_ENG_cap); + add(DT_ENG,br); + end + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + check = 1; + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT,testo); + end + end + end + end +end + +text = 'report_TuL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_WEL.m b/Tilt/report_WEL.m new file mode 100755 index 0000000..1222c2a --- /dev/null +++ b/Tilt/report_WEL.m @@ -0,0 +1,411 @@ +function [FIG,FIG_ENG,battANALOG,ATTIVA] = report_WEL(rWEL,m,NodoWireExtensometerLink,toolrif,... + unitrif,contunit,datarif,Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,DT_ENG,... + FIG,FIG_ENG,br,activeEN,status,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_WEL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +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 + WE = Section(); + sezWEL = Heading3('Wire Extensometer Link'); + sezWEL.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + WE.Title = sezWEL; + 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')}; + sezBATT = Paragraph('GMUX - Batteria e Temperatura'); + sezBATT.Style = {FontSize(Font_tools),Bold(1),Italic(1)}; + 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 + WE_ENG = Section(); + sezWEL_ENG = Heading3('Wire Extensometer Link'); + sezWEL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + WE_ENG.Title = sezWEL_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,sezWEL); + if activeEN == 1 + add(DT_ENG,sezWEL_ENG); + end + + for w = 1:rWEL(m,1) + NodeNum = num2str(NodoWireExtensometerLink(w,m)); + comando = ['select EventDate, EventTime, XShift, T_node 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 + allungamento = cell2mat(Dati(:,3)); % allungamento filo + var_X = allungamento - allungamento(1,:); + TempWEL = cell2mat(Dati(:,4)); % temperatura + + % grafico allungamento NELL'ULTIMO MESE + figure(10); + if isnan(TempWEL(1)) == 0 + yyaxis left + end + wire = plot(Date,var_X); + control = max(abs(var_X)); + if control < 1 % mm + ylim([-1 1]); + end + hold on + xlabel('Data [gg/mm/aaaa]'); + ylabel('Allungamento (+) / Accorciamento (-) [mm]'); + set(gca,'YColor','k'); + if isnan(TempWEL(1)) == 0 + yyaxis right + plot(Date,TempWEL,':','LineWidth',1.1); + ylabel(['Temperatura [' char(176) 'C]']); + set(gca,'YColor','k'); + str(1,1) = cellstr('Variazione lunghezza filo'); + str(2,1) = cellstr('Temperatura'); + MX(1) = max(TempWEL(1:10)); + MX(2) = min(TempWEL(1:10)); + MAX = max(abs(MX)); + IN = find(abs(MX)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + end + title(['Allungamento/accorciamento del filo del nodo numero ' NodeNum]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-WireExt', NodeNum, '.png')); + saveas(wire,TempName); + ChartWEL = Image(TempName); + ChartWEL.Style = {Height('7.3cm'),HAlign('center')}; + ChartWEL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Variazione di lunghezza '... + 'registrata dall''estensimetro numero ' NodeNum ', '... + 'durante il periodo temporale di riferimento']); + FIG = FIG+1; + ChartWEL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['I grafici seguenti rappresentano i dati relativi '... + 'alla variazione di lunghezza registrata dagli estensimetri a filo '... + 'collegati all''Analog Array. In particolare, valori positivi indicano '... + 'un allungamento, mentre numeri negativi rilevano un accorciamento.']); + testo2 = Paragraph(['Durante il periodo temporale di riferimento, '... + 'il nodo numero ' NodeNum ' ha registrato valori massimi e minimi di lunghezza rispettivamente pari a '... + num2str(round(max(var_X),2), '%0.2f') ' mm e ' num2str(round(min(var_X),2), '%0.2f')... + ' mm, con una variazione di circa '... + num2str(round(max(var_X),2)-round(min(var_X),2),'%0.2f') ' mm.' ]); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if w == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,ChartWEL); + add(DT,ChartWEL_cap); + if w == rWEL(m,1) + add(DT,br); + end + close(figure(10)); + + %--ENG-- + + if activeEN == 1 + % grafico allungamento NELL'ULTIMO MESE + figure(20); + if isnan(TempWEL(1)) == 0 + yyaxis left + end + wire = plot(Date,var_X); + control = max(abs(var_X)); + if control < 1 % mm + ylim([-1 1]); + end + hold on + xlabel('Date [dd/mm/yyyy]'); + ylabel('Wire length increase (+) / decrease (-) [mm]'); + set(gca,'YColor','k'); + if isnan(TempWEL(1)) == 0 + yyaxis right + plot(Date,TempWEL,':','LineWidth',1.1); + ylabel(['Temperature [' char(176) 'C]']); + set(gca,'YColor','k'); + str(1,1) = cellstr('Wire length variation'); + str(2,1) = cellstr('Temperature'); + MX(1) = max(TempWEL(1:10)); + MX(2) = min(TempWEL(1:10)); + MAX = max(abs(MX)); + IN = find(abs(MX)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + end + title(['Wire length increase/decrease, node ' NodeNum]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-WireExt', NodeNum, '_ENG.png')); + saveas(wire,TempName); + ChartWEL_ENG = Image(TempName); + ChartWEL_ENG.Style = {Height('7.3cm'),HAlign('center')}; + ChartWEL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Wire length variation '... + 'recorded by extensometer ' NodeNum ' '... + 'during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartWEL_ENG_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graphs display the wire length variation '... + 'recorded by wire extensometer sensors integrated in the '... + 'Analog Array. In particular, positive values represent a incresase of the '... + 'wire length, while negative values indicate a shortening of the wire length.']); + testo2 = Paragraph(['During the reference time period, '... + 'node ' NodeNum ' recorded maximum and minimum values of wire length equal to '... + num2str(round(max(var_X),2), '%0.2f') ' mm and ' num2str(round(min(var_X),2), '%0.2f')... + ' mm respectively, corresponding to a length variation of '... + num2str(round(max(var_X),2)-round(min(var_X),2),'%0.2f') ' mm.' ]); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if w == 1 + add(DT_ENG,testo); + end + add(DT_ENG,testo2); + add(DT_ENG,ChartWEL_ENG); + add(DT_ENG,ChartWEL_ENG_cap); + if w == rWEL(m,1) + add(DT_ENG,br); + end + close(figure(20)); + end + % pulisco variabili da riutilizzare per catena successiva + clear allungamento; + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + end + end + end + end +end + +text = 'report_WEL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_WL.m b/Tilt/report_WL.m new file mode 100755 index 0000000..0490523 --- /dev/null +++ b/Tilt/report_WL.m @@ -0,0 +1,419 @@ +function [FIG,FIG_ENG,battANALOG,ATTIVA] = report_WL(rWL,m,NodoWeirLink,toolrif,... + unitrif,contunit,datarif,Font_caption,Font_tools,battANALOG,ATTIVA,siteID,DT,... + DT_ENG,FIG,FIG_ENG,activeEN,br,status,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_WL function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() +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 + WE = Section(); + sezWeir = Heading3('Weir Link'); + sezWeir.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + WE.Title = sezWeir; + 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 + WE_ENG = Section(); + sezWeir_ENG = Heading3('Weir Link'); + sezWeir_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + WE_ENG.Title = sezWeir_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,sezWeir); + if activeEN == 1 + add(DT_ENG,sezWeir_ENG); + end + + for ww = 1:rWL(m,1) + NodeNum = num2str(NodoWeirLink(ww,m)); + comando = ['select EventDate, EventTime, XShift, T_node 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 + LevelWL = cell2mat(Dati(:,3)); % livello + TempWL = cell2mat(Dati(:,4)); % temperatura + + % grafico livello NELL'ULTIMO MESE + figure(5); + if isnan(TempWL(1)) == 0 + yyaxis left + end + weir = plot(Date,LevelWL); +% Min = min(dW); +% Max = max(dW); +% if Min > -50 && Max < 50 +% ylim([-50 50]) +% end + hold on + ylabel('Livello [mm]'); + xlabel('Data [gg/mm/aaaa]'); + set(gca,'YColor','k'); + if isnan(TempWL(1)) == 0 + yyaxis right + plot(Date,TempWL,':','LineWidth',1.1); + ylabel(['Temperatura [' char(176) 'C]']); + set(gca,'YColor','k'); + str(1,1) = cellstr('Livello'); + str(2,1) = cellstr('Temperatura'); + MX(1) = max(TempWL(1:10)); + MX(2) = min(TempWL(1:10)); + MAX = max(abs(MX)); + IN = find(abs(MX)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + end + title(['Livello idrometrico rilevato dal nodo numero ' NodeNum]); + xlim([Date(1)-1 Date(end)+1]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + hold off + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-WL', NodeNum, '.png')); + saveas(weir,TempName); + ChartWL = Image(TempName); + ChartWL.Style = {Height('7.3cm'),HAlign('center')}; + % ChartEL.Style = {ScaleToFit}; + ChartWL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Livello d''acqua '... + 'misurato dal sensore idrometrico, nodo numero ' NodeNum... + ', nel periodo temporale di riferimento']); + FIG = FIG+1; + ChartWL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['Nei grafici seguenti sono rappresentati i dati relativi '... + 'al livello d''acqua registrati dai sensori idrometrici appartenenti all''Analog Array.']); + testo2 = Paragraph(['Durante il periodo temporale di riferimento, il nodo numero ' NodeNum ... + ' ha registrato valori massimi e minimi pari a '... + num2str(round(max(LevelWL),2),'%0.2f') ' mm e ' num2str(round(min(LevelWL),2),'%0.2f')... + ' mm, con una variazione massima di '... + num2str(round(max(LevelWL),2)-round(min(LevelWL),2),'%0.2f') ' mm.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if ww == 1 + add(DT,testo); + end + add(DT,testo2); + add(DT,ChartWL); + add(DT,ChartWL_cap); + if ww == rWL(m,1) + add(DT,br); + end + close(figure(5)); + + %--ENG-- + + if activeEN == 1 + % grafico deformazioni NELL'ULTIMO MESE + figure(15); + if isnan(TempWL(1)) == 0 + yyaxis left + end + weirEN = plot(Date,LevelWL); +% Min = min(LevelWL); +% Max = max(LevelWL); +% if Min > -50 && Max < 50 +% ylim([-50 50]) +% end + hold on + ylabel('Water level [mm]'); + xlabel('Date [dd/mm/yyyy]'); + set(gca,'YColor','k'); + if isnan(TempWL(1)) == 0 + yyaxis right + plot(Date,TempWL,':','LineWidth',1.1); + ylabel(['Temperature [' char(176) 'C]']); + set(gca,'YColor','k'); + str(1,1) = cellstr('Water level'); + str(2,1) = cellstr('Temperature'); + MX(1) = max(TempWL(1:10)); + MX(2) = min(TempWL(1:10)); + MAX = max(abs(MX)); + IN = find(abs(MX)==MAX); + if IN == 1 % Legenda sotto + legend(str,'Location','southwest'); + else + legend(str,'Location','northwest'); + end + end + title(['Water level - Node ' NodeNum]); + xlim([Date(1)-1 Date(end)+1]); + h = gca; + h.XAxis.MinorTick = 'on'; + datetick('x','dd/mm/yyyy','keepticks','keeplimits'); + xtickangle(20); + grid on + grid minor + hold off + + TempName = char(strcat('Report',siteID,'-', char(toolrif),'-WL', NodeNum, '_ENG.png')); + saveas(weirEN,TempName); + ChartWL_ENG = Image(TempName); + ChartWL_ENG.Style = {Height('7.3cm'),HAlign('center')}; + % ChartEL.Style = {ScaleToFit}; + ChartWL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Water level '... + ' measured by weir monitor sensor ' NodeNum... + ' during the reference time period']); + FIG_ENG = FIG_ENG+1; + ChartWL_ENG_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + + testo = Paragraph(['The following graphs display water level data '... + 'recorded by weir monitor sensors integrated in the Analog Array.']); + testo2 = Paragraph(['During the reference time period, node ' NodeNum ... + ' measured maximum and minimum deformatio values of respectively '... + num2str(round(max(LevelWL),2),'%0.2f') ' mm and ' num2str(round(min(LevelWL),2),'%0.2f')... + ' mm, with a maximum variation of '... + num2str(round(max(LevelWL),2)-round(min(LevelWL),2),'%0.2f') ' mm.']); + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if ww == 1 + add(DT_ENG,testo); + end + add(DT_ENG,testo2); + add(DT_ENG,ChartWL_ENG); + add(DT_ENG,ChartWL_ENG_cap); + if ww == rWL(m,1) + add(DT_ENG,br); + end + close(figure(15)) + end + + %pulisco variabili da riutilizzare per catena successiva + clear LevelWL; + clear TempWL + else + if ATTIVA == 1 + testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.'); + ATTIVA = 0; + add(DT,testo); + if activeEN == 1 + testo = Paragraph('No data available for the reference time period.'); + add(DT_ENG,testo); + end + end + end + end +end + +text = 'report_WL function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_appendix.m b/Tilt/report_appendix.m new file mode 100755 index 0000000..ef04a97 --- /dev/null +++ b/Tilt/report_appendix.m @@ -0,0 +1,4205 @@ +function report_appendix(appTS,appNW,yesTL,yesIPL,yesIPLHR,yesTLH,yesPCL,yesTLHR,yesTLHRH,yesPCLHR,... + yesPL,yesBL,yesTuL,yesRaL,yesThL,yesKL,yesKLHR,yesRL,yesLL,yesPrL,yesPT100,... + yesCrL,yes3DCrL,yesEL,yes3DEL,yesWEL,yesMPBEL,yesTrL,nCAM,yesWL,yesPE,PL_A,PL_D,Font_section,... + Font_caption,Font_tools,FIG,FIG_ENG,dim,appendice,appendice_ENG,colonna4,colonna6,... + rpt,rpt_ENG,activeEN,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_appendix function started'; +fprintf(fileID,fmt,text); + +import mlreportgen.dom.* +import mlreportgen.report.* + +% Make sure DOM is compilable +makeDOMCompilable() + +%% Appendice - Elaborazione dati +partecomune = 0; +partecomune_ENG = 1; +ElabTitle = 0; +Titolo = Section(); + +testoTilt = Paragraph(['I dati immagazzinati dalla centralina (punti ADC) vengono '... + 'definiti ''grezzi'' e devono essere opportunamente elaborati per tradurre '... + 'i valori di accelerazione in spostamenti. In questa fase, ' char(232) ' inoltre possibile '... + 'identificare e ridurre eventuali derive strumentali, spike '... + 'e rumore del segnale. A questo scopo ' char(232) ' stato sviluppato (in ambiente Matlab) '... + 'un opportuno software, definito ''Tilt'', che fornisce il risultato cercato. '... + 'Occorre sottolineare come gli strumenti tradizionali siano caratterizzati da '... + 'un numero esiguo di letture, per le quali non ' char(232) ' possibile affrontare una trattazione '... + 'statistica dell''errore strumentale. Al contrario, la costituzione di un database popolato da '... + 'numerose misure permette di valutare l''evoluzione temporale dei fenomeni e di '... + 'validare l''attendibilit' char(224) ' dei dati elaborati.']); + +testoATD = Paragraph(['I dati immagazzinati dalla centralina (punti ADC) vengono '... + 'definiti ''grezzi'' e devono essere opportunamente elaborati per tradurre '... + 'i valori di accelerazione in spostamenti. In questa fase, ' char(232) ' inoltre '... + 'possibile identificare e ridurre eventuali derive strumentali, spike '... + 'e rumore del segnale. A questo scopo ' char(232) ' stato sviluppato (in '... + 'ambiente Matlab) un opportuno software, definito ''ATD'', che fornisce il '... + 'risultato cercato. Occorre sottolineare come gli strumenti tradizionali '... + 'siano caratterizzati da un numero esiguo di letture, per le quali non ' char(232)... + ' possibile affrontare una trattazione statistica dell''errore strumentale. '... + 'Al contrario, la costituzione di un database popolato da '... + 'numerose misure permette di valutare l''evoluzione temporale dei fenomeni e di '... + 'validare l''attendibilit' char(224) ' dei dati elaborati.']); + +testoRIS = Paragraph(['I dati raccolti in sito dalla centralina vengono trasmessi '... + 'al database di ASE, dal quale il software importa i dati grezzi e i parametri '... + 'di calibrazione. La procedura descritta ' char(232) ' completamente automatizzata: '... + 'nel momento in cui il dato viene ricevuto, ' char(232) ' trasformato in '... + 'unit' char(224) ' fisiche con conseguente calcolo degli spostamenti finali. '... + 'I risultati sono caricati in un tempo brevissimo su piattaforma dinamica web '... + 'ad accesso controllato, dove l''utente pu' char(242) ' visionarli e scaricarli.']); + +testoTilt.HAlign = 'justify'; +testoATD.HAlign = 'justify'; +testoRSN.HAlign = 'justify'; +testoMUSA.HAlign = 'justify'; +testoRIS.HAlign = 'justify'; + +% --- ENG --- + +if activeEN == 1 + + Titolo_ENG = Section(); + testoTilt_ENG = Paragraph(['ADC points stored in the SD card are defined ''raw data'' and they need '... + 'to be properly elaborated in order to convert acceleration data into displacement values. '... + 'Moreover, in this stage it is also possible to identify and correct any issue related to '... + 'data drifting, spike and/or instrumental noises. These results are achieved thanks to a '... + 'dedicated MATLAB-based software, named ''Tilt''. It should be taken into account that traditional '... + 'monitoring devices usually feature a sampling frequency that is too low to allow the '... + 'application of statistical analyses aimed to reduce any tool-related data noise. On the '... + 'other hand, the definition of a database including a great number of monitoring data permits '... + 'to evaluate the phenomena evolution over time and to assess the results reliability.']); + + testoATD_ENG = Paragraph(['ADC points stored in the SD card are defined ''raw data'' and they need '... + 'to be properly elaborated in order to convert acceleration data into displacement values. '... + 'Moreover, in this stage it is also possible to identify and correct any issue related to '... + 'data drifting, spike and/or instrumental noises. These results are achieved thanks to a '... + 'dedicated MATLAB-based software, named ''ATD''. It should be taken into account that traditional '... + 'monitoring devices usually feature a sampling frequency that is too low to allow the '... + 'application of statistical analyses aimed to reduce any tool-related data noise. On the '... + 'other hand, the definition of a database including a great number of monitoring data permits '... + 'to evaluate the phenomenon evolution over time and to assess the results reliability.']); + + testoRIS_ENG = Paragraph(['After collecting the monitoring data on-site, the datalogger sends them '... + 'to the ASE database, from where the software imports raw data and calibration parameters. '... + 'This is a completely automatic procedure: after receiveng new data, the elaboration centre '... + 'converts them into physical units, thus obtaining the actual displacement measured on-site. '... + 'After the results uploading phase, which takes a very short amount of time, the user can access '... + 'and download all monitoring data through the web-based platform.']); + + testoTilt_ENG.HAlign = 'justify'; + testoATD_ENG.HAlign = 'justify'; + testoRSN_ENG.HAlign = 'justify'; + testoMUSA_ENG.HAlign = 'justify'; + testoRIS_ENG.HAlign = 'justify'; +end + +% --- Vertical Array --- +if sum(yesTL) >= 1 || sum(yesTLHR) >= 1 + elabTL = Section(); + if ElabTitle == 0 + app = Heading2('Elaborazione dati'); + app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo.Title = app; + if activeEN == 1 + app_ENG = Heading2('Data elaboration'); + app_ENG.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo_ENG.Title = app_ENG; + end + ElabTitle = 1; + end + sezVA = Heading3('Vertical Array'); + sezVA.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabTL.Title = sezVA; + testo = Paragraph(['Ciascun nodo ' char(232) ' caratterizzato da una particolare giacitura'... + ' nello spazio, ricostruibile sulla base delle grandezze fisiche acquisite'... + ' dal sensore MEMS 3D (accelerometro, magnetometro e sensore di temperatura).'... + ' In particolare, mediante l''accelerometro si ' char(232) ' in grado di conoscere l''inclinazione'... + ' del sensore: a titolo di esempio, se un nodo fosse perfettamente verticale, asse'... + ' X e asse Y dell''accelerometro restituirebbero 0 g, mentre l''asse Z fornirebbe un'... + ' valore pari a 1 g. Mediante l''utilizzo del magnetometro ' char(232) ' possibile ricostruire'... + ' la direzione dello spostamento occorso. Confrontando le nuove posizioni con quelle'... + ' iniziali, si ' char(232) ' in grado di ricavare l''angolo di rotazione di ciascun nodo nello spazio:'... + ' essendo nota la distanza tra i nodi, ' char(232) ' immediato calcolare le componenti di' ... + ' spostamento in corrispondenza di ciascun sensore della catena.']); + img = Image(('vert.jpg')); + img.Style = {Height('7cm'),HAlign('center')}; + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Esempio di spostamento e nuova configurazione del sensore']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + add(elabTL,testo); + add(elabTL,testoTilt); + add(elabTL,img); + add(elabTL,ionhcaption); + add(elabTL,testoRIS); + add(appendice,elabTL); + br = PageBreak(); + add(appendice,br); + + %---ENG--- + if activeEN == 1 + elabTL_ENG = Section(); + sezVA_ENG = Heading3('Vertical Array'); + sezVA_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabTL_ENG.Title = sezVA_ENG; + testo = Paragraph(['When a displacement occurs, the node changes its position in order to '... + 'follow the slope movement. After been read, every tilt sensor records the new position '... + 'as an electrical signal (raw data) and sends the information to the control unit. '... + 'The datalogger saves the information on a volatile memory (SD card) and then transmits '... + 'them to the elaboration centre, where a software processes the electrical signals (ADC points) '... + 'to return information about the real displacement of the node (physical units). The accelerometer '... + 'gives information about the rotation of the node, referring to the constant gravity acceleration g. '... + 'The magnetometer allows to obtain the displacement direction of each node, referring to NED '... + 'reference system (North-East-Down). Finally, the on-board thermometer is necessary to correct the '... + 'thermal effects on the accelerometer, using the calibration values. This sensor also provides '... + 'the temperature along the vertical.']); + img = Image(('vert.jpg')); + img.Style = {Height('7cm'),HAlign('center')}; + ionhcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Effect of displacement on the tool and new configuration of the Array']); + FIG_ENG = FIG_ENG+1; + ionhcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + add(elabTL_ENG,testo); + add(elabTL_ENG,testoTilt_ENG); + add(elabTL_ENG,img); + add(elabTL_ENG,ionhcaption_ENG); + add(elabTL_ENG,testoRIS_ENG); + add(appendice_ENG,elabTL_ENG); + br = PageBreak(); + add(appendice_ENG,br); + end + partecomune = 1; + partecomune_ENG = 1; +end + +% --- In Place Array --- +if sum(yesIPL) >= 1 + elabIPL = Section(); + if ElabTitle == 0 + app = Heading2('Elaborazione dati'); + app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo.Title = app; + if activeEN == 1 + app_ENG = Heading2('Data elaboration'); + app_ENG.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo_ENG.Title = app_ENG; + end + ElabTitle = 1; + end + sezIPA = Heading3('In Place Array'); + sezIPA.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabIPL.Title = sezIPA; + testo = Paragraph(['Ciascun nodo ' char(232) ' caratterizzato da una particolare giacitura'... + ' nello spazio, ricostruibile sulla base delle grandezze fisiche acquisite'... + ' dal sensore MEMS 3D (accelerometro, magnetometro e sensore di temperatura).'... + ' In particolare, mediante l''accelerometro si ' char(232) ' in grado di conoscere l''inclinazione'... + ' del sensore: a titolo di esempio, se un nodo fosse perfettamente verticale, asse'... + ' X e asse Y dell''accelerometro restituirebbero 0 g, mentre l''asse Z fornirebbe un'... + ' valore pari a 1 g. Mediante l''utilizzo del magnetometro ' char(232) ' possibile ricostruire'... + ' la direzione dello spostamento occorso. Confrontando le nuove posizioni con quelle'... + ' iniziali, si ' char(232) ' in grado di ricavare l''angolo di rotazione di ciascun nodo nello spazio:'... + ' essendo nota la distanza tra i nodi, ' char(232) ' immediato calcolare le componenti di' ... + ' spostamento in corrispondenza di ciascun sensore della catena.']); + img = Image(('vert.jpg')); + img.Style = {Height('7cm'),HAlign('center')}; + imgcaption = Paragraph(['Fig. ' num2str(FIG) ' - Esempio di spostamento e nuova configurazione del sensore']); + FIG = FIG+1; + imgcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + add(elabIPL,testo); + add(elabIPL,img); + add(elabIPL,imgcaption); + if partecomune == 0 + add(elabIPL,testoTilt); + add(elabIPL,testoRIS); + partecomune = 1; + end + add(appendice,elabIPL); + br = PageBreak(); + add(appendice,br); + + %---ENG--- + if activeEN == 1 + elabIPL_ENG = Section(); + sezIPA_ENG = Heading3('In Place Array'); + sezIPA_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabIPL_ENG.Title = sezIPA_ENG; + testo = Paragraph(['When a displacement occurs, the node changes its position in order to '... + 'follow the slope movement. After been read, every tilt sensor records the new position '... + 'as an electrical signal (raw data) and sends the information to the control unit. '... + 'The datalogger saves the information on a volatile memory (SD card) and then transmits '... + 'them to the elaboration centre, where a software processes the electrical signals (ADC points) '... + 'to return information about the real displacement of the node (physical units). The accelerometer '... + 'gives information about the rotation of the node, referring to the constant gravity acceleration g. '... + 'The magnetometer allows to obtain the displacement direction of each node, referring to NED '... + 'reference system (North-East-Down). Finally, the on-board thermometer is necessary to correct the '... + 'thermal effects on the accelerometer, using the calibration values. This sensor also provides '... + 'the temperature along the vertical.']); + img = Image(('vert.jpg')); + img.Style = {Height('7cm'),HAlign('center')}; + imgcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - - Effect of displacement on the tool and new configuration of the Array']); + FIG_ENG = FIG_ENG+1; + ionhcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + add(elabIPL_ENG,testo); + add(elabIPL_ENG,img); + add(elabIPL_ENG,imgcaption_ENG); + if partecomune_ENG == 0 + add(elabIPL_ENG,testoTilt_ENG); + add(elabIPL_ENG,testoRIS_ENG); + partecomune_ENG = 1; + end + add(appendice_ENG,elabIPL_ENG); + br = PageBreak(); + add(appendice_ENG,br); + end +end + +nodoTunnel = 0; +nodoTunnel_ENG = 0; +% --- Cir Array --- +if sum(yesTuL) >= 1 + elabCIR = Section(); + if ElabTitle == 0 + app = Heading2('Elaborazione dati'); + app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo.Title = app; + if activeEN == 1 + app_ENG = Heading2('Data elaboration'); + app_ENG.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo_ENG.Title = app_ENG; + end + ElabTitle = 1; + end + sezCA = Heading3('Cir Array'); + sezCA.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabCIR.Title = sezCA; + testo = Paragraph(['Ciascun nodo ' char(232) ' caratterizzato da una '... + 'particolare giacitura nello spazio, ricostruibile sulla base delle '... + 'grandezze fisiche acquisite dal sensore MEMS 3D, equipaggiato con '... + 'accelerometro e sensore di temperatura. In particolare, mediante '... + 'l''accelerometro si ' char(232) ' in grado di conoscere l''inclinazione '... + 'del sensore: a titolo di esempio, se un nodo fosse perfettamente verticale, '... + 'asse X e asse Y dell''accelerometro restituirebbero 0 g, mentre l''asse Z '... + 'fornirebbe un valore pari a 1 g. Confrontando le nuove posizioni con quelle '... + 'iniziali, si ' char(232) ' in grado di ricavare l''angolo di rotazione di '... + 'ciascun nodo nello spazio: essendo note le distanze tra i nodi e le loro '... + 'posizioni di installazione all''interno della sezione, ' char(232) ' immediato '... + 'calcolare le componenti di spostamento in corrispondenza di ciascun sensore '... + 'della catena. Il termometro presente ' char(232) ' utilizzato per la correzione '... + 'degli effetti termici che incidono sul sensore accelerometrico, '... + 'previa calibrazione in camera climatica, fornendo inoltre la temperatura '... + 'lungo la catena.']); + testo2 = Paragraph(['Il sensore MEMS ' char(232) ' posizionato al centro di ogni nodo '... + 'e misura le tre componenti del campo gravitazionale terrestre nel proprio sistema '... + 'di riferimento, riferendosi ad una configurazione iniziale, o lettura di zero. '... + 'Nel momento in cui avviene uno spostamento, la variazione delle tre componenti '... + 'di gravit' char(224) ' permette di determinarne l''entit' char(224) ' '... + 'e la direzione: in questo modo ' char(232) ' possibile valutare la rotazione '... + 'del tunnel e gli spostamenti locali di ogni nodo rispetto al precedente, '... + 'dai quali pu' char(242) ' essere infine costruita la curva cumulata e la '... + 'conseguente deformata 3D della sezione monitorata. In aggiunta, il software '... + 'determina la variazione di lunghezza di segmenti di convergenza predefiniti, '... + 'unendo determinati punti di calcolo, come avviene usualmente nel caso della '... + 'topografia. Ogni Tunnel Link ha il proprio segmento di pertinenza che viene '... + 'assunto infinitamente rigido e si estende dal punto medio tra il nodo '... + 'considerato ed il precedente fino al punto medio con il suo successivo. '... + 'La distanza tra i vari Tunnel Link pu' char(242) ' essere personalizzata '... + 'in base alle esigenze sito specifiche. Distanze minori comportano risultati '... + 'maggiormente attendibili e precisi.']); + img = Image(('cir.png')); + img.Style = {Height('7cm'),HAlign('center')}; + imgcaption = Paragraph(['Fig. ' num2str(FIG) ' - Rappresentazione grafica del segmento di pertinenza '... + 'del sensore Tunnel Link e sistema di installazione in calotta']); + FIG = FIG+1; + imgcaption.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if nodoTunnel==0 + add(elabCIR,testo); + nodoTunnel = 1; + end + add(elabCIR,testo); + add(elabCIR,testo2); + add(elabCIR,img); + add(elabCIR,imgcaption); + if partecomune == 0 + add(elabCIR,testoATD); + add(elabCIR,testoRIS); + partecomune = 1; + end + add(appendice,elabCIR); + + % --- ENG --- + if activeEN == 1 + elabCIR_ENG = Section(); + sezCA_ENG = Heading3('Cir Array'); + sezCA_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabCIR_ENG.Title = sezCA_ENG; + testo = Paragraph(['When a displacement occurs, the node changes its position in order to '... + 'follow the section movement. After been read, every tilt sensor records the new position '... + 'as an electrical signal (raw data) and sends the information to the control unit. '... + 'The datalogger saves the information on a volatile memory (SD card) and then transmits '... + 'them to the elaboration centre, where a software processes the electrical signals (ADC points) '... + 'to return information about the real displacement of the node (physical units). The accelerometer '... + 'gives information about the rotation of the node, referring to the constant gravity acceleration g. '... + 'The on-board thermometer is necessary to correct the '... + 'thermal effects on the accelerometer, using the calibration values. This sensor also provides '... + 'the temperature along the array.']); + testo2 = Paragraph(['MEMS sensor is located at the centre of each Link and measures the three '... + 'components of the gravitational field in its own reference system, starting from an initial '... + 'configuration (zero reading). When a movement arises, the variation of the different gravity '... + 'components gives back the information of the displacement. In this way, it is possible to '... + 'calculate the tunnel rotation and the local displacement of each Link, and finally compute '... + 'a curve of cumulated displacements and the three-dimensional variation of the monitored section. '... + 'Moreover, the software determines the length variation of predefined convergence segments, created '... + 'by connecting specific calculation points with an approach similar to topography applications. '... + 'Each Tunnel Link has a Segment of Relevance, which is assumed as infinitely rigid, that starts from the middle '... + 'point between the considered and the previous Link and ends at the medium distance between the '... + 'considered and the following Link. It is possible to customize the distance between Links according to '... + 'specific monitoring necessities (smaller distances lead to more reliable and accurate results).']); + img = Image(('cir.png')); + img.Style = {Height('7cm'),HAlign('center')}; + imgcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Tunnel Link Segment of Relevance and '... + 'installation system']); + FIG_ENG = FIG_ENG+1; + imgcaption_ENG.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if nodoTunnel_ENG==0 + add(elabCIR_ENG,testo); + nodoTunnel_ENG = 1; + end + add(elabCIR_ENG,testo); + add(elabCIR_ENG,testo2); + add(elabCIR_ENG,img); + add(elabCIR_ENG,imgcaption_ENG); + if partecomune_ENG == 0 + add(elabCIR_ENG,testoATD_ENG); + add(elabCIR_ENG,testoRIS_ENG); + partecomune_ENG = 1; + end + add(appendice_ENG,elabCIR_ENG); + end +end + +% --- Rad Array --- +if sum(yesRaL) >= 1 + elabRAD = Section(); + if ElabTitle == 0 + app = Heading2('Elaborazione dati'); + app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo.Title = app; + if activeEN == 1 + app_ENG = Heading2('Data elaboration'); + app_ENG.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo_ENG.Title = app_ENG; + end + ElabTitle = 1; + end + sezRA = Heading3('Rad Array'); + sezRA.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabRAD.Title = sezRA; + testo = Paragraph(['Ciascun nodo ' char(232) ' caratterizzato da una '... + 'particolare giacitura nello spazio, ricostruibile sulla base delle '... + 'grandezze fisiche acquisite dal sensore MEMS 3D, equipaggiato con '... + 'accelerometro e sensore di temperatura. In particolare, mediante '... + 'l''accelerometro si ' char(232) ' in grado di conoscere l''inclinazione '... + 'del sensore: a titolo di esempio, se un nodo fosse perfettamente verticale, '... + 'asse X e asse Y dell''accelerometro restituirebbero 0 g, mentre l''asse Z '... + 'fornirebbe un valore pari a 1 g. Confrontando le nuove posizioni con quelle '... + 'iniziali, si ' char(232) ' in grado di ricavare l''angolo di rotazione di '... + 'ciascun nodo nello spazio: essendo note le distanze tra i nodi e le loro '... + 'posizioni di installazione all''interno della sezione, ' char(232) ' immediato '... + 'calcolare le componenti di spostamento in corrispondenza di ciascun sensore '... + 'della catena. Il termometro presente ' char(232) ' utilizzato per la correzione '... + 'degli effetti termici che incidono sul sensore accelerometrico, '... + 'previa calibrazione in camera climatica, fornendo inoltre la temperatura '... + 'lungo la catena.']); + testo2 = Paragraph(['Il sensore MEMS ' char(232) ' posizionato al centro di ogni nodo '... + 'e misura le tre componenti del campo gravitazionale terrestre nel proprio sistema '... + 'di riferimento, riferendosi ad una configurazione iniziale, o lettura di zero. '... + 'Nel momento in cui avviene uno spostamento, la variazione delle tre componenti '... + 'di gravit' char(224) ' ne permette di determinarne l''entit' char(224) ... + ' e la direzione: in questo modo ' char(232) ' possibile valutare le deformazioni '... + 'tridimensionali dell''ammasso roccioso al di fuori della sezione scavata. '... + 'Ogni nodo fornisce un''informazione locale secondo il sistema di riferimento X (larghezza), '... + 'Y (profondit' char(224) ') e Z (altezza). Sommando i singoli contributi si ' char(232) ... + ' in grado di risalire agli spostamenti cumulati e alla deformata 3D nello spazio. '... + 'Mettendo insieme le informazioni fornite dal Rad Array con quelle di un estensimetro '... + 'multibase, si ' char(232) ' in grado di determinare e distinguere le componenti di '... + 'deformazione radiale da quelle operanti nelle restanti direzioni. '... + 'Ogni sensore Radial Link ha il proprio segmento di pertinenza che viene '... + 'assunto infinitamente rigido e si estende dal punto medio tra il nodo '... + 'considerato ed il precedente fino al punto medio con il suo successivo. '... + 'La distanza tra i vari Radial Link pu' char(242) ' essere personalizzata '... + 'in base alle esigenze sito specifiche. Distanze minori comportano risultati '... + 'maggiormente attendibili e precisi.']); + img = Image(('rad.png')); + img.Style = {Height('7.5cm'),HAlign('center')}; + imgcaption = Paragraph(['Fig. ' num2str(FIG) ' - Rappresentazione grafica di due Rad Array '... + 'installati nella parte sommitale della sezione monitorata, con un''inclinazione di 45 '... + 'gradi rispetto all''orizzontale.']); + FIG = FIG+1; + imgcaption.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if nodoTunnel==0 + add(elabRAD,testo); + nodoTunnel = 1; + end + add(elabRAD,testo2); + add(elabRAD,img); + add(elabRAD,imgcaption); + if partecomune == 0 + add(elabRAD,testoATD); + add(elabRAD,testoRIS); + partecomune = 1; + end + add(appendice,elabRAD); + + % --- ENG --- + if activeEN == 1 + elabRAD_ENG = Section(); + sezRA_ENG = Heading3('Rad Array'); + sezRA_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabRAD_ENG.Title = sezRA_ENG; + testo = Paragraph(['When a displacement occurs, the node changes its position in order to '... + 'follow the rock mass movement. After been read, every tilt sensor records the new position '... + 'as an electrical signal (raw data) and sends the information to the control unit. '... + 'The datalogger saves the information on a volatile memory (SD card) and then transmits '... + 'them to the elaboration centre, where a software processes the electrical signals (ADC points) '... + 'to return information about the real displacement of the node (physical units). The accelerometer '... + 'gives information about the rotation of the node, referring to the constant gravity acceleration g. '... + 'The on-board thermometer is necessary to correct the '... + 'thermal effects on the accelerometer, using the calibration values. This sensor also provides '... + 'the temperature along the array.']); + testo2 = Paragraph(['MEMS sensor is located at the centre of each Link and measures the three '... + 'components of the gravitational field in its own reference system, starting from an initial '... + 'configuration (zero reading). When a movement arises, the variation of the different gravity '... + 'components gives back the information of the displacement. In this way, it is possible to '... + 'calculate the 3D displacement surrounding the monitored section. '... + 'Each single node provides a local information according to the 3D reference system X-Y-Z (respectively '... + 'width, depth and height). The resultant of these components allows to determine the cumulative displacement '... + 'and the three-dimensional position variation of the monitored element. Moreover, it is possible to couple a Rad '... + 'Array with a multi-point borehole extensometer in order to separate radial deformations from components acting '... + 'along other directions. '... + 'Each Radial Link has a Segment of Relevance, which is assumed as infinitely rigid, that starts from the middle '... + 'point between the considered and the previous Link and ends at the medium distance between the '... + 'considered and the following Link. It is possible to customize the distance between Links according to '... + 'specific monitoring necessities (smaller distances lead to more reliable and accurate results).']); + img = Image(('rad.png')); + img.Style = {Height('7.5cm'),HAlign('center')}; + imgcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Graphical illustration of two Rad Arrays located '... + 'on the upper part of the monitorign section and installed with a 45-degree tilt.']); + FIG_ENG = FIG_ENG+1; + imgcaption_ENG.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if nodoTunnel_ENG==0 + add(elabRAD_ENG,testo); + nodoTunnel_ENG = 1; + end + add(elabRAD_ENG,testo2); + add(elabRAD_ENG,img); + add(elabRAD_ENG,imgcaption_ENG); + if partecomune_ENG == 0 + add(elabRAD_ENG,testoATD_ENG); + add(elabRAD_ENG,testoRIS_ENG); + partecomune_ENG = 1; + end + add(appendice_ENG,elabRAD_ENG); + end +end + +% --- PreConv Array --- +if sum(yesPCL) >= 1 + elabPCL = Section(); + if ElabTitle == 0 + app = Heading2('Elaborazione dati'); + app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo.Title = app; + if activeEN == 1 + app_ENG = Heading2('Data elaboration'); + app_ENG.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo_ENG.Title = app_ENG; + end + ElabTitle = 1; + end + sezPCA = Heading3('PreConv Array'); + sezPCA.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabPCL.Title = sezPCA; + testo = Paragraph(['Ciascun nodo ' char(232) ' caratterizzato da una '... + 'particolare giacitura nello spazio, ricostruibile sulla base delle '... + 'grandezze fisiche acquisite dal sensore MEMS 3D, equipaggiato con '... + 'accelerometro e sensore di temperatura. In particolare, mediante '... + 'l''accelerometro si ' char(232) ' in grado di conoscere l''inclinazione '... + 'del sensore rispetto all''orizzontale: a titolo di esempio, se un nodo '... + 'di questa tipologia fosse perfettamente orizzontale, asse X e asse Y '... + 'dell''accelerometro restituirebbero 0 g, mentre l''asse Z '... + 'fornirebbe un valore pari a 1 g. Confrontando le nuove posizioni con quelle '... + 'iniziali, si ' char(232) ' in grado di ricavare l''angolo di rotazione di '... + 'ciascun nodo nello spazio: essendo note le distanze tra i nodi, ' char(232) ' immediato '... + 'calcolare le componenti di spostamento verticale in corrispondenza di ciascun sensore '... + 'della catena. Il termometro presente ' char(232) ' utilizzato per la correzione '... + 'degli effetti termici che incidono sul sensore accelerometrico, '... + 'previa calibrazione in camera climatica, fornendo inoltre la temperatura '... + 'dei singoli nodi.']); + testo2 = Paragraph(['Il sensore MEMS ' char(232) ' posizionato al centro di ogni nodo '... + 'e misura le tre componenti del campo gravitazionale terrestre nel proprio sistema '... + 'di riferimento, riferendosi ad una configurazione iniziale, o lettura di zero. '... + 'Nel momento in cui avviene uno spostamento, la variazione delle tre componenti '... + 'di gravit' char(224) ' permette di determinarne l''entit' char(224) ' '... + 'e la direzione: in questo modo ' char(232) ' possibile valutare l''eventuale movimento '... + 'di pre-convergenza della sezione ancora da scavare, la rotazione dei sensori su s' char(232) ' stessi '... + 'e gli spostamenti locali di ogni nodo rispetto al precedente, dai quali pu' char(242) ' '... + 'essere costruita la curva cumulata dei movimenti. Ogni PreConv Link ha il proprio '... + 'segmento di pertinenza che viene assunto infinitamente rigido e si estende dal punto medio tra il nodo '... + 'considerato ed il precedente fino al punto medio con il suo successivo. '... + 'La distanza tra i vari sensori pu' char(242) ' essere personalizzata '... + 'in base alle esigenze sito specifiche. Distanze minori comportano risultati '... + 'maggiormente attendibili e precisi.']); + img1 = Image(('PCA.png')); + img2 = Image(('PCA2.jpg')); + img1.Style = {Height('6cm'),HAlign('center')}; + imgcaption = Paragraph(['Fig. ' num2str(FIG) ' - Rappresentazione grafica '... + 'del comportamento deformativo atteso in seguito ad uno scavo in sotterraneo']); + FIG = FIG+1; + imgcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + img2.Style = {Height('14cm'),HAlign('center')}; + img2caption = Paragraph(['Fig. ' num2str(FIG) ' - Esempio di fasi di scavo successive '... + 'con installazione del sistema MUMS PreConv Array']); + FIG = FIG+1; + img2caption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if nodoTunnel == 0 + add(elabPCL,testo); + nodoTunnel = 1; + end + add(elabPCL,img1); + add(elabPCL,imgcaption); + add(elabPCL,testo2); + add(elabPCL,img2); + add(elabPCL,img2caption); + if partecomune == 0 + add(elabPCL,testoATD); + add(elabPCL,testoRIS); + partecomune = 1; + end + add(appendice,elabPCL); + + % --- ENG --- + if activeEN == 1 + elabPCL_ENG = Section(); + sezPCA_ENG = Heading3('PreConv Array'); + sezPCA_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabPCL_ENG.Title = sezPCA_ENG; + testo = Paragraph(['When a displacement occurs, the node changes its position in order to '... + 'follow the rock mass movement. After been read, every tilt sensor records the new position '... + 'as an electrical signal (raw data) and sends the information to the control unit. '... + 'The datalogger saves the information on a volatile memory (SD card) and then transmits '... + 'them to the elaboration centre, where a software processes the electrical signals (ADC points) '... + 'to return information about the real displacement of the node (physical units). The accelerometer '... + 'gives information about the rotation of the node, referring to the constant gravity acceleration g. '... + 'The on-board thermometer is necessary to correct the '... + 'thermal effects on the accelerometer, using the calibration values. This sensor also provides '... + 'the temperature along the array.']); + testo2 = Paragraph(['MEMS sensor is located at the centre of each Link and measures the three '... + 'components of the gravitational field in its own reference system, starting from an initial '... + 'configuration (zero reading). When a movement arises, the variation of the different gravity '... + 'components gives back the information of the displacement. In this way, it is possible to '... + 'calculate the pre-convergence component ahead of the tunnel face and the local displacement of each Link, '... + 'thus allowing to compute a curve of cumulated displacements.'... + 'Each PreConv Link has a Segment of Relevance, which is assumed as infinitely rigid, that starts from the middle '... + 'point between the considered and the previous Link and ends at the medium distance between the '... + 'considered and the following Link. It is possible to customize the distance between Links according to '... + 'specific monitoring necessities (smaller distances lead to more reliable and accurate results).']); + img1 = Image(('PCA.png')); + img2 = Image(('PCA2.jpg')); + img1.Style = {Height('6cm'),HAlign('center')}; + imgcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Graphical representation '... + 'of the expected deformation behaviour induced by underground excavation']); + FIG_ENG = FIG_ENG+1; + imgcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + img2.Style = {Height('14cm'),HAlign('center')}; + img2caption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - MUMS PreConv Array installation example']); + FIG_ENG = FIG_ENG+1; + img2caption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + if nodoTunnel_ENG == 0 + add(elabPCL_ENG,testo_ENG); + nodoTunnel_ENG = 1; + end + add(elabPCL_ENG,img1); + add(elabPCL_ENG,imgcaption_ENG); + add(elabPCL_ENG,testo2); + add(elabPCL_ENG,img2); + add(elabPCL_ENG,img2caption_ENG); + if partecomune_ENG == 0 + add(elabPCL_ENG,testoATD_ENG); + add(elabPCL_ENG,testoRIS_ENG); + partecomune_ENG = 1; + end + add(appendice_ENG,elabPCL_ENG); + end +end + +% --- Analog Array --- +if sum(yesLL)>=1 || sum(yesPrL)>=1 || sum(yesPT100)>=1 || sum(yesCrL)>=1 || ... + sum(yes3DCrL)>=1 || sum(yesEL)>=1 || sum(yes3DEL)>=1 || sum(yesWEL)>=1 || sum(yesMPBEL)>=1 + elabAA = Section(); + if ElabTitle == 0 + app = Heading2('Elaborazione dati'); + app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo.Title = app; + if activeEN == 1 + app_ENG = Heading2('Data elaboration'); + app_ENG.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + Titolo_ENG.Title = app_ENG; + end + ElabTitle = 1; + end + sezAA = Heading3('Analog Array'); + sezAA.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabAA.Title = sezAA; + testo = Paragraph(['Gli Analog Array sono costituiti da sensori analogici tradizionali, '... + 'letti mediante centralina ASE801 e multiplexer analogico-digitale GMUX o centralina '... + 'ASE201. Tali datalogger permettono il campionamento di ogni tipologia di sensoristica '... + 'presente sul mercato e letta con grandezze quali Hz, mV/V, 0-5 V, 0-10 V, VW, 4-20 mA, NTC, PT100, etc.']); + testo2 = Paragraph(['Ogni sensore viene collegato nel canale designato e letto in automatico secondo '... + 'il periodo di campionamento impostato.']); + img = Image(('G201.png')); + img.Style = {Height('3cm'),HAlign('center')}; + imgcaption = Paragraph(['Fig. ' num2str(FIG) ' - Centralina ASE201 in grado di leggere '... + 'ogni tipologia di sensore analogico tradizionale, convertendo il segnale in ingresso '... + 'in un''uscita digitale.']); + FIG = FIG+1; + imgcaption.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + add(elabAA,testo); + add(elabAA,testo2); + add(elabAA,img); + add(elabAA,imgcaption); + if partecomune == 0 + add(elabAA,testoATD); + add(elabAA,testoRIS); + partecomune = 1; + end + add(appendice,elabAA); + + %---ENG--- + if activeEN == 1 + elabAA_ENG = Section(); + sezAA_ENG = Heading3('Analog Array'); + sezAA_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + elabAA_ENG.Title = sezAA_ENG; + testo = Paragraph(['Analog Arrays are composed of traditional analog sensors, connected to the ASE801 '... + 'datalogger thanks to a dedicated GMUX module that converts an analog '... + 'signal into a digital one, or by installing an ASE201 control unit. '... + 'This datalogger is able to read any traditional sensors featuring different '... + 'output signals (e.g. Hz, mV/V, 0-5 V, 0-10 V, VW, 4-20 mA, NTC, PT100, etc.).']); + testo2 = Paragraph(['Each single sensor is connected to a dedicated channel, and the recording process is performed '... + 'automatically according to the appropriate sampling frequency.']); + img = Image(('G201.png')); + img.Style = {Height('3cm'),HAlign('center')}; + imgcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - ASE201 control unit, designed to read any traditional analog '... + 'monitoring device by converting its signal into a digital output']); + FIG_ENG = FIG_ENG+1; + imgcaption_ENG.Style = {HAlign('justify'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + testo.HAlign = 'justify'; + testo2.HAlign = 'justify'; + add(elabAA_ENG,testo); + add(elabAA_ENG,testo2); + add(elabAA_ENG,img); + add(elabAA_ENG,imgcaption_ENG); + if partecomune_ENG == 0 + add(elabAA_ENG,testoATD_ENG); + add(elabAA_ENG,testoRIS_ENG); + partecomune_ENG = 1; + end + add(appendice_ENG,elabAA_ENG); + end +end + +%% Appendice sensori +% ---Tilt Link HR 3D V--- +elabSE = Section(); +SE = Section(); +app = Heading2('Descrizione sensori'); +app.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso +elabSE.Title = app; +add(appendice,elabSE); +if activeEN == 1 + elabSE_ENG = Section(); + SE_ENG = Section(); + app_ENG = Heading2('Sensors description'); + app_ENG.Style = {OuterMargin('0in','0in','0.2in','0.2in'),FontSize(Font_section),HAlign('justify')}; % Sx-Dx-Alto-Basso + elabSE_ENG.Title = app_ENG; + add(appendice_ENG,elabSE_ENG); +end +TL3D = 0; +for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Tilt Link HR 3D V') == 1 + if TL3D == 0 + SE = Section(); + end + sezTilt = Heading3('Tilt Link HR 3D V'); + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SE.Title = sezTilt; + text = Paragraph(['I Tilt Link HR 3D V sono caratterizzati dalla presenza '... + 'simultanea di una coppia di sensori nella medesima scheda elettronica. Il primo, '... + 'di tipo MEMS 3D, ' char(232) ' equipaggiato con accelerometro, magnetometro e termometro, '... + 'con inclinazioni dei sensori registrate dal primo elemento. La seconda tipologia, '... + 'cella elettrolitica 2D, ' char(232) ' in grado di fornire lo spostamento lungo gli assi strumentali '... + 'X e Y, a partire dalle inclinazioni ottenute mediante un''elettrolivella. La cella elettrolitica '... + '' char(232) ' orientata mediante il magnetometro del MEMS, dal momento che gli assi '... + 'strumentali X e Y dei due sensori possono ritenersi coincidenti. Nel dettaglio, '... + 'il sensore MEMS dispone di una portata teoricamente infinita (pu' char(242) ' essere ruotato in '... + 'ogni direzione dello spazio senza particolari problemi) e nasce per misurare spostamenti significativi, '... + 'mentre per quanto riguarda le piccole deformazioni risente dei disturbi legati al proprio '... + 'rumore di fondo di natura elettrica. La cella elettrolitica ha una sensibilit' char(224) ' molto elevata, '... + 'tale da percepire vibrazioni anche molto piccole, con il difetto di finire fuori scala per '... + 'valori di inclinazione assoluta pari a ' char(177) ' 25' char(176) ' (in tal senso ' char(232) ' importante sottolineare che, '... + 'se al momento dell''installazione il sensore presenta gi' char(224) ' un''inclinazione verso valle di '... + 'qualche grado, la portata del sensore ne risulter' char(224) ' conseguentemente ridotta).']); + text.HAlign = 'justify'; + + %---ENG--- + if activeEN == 1 + if TL3D == 0 + SE_ENG = Section(); + end + sezTilt_ENG = Heading3('Tilt Link HR 3D V'); + sezTilt_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SE_ENG.Title = sezTilt_ENG; + text_ENG = Paragraph(['Tilt Link HR 3D V follows the same working principle of Tilt Link V. '... + 'The main improvement refers to the 2D electrolytic cell, which permits to monitor small '... + 'displacements with a 10 times higher accuracy. Contrary to the MEMS sensor, which has a theoretically '... + 'infinite measure range, the electrolytic cell is limited to a ' char(177) '25' char(186) ' absolute tilt range. Since the '... + 'instrumental axes X and Y of this sensor coincide '... + 'with the two corresponding MEMS axes, the MEMS magnetometer can be used to define also the electrolytic cell '... + 'orientation. The simultaneous presence of two different '... + 'type of sensors in the same Link gives redundancy to results, which is fundamental to reduce '... + 'the uncertainties and have a robust interpretation of the occurring phenomenon.']); + text_ENG.HAlign = 'justify'; + end + if TL3D == 0 + add(SE,text); + imgTL = Image(('Tilt Link HR 3D V.tif')); + add(SE,imgTL); + imgTL.Style = {Height('5cm'),HAlign('center')}; + imgTLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Tilt Link HR 3D V']); + imgTLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SE,imgTLcaption); + FIG = FIG+1; + if activeEN == 1 + add(SE_ENG,text_ENG); + imgTL = Image(('Tilt Link HR 3D V.tif')); + add(SE_ENG,imgTL); + imgTL.Style = {Height('5cm'),HAlign('center')}; + imgTLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Tilt Link HR 3D V sensor']); + imgTLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SE_ENG,imgTLcaption_ENG); + FIG_ENG = FIG_ENG+1; + end + TL3D = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Tilt Link HR 3D V') == 1 + if TL3D == 0 + SE = Section(); + end + sezTilt = Heading3('Tilt Link HR 3D V'); + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SE.Title = sezTilt; + text = Paragraph(['I Tilt Link HR 3D V sono caratterizzati dalla presenza '... + 'simultanea di una coppia di sensori nella medesima scheda elettronica. Il primo, '... + 'di tipo MEMS 3D, ' char(232) ' equipaggiato con accelerometro, magnetometro e termometro, '... + 'con inclinazioni dei sensori registrate dal primo elemento. La seconda tipologia, '... + 'cella elettrolitica 2D, ' char(232) ' in grado di fornire lo spostamento lungo gli assi strumentali '... + 'X e Y, a partire dalle inclinazioni ottenute mediante un''elettrolivella. La cella elettrolitica '... + char(232) ' orientata mediante il magnetometro del MEMS, dal momento che gli assi '... + 'strumentali X e Y dei due sensori possono ritenersi coincidenti. Nel dettaglio, '... + 'il sensore MEMS dispone di una portata teoricamente infinita (pu' char(242) ' essere ruotato in '... + 'ogni direzione dello spazio senza particolari problemi) e nasce per misurare spostamenti significativi, '... + 'mentre per quanto riguarda le piccole deformazioni risente dei disturbi legati al proprio '... + 'rumore di fondo di natura elettrica. La cella elettrolitica ha una sensibilit' char(224) ' molto elevata, '... + 'tale da percepire vibrazioni anche molto piccole, con il difetto di finire fuori scala per '... + 'valori di inclinazione assoluta pari a ' char(177) ' 25' char(176) ' (in tal senso ' char(232) ' importante sottolineare che, '... + 'se al momento dell''installazione il sensore presenta gi' char(224) ' un''inclinazione verso valle di '... + 'qualche grado, la portata del sensore ne risulter' char(224) ' conseguentemente ridotta).']); + text.HAlign = 'justify'; + + %---ENG--- + if activeEN == 1 + if TL3D == 0 + SE_ENG = Section(); + end + sezTilt_ENG = Heading3('Tilt Link HR 3D V'); + sezTilt_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SE_ENG.Title = sezTilt_ENG; + text_ENG = Paragraph(['Tilt Link HR 3D V follows the same working principle of Tilt Link V. '... + 'The main improvement refers to the 2D electrolytic cell, which permits to monitor small '... + 'displacements with a 10 times higher accuracy. Contrary to the MEMS sensor, which has a theoretically '... + 'infinite measure range, the electrolytic cell is limited to a ' char(177) '25' char(186) ' absolute tilt range. Since the '... + 'instrumental axes X and Y of this sensor coincide '... + 'with the two corresponding MEMS axes, the MEMS magnetometer can be used to define also the electrolytic cell '... + 'orientation. The simultaneous presence of two different '... + 'type of sensors in the same Link gives redundancy to results, which is fundamental to reduce '... + 'the uncertainties and have a robust interpretation of the occurring phenomenon.']); + text_ENG.HAlign = 'justify'; + end + if TL3D == 0 + add(SE,text); + imgTL = Image(('Tilt Link HR 3D V.tif')); + add(SE,imgTL); + imgTL.Style = {Height('5cm'),HAlign('center')}; + imgTLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Tilt Link HR 3D V']); + imgTLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SE,imgTLcaption); + FIG = FIG+1; + if activeEN == 1 + add(SE_ENG,text); + imgTL = Image(('Tilt Link HR 3D V.tif')); + add(SE_ENG,imgTL); + imgTL.Style = {Height('5cm'),HAlign('center')}; + imgTLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Tilt Link HR 3D V sensor']); + imgTLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SE_ENG,imgTLcaption_ENG); + FIG_ENG = FIG_ENG+1; + end + TL3D = 1; + end + break + end + end + end +end +add(appendice,SE); +if activeEN == 1 + add(appendice_ENG,SE_ENG); +end + +% --- Tilt Link V --- +TL = 0; +ST = Section(); +if activeEN == 1 + ST_ENG = Section(); +end + +for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Tilt Link V') == 1 + if TL == 0 + ST = Section(); + end + sezTilt = Heading3('Tilt Link V'); + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + ST.Title = sezTilt; + text = Paragraph(['I Tilt Link V sono caratterizzati dalla presenza '... + 'del sensore MEMS 3D, equipaggiato con accelerometro, magnetometro e termometro. Il primo '... + 'elemento registra le inclinazioni del sensore, mentre il secondo definisce la direzione '... + 'di inclinazione. Il termometro ' char(232) ' utilizzato per la compensazione termica delle singole misure. '... + 'Nel dettaglio, il sensore dispone di una portata teoricamente infinita (pu' char(242) ' essere ruotato in '... + 'ogni direzione dello spazio senza particolari problemi) e nasce per misurare spostamenti significativi, '... + 'mentre per quanto riguarda le piccole deformazioni risente dei disturbi legati al proprio '... + 'rumore di fondo di natura elettrica.']); + + %--ENG-- + if activeEN == 1 + if TL_ENG == 0 + ST_ENG = Section(); + end + sezTilt_ENG = Heading3('Tilt Link V'); + sezTilt_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + ST_ENG.Title = sezTilt_ENG; + text_ENG = Paragraph(['Each Tilt Link V features a 3D MEMS sensor, which equips an accelerometer, a '... + 'magnetometer, and a thermometer. The first element is able to record the sensor tilt, '... + 'while the second one defines its direction. The thermometer provides the sensor temperature, and it '... + 'is used to correct the thermal effects on the accelerometer. Form a theoretical point of view, '... + 'the MEMS features an infinite range of tilt measure, while small variations in its '... + 'position are influenced by electrical noises.']); + end + if TL == 0 + text.HAlign = 'justify'; + add(ST,text); + img = Image(('Tilt Link V.tif')); + img.Style = {Height('5cm'),HAlign('center')}; + add(ST,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Tilt Link V']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(ST,ionhcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(ST_ENG,text_ENG); + img = Image(('Tilt Link V.tif')); + img.Style = {Height('5cm'),HAlign('center')}; + add(ST,img); + ionhcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Tilt Link V sensor']); + FIG_ENG = FIG_ENG+1; + ionhcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(ST,ionhcaption_ENG); + end + TL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Tilt Link V') == 1 + if TL == 0 + ST = Section(); + end + sezTilt = Heading3('Tilt Link V'); + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + ST.Title = sezTilt; + text = Paragraph(['I Tilt Link V sono caratterizzati dalla presenza '... + 'del sensore MEMS 3D, equipaggiato con accelerometro, magnetometro e termometro. Il primo '... + 'elemento registra le inclinazioni del sensore, mentre il secondo definisce la direzione '... + 'di inclinazione. Il termometro ' char(232) ' utilizzato per la compensazione termica delle singole misure. '... + 'Nel dettaglio, il sensore dispone di una portata teoricamente infinita (pu' char(242) ' essere ruotato in '... + 'ogni direzione dello spazio senza particolari problemi) e nasce per misurare spostamenti significativi, '... + 'mentre per quanto riguarda le piccole deformazioni risente dei disturbi legati al proprio '... + 'rumore di fondo di natura elettrica.']); + %--ENG-- + if activeEN == 1 + if TL_ENG == 0 + ST_ENG = Section(); + end + sezTilt_ENG = Heading3('Tilt Link V'); + sezTilt_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + ST_ENG.Title = sezTilt_ENG; + text_ENG = Paragraph(['Each Tilt Link V features a 3D MEMS sensor, which equips an accelerometer, a '... + 'magnetometer, and a thermometer. The first element is able to record the sensor tilt, '... + 'while the second one defines its direction. The thermometer provides the sensor temperature, and it '... + 'is used to correct the thermal effects on the accelerometer. Form a theoretical point of view, '... + 'the MEMS features an infinite range of tilt measure, while small variations in its '... + 'position are influenced by electrical noises.']); + end + if TL == 0 + text.HAlign = 'justify'; + add(ST,text); + img = Image(('Tilt Link V.tif')); + img.Style = {Height('5cm'),HAlign('center')}; + add(ST,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Tilt Link V']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(ST,ionhcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(ST_ENG,text_ENG); + img = Image(('Tilt Link V.tif')); + img.Style = {Height('5cm'),HAlign('center')}; + add(ST,img); + ionhcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Tilt Link V sensor']); + FIG_ENG = FIG_ENG+1; + ionhcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(ST,ionhcaption_ENG); + end + TL = 1; + end + break + end + end + end +end +add(appendice,ST); +if activeEN == 1 + add(appendice_ENG,ST_ENG); +end + +% --- In Place Link HR 3D --- +SIPI3D = Section(); +if activeEN == 1 + SIPI3D_ENG = Section(); +end +IPL3D = 0; +for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'In Place Link HR 3D') == 1 + if IPL3D == 0 + SIPI3D = Section(); + end + sezIPI = Heading3('In Place Link HR 3D'); + sezIPI.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SIPI3D.Title = sezIPI; + text = Paragraph(['Gli In Place Link HR sono caratterizzati dalla presenza '... + 'simultanea di una coppia di sensori nella medesima scheda elettronica. Il primo, '... + 'di tipo MEMS 3D, ' char(232) ' equipaggiato con accelerometro, magnetometro e termometro, '... + 'con inclinazioni dei sensori registrate dal primo elemento. La seconda tipologia, '... + 'cella elettrolitica 2D, ' char(232) ' in grado di fornire lo spostamento lungo gli assi strumentali '... + 'X e Y, a partire dalle inclinazioni ottenute mediante un''elettrolivella. La cella elettrolitica '... + '' char(232) ' orientata mediante il magnetometro del MEMS, dal momento che gli assi '... + 'strumentali X e Y dei due sensori possono ritenersi coincidenti. Nel dettaglio, '... + 'il sensore MEMS dispone di una portata teoricamente infinita (pu' char(242) ' essere ruotato in '... + 'ogni direzione dello spazio senza particolari problemi) e nasce per misurare spostamenti significativi, '... + 'mentre per quanto riguarda le piccole deformazioni risente dei disturbi legati al proprio '... + 'rumore di fondo di natura elettrica. La cella elettrolitica ha una sensibilit' char(224) ' molto elevata, '... + 'tale da percepire vibrazioni anche molto piccole, con il difetto di finire fuori scala per '... + 'valori di inclinazione assoluta pari a ' char(177) ' 25' char(176) ' (in tal senso ' char(232) ' importante sottolineare che, '... + 'se al momento dell''installazione il sensore presenta gi' char(224) ' un''inclinazione verso valle di '... + 'qualche grado, la portata del sensore ne risulter' char(224) ' conseguentemente ridotta).']); + text.HAlign = 'justify'; + + %--ENG-- + if activeEN == 1 + if IPL3D == 0 + SIPI3D_ENG = Section(); + end + sezIPI_ENG = Heading3('In Place Link HR 3D'); + sezIPI_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SIPI3D_ENG.Title = sezIPI_ENG; + text_ENG = Paragraph(['In Place HR 3D follows the same working principle of In Place Link. '... + 'The main improvement refers to the 2D electrolytic cell, which permits to monitor small '... + 'displacements with a 10 times higher accuracy. Contrary to the MEMS sensor, which has a theoretically '... + 'infinite measure range, the electrolytic cell is limited to a ' char(177) '25' char(186) ' absolute tilt range. Since the '... + 'instrumetal axes X and Y of this sensor coincide '... + 'with the two corresponding MEMS axes, the MEMS magnetometer can be used to define also the electrolytic cell '... + 'orientation. The simultaneous presence of two different '... + 'type of sensors in the same link gives redundancy to results, which is fundamental to reduce '... + 'the uncertainties and have a robust interpretation of the occurring phenomenon.']); + text_ENG.HAlign = 'justify'; + end + if IPL3D == 0 + add(SIPI3D,text); + imgIPL = Image(('Tilt Link HR 3D V.tif')); + add(SIPI3D,imgIPL); + imgIPL.Style = {Height('5cm'),HAlign('center')}; + imgIPLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore In Place Link HR 3D']); + imgIPLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SIPI3D,imgIPLcaption); + FIG = FIG+1; + if activeEN == 1 + add(SIPI3D_ENG,text_ENG); + imgIPL = Image(('Tilt Link HR 3D V.tif')); + add(SIPI3D_ENG,imgIPL); + imgIPL.Style = {Height('5cm'),HAlign('center')}; + imgIPLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - In Place Link HR 3D sensor']); + FIG_ENG = FIG_ENG+1; + imgIPLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SIPI3D,imgIPLcaption_ENG); + end + IPL3D = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'In Place Link HR 3D') == 1 + if IPL3D == 0 + SIPI3D = Section(); + end + sezIPI = Heading3('In Place Link HR 3D'); + sezIPI.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SIPI3D.Title = sezIPI; + text = Paragraph(['Gli In Place Link HR 3D sono caratterizzati dalla presenza '... + 'simultanea di una coppia di sensori nella medesima scheda elettronica. Il primo, '... + 'di tipo MEMS 3D, ' char(232) ' equipaggiato con accelerometro, magnetometro e termometro, '... + 'con inclinazioni dei sensori registrate dal primo elemento. La seconda tipologia, '... + 'cella elettrolitica 2D, ' char(232) ' in grado di fornire lo spostamento lungo gli assi strumentali '... + 'X e Y, a partire dalle inclinazioni ottenute mediante un''elettrolivella. La cella elettrolitica '... + char(232) ' orientata mediante il magnetometro del MEMS, dal momento che gli assi '... + 'strumentali X e Y dei due sensori possono ritenersi coincidenti. Nel dettaglio, '... + 'il sensore MEMS dispone di una portata teoricamente infinita (pu' char(242) ' essere ruotato in '... + 'ogni direzione dello spazio senza particolari problemi) e nasce per misurare spostamenti significativi, '... + 'mentre per quanto riguarda le piccole deformazioni risente dei disturbi legati al proprio '... + 'rumore di fondo di natura elettrica. La cella elettrolitica ha una sensibilit' char(224) ' molto elevata, '... + 'tale da percepire vibrazioni anche molto piccole, con il difetto di finire fuori scala per '... + 'valori di inclinazione assoluta pari a ' char(177) ' 25' char(176) ' (in tal senso ' char(232) ' importante sottolineare che, '... + 'se al momento dell''installazione il sensore presenta gi' char(224) ' un''inclinazione verso valle di '... + 'qualche grado, la portata del sensore ne risulter' char(224) ' conseguentemente ridotta).']); + text.HAlign = 'justify'; + %--ENG-- + if activeEN == 1 + if IPL3D == 0 + SIPI3D_ENG = Section(); + end + sezIPI_ENG = Heading3('In Place Link HR 3D'); + sezIPI_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SIPI3D_ENG.Title = sezIPI_ENG; + text_ENG = Paragraph(['In Place HR 3D follows the same working principle of In Place Link. '... + 'The main improvement refers to the 2D electrolytic cell, which permits to monitor small '... + 'displacements with a 10 times higher accuracy. Contrary to the MEMS sensor, which has a theoretically '... + 'infinite measure range, the electrolytic cell is limited to a ' char(177) '25' char(186) ' absolute tilt range. Since the '... + 'instrumetal axes X and Y of this sensor coincide '... + 'with the two corresponding MEMS axes, the MEMS magnetometer can be used to define also the electrolytic cell '... + 'orientation. The simultaneous presence of two different '... + 'type of sensors in the same link gives redundancy to results, which is fundamental to reduce '... + 'the uncertainties and have a robust interpretation of the occurring phenomenon.']); + text_ENG.HAlign = 'justify'; + end + if IPL3D == 0 + add(SIPI3D,text); + imgIPL = Image(('Tilt Link HR 3D V.tif')); + add(SIPI3D,imgIPL); + imgIPL.Style = {Height('5cm'),HAlign('center')}; + imgIPLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore In Place Link HR 3D']); + FIG = FIG+1; + imgIPLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SIPI3D,imgIPLcaption); + if activeEN == 1 + add(SIPI3D_ENG,text_ENG); + imgIPL = Image(('Tilt Link HR 3D V.tif')); + add(SIPI3D_ENG,imgIPL); + imgIPL.Style = {Height('5cm'),HAlign('center')}; + imgIPLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - In Place Link HR 3D sensor']); + FIG_ENG = FIG_ENG+1; + imgIPLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SIPI3D,imgIPLcaption_ENG); + end + IPL3D = 1; + end + break + end + end + end +end +add(appendice,SIPI3D); +if activeEN == 1 + add(appendice_ENG,SIPI3D_ENG); +end + +% --- In Place Link --- +IPL = 0; +SIPI = Section(); +if activeEN == 1 + SIPI_ENG = Section(); +end +for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'In Place Link') == 1 + if IPL == 0 + SIPI = Section(); + end + sezIPI = Heading3('In Place Link'); + sezIPI.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SIPI.Title = sezIPI; + text = Paragraph(['Gli In Place Link sono caratterizzati dalla presenza '... + 'del sensore MEMS 3D, equipaggiato con accelerometro, magnetometro e termometro. Il primo '... + 'elemento registra le inclinazioni del sensore, mentre il secondo definisce la direzione '... + 'di inclinazione. Il termometro ' char(232) ' utilizzato per la compensazione termica delle singole misure. '... + 'Nel dettaglio, il sensore dispone di una portata teoricamente infinita (pu' char(242) ' essere ruotato in '... + 'ogni direzione dello spazio senza particolari problemi) e nasce per misurare spostamenti significativi, '... + 'mentre per quanto riguarda le piccole deformazioni risente dei disturbi legati al proprio '... + 'rumore di fondo di natura elettrica.']); + + %--ENG-- + if activeEN == 1 + if IPL == 0 + SIPI_ENG = Section(); + end + sezIPI_ENG = Heading3('In Place Link'); + sezIPI_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SIPI_ENG.Title = sezIPI_ENG; + text_ENG = Paragraph(['Each In Place Link features a 3D MEMS sensor, which equips an accelerometer, a '... + 'magnetometer, and a thermometer. The first element is able to record the node tilt, '... + 'while the second one defines its direction. The thermometer provides the sensor temperature, and it '... + 'is used to correct the thermal effects on the accelerometer. From a theoretical point of view, '... + 'the MEMS features an infinite range of tilt measure, while small variations in its '... + 'position are influenced by electrical noises.']); + end + if IPL == 0 + text.HAlign = 'justify'; + add(SIPI,text); + img = Image(('Tilt Link V.tif')); + img.Style = {Height('5cm'),HAlign('center')}; + add(SIPI,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore In Place Link']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SIPI,ionhcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(SIP_ENGI,text_ENG); + img = Image(('Tilt Link V.tif')); + img.Style = {Height('5cm'),HAlign('center')}; + add(SIPI,img); + ionhcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - In Place Link sensor']); + FIG_ENG = FIG_ENG+1; + ionhcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SIPI_ENG,ionhcaption_ENG); + end + IPL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'In Place Link') == 1 + if IPL == 0 + SIPI = Section(); + end + sezIPI = Heading3('In Place Link'); + sezIPI.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SIPI.Title = sezIPI; + text = Paragraph(['Gli In Place Link sono caratterizzati dalla presenza '... + 'del sensore MEMS 3D, equipaggiato con accelerometro, magnetometro e termometro. Il primo '... + 'elemento registra le inclinazioni del sensore, mentre il secondo definisce la direzione '... + 'di inclinazione. Il termometro ' char(232) ' utilizzato per la compensazione termica delle singole misure. '... + 'Nel dettaglio, il sensore dispone di una portata teoricamente infinita (pu' char(242) ' essere ruotato in '... + 'ogni direzione dello spazio senza particolari problemi) e nasce per misurare spostamenti significativi, '... + 'mentre per quanto riguarda le piccole deformazioni risente dei disturbi legati al proprio '... + 'rumore di fondo di natura elettrica.']); + %--ENG-- + if activeEN == 1 + if IPL == 0 + SIPI_ENG = Section(); + end + sezIPI_ENG = Heading3('In Place Link'); + sezIPI_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SIPI_ENG.Title = sezIPI_ENG; + text_ENG = Paragraph(['Each In Place Link features a 3D MEMS sensor, which equips an accelerometer, a '... + 'magnetometer, and a thermometer. The first element is able to record the node tilt, '... + 'while the second one defines its direction. The thermometer provides the sensor temperature, and it '... + 'is used to correct the thermal effects on the accelerometer. From a theoretical point of view, '... + 'the MEMS features an infinite range of tilt measure, while small variations in its '... + 'position are influenced by electrical noises.']); + end + if IPL == 0 + text.HAlign = 'justify'; + add(SIPI,text); + img = Image(('Tilt Link V.tif')); + img.Style = {Height('5cm'),HAlign('center')}; + add(SIPI,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore In Place Link']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SIPI,ionhcaption); + + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(SIP_ENGI,text_ENG); + img = Image(('Tilt Link V.tif')); + img.Style = {Height('5cm'),HAlign('center')}; + add(SIPI,img); + ionhcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - In Place Link sensor']); + FIG_ENG = FIG_ENG+1; + ionhcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SIPI_ENG,ionhcaption_ENG); + end + IPL = 1; + end + break + end + end + end +end +add(appendice,SIPI); +if activeEN == 1 + add(appendice_ENG,SIPI_ENG); +end + +% --- In Place Link HR --- +if yesIPL == 0 + IPLHR = 0; + SIPIHR = Section(); + if activeEN == 1 + SIPIHR_ENG = Section(); + end + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'In Place Link HR') == 1 + if IPLHR == 0 + SIPIHR = Section(); + end + sezIPIHR = Heading3('In Place Link HR'); + sezIPIHR.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SIPIHR.Title = sezIPIHR; + text = Paragraph(['Gli In Place Link HR sono caratterizzati dalla simultanea presenza '... + 'del sensore elettrolitico 2D e di un termometro. Il primo '... + 'elemento registra le inclinazioni assolute del sensore rispetto al piano orizzontale, mentre '... + 'il termometro fornisce il dato di temperatura, molto utile nell''individuazione degli effetti termici. '... + 'A seconda delle impostazioni definite al momento dell''installazione, il sensore va fuori scala '... + 'per un determinato angolo assoluto positivo o negativo.']); + + %--ENG-- + if activeEN == 1 + if IPLHR == 0 + SIPIHR = Section(); + end + sezIPIHR = Heading3('In Place Link HR'); + sezIPIHR.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SIPIHR.Title = sezIPIHR; + text_ENG = Paragraph(['Each In Place Link HR features a 2D electrolytic tilt sensor and a thermometer. '... + 'The first element is able to record the absolute tilt of the node, '... + 'while the thermometer provides the sensor temperature, and it '... + 'is used to correct the thermal effects on the tilt sensor. Depending on the installation '... + 'configuration, the elctrolytic sensor could reach out-of-range positions for specific values '... + 'of absolute tilt of the node (both positive and/or negative). ']); + end + if IPLHR == 0 + text.HAlign = 'justify'; + add(SIPIHR,text); + img = Image(('IPLHR.jpg')); + img.Style = {Height('3cm'),HAlign('center')}; + add(SIPIHR,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore In Place Link HR']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SIPIHR,ionhcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(SIPIHR_ENG,text_ENG); + img = Image(('IPLHR.jpg')); + img.Style = {Height('3cm'),HAlign('center')}; + add(SIPIHR_ENG,img); + ionhcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - In Place Link HR sensor']); + FIG_ENG = FIG_ENG+1; + ionhcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SIPIHR,ionhcaption_ENG); + end + IPLHR = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'In Place Link HR') == 1 + if IPLHR == 0 + SIPIHR = Section(); + end + sezIPIHR = Heading3('In Place Link HR'); + sezIPIHR.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SIPIHR.Title = sezIPIHR; + text = Paragraph(['Gli In Place Link HR sono caratterizzati dalla simultanea presenza '... + 'del sensore elettrolitico 2D e di un termometro. Il primo '... + 'elemento registra le inclinazioni assolute del sensore rispetto al piano orizzontale, mentre '... + 'il termometro fornisce il dato di temperatura, molto utile nell''individuazione degli effetti termici. '... + 'A seconda delle impostazioni definite al momento dell''installazione, il sensore va fuori scala '... + 'per un determinato angolo assoluto positivo o negativo.']); + %--ENG-- + if activeEN == 1 + if IPLHR == 0 + SIPIHR = Section(); + end + sezIPIHR = Heading3('In Place Link HR'); + sezIPIHR.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SIPIHR.Title = sezIPIHR; + text_ENG = Paragraph(['Each In Place Link HR features a 2D electrolytic tilt sensor and a thermometer. '... + 'The first element is able to record the absolute tilt of the node, '... + 'while the thermometer provides the sensor temperature, and it '... + 'is used to correct the thermal effects on the tilt sensor. Depending on the installation '... + 'configuration, the elctrolytic sensor could reach out-of-range positions for specific values '... + 'of absolute tilt of the node (both positive and/or negative). ']); + end + if IPLHR == 0 + text.HAlign = 'justify'; + add(SIPIHR,text); + img = Image(('IPLHR.jpg')); + img.Style = {Height('3cm'),HAlign('center')}; + add(SIPIHR,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore In Place Link HR']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SIPIHR,ionhcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(SIPIHR_ENG,text_ENG); + img = Image(('IPLHR.jpg')); + img.Style = {Height('3cm'),HAlign('center')}; + add(SIPIHR_ENG,img); + ionhcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - In Place Link HR sensor']); + FIG_ENG = FIG_ENG+1; + ionhcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SIPIHR,ionhcaption_ENG); + end + IPLHR = 1; + end + break + end + end + end + end + add(appendice,SIPIHR); + if activeEN == 1 + add(appendice_ENG,SIPIHR_ENG); + end +end + +if sum(yesPL) >= 1 + % --- Piezo Link --- + PL = 0; + if isempty(PL_A) == 1 && isempty(PL_D) == 1 + tipoPL = 'assoluta '; + figuraPL = 'Piezo Link D.jpg'; + capPL = 'digitale'; + baroPL = ', accoppiati con un sensore barometrico, '; + else + if sum(PL_A) > 0 && sum(PL_D) > 0 + tipoPL = 'assoluta (digitali) e relativa (analogici) '; + figuraPL = 'Piezo Link DA.jpg'; + capPL = 'digitale (a sinistra) e analogico (a destra)'; + baroPL = ' '; + elseif sum(PL_A) > 0 + tipoPL = 'relativa '; + figuraPL = 'Piezo Link A.png'; + capPL = 'analogico'; + baroPL = ' '; + elseif sum(PL_D) > 0 + tipoPL = 'assoluta '; + figuraPL = 'Piezo Link D.jpg'; + capPL = 'digitale'; + baroPL = ', accoppiati con un sensore barometrico, '; + end + end + + if activeEN == 1 + if isempty(PL_A) == 1 && isempty(PL_D) == 1 + tipoPL_ENG = 'absolute '; + figuraPL = 'Piezo Link D.jpg'; + capPL_ENG = 'digitale'; + baroPL_ENG = ', coupled with a barometer, it also allows '; + else + if sum(PL_A) > 0 && sum(PL_D) > 0 + tipoPL_ENG = 'absolute (digital) and relative (analog) '; + figuraPL = 'Piezo Link DA.jpg'; + capPL_ENG = 'digital (left) and analog (right)'; + baroPL_ENG = ' '; + elseif sum(PL_A) > 0 + tipoPL_ENG = 'relative '; + figuraPL = 'Piezo Link A.png'; + capPL_ENG = 'analog'; + baroPL_ENG = ' '; + elseif sum(PL_D) > 0 + tipoPL_ENG = 'absolute '; + figuraPL = 'Piezo Link D.jpg'; + capPL_ENG = 'digital'; + baroPL_ENG = ', coupled with a barometer, it also allows '; + end + end + end + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Piezo Link') == 1 + if PL == 0 + PE = Section(); + end + sezTilt = Heading3('Piezo Link'); + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PE.Title = sezTilt; + text = Paragraph(['I sensori Piezo Link sono rilevatori di pressione ' tipoPL... + 'che' baroPL 'permettono di calcolare la pressione '... + 'interstiziale e, conoscendo la profondit' char(224) ' del piezometro, la stima della colonna d''acqua.']); + %--ENG-- + if activeEN == 1 + if PL == 0 + PE_ENG = Section(); + end + sezTilt_ENG = Heading3('Piezo Link'); + sezTilt_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PE_ENG.Title = sezTilt_ENG; + text_ENG = Paragraph(['Piezo Link is a sensor able to measure the ' tipoPL_ENG 'pressure and' baroPL_ENG ... + 'to calculate the water table level.']); + end + + if PL == 0 + text.HAlign = 'justify'; + add(PE,text); + imgPL = Image(figuraPL); + imgPL.Style = {Height('5.5cm'),HAlign('center')}; + add(PE,imgPL); + PLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Piezo Link ' capPL]); + FIG = FIG+1; + PLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(PE,PLcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(PE_ENG,text_ENG); + imgPL = Image(figuraPL); + imgPL.Style = {Height('5.5cm'),HAlign('center')}; + add(PE_ENG,imgPL); + PLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Piezo Link sensor, ' capPL_ENG]); + FIG_ENG = FIG_ENG+1; + PLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(PE_ENG,PLcaption_ENG); + end + PL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Piezo Link') == 1 + if PL == 0 + PE = Section(); + end + sezTilt = Heading3('Piezo Link'); + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PE.Title = sezTilt; + text = Paragraph(['I sensori Piezo Link sono rilevatori di pressione ' tipoPL... + 'che' baroPL 'permettono di calcolare la pressione '... + 'interstiziale e, conoscendo la profondit' char(224) ' del piezometro, la stima della colonna d''acqua.']); + %--ENG-- + if activeEN == 1 + if PL == 0 + PE_ENG = Section(); + end + sezTilt_ENG = Heading3('Piezo Link'); + sezTilt_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PE_ENG.Title = sezTilt_ENG; + text_ENG = Paragraph(['Piezo Link is a sensor able to measure the ' tipoPL_ENG 'pressure and' baroPL_ENG ... + 'to calculate the water table level.']); + end + if PL == 0 + text.HAlign = 'justify'; + add(PE,text); + imgPL = Image(figuraPL); + imgPL.Style = {Height('5.5cm'),HAlign('center')}; + add(PE,imgPL); + PLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Piezo Link ' capPL]); + FIG = FIG+1; + PLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(PE,PLcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(PE_ENG,text_ENG); + imgPL = Image(figuraPL); + imgPL.Style = {Height('5.5cm'),HAlign('center')}; + add(PE_ENG,imgPL); + PLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Piezo Link sensor, ' capPL_ENG]); + FIG_ENG = FIG_ENG+1; + PLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(PE_ENG,PLcaption_ENG); + end + PL = 1; + end + break + end + end + end + end + % ---Baro Link--- + if sum(yesBL) >= 1 + BL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Baro Link') == 1 + if BL == 0 + BE = Section(); + end + sezTilt = Heading3('Baro Link'); + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + BE.Title = sezTilt; + text = Paragraph(['Il sensore Baro Link ' char(232) ' un rilevatore di pressione assoluta. '... + 'Le informazioni che si ottengono permettono di stimare le condizioni '... + 'meteorologiche del sito e calcolare la pressione interstiziale, se '... + 'accoppiato alle informazioni di un piezometro assoluto']); + + if activeEN == 1 + if BL == 0 + BE_ENG = Section(); + end + sezTilt_ENG = Heading3('Baro Link'); + sezTilt_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + BE_ENG.Title = sezTilt_ENG; + text_ENG = Paragraph(['Baro Link is a sensor designed to measure the atmospheric pressure, allowing to '... + 'evaluate the meteorological conditions of the monitored site and to estimate the pore water pressure, '... + 'when coupled with a piezometer.']); + end + if BL == 0 + text.HAlign = 'justify'; + add(BE,text); + imgBL = Image(('Barometro.png')); + imgBL.Style = {Height('2.8cm'),HAlign('center')}; + add(BE,imgBL); + BLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Baro Link']); + FIG = FIG+1; + BLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(BE,BLcaption); + if activeEN ==1 + text_ENG.HAlign = 'justify'; + add(BE_ENG,text_ENG); + imgBL = Image(('Barometro.png')); + imgBL.Style = {Height('2.8cm'),HAlign('center')}; + add(BE_ENG,imgBL); + BLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Baro Link sensor']); + FIG_ENG = FIG_ENG+1; + BLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(BE_ENG,BLcaption_ENG); + end + BL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Baro Link') == 1 + if BL == 0 + BE = Section(); + end + sezTilt = Heading3('Baro Link'); + sezTilt.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + BE.Title = sezTilt; + text = Paragraph(['Il sensore Baro Link ' char(232) ' un rilevatore di pressione assoluta. '... + 'Le informazioni che si ottengono permettono di stimare le condizioni '... + 'meteorologiche del sito e calcolare la pressione interstiziale, se '... + 'accoppiato alle informazioni di un piezometro assoluto.']); + if activeEN == 1 + if BL == 0 + BE_ENG = Section(); + end + sezTilt_ENG = Heading3('Baro Link'); + sezTilt_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + BE_ENG.Title = sezTilt_ENG; + text_ENG = Paragraph(['Baro Link is a sensor designed to measure the atmospheric pressure, allowing to '... + 'evaluate the meteorological conditions of the monitored site and to estimate the pore water pressure, '... + 'when coupled with a piezometer.']); + end + if BL == 0 + text.HAlign = 'justify'; + add(BE,text); + imgBL = Image(('Barometro.png')); + imgBL.Style = {Height('2.8cm'),HAlign('center')}; + add(BE,imgBL); + BLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Baro Link']); + FIG = FIG+1; + BLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(BE,BLcaption) + if activeEN ==1 + text_ENG.HAlign = 'justify'; + add(BE_ENG,text_ENG); + imgBL = Image(('Barometro.png')); + imgBL.Style = {Height('2.8cm'),HAlign('center')}; + add(BE_ENG,imgBL); + BLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Baro Link sensor']); + FIG_ENG = FIG_ENG+1; + BLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(BE_ENG,BLcaption_ENG); + end + BL = 1; + end + break + end + end + end + end + add(appendice,BE); + if activeEN == 1 + add(appendice_ENG,BE_ENG); + end + end + add(appendice,PE); + if activeEN == 1 + add(appendice_ENG,PE_ENG); + end +end + +% ---Klino Link--- +if sum(yesKL) >= 1 + KL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(char(colonna4(a,1)),'Klino Array D2W') == 1 % Clinometro Wi-Fi + if KL == 0 + KE = Section(); + end + sezKlino = Heading3('Klino Link'); + sezKlino.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KE.Title = sezKlino; + text = Paragraph(['I sensori Klino Link D2W sono clinometri Wi-Fi '... + 'caratterizzati dalla presenza di un sensore MEMS 2D '... + 'ed un termometro. I dispositivi sono in grado di monitorare '... + 'l''inclinazione assoluta e differenziale della struttura a cui sono fissati, '... + 'oltre alla temperatura della stessa.']); + + %--ENG-- + if activeEN == 1 + if KL == 0 + KE_ENG = Section(); + end + sezKlino_ENG = Heading3('Klino Link'); + sezKlino_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KE_ENG.Title = sezKlino_ENG; + text_ENG = Paragraph(['Klino Link D2W are wireless tilt sensors, '... + 'integrating a 2D MEMS and a thermometer. These devices are able to measure the '... + 'the absolute and relative tilt of the monitored structure, providing also '... + 'a temperature value.']); + end + + if KL == 0 + text.HAlign = 'justify'; + add(KE,text); + imgKL = Image(('ClinometroES.jpg')); + imgKL.Style = {Height('3cm'),HAlign('center')}; + add(KE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Klino Link D2W']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(KE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(KE_ENG,text); + imgKL = Image(('ClinometroES.jpg')); + imgKL.Style = {Height('3cm'),HAlign('center')}; + add(KE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Klino Link D2W sensor']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(KE_ENG,KEcaption_ENG); + end + KL = 1; + end + break + else + if strcmp(colonna6(a,1),'Klino Link HR 3D') == 1 + if KL == 0 + KE = Section(); + end + sezKlino = Heading3('Klino Link HR 3D'); + sezKlino.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KE.Title = sezKlino; + text = Paragraph(['I sensori Klino Link HR 3D sono clinometri '... + 'caratterizzati dalla simultanea presenza di un sensore MEMS 3D '... + 'ed un sensore elettrolitico 2D, in grado di monitorare '... + 'l''inclinazione della struttura a cui sono fissati, '... + 'oltre alla temperatura della stessa.']); + + %--ENG-- + if activeEN == 1 + if KL == 0 + KE_ENG = Section(); + end + sezKlino_ENG = Heading3('Klino Link HR 3D'); + sezKlino_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KE_ENG.Title = sezKlino_ENG; + text_ENG = Paragraph(['Klino Link HR 3D is a sensor that integrates a 3D MEMS sensor and an electrolytic '... + 'tilt sensor, able to measure the tilt of the element on which is installed. It also '... + 'includes a thermometer to collect temperature values.']); + end + + if KL == 0 + text.HAlign = 'justify'; + add(KE,text); + imgKL = Image(('Klino.png')); + imgKL.Style = {Height('3cm'),HAlign('center')}; + add(KE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Klino Link HR 3D']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(KE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(KE_ENG,text); + imgKL = Image(('Klino.jpg')); + imgKL.Style = {Height('3cm'),HAlign('center')}; + add(KE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Klino Link HR 3d sensor']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(KE_ENG,KEcaption_ENG); + end + KL = 1; + end + break + end + end + else + for aC = 1:dimC + if strcmp(char(colonna4(m+1,1)),'Klino Array D2W') == 1 % Clinometro Wi-Fi + if KL == 0 + KE = Section(); + end + sezKlino = Heading3('Klino Link'); + sezKlino.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KE.Title = sezKlino; + text = Paragraph(['I sensori Klino Link D2W sono clinometri Wi-Fi '... + 'caratterizzati dalla presenza di un sensore MEMS 2D '... + 'ed un termometro. I dispositivi sono in grado di monitorare '... + 'l''inclinazione assoluta e differenziale della struttura a cui sono fissati, '... + 'oltre alla temperatura della stessa.']); + %--ENG-- + if activeEN == 1 + if KL == 0 + KE_ENG = Section(); + end + sezKlino_ENG = Heading3('Klino Link'); + sezKlino_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KE_ENG.Title = sezKlino_ENG; + text_ENG = Paragraph(['Klino Link D2W are wireless tilt sensors, '... + 'integrating a 2D MEMS and a thermometer. These devices are able to measure the '... + 'the absolute and relative tilt of the monitored structure, providing also '... + 'a temperature value.']); + end + if KL == 0 + text.HAlign = 'justify'; + add(KE,text); + imgKL = Image(('ClinometroES.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(KE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Klino Link D2W']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(KE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(KE_ENG,text); + imgKL = Image(('ClinometroES.png')); + imgKL.Style = {Height('3cm'),HAlign('center')}; + add(KE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Klino Link D2W sensor']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(KE_ENG,KEcaption_ENG); + end + KL = 1; + end + break + else + if strcmp(colonna6{a, 1}{aC, 1},'Klino Link HR 3D') == 1 + if KL == 0 + KE = Section(); + end + sezKlino = Heading3('Klino Link HR 3D'); + sezKlino.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KE.Title = sezKlino; + text = Paragraph(['I sensori Klino Link HR 3D sono clinometri '... + 'caratterizzati dalla simultanea presenza di un sensore MEMS 3D '... + 'ed un sensore elettrolitico 2D, in grado di monitorare '... + 'l''inclinazione della struttura a cui sono fissati, '... + 'oltre alla temperatura della stessa.']); + + %--ENG-- + if activeEN == 1 + if KL == 0 + KE_ENG = Section(); + end + sezKlino_ENG = Heading3('Klino Link HR 3D'); + sezKlino_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KE_ENG.Title = sezKlino_ENG; + text_ENG = Paragraph(['Klino Link HR 3D is a sensor that integrates a 3D MEMS sensor and an electrolytic '... + 'tilt sensor, able to measure the tilt of the element on which is installed. It also '... + 'includes a thermometer to collect temperature values.']); + end + if KL == 0 + text.HAlign = 'justify'; + add(KE,text); + imgKL = Image(('Klino.png')); + imgKL.Style = {Height('5cm'),HAlign('center')}; + add(KE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Klino Link HR 3D']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(KE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(KE_ENG,text); + imgKL = Image(('Klino.jpg')); + imgKL.Style = {Height('3cm'),HAlign('center')}; + add(KE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Klino Link HR 3D sensor']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(KE_ENG,KEcaption_ENG); + end + KL = 1; + end + break + end + end + end + end + end + add(appendice,KE); + if activeEN == 1 + add(appendice_ENG,KE_ENG); + end +end + +% ---Klino Link HR--- +if sum(yesKL) == 0 && sum(yesKLHR) >= 1 + KLHR = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Klino Link HR') == 1 + if KLHR == 0 + KLE = Section(); + end + sezKlinoHR = Heading3('Klino Link HR'); + sezKlinoHR.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KLE.Title = sezKlinoHR; + text = Paragraph(['I sensori Klino Link HR sono clinometri '... + 'caratterizzati dalla presenza di un sensore elettrolitico 2D, '... + 'in grado di monitorare l''inclinazione della struttura a cui sono fissati, '... + 'oltre alla temperatura della stessa.']); + + %--ENG-- + if activeEN == 1 + if KLHR == 0 + KLE_ENG = Section(); + end + sezKlinoHR_ENG = Heading3('Klino Link HR'); + sezKlinoHR_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KLE_ENG.Title = sezKlinoHR_ENG; + text_ENG = Paragraph(['Klino Link HR is a sensor that integrates an electrolytic '... + 'tilt sensor, able to measure the tilt of the element on which is installed. It also '... + 'includes a thermometer to collect temperature data.']); + end + + if KLHR == 0 + text.HAlign = 'justify'; + add(KLE,text); + imgKL = Image(('KlinoHR.png')); + imgKL.Style = {Height('3.7cm'),HAlign('center')}; + add(KLE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Klino Link HR']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(KLE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(KLE_ENG,text_ENG); + imgKL = Image(('KlinoHR.png')); + imgKL.Style = {Height('3.7cm'),HAlign('center')}; + add(KLE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Klino Link HR sensor']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(KLE_ENG,KEcaption_ENG); + end + KLHR = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Klino Link HR') == 1 + if KLHR == 0 + KLE = Section(); + end + sezKlinoHR = Heading3('Klino Link HR'); + sezKlinoHR.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KLE.Title = sezKlinoHR; + text = Paragraph(['I sensori Klino Link HR sono clinometri '... + 'caratterizzati dalla presenza di un sensore elettrolitico 2D, '... + 'in grado di monitorare l''inclinazione della struttura a cui sono fissati, '... + 'oltre alla temperatura della stessa.']); + + %--ENG-- + if activeEN == 1 + if KLHR == 0 + KLE_ENG = Section(); + end + sezKlinoHR_ENG = Heading3('Klino Link HR'); + sezKlinoHR_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + KLE_ENG.Title = sezKlinoHR_ENG; + text_ENG = Paragraph(['Klino Link HR is a sensor that integrates an electrolytic '... + 'tilt sensor, able to measure the tilt of the element on which is installed. It also '... + 'includes a thermometer to collect temperature data.']); + end + + if KLHR == 0 + text.HAlign = 'justify'; + add(KLE,text); + imgKL = Image(('KlinoHR.png')); + imgKL.Style = {Height('3.7cm'),HAlign('center')}; + add(KLE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Klino Link HR']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(KLE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(KLE_ENG,text_ENG); + imgKL = Image(('KlinoHR.png')); + imgKL.Style = {Height('3.7cm'),HAlign('center')}; + add(KLE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Klino Link HR sensor']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(KLE_ENG,KEcaption_ENG); + end + KLHR = 1; + end + break + end + end + end + end + add(appendice,KLE); + if activeEN == 1 + add(appendice_ENG,KLE_ENG); + end +end + +% --- Therm Link --- +if sum(yesThL) >= 1 + ThL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Therm Link') == 1 + if ThL == 0 + ThE = Section(); + end + sezTherm = Heading3('Therm Link'); + sezTherm.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + ThE.Title = sezTherm; + text = Paragraph(['I sensori Therm Link sono termometri '... + 'ad alta precisione e ripetibilit' char(224) ', in grado di monitorare '... + 'la temperatura a differenti profondit' char(224) ', sfruttando un '... + 'unico cavo elettrico quadripolare.']); + + %--ENG-- + if activeEN == 1 + if ThL == 0 + ThE_ENG = Section(); + end + sezTherm_ENG = Heading3('Therm Link'); + sezTherm_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + ThE_ENG.Title = sezTherm_ENG; + text_ENG = Paragraph(['Therm Link sensor is composed of a thermometer '... + 'featuring high accuracy and repeatability, '... + 'able to measure temperature values at different depths by '... + 'exploiting a single quadrupole cable that '... + 'connects different Links in a single array.']); + end + + if ThL == 0 + text.HAlign = 'justify'; + add(ThE,text); + imgThL = Image(('Tilt Link.jpg')); + imgThL.Style = {Height('5cm'),HAlign('center')}; + add(ThE,imgThL); + ThEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Therm Link']); + FIG = FIG+1; + ThEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(ThE,ThEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(ThE_ENG,text_ENG); + imgThL = Image(('Tilt Link.jpg')); + imgThL.Style = {Height('5cm'),HAlign('center')}; + add(ThE_ENG,imgThL); + ThEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Therm Link sensor']); + FIG_ENG = FIG_ENG+1; + ThEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(ThE_ENG,ThEcaption_ENG); + end + ThL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Therm Link') == 1 + if ThL == 0 + ThE = Section(); + end + sezTherm = Heading3('Therm Link'); + sezTherm.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + ThE.Title = sezTherm; + text = Paragraph(['I sensori Therm Link sono termometri '... + 'ad alta precisione e ripetibilit' char(224) ', in grado di monitorare '... + 'la temperatura a differenti profondit' char(224) ', sfruttando un '... + 'unico cavo elettrico quadripolare.']); + + %--ENG-- + if activeEN == 1 + if ThL == 0 + ThE_ENG = Section(); + end + sezTherm_ENG = Heading3('Therm Link'); + sezTherm_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + ThE_ENG.Title = sezTherm_ENG; + text_ENG = Paragraph(['Therm Link sensor is composed of a thermometer '... + 'featuring high accuracy and repeatability, '... + 'able to measure temperature values at different depths by '... + 'exploiting a single quadrupole cable that '... + 'connects different Links in a single array.']); + end + if ThL == 0 + text.HAlign = 'justify'; + add(ThE,text); + imgThL = Image(('Tilt Link.jpg')); + imgThL.Style = {Height('5cm'),HAlign('center')}; + add(ThE,imgThL); + ThEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Therm Link']); + FIG = FIG+1; + ThEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(ThE,ThEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(ThE_ENG,text_ENG); + imgThL = Image(('Tilt Link.jpg')); + imgThL.Style = {Height('5cm'),HAlign('center')}; + add(ThE_ENG,imgThL); + ThEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Therm Link sensor']); + FIG_ENG = FIG_ENG+1; + ThEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(ThE_ENG,ThEcaption_ENG); + end + ThL = 1; + end + break + end + end + end + end + add(appendice,ThE); + if activeEN == 1 + add(appendice_ENG,ThE_ENG); + end +end + +% --- PT100 Link --- +if sum(yesPT100) >= 1 + PT100 = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'PT100 Link') == 1 + if PT100 == 0 + PT100E = Section(); + end + sezPT100 = Heading3('PT100 Link'); + sezPT100.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PT100E.Title = sezPT100; + text = Paragraph(['I sensori PT100 sono termoresistenze al platino '... + 'che sfruttano la variazione di resistivit' char(224) ' del materiale per '... + 'rilevare la temperatura mediante un legame lineare. Questa tipologia '... + 'di sensori non richiede calibrazione.']); + + %--ENG-- + if activeEN == 1 + if PT100 == 0 + PT100E_ENG = Section(); + end + sezPT100_ENG = Heading3('PT100 Link'); + sezPT100_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PT100E_ENG.Title = sezPT100_ENG; + text_ENG = Paragraph(['PT100 is a platinum resistance thermometer that exploits the material resistivity '... + 'variation to evaluate the temperature with a linear correlation. This type of sensor does not need '... + 'any calibration.']); + end + if PT100 == 0 + text.HAlign = 'justify'; + add(PT100E,text); + imgPT100 = Image(('PT100.jpg')); + imgPT100.Style = {Height('3cm'),HAlign('center')}; + add(PT100E,imgPT100); + PT100caption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore PT100 Link']); + FIG = FIG+1; + PT100caption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(PT100E,PT100caption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(PT100E_ENG,text_ENG); + imgPT100 = Image(('PT100.jpg')); + imgPT100.Style = {Height('3cm'),HAlign('center')}; + add(PT100E_ENG,imgPT100); + PT100caption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - PT100 Link sensor']); + FIG_ENG = FIG_ENG+1; + PT100caption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(PT100E_ENG,PT100caption_ENG); + end + PT100 = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'PT100 Link') == 1 + if PT100 == 0 + PT100E = Section(); + end + sezPT100 = Heading3('PT100 Link'); + sezPT100.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PT100E.Title = sezPT100; + text = Paragraph(['I sensori PT100 sono termoresistenze al platino '... + 'che sfruttano la variazione di resistivit' char(224) ' del materiale per '... + 'rilevare la temperatura mediante un legame lineare. Questa tipologia '... + 'di sensori non richiede calibrazione.']); + %--ENG-- + if activeEN == 1 + if PT100 == 0 + PT100E_ENG = Section(); + end + sezPT100_ENG = Heading3('PT100 Link'); + sezPT100_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PT100E_ENG.Title = sezPT100_ENG; + text_ENG = Paragraph(['PT100 is a platinum resistance thermometer that exploits the material resistivity '... + 'variation to evaluate the temperature with a linear correlation. This type of sensor does not need '... + 'any calibration.']); + end + if PT100 == 0 + text.HAlign = 'justify'; + add(PT100E,text); + imgPT100 = Image(('PT100.jpg')); + imgPT100.Style = {Height('3cm'),HAlign('center')}; + add(PT100E,imgPT100); + PT100caption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore PT100 Link']); + FIG = FIG+1; + PT100caption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(PT100E,PT100caption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(PT100E_ENG,text_ENG); + imgPT100 = Image(('PT100.jpg')); + imgPT100.Style = {Height('3cm'),HAlign('center')}; + add(PT100E_ENG,imgPT100); + PT100caption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - PT100 Link sensor']); + FIG_ENG = FIG_ENG+1; + PT100caption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(PT100E_ENG,PT100caption_ENG); + end + PT100 = 1; + end + break + end + end + end + end + add(appendice,PT100E); + if activeEN == 1 + add(appendice_ENG,PT100E_ENG); + end +end + +% --- Tunnel Link --- +TuL = 0; +if sum(yesTuL) >= 1 + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Tunnel Link') == 1 + if TuL == 0 + STu = Section(); + end + sezTunnel = Heading3('Tunnel Link'); + sezTunnel.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + STu.Title = sezTunnel; + text = Paragraph(['I Tunnel Link sono caratterizzati dalla presenza '... + 'di un sensore MEMS 3D, equipaggiato con accelerometro e termometro. Il primo '... + 'elemento registra le inclinazioni del sensore, mentre Il termometro '... + char(232) ' utilizzato per la compensazione termica delle singole misure. '... + 'Nel dettaglio, il sensore dispone di una portata teoricamente infinita '... + '(pu' char(242) ' essere ruotato in ogni direzione dello spazio senza '... + 'particolari problemi) e nasce per misurare spostamenti significativi, '... + 'mentre per quanto riguarda le deformazioni sub-millimetriche risente dei disturbi '... + 'legati al proprio rumore di fondo di natura elettrica.']); + + %--ENG-- + if activeEN == 1 + if TuL == 0 + STu_ENG = Section(); + end + sezTunnel_ENG = Heading3('Tunnel Link'); + sezTunnel_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + STu_ENG.Title = sezTunnel_ENG; + text_ENG = Paragraph(['Each Tunnel Link features a 3D MEMS sensor, which equips an accelerometer '... + 'and a thermometer. The first element is able to record the node tilt, '... + 'while the second one provides the sensor temperature and it '... + 'is used to correct the thermal effects on the accelerometer. From a theoretical point of view, '... + 'the MEMS features an infinite range of tilt measure, while small variations in its '... + 'position are influenced by electrical noises.']); + end + if TuL == 0 + text.HAlign = 'justify'; + add(STu,text); + img = Image(('Tunnel Link.png')); + img.Style = {Height('4.5cm'),HAlign('center')}; + add(STu,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Tunnel Link']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(STu,ionhcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(STu_ENG,text_ENG); + img = Image(('Tunnel Link.png')); + img.Style = {Height('4.5cm'),HAlign('center')}; + add(STu_ENG,img); + ionhcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Tunnel Link sensor']); + FIG_ENG = FIG_ENG+1; + ionhcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(STu_ENG,ionhcaption_ENG); + end + TuL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Tunnel Link') == 1 + if TuL == 0 + STu = Section(); + end + sezTunnel = Heading3('Tunnel Link'); + sezTunnel.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + STu.Title = sezTunnel; + text = Paragraph(['I Tunnel Link sono caratterizzati dalla presenza '... + 'di un sensore MEMS 3D, equipaggiato con accelerometro e termometro. Il primo '... + 'elemento registra le inclinazioni del sensore, mentre. Il termometro '... + char(232) ' utilizzato per la compensazione termica delle singole misure. '... + 'Nel dettaglio, il sensore dispone di una portata teoricamente infinita '... + '(pu' char(242) ' essere ruotato in ogni direzione dello spazio senza '... + 'particolari problemi) e nasce per misurare spostamenti significativi, '... + 'mentre per quanto riguarda le deformazioni sub-millimetriche risente dei disturbi '... + 'legati al proprio rumore di fondo di natura elettrica.']); + %--ENG-- + if activeEN == 1 + if TuL == 0 + STu_ENG = Section(); + end + sezTunnel_ENG = Heading3('Tunnel Link'); + sezTunnel_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + STu_ENG.Title = sezTunnel_ENG; + text_ENG = Paragraph(['Each Tunnel Link features a 3D MEMS sensor, which equips an accelerometer '... + 'and a thermometer. The first element is able to record the node tilt, '... + 'while the second one provides the sensor temperature and it '... + 'is used to correct the thermal effects on the accelerometer. From a theoretical point of view, '... + 'the MEMS features an infinite range of tilt measure, while small variations in its '... + 'position are influenced by electrical noises.']); + end + if TuL == 0 + text.HAlign = 'justify'; + add(STu,text); + img = Image(('Tunnel Link.png')); + img.Style = {Height('4.5cm'),HAlign('center')}; + add(STu,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Tunnel Link']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(STu,ionhcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(STu_ENG,text_ENG); + img = Image(('Tunnel Link.png')); + img.Style = {Height('4.5cm'),HAlign('center')}; + add(STu_ENG,img); + ionhcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Tunnel Link sensor']); + FIG_ENG = FIG_ENG+1; + ionhcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(STu_ENG,ionhcaption_ENG); + end + TuL = 1; + end + break + end + end + end + end + add(appendice,STu); + if activeEN == 1 + add(appendice,STu); + end +end + +% --- Radial Link --- +RaL = 0; +if sum(yesRaL) >= 1 + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Radial Link') == 1 + if RaL == 0 + SRaL = Section(); + end + sezRadial = Heading3('Radial Link'); + sezRadial.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SRaL.Title = sezRadial; + text = Paragraph(['I Radial Link sono caratterizzati dalla presenza '... + 'di un sensore MEMS 3D, equipaggiato con accelerometro e termometro. Il primo '... + 'elemento registra le inclinazioni del sensore, mentre Il termometro '... + char(232) ' utilizzato per la compensazione termica delle singole misure. '... + 'Nel dettaglio, il sensore dispone di una portata teoricamente infinita '... + '(pu' char(242) ' essere ruotato in ogni direzione dello spazio senza '... + 'particolari problemi) e nasce per misurare spostamenti significativi, '... + 'mentre per quanto riguarda le deformazioni sub-millimetriche risente dei disturbi '... + 'legati al proprio rumore di fondo di natura elettrica.']); + %--ENG-- + if activeEN == 1 + if RaL == 0 + SRaL_ENG = Section(); + end + sezRadial_ENG = Heading3('Radial Link'); + sezRadial_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SRaL_ENG.Title = sezRadial_ENG; + text_ENG = Paragraph(['Each Radial Link features a 3D MEMS sensor, which equips an accelerometer '... + 'and a thermometer. The first component is able to record the node tilt, '... + 'while the second one provides the sensor temperature and it '... + 'is used to correct the thermal effects on the accelerometer. Form a theoretical point of view, '... + 'the MEMS features an infinite range of tilt measure, while small variations in its '... + 'position are influenced by electrical noises.']); + end + + if RaL == 0 + text.HAlign = 'justify'; + add(SRaL,text); + img = Image(('Tunnel Link.png')); + img.Style = {Height('4.5cm'),HAlign('center')}; + add(SRaL,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Radial Link']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SRaL,ionhcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(SRaL_ENG,text_ENG); + img = Image(('Tunnel Link.png')); + img.Style = {Height('4.5cm'),HAlign('center')}; + add(SRaL_ENG,img); + ionhcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Radial Link sensor']); + FIG_ENG = FIG_ENG+1; + ionhcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SRaL_ENG,ionhcaption_ENG); + end + RaL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Radial Link') == 1 + if RaL == 0 + SRaL = Section(); + end + sezRadial = Heading3('Radial Link'); + sezRadial.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SRaL.Title = sezRadial; + text = Paragraph(['I Radial Link sono caratterizzati dalla presenza '... + 'di un sensore MEMS 3D, equipaggiato con accelerometro e termometro. Il primo '... + 'elemento registra le inclinazioni del sensore, mentre. Il termometro '... + char(232) ' utilizzato per la compensazione termica delle singole misure. '... + 'Nel dettaglio, il sensore dispone di una portata teoricamente infinita '... + '(pu' char(242) ' essere ruotato in ogni direzione dello spazio senza '... + 'particolari problemi) e nasce per misurare spostamenti significativi, '... + 'mentre per quanto riguarda le deformazioni sub-millimetriche risente dei disturbi '... + 'legati al proprio rumore di fondo di natura elettrica.']); + + %--ENG-- + if activeEN == 1 + if RaL == 0 + SRaL_ENG = Section(); + end + sezRadial_ENG = Heading3('Radial Link'); + sezRadial_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SRaL_ENG.Title = sezRadial_ENG; + text_ENG = Paragraph(['Each Radial Link features a 3D MEMS sensor, which equips an accelerometer '... + 'and a thermometer. The first component is able to record the node tilt, '... + 'while the second one provides the sensor temperature and it '... + 'is used to correct the thermal effects on the accelerometer. Form a theoretical point of view, '... + 'the MEMS features an infinite range of tilt measure, while small variations in its '... + 'position are influenced by electrical noises.']); + end + if RaL == 0 + text.HAlign = 'justify'; + add(SRaL,text); + img = Image(('Tunnel Link.png')); + img.Style = {Height('4.5cm'),HAlign('center')}; + add(SRaL,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Radial Link']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SRaL,ionhcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(SRaL_ENG,text_ENG); + img = Image(('Tunnel Link.png')); + img.Style = {Height('4.5cm'),HAlign('center')}; + add(SRaL_ENG,img); + ionhcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Radial Link sensor']); + FIG_ENG = FIG_ENG+1; + ionhcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SRaL_ENG,ionhcaption_ENG); + end + RaL = 1; + end + break + end + end + end + end + add(appendice,SRaL); + if activeEN == 1 + add(appendice_ENG,SRaL_ENG); + end +end + +% --- PreConv Link --- +PCL = 0; +if sum(yesPCL) >= 1 + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'PreConv Link') == 1 + if PCL == 0 + SPCL = Section(); + end + sezPCL = Heading3('PreConv Link'); + sezPCL.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SPCL.Title = sezPCL; + text = Paragraph(['I PreConv Link sono sensori caratterizzati dalla presenza '... + 'di un MEMS 3D, equipaggiato con accelerometro e termometro. Il primo '... + 'elemento registra le inclinazioni del nodo rispetto all''orizzontale, mentre Il termometro '... + 'viene utilizzato per la compensazione termica delle singole misure. '... + 'Nel dettaglio, il sensore dispone di una portata teoricamente infinita '... + '(pu' char(242) ' essere ruotato in ogni direzione dello spazio senza '... + 'particolari problemi) e nasce per misurare spostamenti nell''ordine dei 0.2 mm/m, '... + 'mentre deformazioni pi' char(249) ' piccole sono indistinguibili '... + 'dal proprio rumore di fondo di natura elettrica.']); + %--ENG-- + if activeEN == 1 + if PCL == 0 + SPCL_ENG = Section(); + end + sezPCL_ENG = Heading3('PreConv Link'); + sezPCL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SPCL_ENG.Title = sezPCL_ENG; + text_ENG = Paragraph(['Each PreConv Link features a 3D MEMS sensor, which equips an accelerometer '... + 'and a thermometer. The first element is able to record the node tilt, '... + 'while the second one provides the sensor temperature and it '... + 'is used to correct the thermal effects on the accelerometer. Form a theoretical point of view, '... + 'the MEMS features an infinite range of tilt measure, while small variations in its '... + 'position are influenced by electrical noises.']); + end + if PCL == 0 + text.HAlign = 'justify'; + add(SPCL,text); + img = Image(('Klino.png')); + img.Style = {Height('4cm'),HAlign('center')}; + add(SPCL,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore PreConv Link']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SPCL,ionhcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(SPCL_ENG,text_ENG); + img = Image(('Klino.png')); + img.Style = {Height('4cm'),HAlign('center')}; + add(SPCL_ENG,img); + ionhcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - PreConv Link sensor']); + FIG_ENG = FIG_ENG+1; + ionhcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SPCL_ENG,ionhcaption_ENG); + end + PCL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'PreConv Link') == 1 + if PCL == 0 + SPCL = Section(); + end + sezPCL = Heading3('PreConv Link'); + sezPCL.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SPCL.Title = sezPCL; + text = Paragraph(['I PreConv Link sono sensori caratterizzati dalla presenza '... + 'di un MEMS 3D, equipaggiato con accelerometro e termometro. Il primo '... + 'elemento registra le inclinazioni del nodo rispetto all''orizzontale, mentre Il termometro '... + 'viene utilizzato per la compensazione termica delle singole misure. '... + 'Nel dettaglio, il sensore dispone di una portata teoricamente infinita '... + '(pu' char(242) ' essere ruotato in ogni direzione dello spazio senza '... + 'particolari problemi) e nasce per misurare spostamenti nell''ordine dei 0.2 mm/m, '... + 'mentredeformazioni pi' char(242) ' piccole sono indistinguibili '... + 'dal proprio rumore di fondo di natura elettrica.']); + %--ENG-- + if activeEN == 1 + if PCL == 0 + SPCL_ENG = Section(); + end + sezPCL_ENG = Heading3('PreConv Link'); + sezPCL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SPCL_ENG.Title = sezPCL_ENG; + text_ENG = Paragraph(['Each PreConv Link features a 3D MEMS sensor, which equips an accelerometer '... + 'and a thermometer. The first element is able to record the node tilt, '... + 'while the second one provides the sensor temperature and it '... + 'is used to correct the thermal effects on the accelerometer. Form a theoretical point of view, '... + 'the MEMS features an infinite range of tilt measure, while small variations in its '... + 'position are influenced by electrical noises.']); + end + if PCL == 0 + text.HAlign = 'justify'; + add(SPCL,text); + img = Image(('Klino.png')); + img.Style = {Height('4cm'),HAlign('center')}; + add(SPCL,img); + ionhcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore PreConv Link']); + FIG = FIG+1; + ionhcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SPCL,ionhcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(SPCL_ENG,text_ENG); + img = Image(('Klino.png')); + img.Style = {Height('4cm'),HAlign('center')}; + add(SPCL_ENG,img); + ionhcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - PreConv Link sensor']); + FIG_ENG = FIG_ENG+1; + ionhcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SPCL_ENG,ionhcaption_ENG); + end + PCL = 1; + end + break + end + end + end + end + add(appendice,SPCL); + if activeEN == 1 + add(appendice_ENG,SPCL_ENG); + end +end + +% --- Rain Link --- +if sum(yesRL) >= 1 + RL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Rain Link') == 1 + if RL == 0 + RLE = Section(); + end + sezRain = Heading3('Rain Link'); + sezRain.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + RLE.Title = sezRain; + text = Paragraph(['Il sensore Rain Link ' char(232) ' un pluviometro '... + 'in grado di misurare l''altezza di pioggia secondo il '... + 'periodo di campionamento specificato.']); + %--ENG-- + if activeEN == 1 + if RL == 0 + RLE_ENG = Section(); + end + sezRain_ENG = Heading3('Rain Link'); + sezRain_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + RLE_ENG.Title = sezRain_ENG; + text_ENG = Paragraph(['Rain Link is a rain gauge sensor able to collect rainfall data '... + 'with a predefined sampling period.']); + end + if RL == 0 + text.HAlign = 'justify'; + add(RLE,text); + imgRL = Image(('Rain.png')); + imgRL.Style = {Height('3.5cm'),HAlign('center')}; + add(RLE,imgRL); + REcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Rain Link']); + FIG = FIG+1; + REcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(RLE,REcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(RLE_ENG,text_ENG); + imgRL = Image(('Rain.png')); + imgRL.Style = {Height('3.5cm'),HAlign('center')}; + add(RLE_ENG,imgRL); + REcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Rain Link sensor']); + FIG_ENG = FIG_ENG+1; + REcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(RLE_ENG,REcaption_ENG); + end + RL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Rain Link') == 1 + if RL == 0 + RLE = Section(); + end + sezRain = Heading3('Rain Link'); + sezRain.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + RLE.Title = sezRain; + text = Paragraph(['Il sensore Rain Link ' char(232) ' un pluviometro '... + 'in grado di misurare l''altezza di pioggia secondo il '... + 'periodo di campionamento specificato.']); + %--ENG-- + if activeEN == 1 + if RL == 0 + RLE_ENG = Section(); + end + sezRain_ENG = Heading3('Rain Link'); + sezRain_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + RLE_ENG.Title = sezRain_ENG; + text_ENG = Paragraph(['Rain Link is a rain gauge sensor able to collect rainfall data '... + 'with a predefined sampling period.']); + end + if RL == 0 + text.HAlign = 'justify'; + add(RLE,text); + imgRL = Image(('Rain.png')); + imgRL.Style = {Height('3.5cm'),HAlign('center')}; + add(RLE,imgRL); + REcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Rain Link']); + FIG = FIG+1; + REcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(RLE,REcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(RLE_ENG,text_ENG); + imgRL = Image(('Rain.png')); + imgRL.Style = {Height('3.5cm'),HAlign('center')}; + add(RLE_ENG,imgRL); + REcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Rain Link sensor']); + FIG_ENG = FIG_ENG+1; + REcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(RLE_ENG,REcaption_ENG); + end + RL = 1; + end + break + end + end + end + end + add(appendice,RLE); + if activeEN == 1 + add(appendice_ENG,RLE_ENG); + end +end + +% --- Crack Link --- +if sum(yesCrL) >= 1 + CrL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Crack Link') == 1 + if CrL == 0 + CrE = Section(); + end + sezCrack = Heading3('Crack Link'); + sezCrack.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + CrE.Title = sezCrack; + text = Paragraph(['I sensori Crack Link sono fessurimetri analogici '... + 'che vengono letti mediante un modulo GMUX, convertitore di segnale '... + 'da analogico a digitale, o centralina ASE201. I fessurimetri vengono '... + 'posti perpendicolarmente a cavallo di fessure esistenti '... + 'o nelle zone in cui con maggiore probabilit' char(224) ' '... + 'potrebbero svilupparsi delle fessurazioni.']); + + %--ENG-- + if activeEN == 1 + if CrL == 0 + CrE_ENG = Section(); + end + 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_ENG; + text_ENG = Paragraph(['Crack Link sensor is an analog crack meter, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. Crack meters are located across surface cracks, or in specific areas '... + 'where the generation of surface fissures is expected.']); + end + if CrL == 0 + text.HAlign = 'justify'; + add(CrE,text); + imgKL = Image(('Crack.jpg')); + imgKL.Style = {Height('4.5cm'),HAlign('center')}; + add(CrE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Crack Link']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(CrE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(CrE_ENG,text_ENG); + imgKL = Image(('Crack.jpg')); + imgKL.Style = {Height('4.5cm'),HAlign('center')}; + add(CrE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Crack Link sensor']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(CrE_ENG,KEcaption_ENG); + end + CrL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Crack Link') == 1 + if CrL == 0 + CrE = Section(); + end + sezCrack = Heading3('Crack Link'); + sezCrack.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + CrE.Title = sezCrack; + text = Paragraph(['I sensori Crack Link sono fessurimetri analogici '... + 'che vengono letti mediante un modulo GMUX, convertitore di segnale '... + 'da analogico a digitale, o centralina ASE201. I fessurimetri vengono '... + 'posti perpendicolarmente a cavallo di fessure esistenti '... + 'o nelle zone in cui con maggiore probabilit' char(224) ' '... + 'potrebbero svilupparsi delle fessurazioni.']); + %--ENG-- + if activeEN == 1 + if CrL == 0 + CrE_ENG = Section(); + end + 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_ENG; + text_ENG = Paragraph(['Crack Link sensor is an analog crack meter, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. Crack meters are located across surface cracks, or in specific areas '... + 'where the generation of surface fissures is expected.']); + end + if CrL == 0 + text.HAlign = 'justify'; + add(CrE,text); + imgKL = Image(('Crack.jpg')); + imgKL.Style = {Height('4.5cm'),HAlign('center')}; + add(CrE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Crack Link']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(CrE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(CrE_ENG,text_ENG); + imgKL = Image(('Crack.jpg')); + imgKL.Style = {Height('4.5cm'),HAlign('center')}; + add(CrE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Crack Link sensor']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(CrE_ENG,KEcaption_ENG); + end + CrL = 1; + end + break + end + end + end + end + add(appendice,CrE); + if activeEN == 1 + add(appendice_ENG,CrE_ENG); + end +end + +% --- 3D Crack Link --- +if sum(yes3DCrL) >= 1 + CrL3D = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'3D Crack Link') == 1 + if CrL3D == 0 + Cr3DE = Section(); + end + sezCrack3D = Heading3('3D Crack Link'); + sezCrack3D.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + Cr3DE.Title = sezCrack3D; + text = Paragraph(['I sensori 3D Crack Link sono fessurimetri tridimensionali analogici, '... + 'letti mediante un modulo GMUX, convertitore di segnale '... + 'da analogico a digitale, o una centralina ASE201. I fessurimetri '... + 'vengono posti perpendicolarmente a cavallo di fessure esistenti o nelle zone in cui '... + 'con maggiore probabilit' char(224) 'potrebbero svilupparsi delle fessurazioni lungo '... + 'tre dimensioni fra loro perpendicolari.']); + %--ENG-- + if activeEN == 1 + if CrL3D == 0 + Cr3DE_ENG = Section(); + end + sezCrack3D_ENG = Heading3('3D Crack Link'); + sezCrack3D_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + Cr3DE_ENG.Title = sezCrack3D_ENG; + text_ENG = Paragraph(['3D Crack Link sensor is a three-dimension analog crack meter, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. 3D Crack meters are located across surface cracks, or in specific areas '... + 'where the generation of surface fissures is expected.']); + end + if CrL3D == 0 + text.HAlign = 'justify'; + add(Cr3DE,text); + imgKL = Image(('3DCrack.jpg')); + imgKL.Style = {Height('5cm'),HAlign('center')}; + add(Cr3DE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore 3D Crack Link (fonte: Pizzi Instruments)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Cr3DE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(Cr3DE_ENG,text_ENG); + imgKL = Image(('3DCrack.jpg')); + imgKL.Style = {Height('5cm'),HAlign('center')}; + add(Cr3DE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - 3D Crack Link sensor (source: Pizzi Instruments)']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Cr3DE_ENG,KEcaption_ENG); + end + CrL3D = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'3D Crack Link') == 1 + if CrL3D == 0 + Cr3DE = Section(); + end + sezCrack3D = Heading3('3D Crack Link'); + sezCrack3D.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + Cr3DE.Title = sezCrack3D; + text = Paragraph(['I sensori 3D Crack Link sono fessurimetri tridimensionali analogici, '... + 'letti mediante un modulo GMUX, convertitore di segnale '... + 'da analogico a digitale, o una centralina ASE201. I fessurimetri '... + 'vengono posti perpendicolarmente a cavallo di fessure esistenti o nelle zone in cui '... + 'con maggiore probabilit' char(224) 'potrebbero svilupparsi delle fessurazioni lungo '... + 'tre dimensioni fra loro perpendicolari.']); + %--ENG-- + if activeEN == 1 + if CrL3D == 0 + Cr3DE_ENG = Section(); + end + sezCrack3D_ENG = Heading3('3D Crack Link'); + sezCrack3D_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + Cr3DE_ENG.Title = sezCrack3D_ENG; + text_ENG = Paragraph(['3D Crack Link sensor is a three-dimension analog crack meter, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. 3D Crack meters are located across surface cracks, or in specific areas '... + 'where the generation of surface fissures is expected.']); + end + if CrL3D == 0 + text.HAlign = 'justify'; + add(Cr3DE,text); + imgKL = Image(('3DCrack.jpg')); + imgKL.Style = {Height('5cm'),HAlign('center')}; + add(Cr3DE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore 3D Crack Link (fonte: Pizzi Instruments)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Cr3DE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(Cr3DE_ENG,text_ENG); + imgKL = Image(('3DCrack.jpg')); + imgKL.Style = {Height('5cm'),HAlign('center')}; + add(Cr3DE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - 3D Crack Link sensor (source: Pizzi Instruments)']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(Cr3DE_ENG,KEcaption_ENG); + end + CrL3D = 1; + end + break + end + end + end + end + add(appendice,Cr3DE); + if activeEN == 1 + add(appendice_ENG,r3DE_ENG); + end +end + +% --- Extensometer Link --- +if sum(yesEL) >= 1 + EL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Extensometer Link') == 1 + if EL == 0 + EE = Section(); + end + sezExtensometer = Heading3('Extensometer Link'); + sezExtensometer.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE.Title = sezExtensometer; + text = Paragraph(['I sensori Extensometer Link sono barrette estensimetriche analogiche '... + 'che vengono lette mediante un modulo GMUX, convertitore di segnale '... + 'da analogico a digitale, o centralina ASE201. Le barrette vengono poste a cavallo '... + 'delle zone da monitorare e rilevano microfessurazioni '... + 'adimensionalizzate rispetto alla lunghezza della barretta stessa.']); + + %--ENG-- + if activeEN == 1 + if EL == 0 + EE_ENG = Section(); + end + sezExtensometer_ENG = Heading3('Extensometer Link'); + sezExtensometer_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE_ENG.Title = sezExtensometer_ENG; + text_ENG = Paragraph(['Extensometer Link is a sensor composed of an analog extensometer, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. Extensometers are located in specific areas in order to '... + 'detect the formation of micro-fractures, which are measured with a parameter that depends on the '... + 'length of the monitoring tool.']); + end + if EL == 0 + text.HAlign = 'justify'; + add(EE,text); + imgKL = Image(('Extensometer.png')); + imgKL.Style = {Height('2.7cm'),HAlign('center')}; + add(EE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Extensometer Link (fonte: Earth System)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(EE_ENG,text_ENG); + imgKL = Image(('Extensometer.png')); + imgKL.Style = {Height('2.7cm'),HAlign('center')}; + add(EE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Extensometer Link sensor (source: Earth System)']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE_ENG,KEcaption_ENG); + end + EL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Extensometer Link') == 1 + if EL == 0 + EE = Section(); + end + sezExtensometer = Heading3('Extensometer Link'); + sezExtensometer.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE.Title = sezExtensometer; + text = Paragraph(['I sensori Extensometer Link sono barrette estensimetriche analogiche '... + 'che vengono lette mediante un modulo GMUX, convertitore di segnale '... + 'da analogico a digitale, o centralina ASE201. Le barrette vengono poste a cavallo '... + 'delle zone da monitorare e rilevano microfessurazioni '... + 'adimensionalizzate rispetto alla lunghezza della barretta stessa.']); + %--ENG-- + if activeEN == 1 + if EL == 0 + EE_ENG = Section(); + end + sezExtensometer_ENG = Heading3('Extensometer Link'); + sezExtensometer_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE_ENG.Title = sezExtensometer_ENG; + text_ENG = Paragraph(['Extensometer Link is a sensor composed of an analog extensometer, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. Extensometers are located in specific areas in order to '... + 'detect the formation of micro-fractures, which are measured with a parameter that depends on the '... + 'length of the monitoring tool.']); + end + if EL == 0 + text.HAlign = 'justify'; + add(EE,text); + imgKL = Image(('Extensometer.png')); + imgKL.Style = {Height('2.7cm'),HAlign('center')}; + add(EE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Extensometer Link (fonte: Earth System)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(EE_ENG,text_ENG); + imgKL = Image(('Extensometer.png')); + imgKL.Style = {Height('2.7cm'),HAlign('center')}; + add(EE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Extensometer Link sensor (source: Earth System)']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE_ENG,KEcaption_ENG); + end + EL = 1; + end + break + end + end + end + end + add(appendice,EE); + if activeEN == 1 + add(appendice_ENG,EE_ENG); + end +end + +% --- 3D Extensometer Link --- +if sum(yes3DEL) >= 1 + EL3D = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'3D Extensometer Link') == 1 + if EL3D == 0 + EE = Section(); + end + sez3DExtensometer = Heading3('3D Extensometer Link'); + sez3DExtensometer.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE.Title = sez3DExtensometer; + text = Paragraph(['I sensori 3D Extensometer Link sono terne di '... + 'barrette estensimetriche analogiche, lette mediante modulo GMUX, '... + 'convertitore di segnale da analogico a digitale, o centralina ASE201. '... + 'Le barrette vengono poste a cavallo delle zone da monitorare e rilevano '... + 'microfessurazioni adimensionalizzate rispetto alla lunghezza della barretta '... + 'stessa. A seconda della tipologia di impiego, si distinguono in barrette '... + 'da calcestruzzo o a saldare.']); + %--ENG-- + if acriveEN == 1 + if EL3D == 0 + EE_ENG = Section(); + end + sez3DExtensometer_ENG = Heading3('3D Extensometer Link'); + sez3DExtensometer_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE_ENG.Title = sez3DExtensometer_ENG; + text_ENG = Paragraph(['3D Extensometer Link is a sensor composed of three analog strain gauges, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. Strain gauges are located in specific areas in order to '... + 'detect the formation of micro-fractures, which are measured with a parameter that depends on the '... + 'length of the monitoring tool.']); + end + if EL3D == 0 + text.HAlign = 'justify'; + add(EE,text); + imgKL = Image(('3DExtensometer.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore 3D Extensometer Link (fonte: Earth System)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(EE_ENG,text_ENG); + imgKL = Image(('3DExtensometer.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - 3D Extensometer Link sensor (source: Earth System)']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE_ENG,KEcaption_ENG); + end + EL3D = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'3D Extensometer Link') == 1 + if EL3D == 0 + EE = Section(); + end + sez3DExtensometer = Heading3('3D Extensometer Link'); + sez3DExtensometer.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE.Title = sez3DExtensometer; + text = Paragraph(['I sensori 3D Extensometer Link sono terne di '... + 'barrette estensimetriche analogiche, lette mediante modulo GMUX, '... + 'convertitore di segnale da analogico a digitale, o centralina ASE201. '... + 'Le barrette vengono poste a cavallo delle zone da monitorare e rilevano '... + 'microfessurazioni adimensionalizzate rispetto alla lunghezza della barretta '... + 'stessa. A seconda della tipologia di impiego, si distinguono in barrette '... + 'da calcestruzzo o a saldare.']); + %--ENG-- + if acriveEN == 1 + if EL3D == 0 + EE_ENG = Section(); + end + sez3DExtensometer_ENG = Heading3('3D Extensometer Link'); + sez3DExtensometer_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE_ENG.Title = sez3DExtensometer_ENG; + text_ENG = Paragraph(['3D Extensometer Link is a sensor composed of three analog strain gauges, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. Strain gauges are located in specific areas in order to '... + 'detect the formation of micro-fractures, which are measured with a parameter that depends on the '... + 'length of the monitoring tool.']); + end + if EL3D == 0 + text.HAlign = 'justify'; + add(EE,text); + imgKL = Image(('3DExtensometer.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore 3D Extensometer Link (fonte: Earth System)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(EE_ENG,text_ENG); + imgKL = Image(('3DExtensometer.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - 3D Extensometer Link sensor (source: Earth System)']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE_ENG,KEcaption_ENG); + end + EL3D = 1; + end + break + end + end + end + end + add(appendice,EE); + if activeEN == 1 + add(appendice_ENG,EE_ENG); + end +end + +% --- Wire Extensometer Link --- +if sum(yesWEL) >= 1 + WEL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Wire Extensometer Link') == 1 + if WEL == 0 + EE = Section(); + end + sezWireExtensometer = Heading3('Wire Extensometer Link'); + sezWireExtensometer.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE.Title = sezWireExtensometer; + text = Paragraph(['I sensori Wire Extensometer Link sono estensimetri a filo analogici, '... + 'letti mediante modulo GMUX, convertitore di segnale da analogico a digitale, o centralina ASE201. '... + 'Lo strumento viene posto a cavallo delle zone da monitorare, con la base '... + 'da un lato della fessura ed il filo fissato dall''altro lato e rileva '... + 'l''allungamento o l''accorciamento del filo stesso, indice dell''apertura '... + 'o chiusura della fessura presente nella zona monitorata. ']); + %--ENG-- + if activeEN == 1 + if WEL == 0 + EE_ENG = Section(); + end + sezWireExtensometer_ENG = Heading3('Wire Extensometer Link'); + sezWireExtensometer_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE_ENG.Title = sezWireExtensometer_ENG; + text_ENG = Paragraph(['Wire Extensometer Link is an analog wire extensometer sensor, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. The device is placed in specific areas where fissures are observed, by installing the '... + 'base on one side and fixing the wire on the other one. The aim is to determine the crack opening/closing '... + 'according to the wire length variation.']); + end + if WEL == 0 + text.HAlign = 'justify'; + add(EE,text); + imgKL = Image(('wire.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Wire Extensometer Link (fonte: Earth System)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(EE_ENG,text_ENG); + imgKL = Image(('wire.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Wire Extensometer Link sensor (source: Earth System)']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE_ENG,KEcaption_ENG); + end + WEL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Wire Extensometer Link') == 1 + if WEL == 0 + EE = Section(); + end + sezWireExtensometer = Heading3('Wire Extensometer Link'); + sezWireExtensometer.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE.Title = sezWireExtensometer; + text = Paragraph(['I sensori Wire Extensometer Link sono estensimetri a filo analogici, '... + 'letti mediante modulo GMUX, convertitore di segnale da analogico a digitale, o centralina ASE201. '... + 'Lo strumento viene posto a cavallo delle zone da monitorare, con la base '... + 'da un lato della fessura ed il filo fissato dall''altro lato e rileva '... + 'l''allungamento o l''accorciamento del filo stesso, indice dell''apertura '... + 'o chiusura della fessura presente nella zona monitorata. ']); + %--ENG-- + if activeEN == 1 + if WEL == 0 + EE_ENG = Section(); + end + sezWireExtensometer_ENG = Heading3('Wire Extensometer Link'); + sezWireExtensometer_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE_ENG.Title = sezWireExtensometer_ENG; + text_ENG = Paragraph(['Wire Extensometer Link is an analog wire extensometer sensor, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. The device is placed in specific areas where fissures are observed, by installing the '... + 'base on one side and fixing the wire on the other one. The aim is to determine the crack opening/closing '... + 'according to the wire length variation.']); + end + if WEL == 0 + text.HAlign = 'justify'; + add(EE,text); + imgKL = Image(('wire.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Wire Extensometer Link (fonte: Earth System)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(EE_ENG,text_ENG); + imgKL = Image(('wire.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Wire Extensometer Link sensor (source: Earth System)']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE_ENG,KEcaption_ENG); + end + WEL = 1; + end + break + end + end + end + end + add(appendice,EE); + if activeEN == 1 + add(appendice_ENG,EE_ENG); + end +end + +% --- MultiPoint Borehole Extensometer --- +if sum(yesMPBEL) >= 1 + MPBEL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Multi Point Borehole Extensometer Link') == 1 + if MPBEL == 0 + EE = Section(); + end + sezMPBEL = Heading3('Multi Point Borehole Rod Extensometer'); + sezMPBEL.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE.Title = sezMPBEL; + text = Paragraph(['I sensori Multi Point Borehole Rod Extensometer sono estensimetri multibase '... + 'analogici, letti mediante modulo GMUX, convertitore di segnale da analogico a digitale, o '... + 'centralina ASE201. Lo strumento viene posto all''interno di perforazioni radiali '... + 'ed ' char(232) ' caratterizzato dalla presenza di una o pi' char(250) ' basi a lunghezza differente. '... + 'Comparando le deformazioni delle singole basi, si ' char(232) ' in grado di risalire '... + 'alla zona in cui si sono sviluppati i movimenti radiali.']); + %--ENG-- + if activeEN == 1 + if MPBEL == 0 + EE_ENG = Section(); + end + sezMPBEL_ENG = Heading3('Multi Point Borehole Rod Extensometer'); + sezMPBEL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE_ENG.Title = sezMPBEL_ENG; + text_ENG = Paragraph(['Multi Point Borehole Extensometer Link is '... + 'an analog multi point borehole rod extensometer '... + 'sensor, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. The device is placed inside a radial drilling borehole, and features one or more rods in different positions. '... + 'The tool allows to identify the areas experiencing higher deformations, by comparing data coming from different rods.']); + end + if MPBEL == 0 + text.HAlign = 'justify'; + add(EE,text); + imgKL = Image(('MPBEL.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Multi Point Borehole Rod Extensometer Link (fonte: Earth System)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(EE_ENG,text_ENG); + imgKL = Image(('MPBEL.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Multi Point Borehole Rod Extensometer Link sensor (source: Earth System)']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE_ENG,KEcaption_ENG); + end + MPBEL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Multi Point Borehole Extensometer Link') == 1 + if MPBEL == 0 + EE = Section(); + end + sezMPBEL = Heading3('Multi Point Borehole Rod Extensometer'); + sezMPBEL.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE.Title = sezMPBEL; + text = Paragraph(['I sensori Multi Point Borehole Rod Extensometer sono estensimetri multibase '... + 'analogici, letti mediante modulo GMUX, convertitore di segnale da analogico a digitale, o '... + 'centralina ASE201. Lo strumento viene posto all''interno di perforazioni radiali '... + 'ed ' char(232) ' caratterizzato dalla presenza di una o pi' char(250) ' basi a lunghezza differente. '... + 'Comparando le deformazioni delle singole basi, si ' char(232) ' in grado di risalire '... + 'alla zona in cui si sono sviluppati i movimenti radiali.']); + %--ENG-- + if activeEN == 1 + if MPBEL == 0 + EE_ENG = Section(); + end + sezMPBEL_ENG = Heading3('Multi Point Borehole Rod Extensometer'); + sezMPBEL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + EE_ENG.Title = sezMPBEL_ENG; + text_ENG = Paragraph(['Multi Point Borehole Extensometer Link is '... + 'an analog multi point borehole rod extensometer '... + 'sensor, read by implementing '... + 'a GMUX module able to convert its signal into a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. The device is placed inside a radial drilling borehole, and features one or more rods in different positions. '... + 'The tool allows to identify the areas experiencing higher deformations, by comparing data coming from different rods.']); + end + if MPBEL == 0 + text.HAlign = 'justify'; + add(EE,text); + imgKL = Image(('MPBEL.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE,imgKL); + KEcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Multi Point Borehole Rod Extensometer Link (fonte: Earth System)']); + FIG = FIG+1; + KEcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE,KEcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(EE_ENG,text_ENG); + imgKL = Image(('MPBEL.png')); + imgKL.Style = {Height('4cm'),HAlign('center')}; + add(EE_ENG,imgKL); + KEcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Multi Point Borehole Rod Extensometer Link sensor (source: Earth System)']); + FIG_ENG = FIG_ENG+1; + KEcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(EE_ENG,KEcaption_ENG); + end + MPBEL = 1; + end + break + end + end + end + end + add(appendice,EE); + if activeEN == 1 + add(appendice_ENG,EE_ENG); + end +end + +% --- Load Link --- +if sum(yesLL)>=1 + LL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Load Link') == 1 + if LL == 0 + SL = Section(); + end + sezLL = Heading3('Load Link'); + sezLL.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SL.Title = sezLL; + text = Paragraph(['I sensori Load Link sono celle di carico '... + 'analogiche, lette mediante modulo GMUX, convertitore di segnale da analogico a digitale, o '... + 'centralina ASE201/G201. Lo strumento, a seconda della tipologia, misura il carico di compressione '... + 'o trazione che agisce perpendicolarmente rispetto allo stesso.']); + + %--ENG-- + if activeEN == 1 + if LL == 0 + SL_ENG = Section(); + end + sezLL_ENG = Heading3('Load Link'); + sezLL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SL_ENG.Title = sezLL_ENG; + text = Paragraph(['Load Link is an analog load sensor, '... + 'read by implementing a GMUX module able to convert its signal into '... + 'a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. Depending on the sensor working principle, the device is able to measure '... + 'compression or traction loads acting in perpendicular direction.']); + end + if LL == 0 + text.HAlign = 'justify'; + add(SL,text); + imgLL = Image(('LL.jpg')); + imgLL.Style = {Height('4cm'),HAlign('center')}; + add(SL,imgLL); + LLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Load Link (fonte: Earth System)']); + FIG = FIG+1; + LLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SL,LLcaption); + LL = 1; + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(SL_ENG,text_ENG); + imgLL = Image(('LL.jpg')); + imgLL.Style = {Height('4cm'),HAlign('center')}; + add(SL_ENG,imgLL); + LLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Load Link sensor (source: Earth System)']); + FIG_ENG = FIG_ENG+1; + LLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SL_ENG,LLcaption_ENG); + LL = 1; + end + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Load Link') == 1 + if LL == 0 + SL = Section(); + end + sezLL = Heading3('Load Link'); + sezLL.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SL.Title = sezLL; + text = Paragraph(['I sensori Load Link sono celle di carico '... + 'analogiche, lette mediante modulo GMUX, convertitore di segnale da analogico a digitale, o '... + 'centralina ASE201/G201. Lo strumento, a seconda della tipologia, misura il carico di compressione '... + 'o trazione che agisce perpendicolarmente rispetto allo stesso.']); + %--ENG-- + if activeEN == 1 + if LL == 0 + SL_ENG = Section(); + end + sezLL_ENG = Heading3('Load Link'); + sezLL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SL_ENG.Title = sezLL_ENG; + text = Paragraph(['Load Link is an analog load sensor, '... + 'read by implementing a GMUX module able to convert its signal into '... + 'a digital one, or by connecting it to a dedicated ASE201 '... + 'control unit. Depending on the sensor working principle, the device is able to measure '... + 'compression or traction loads acting in perpendicular direction.']); + end + if LL == 0 + text.HAlign = 'justify'; + add(SL,text); + imgLL = Image(('LL.jpg')); + imgLL.Style = {Height('4cm'),HAlign('center')}; + add(SL,imgLL); + LLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Load Link (fonte: Earth System)']); + FIG = FIG+1; + LLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SL,LLcaption); + if activeEN == 1 + + text_ENG.HAlign = 'justify'; + add(SL_ENG,text_ENG); + imgLL = Image(('LL.jpg')); + imgLL.Style = {Height('4cm'),HAlign('center')}; + add(SL_ENG,imgLL); + LLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Load Link sensor (source: Earth System)']); + FIG_ENG = FIG_ENG+1; + LLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SL_ENG,LLcaption_ENG); + end + LL = 1; + end + break + end + end + end + end + add(appendice,SL); + if activeEN == 1 + add(appendice_ENG,SL_ENG); + end +end + +% --- Trigger Link --- +if sum(yesTrL)>=1 + % Trigger standard + if appTS == 1 + FC = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Trigger Link') == 1 + if FC == 0 + TRL = Section(); + end + sezTRL = Heading3('Trigger Link'); + sezTRL.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + TRL.Title = sezTRL; + text = Paragraph(['Il Trigger Link ' char(232) ' un sensore analogico costituito da un finecorsa elettro-meccanico, '... + 'la cui attivazione serve a inizializzare una serie di procedure predefinite sulla centralina a cui '... + char(232) ' collegato (e.g. lettura dei sensori, trasmissione dati, ecc.).']); + + %--ENG-- + if activeEN == 1 + if FC == 0 + TRL_ENG = Section(); + end + sezTRL_ENG = Heading3('Trigger Link'); + sezTRL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + TRL_ENG.Title = sezTRL_ENG; + text_ENG = Paragraph(['Trigger Link is an analog sensor integrating an electro-mechanical switch, '... + 'whose activation leads to the initialization of predefined procedures involving the control unit '... + 'to which it is connected (e.g. sensors reading, data transmission, etc.).']); + end + if FC == 0 + text.HAlign = 'justify'; + add(TRL,text); + imgTRL = Image(('TRL.jpg')); + imgTRL.Style = {Height('4cm'),HAlign('center')}; + add(TRL,imgTRL); + TRLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Trigger Link']); + FIG = FIG+1; + TRLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(TRL,TRLcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(TRL_ENG,text_ENG); + imgTRL = Image(('TRL.jpg')); + imgTRL.Style = {Height('4cm'),HAlign('center')}; + add(TRL_ENG,imgTRL); + TRLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Trigger Link sensor']); + FIG_ENG = FIG_ENG+1; + TRLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(TRL_ENG,TRLcaption_ENG); + end + FC = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Trigger Link') == 1 + if FC == 0 + TRL = Section(); + end + sezTRL = Heading3('Trigger Link'); + sezTRL.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + TRL.Title = sezTRL; + text = Paragraph(['Il Trigger Link ' char(232) ' un sensore analogico costituito da un finecorsa elettro-meccanico, '... + 'la cui attivazione serve a inizializzare une serie di procedure predefinite sulla centralina a cui '... + char(232) ' collegato (e.g. lettura dei sensori, trasmissione dati, ecc.).']); + + %--ENG-- + if activeEN == 1 + if FC == 0 + TRL_ENG = Section(); + end + sezTRL_ENG = Heading3('Trigger Link'); + sezTRL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + TRL_ENG.Title = sezTRL_ENG; + text_ENG = Paragraph(['Trigger Link is an analog sensor integrating an electro-mechanical switch, '... + 'whose activation leads to the initialization of predefined procedures involving the control unit '... + 'to which it is connected (e.g. sensors reading, data transmission, etc.).']); + end + if FC == 0 + text.HAlign = 'justify'; + add(TRL,text); + imgTRL = Image(('TRL.jpg')); + imgTRL.Style = {Height('4cm'),HAlign('center')}; + add(TRL,imgTRL); + TRLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Trigger Link']); + FIG = FIG+1; + TRLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(TRL,TRLcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(TRL_ENG,text_ENG); + imgTRL = Image(('TRL.jpg')); + imgTRL.Style = {Height('4cm'),HAlign('center')}; + add(TRL_ENG,imgTRL); + TRLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Trigger Link sensor']); + FIG_ENG = FIG_ENG+1; + TRLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(TRL_ENG,TRLcaption_ENG); + end + FC = 1; + end + break + end + end + end + end + add(appendice,TRL); + if activeEN == 1 + add(appendice_ENG,TRL_ENG); + end + end + % Corda a strappo Nesa + if appNW == 1 + NW = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Trigger Link') == 1 + if NW == 0 + NL = Section(); + end + sezNL = Heading3('Corda a strappo'); + sezNL.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + NL.Title = sezNL; + text = Paragraph(['La corda a strappo ' char(232) ' uno strumento di monitoraggio che viene installato in corrispondenza '... + 'di un punto dove ' char(232) ' previsto il passaggio di una colata di detrito. La rottura del cavo segnala che il fenomeno '... + char(232) ' in atto e permette di allertare le autorit' char(224) ' preposte alla gestione del sito monitorato.']); + + %--ENG-- + if activeEN == 1 + if NW == 0 + NL_ENG = Section(); + end + sezNL_ENG = Heading3('Wire sensor'); + sezNL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + NL_ENG.Title = sezNL_ENG; + text_ENG = Paragraph(['The wire sensor is a monitoring device installed in an area where the occurence of '... + 'a debris flow is expected. The cut of the wire sensor indicates that the event is currently ongoing, and '... + 'allows to send alert messages to authorities responsible of the monitored site.']); + end + if NW == 0 + text.HAlign = 'justify'; + add(NL,text); + imgNL = Image(('corda.jpg')); + imgNL.Style = {Height('4cm'),HAlign('center')}; + add(NL,imgNL); + NLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Corda a strappo e centralina di acquisizione (fonte: Nesa Srl)']); + FIG = FIG+1; + NLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(NL,NLcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(NL_ENG,text_ENG); + imgNL = Image(('corda.jpg')); + imgNL.Style = {Height('4cm'),HAlign('center')}; + add(NL_ENG,imgNL); + NLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Wire sensor and data logger (source: Nesa Srl']); + FIG_ENG = FIG_ENG+1; + NLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(NL_ENG,NLcaption_ENG); + end + NW = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Trigger Link') == 1 + if NW == 0 + NL = Section(); + end + sezNL = Heading3('Trigger Link'); + sezNL.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + NL.Title = sezNL; + text = Paragraph(['La corda a strappo ' char(232) ' uno strumento di monitoraggio che viene installato in corrispondenza '... + 'di un punto dove ' char(232) ' previsto il passaggio di una colata di detrito. La rottura del cavo segnala che il fenomeno '... + char(232) ' in atto e permette di allertare le autorit' char(224) ' preposte alla gestione del sito monitorato.']); + + %--ENG-- + if activeEN == 1 + if NW == 0 + NL_ENG = Section(); + end + sezNL_ENG = Heading3('Wire sensor'); + sezNL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + NL_ENG.Title = sezNL_ENG; + text_ENG = Paragraph(['The wire sensor is a monitoring device installed in an area where the occurence of '... + 'a debris flow is expected. The cut of the wire sensor indicates that the event is currently ongoing, and '... + 'allows to send alert messages to authorities responsible of the monitored site.']); + end + if NW == 0 + text.HAlign = 'justify'; + add(NL,text); + imgNL = Image(('corda.jpg')); + imgNL.Style = {Height('4cm'),HAlign('center')}; + add(NL,imgNL); + NLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Corda a strappo e centralina di acquisizione (fonte: Nesa Srl)']); + FIG = FIG+1; + NLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(NL,NLcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(NL_ENG,text_ENG); + imgNL = Image(('corda.jpg')); + imgNL.Style = {Height('4cm'),HAlign('center')}; + add(NL_ENG,imgNL); + NLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Wire sensor and data logger (source: Nesa Srl']); + FIG_ENG = FIG_ENG+1; + NLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(NL_ENG,NLcaption_ENG); + end + NW = 1; + end + break + end + end + end + end + add(appendice,NL); + if activeEN == 1 + add(appendice_ENG,NL_ENG); + end + end +end + +% --- ASECam --- +if nCAM >= 1 + CM = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Camera') == 1 + if CM == 0 + SCM = Section(); + end + sezCM = Heading3('ASE Cam'); + sezCM.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SCM.Title = sezCM; + text = Paragraph(['ASECam ' char(232) ' una videocamera ad alta risoluzione, appositamente sviluppata per uso esterno, '... + ' in grado di acquisire immagini '... + 'dell''area monitorata con cadenza periodica o al verificarsi di un evento critico.']); + + %--ENG-- + if activeEN == 1 + if CM == 0 + SCM_ENG = Section(); + end + sezCM_ENG = Heading3('ASE Cam'); + sezCM_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SCM_ENG.Title = sezCM_ENG; + text = Paragraph(['ASECam is a high resolution video camera, specifically developed for outdoor use. '... + 'It is able to acquire images of the monitored area with '... + 'a predefined sampling frequency, or at the occurrence of a critical event.']); + end + if CM == 0 + text.HAlign = 'justify'; + add(SCM,text); + imgCAM = Image(('ASECam.jpg')); + imgCAM.Style = {Height('4cm'),HAlign('center')}; + add(SCM,imgCAM); + CAMcaption = Paragraph(['Fig. ' num2str(FIG) ' - Videocamera ASECam']); + FIG = FIG+1; + CAMcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SCM,CAMcaption); + CM = 1; + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(SCM_ENG,text_ENG); + imgCAM = Image(('ASECam.jpg')); + imgCAM.Style = {Height('4cm'),HAlign('center')}; + add(SCM_ENG,imgCAM); + CAMcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - ASECam video camera']); + FIG_ENG = FIG_ENG+1; + CAMcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SCM_ENG,CAMcaption_ENG); + CM = 1; + end + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Camera') == 1 + if CM == 0 + SCM = Section(); + end + sezCM = Heading3('ASE Cam'); + sezCM.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SCM.Title = sezCM; + text = Paragraph(['ASECam ' char(232) ' una videocamera ad alta risoluzione, appositamente sviluppata per uso esterno, '... + ' in grado di acquisire immagini '... + 'dell''area monitorata con cadenza periodica o al verificarsi di un evento critico.']); + %--ENG-- + if activeEN == 1 + if CM == 0 + SCM_ENG = Section(); + end + sezCM_ENG = Heading3('ASE Cam'); + sezCM_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + SCM_ENG.Title = sezCM_ENG; + text = Paragraph(['ASECam is a high resolution video camera, specifically developed for outdoor use. '... + 'It is able to acquire images of the monitored area with '... + 'a predefined sampling frequency, or at the occurrence of a critical event.']); + end + if CM == 0 + text.HAlign = 'justify'; + add(SCM,text); + imgCAM = Image(('ASECam.jpg')); + imgCAM.Style = {Height('4cm'),HAlign('center')}; + add(SCM,imgCAM); + CAMcaption = Paragraph(['Fig. ' num2str(FIG) ' - Videocamera ASECam']); + FIG = FIG+1; + CAMcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SCM,CAMcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(SCM_ENG,text_ENG); + imgCAM = Image(('ASECam.jpg')); + imgCAM.Style = {Height('4cm'),HAlign('center')}; + add(SCM_ENG,imgCAM); + CAMcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - ASECam video camera']); + FIG_ENG = FIG_ENG+1; + CAMcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(SCM_ENG,CAMcaption_ENG); + end + CM = 1; + end + break + end + end + end + end + add(appendice,SCM); + if activeEN == 1 + add(appendice_ENG,SCM_ENG); + end +end + +% --- Weir Link --- +if sum(yesWL) >= 1 + WeirL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Weir Link') == 1 + if WeirL == 0 + WeirLE = Section(); + end + sezWeirL = Heading3('Weir Link'); + sezWeirL.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + WeirLE.Title = sezWeirL; + text = Paragraph(['Il sensore Weir Link ' char(232) ' un idrometro '... + 'in grado di misurare l''altezza del livello d''acqua '... + 'tramite un trasduttore finestrato a corda vibrante combinato con '... + 'un contrappeso cilindrico sospeso.']); + %--ENG-- + if activeEN == 1 + if WeirL == 0 + WeirLE_ENG = Section(); + end + sezWeirL_ENG = Heading3('Weir Link'); + sezWeirL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + WeirLE_ENG.Title = sezWeirL_ENG; + text_ENG = Paragraph(['Weir Link is a sensor that utilises a vented vibrating wire force '... + 'transducer in combination with a cylindrical weight suspended '... + 'from it to monitor water levels.']); + end + if WeirL == 0 + text.HAlign = 'justify'; + add(WeirLE,text); + imgWL = Image(('Weir.png')); + imgWL.Style = {Height('3.5cm'),HAlign('center')}; + add(WeirLE,imgWL); + WeirLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Weir Link']); + FIG = FIG+1; + WeirLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(WeirLE,WeirLcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(WeirLE_ENG,text_ENG); + imgWL = Image(('Weir.png')); + imgWL.Style = {Height('3.5cm'),HAlign('center')}; + add(WeirLE_ENG,imgWL); + WeirLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Weir Link sensor']); + FIG_ENG = FIG_ENG+1; + WeirLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(WeirLE_ENG,WeirLcaption_ENG); + end + WeirL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Weir Link') == 1 + if WeirL == 0 + WeirLE = Section(); + end + sezWeirL = Heading3('Weir Link'); + sezWeirL.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + WeirLE.Title = sezWeirL; + text = Paragraph(['Il sensore Weir Link ' char(232) ' un idrometro '... + 'in grado di misurare l''altezza del livello d''acqua '... + 'tramite un trasduttore finestrato a corda vibrante combinato con '... + 'un contrappeso cilindrico sospeso.']); + %--ENG-- + if activeEN == 1 + if WeirL == 0 + WeirLE_ENG = Section(); + end + sezWeirL_ENG = Heading3('Weir Link'); + sezWeirL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + WeirLE_ENG.Title = sezWeirL_ENG; + text_ENG = Paragraph(['Weir Link is a sensor that utilises a vented vibrating wire force '... + 'transducer in combination with a cylindrical weight suspended '... + 'from it to monitor water levels.']); + end + if WeirL == 0 + text.HAlign = 'justify'; + add(WeirLE,text); + imgWL = Image(('Weir.png')); + imgWL.Style = {Height('3.5cm'),HAlign('center')}; + add(WeirLE,imgWL); + WeirLcaption = Paragraph(['Fig. ' num2str(FIG) ' - Sensore Weir Link']); + FIG = FIG+1; + WeirLcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(WeirLE,WeirLcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(WeirLE_ENG,text_ENG); + imgWL = Image(('Weir.png')); + imgWL.Style = {Height('3.5cm'),HAlign('center')}; + add(WeirLE_ENG,imgWL); + WeirLcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Weir Link sensor']); + FIG_ENG = FIG_ENG+1; + WeirLcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(WeirLE_ENG,WeirLcaption_ENG); + end + WeirL = 1; + end + break + end + end + end + end + add(appendice,WeirLE); + if activeEN == 1 + add(appendice_ENG,WeirLE_ENG); + end +end + +% --- Pendulum --- +if sum(yesPE) >= 1 + PNDL = 0; + for a = 1:dim + [dimC,~] = size(colonna6{a,1}); + if dimC == 1 + if strcmp(colonna6(a,1),'Pendulum') == 1 + if PNDL == 0 + PN = Section(); + end + sezPendulum = Heading3('Pendolo'); + sezPendulum.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PN.Title = sezPendulum; + text = Paragraph(['Il pendolo ' char(232) ' un sensore '... + 'per la misura degli spostamenti nel piano orizzontale, eseguita '... + 'grazie a un filo verticale tensionato di cui viene registrata la '... + 'posizione all''interno di un sistema di riferimento predefinito.']); + %--ENG-- + if activeEN == 1 + if PNDL == 0 + PN_ENG = Section(); + end + sezPendulum_ENG = Heading3('Pendulum'); + sezPendulum_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PN_ENG.Title = sezPendulum_ENG; + text_ENG = Paragraph(['The Pendulum system is a sensor able to measure displacements '... + 'eperienced by the structure in the horizontal plane. The working principle exploits a '... + 'tensioned vertical wire, recording its position in a planar reference system.']); + end + if PNDL == 0 + text.HAlign = 'justify'; + add(PN,text); + imgPE = Image(('Pendulum.png')); + imgPE.Style = {Height('3.5cm'),HAlign('center')}; + add(PN,imgPE); + Pendcaption = Paragraph(['Fig. ' num2str(FIG) ' - Pendolo']); + FIG = FIG+1; + Pendcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(PN,Pendcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(PN_ENG,text_ENG); + imgPE = Image(('Pendulum.png')); + imgPE.Style = {Height('3.5cm'),HAlign('center')}; + add(PN_ENG,imgPE); + Pendcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Pendulum system']); + FIG_ENG = FIG_ENG+1; + Pendcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(PN_ENG,Pendcaption_ENG); + end + PNDL = 1; + end + break + end + else + for aC = 1:dimC + if strcmp(colonna6{a, 1}{aC, 1},'Pendulum') == 1 + if PNDL == 0 + PN = Section(); + end + sezPendulum = Heading3('Pendolo'); + sezPendulum.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PN.Title = sezPendulum; + text = Paragraph(['Il pendolo ' char(232) ' un sensore '... + 'per la misura degli spostamenti nel piano orizzontale, eseguita '... + 'grazie a un filo verticale tensionato di cui viene registrata la '... + 'posizione all''interno di un sistema di riferimento predefinito.']); + %--ENG-- + if activeEN == 1 + if PNDL == 0 + PN_ENG = Section(); + end + sezPendulum_ENG = Heading3('Pendulum'); + sezPendulum_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)}; + PN_ENG.Title = sezPendulum_ENG; + text_ENG = Paragraph(['The Pendulum system is a sensor able to measure displacements '... + 'eperienced by the structure in the horizontal plane. The working principle exploits a '... + 'tensioned vertical wire, recording its position in a planar reference system.']); + end + if PNDL == 0 + text.HAlign = 'justify'; + add(PN,text); + imgPE = Image(('Pendulum.png')); + imgPE.Style = {Height('3.5cm'),HAlign('center')}; + add(PN,imgPE); + Pendcaption = Paragraph(['Fig. ' num2str(FIG) ' - Pendolo']); + FIG = FIG+1; + Pendcaption.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(PN,Pendcaption); + if activeEN == 1 + text_ENG.HAlign = 'justify'; + add(PN_ENG,text_ENG); + imgPE = Image(('Pendulum.png')); + imgPE.Style = {Height('3.5cm'),HAlign('center')}; + add(PN_ENG,imgPE); + Pendcaption_ENG = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Pendulum system']); + FIG_ENG = FIG_ENG+1; + Pendcaption_ENG.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')}; + add(PN_ENG,Pendcaption_ENG); + end + PNDL = 1; + end + break + end + end + end + end + add(appendice,PN); + if activeEN == 1 + add(appendice_ENG,PN_ENG); + end +end + +add(rpt,appendice); +template(rpt); +if activeEN == 1 + add(rpt_ENG,appendice_ENG); + template(rpt_ENG); +end + +text = 'report_appendix function executed correctly. report_appendix function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_ini.m b/Tilt/report_ini.m new file mode 100755 index 0000000..67a2664 --- /dev/null +++ b/Tilt/report_ini.m @@ -0,0 +1,56 @@ +function [GI_Disp_TL,GI_Date_TL,GI_Prof_TL,GI_Disp_IPL,GI_Date_IPL,GI_Prof_IPL,... + GI_Disp_IPLHR,GI_Date_IPLHR,GI_Prof_IPLHR,GI_Level_PL,GI_Prof_PL,GI_Date_PL,... + GI_Rain_RL,GI_Date_RL,GI_Angolo_KL,GI_Date_KL,GI_Num_KL,GI_Disp_CrL,GI_Date_CrL,... + GI_Num_CrL,PL_A,PL_D,GI_Q1_TuL,GI_Q2_TuL,GI_Q3_TuL,GI_Q4_TuL,GI_Q1_Num_TuL,... + GI_Q2_Num_TuL,GI_Q3_Num_TuL,GI_Q4_Num_TuL,GI_Seg_TuL,GI_NumSeg_TuL,GI_Z_TuL,... + GI_Date_TuL,GI_XYZ_Rad,GI_Num_Rad,GI_dS_RL_MPB,GI_dS_RL_TuL,GI_dS_TuL_RL,... + GI_Date_Rad,GI_Z_PCL,GI_Date_PCL,GI_Date_MPB,GI_dS_MPB,GI_MPB_Base,GI_dS_MPB_RL] = report_ini + +GI_Disp_TL = []; +GI_Date_TL = []; +GI_Prof_TL = []; +GI_Disp_IPL = []; +GI_Date_IPL = []; +GI_Prof_IPL = []; +GI_Disp_IPLHR = []; +GI_Date_IPLHR = []; +GI_Prof_IPLHR = []; +GI_Level_PL = []; +GI_Prof_PL = []; +GI_Date_PL = []; +GI_Rain_RL = []; +GI_Date_RL = []; +GI_Angolo_KL = []; +GI_Date_KL = []; +GI_Num_KL = []; +GI_Disp_CrL = []; +GI_Date_CrL = []; +GI_Num_CrL = []; +PL_A = []; +PL_D = []; +GI_Q1_TuL = []; +GI_Q2_TuL = []; +GI_Q3_TuL = []; +GI_Q4_TuL = []; +GI_Q1_Num_TuL = []; +GI_Q2_Num_TuL = []; +GI_Q3_Num_TuL = []; +GI_Q4_Num_TuL = []; +GI_Seg_TuL = []; +GI_NumSeg_TuL = []; +GI_Z_TuL = []; +GI_Date_TuL = []; +GI_Z_PCL = []; +GI_Date_PCL = []; +GI_Date_MPB = []; +GI_dS_MPB = []; +GI_MPB_Base = []; +GI_dS_MPB_RL = []; +GI_XYZ_Rad = []; +GI_Num_Rad = []; +GI_dS_RL_MPB = []; +GI_dS_RL_TuL = []; +GI_dS_TuL_RL = []; +GI_Date_Rad = []; + +end \ No newline at end of file diff --git a/Tilt/report_table.m b/Tilt/report_table.m new file mode 100755 index 0000000..4227b80 --- /dev/null +++ b/Tilt/report_table.m @@ -0,0 +1,609 @@ +function [Font_Loc,status,firstdata_num,datasample,colonna1,colonna2,colonna2bis,colonna3,... + colonna4,colonna5,colonna6,colonna6_short,colonna7,yesKLHR3D,c1trigger,c6trigger,cA] = ... + report_table(Font_Loc,info_sito,controlsito,tipoarray,tipoalarms,alarms,chainID,Chain_Scheme,... + yesTL,yesTLHR,yesTLH,yesTLHRH,yesPL,yesBL,yesLL,yesRL,yesKL,yesKLHR,yesThL,... + yesPT100,yesIPL,yesIPLHR,yesTuL,yesRaL,yesPCL,yesPCLHR,yesPrL,yesEL,yes3DEL,... + yesWEL,yesMPBEL,yesCrL,yes3DCrL,yesBML,yesHL,yesLuxL,yesCO2,yesRSN,yesRSNHR,yesTrL,... + yesPE,yesWL,yes2DCrL,yesGF,yesGS,yesWiL,rTL,rTLHR,rTLH,rTLHRH,rKL,rKLHR,rIPL,rIPLHR,nCT,... + num_nodi,time,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_table function started'; +fprintf(fileID,fmt,text); + +[rS,~] = size(info_sito); +[~,cCT] = size(controlsito); +rCT = nCT; +status = zeros(rS,1); % Stato dei Tool presenti in sito + +% Riga 1 - ID +for j = 1:rS + coppia = {char(info_sito(j,1)) ' ' char(info_sito(j,2))}; + isLoc = char((info_sito(j,2))); + if strcmp(isLoc(1),'L') == 1 % se c'è almeno un LOC attivo cambio font della tabella + Font_Loc = 1; + end + info = cellstr(strjoin(coppia)); + colonna1(1,j+1) = info; +end +colonna1(1,1) = {'ID'}; +[rA,cA] = size(alarms); +if cA > 1 + for j = 1:rA + IDallarme = {char(alarms(j,2))}; + colonna1(1,rS+1+j) = IDallarme; + end + c1trigger = colonna1{1,rS+2:end}; +else + c1trigger = []; +end +colonna1 = colonna1'; + +% Riga 2 - prima lettura valida disponibile +date_start = '2010-01-01'; % data "artificiale" per trovare la prima lettura +Data(1,1) = cellstr(date_start); +Data(1,2) = cellstr(time); +colonna2(1,1) = {'Prima lettura disponibile [gg-mm-aaaa]'}; +for t = 1:rS + datalogger = num2str(cell2mat((chainID(t,1)))); + array = char(info_sito(t,2)); + comando = ['select statustool_id from tools where unit_ID like ''' ... + datalogger ''' and name like ''' array ''' ']; + status(t,1) = cell2mat(fetch(conn,comando)); + if status(t,1) == 1 % Inactive + colonna2{t+1,1} = 'Strumento non ancora installato o inattivo'; + firstdata_num{t+1,1} = 0; + elseif status(t,1) == 3 % Monitoring Completed + colonna2{t+1,1} = 'Monitoraggio completato'; + firstdata_num{t+1,1} = 0; + elseif status(t,1) == 2 || status(t,1) == 4 % Active o Manual Upload + comando = ['select prod_date from tools where unit_ID like ''' ... + datalogger ''' and name like ''' array ''' ']; + data_ini = fetch(conn,comando); + Datab = datestr(data_ini(1,1),'yyyy-mm-dd HH:MM:SS'); + [rI,cI] = size(Datab); + if rI && cI == 1 + data1b = 0; + else + data1b = datenum(Datab); + end + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + if data1b > data1a + data1 = data1b; + else + data1 = data1a; + end + if data1 == data1a + colonna2{t+1,1} = 'Strumento non ancora installato'; + firstdata_num{t+1,1} = 0; + else + colonna2{t+1,1} = datestr(data1,'dd-mm-yyyy'); + firstdata_num{t+1,1} = data1; % mi serve per definire catena più recente in Centralina + end + else + firstdata_num{t+1,1} = 0; + end +end +if cCT > 1 + for t = 1:rCT + array = char(alarms(t,2)); + comando = ['select EventDate, EventTime from ELABDATACTRL where EventDate > ''' ... + date_start ''' and CtrlToolName = ''' ... + array ''' and NodeNum = 1 ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + Data_num_ini = [cell2mat(D_num_ini(1,1)) repmat(' ', [1,1]) cell2mat(D_num_ini(1,2))]; + [rI,cI] = size(D_num_ini); + if rI && cI == 1 + Data_num_ini = 0; + end + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = datenum(Data_num_ini(1,:)); + if data1b > data1a + data1 = data1b; + else + data1 = data1a; + end + if data1 == data1a + colonna2{t+rS+1,1} = 'Dispositivo non ancora installato'; + firstdata_num{t+1,1} = 0; + else + colonna2{t+rS+1,1} = datestr(data1,'dd-mm-yyyy'); + firstdata_num{t+1,1} = data1; % mi serve per definire catena più recente in Centralina + end + end +end + +% Riga 2 Bis - Lettura di riferimento +date_start = '2010-01-01'; % data "artificiale" per trovare la prima lettura +Data(1,1) = cellstr(date_start); +Data(1,2) = cellstr(time); +colonna2bis(1,1) = {'Lettura di riferimento [gg-mm-aaaa]'}; +for t = 1:rS + if status(t,1) == 1 % Inactive + colonna2bis{t+1,1} = '-'; + elseif status(t,1) == 3 % Monitoring Completed + colonna2bis{t+1,1} = '-'; + elseif status(t,1) == 2 || status(t,1) == 4 % Active o Manual Upload + datalogger = num2str(cell2mat((chainID(t,1)))); + array = char(info_sito(t,2)); + comando = ['select graph_prod_date from tools where unit_ID like ''' datalogger ''' and name like ''' array ''' ']; + data_ini = fetch(conn,comando); + stringa = cell2mat(data_ini); + [~,cS] = size(stringa); + esci = 0; + if cS == 4 + esci = 1; + else + date = stringa(1,1:10); + time = stringa(1,11:21); + clear Datab + Datab(1,1) = cellstr(date); + Datab(1,2) = cellstr(time); + Datab = [cell2mat(Datab(1,1)) repmat(' ', [1,1]) cell2mat(Datab(1,2))]; + data1b = datenum(Datab); + end + if esci == 0 + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + if data1b > data1a + data1 = data1b; + else + data1 = data1a; + end + if data1 == data1a + colonna2bis{t+1,1} = 'Strumento non ancora installato'; + else + colonna2bis{t+1,1} = datestr(data1,'dd-mm-yyyy'); + firstdata_num{t+1,1} = data1; % mi serve per definire catena più recente in Centralina + end + else + colonna2bis{t+1,1} = colonna2{t+1,1}; + end + end +end +if nCT > 0 + for c = 1:nCT + colonna2bis{rS+1+c:rS+c+1,1} = colonna2{rS+1+c:rS+c+1,1}; + end +end + +% Riga 3 - Ultima lettura disponibile +colonna3(1,1) = {'Ultima lettura disponibile [gg-mm-aaaa]'}; +for i = 1:rS + datalogger = char(info_sito(i,1)); + array = char(info_sito(i,2)); + dataU = datestr(today,'yyyy-mm-dd'); + OK = 0; + if status(i,1) == 1 % Inactive + colonna3{i+1,1} = '-'; + datasample{i+1,1} = 9999; + OK = 1; + end + while OK == 0 + % trovo la data dell'ultima lettura disponibile + if strcmp(tipoarray(i),'MUSA') == 1 + comando = ['select EventDate, EventTime from ElabDataMusaView where EventDate >= ''' dataU ''' and UnitName = ''' datalogger... + ''' and ToolNameID = ''' array ''' and NodeNum = 1 ']; + else + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' dataU ''' and UnitName = ''' datalogger... + ''' and ToolNameID = ''' array ''' and NodeNum = 1 ']; + end + curs = exec(conn,comando); + curs = fetch(curs); + Letture = curs.Data; + [~,cu] = size(Letture); + if cu == 1 % nessun dato trovato + dataU = datestr((datenum(dataU) - 1),'yyyy-mm-dd'); % provo con la data precedente + else + dataUL = datestr(dataU,'dd-mm-yyyy'); + datasample{i+1,1} = datenum(dataU); % date numeriche per scegliere, a partità di centralina, la catena con i dati più recenti + colonna3{i+1,1} = dataUL; + OK = 1; + end + end +end +if cCT > 1 + for t = 1:rCT + array = char(alarms(t,2)); + comando = ['select EventDate, EventTime from ELABDATACTRL where EventDate > ''' ... + date_start ''' and CtrlToolName = ''' ... + array ''' and NodeNum = 1 ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + Data_num_ini = [cell2mat(D_num_ini(end,1)) repmat(' ', [1,1]) cell2mat(D_num_ini(end,2))]; + [rI,cI] = size(D_num_ini); + if rI && cI == 1 + Data_num_ini = 0; + end + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = datenum(Data_num_ini(1,:)); + if data1b > data1a + data1 = data1b; + else + data1 = data1a; + end + if data1 == data1a + colonna3{t+rS+1,1} = 'Dispositivo non ancora installato'; + else + colonna3{t+rS+1,1} = datestr(data1,'dd-mm-yyyy'); + end + end +end + +% Riga 4 - tipologia catena +colonna4(1,1) = {'Tipologia di Array'}; +colonna4 = [colonna4, tipoarray']; +if cCT > 1 + colonna4 = [colonna4, tipoalarms']; +end +colonna4 = colonna4'; + +% Riga 5 - Lunghezza catena +colonna5(1,1) = {'Lunghezza [m]'}; +c = 0; +for k = 1:rS + L(k+1,1) = max(cell2mat(Chain_Scheme(:,2+c))); + conv2 = num2str(L(k+1,1)); + [~,cc2] = size(conv2); + corretto = 0; + for cc = 1:cc2 + if strcmp(conv2(cc),'.') % Cerco la virgola + corretto = 1; % Significa che ho trovato la virgola + if cc == cc2-1 % Un solo decimale + conv2 =[conv2 '0']; + break + end + end + end + if corretto == 0 + conv2 = [conv2 '.00']; + end + colonna5(k+1,1) = {conv2}; + if strcmp(colonna5(k+1,1),'0') || strcmp(colonna5(k+1,1),'0.00') + colonna5(k+1,1) = cellstr('-'); + end + c = c+3; +end +if cCT > 1 + colonna5(rS+2:rS+rCT+1,1) = cellstr('-'); +end + +% Riga 6 - tipologia sensori +colonna6(1,1) = {'Tipologia di sensori o dispositivi'}; +colonna6_short(1,1) = {'Tipologia di sensori o dispositivi'}; +for nn = 1:rS + s = 1; % conta sensori di tipo diverso + if yesTL(nn) == 1 % Tilt Link V + if yesTLHR(nn) == 1 % se ho Tilt Link HR elimino Tilt Link dalla lista + if rTL(nn) == rTLHR(nn) + riga6temp(s,1) = {'Tilt Link HR 3D V'}; + riga6short(s,1) = {'Tilt Link HR 3D V'}; + else + riga6temp(s,1) = {'Tilt Link V'}; + riga6short(s,1) = {'Tilt Link V'}; + end + else + riga6temp(s,1) = {'Tilt Link V'}; + riga6short(s,1) = {'Tilt Link V'}; + end + s = s+1; + end + if yesTLHR(nn) == 1 % Tilt Link HR V + if yesTL(nn) ~= 1 % Tilt Link V + riga6temp(s,1) = {'Tilt Link HR V'}; + riga6short(s,1) = {'Tilt Link HR V'}; + s = s+1; + end + end + if yesTLH(nn) == 1 % Tilt Link H + if yesTLHRH(nn) == 1 % se ho Tilt Link HR H elimino Tilt Link H dalla lista + if rTLH(nn) == rTLHRH(nn) + riga6temp(s,1) = {'Tilt Link HR 3D H'}; + riga6short(s,1) = {'Tilt Link HR 3D H'}; + else + riga6temp(s,1) = {'Tilt Link H'}; + riga6short(s,1) = {'Tilt Link H'}; + end + else + riga6temp(s,1) = {'Tilt Link H'}; + riga6short(s,1) = {'Tilt Link H'}; + end + s = s+1; + end + if yesTLHRH(nn) == 1 % Tilt Link HR H + if yesTLH(nn) ~= 1 % Tilt Link H + riga6temp(s,1) = {'Tilt Link HR H'}; + riga6short(s,1) = {'Tilt Link HR H'}; + s = s+1; + end + end + if yesPL(nn) == 1 % Piezo Link + riga6temp(s,1) = {'Piezo Link'}; + riga6short(s,1) = {'Piezo Link'}; + s = s+1; + end + if yesBL(nn) == 1 || yesBML(nn) == 1 % Baro Link (normale o MUSA) + riga6temp(s,1) = {'Baro Link'}; + riga6short(s,1) = {'Baro Link'}; + s = s+1; + end + if yesLL(nn) == 1 % Load Link + riga6temp(s,1) = {'Load Link'}; + riga6short(s,1) = {'Load Link'}; + s = s+1; + end + if yesRL(nn) == 1 % Rain Link + riga6temp(s,1) = {'Rain Link'}; + riga6short(s,1) = {'Rain Link'}; + s = s+1; + end + if yesKL(nn) == 1 % Klino Link + if yesKLHR(nn) == 1 % se ho Klino Link HR elimino Klino Link dalla lista + if rKL(nn) == rKLHR(nn) + yesKLHR3D(nn,1) = 1; + riga6temp(s,1) = {'Klino Link HR 3D'}; + riga6short(s,1) = {'Klino Link HR 3D'}; + else + yesKLHR3D(nn,1) = 0; + riga6temp(s,1) = {'Klino Link'}; + riga6short(s,1) = {'Klino Link'}; + end + else + yesKLHR3D(nn,1) = 0; + riga6temp(s,1) = {'Klino Link'}; + riga6short(s,1) = {'Klino Link'}; + end + s = s+1; + else + yesKLHR3D(nn,1) = 0; + end + if yesKLHR(nn) == 1 % Klino Link HR + if yesKL(nn) ~= 1 % Klino Link + riga6temp(s,1) = {'Klino Link HR'}; + riga6short(s,1) = {'Klino Link HR'}; + s = s+1; + end + end + if yesThL(nn) == 1 % Therm Link + riga6temp(s,1) = {'Therm Link'}; + riga6short(s,1) = {'Therm Link'}; + s = s+1; + end + if yesPT100(nn) == 1 % PT100 Link + riga6temp(s,1) = {'PT100 Link'}; + riga6short(s,1) = {'PT100 Link'}; + s = s+1; + end + if yesIPL(nn) == 1 % In Place Link + if yesIPLHR(nn) == 1 % se ho In Place Link HR elimino In Place Link dalla lista + if rIPL(nn) == rIPLHR(nn) + riga6temp(s,1) = {'In Place Link HR 3D'}; + riga6short(s,1) = {'IP Link HR 3D'}; + else + riga6temp(s,1) = {'In Place Link'}; + riga6short(s,1) = {'In Place Link'}; + end + else + riga6temp(s,1) = {'In Place Link'}; + riga6short(s,1) = {'In Place Link'}; + end + s = s+1; + end + if yesIPLHR(nn) == 1 % In Place Link HR + if yesIPL(nn) ~= 1 % In Place Link + riga6temp(s,1) = {'In Place Link HR'}; + riga6short(s,1) = {'IP Link HR'}; + s = s+1; + end + end + if yesTuL(nn) == 1 % Tunnel Link + riga6temp(s,1) = {'Tunnel Link'}; + riga6short(s,1) = {'Tunnel Link'}; + s = s+1; + end + if yesRaL(nn) == 1 % Radial Link + riga6temp(s,1) = {'Radial Link'}; + riga6short(s,1) = {'Radial Link'}; + s = s+1; + end + if yesPCL(nn) == 1 % PreConv Link + if yesPCLHR(nn) == 1 % se ho PreConv Link HR elimino PreConv Link dalla lista + if rPCL(nn) == rPCLHR(nn) + riga6temp(s,1) = {'PreConv Link HR 3D'}; + riga6short(s,1) = {'PC Link HR 3D'}; + else + riga6temp(s,1) = {'PreConv Link'}; + riga6short(s,1) = {'PreConv Link'}; + end + else + riga6temp(s,1) = {'PreConv Link'}; + riga6short(s,1) = {'PreConv Link'}; + end + s = s+1; + end + if yesPCLHR(nn) == 1 % PreConv Link HR + if yesPCL(nn) ~= 1 % PreConv Link + riga6temp(s,1) = {'PreConv Link HR'}; + riga6short(s,1) = {'PC Link HR'}; + s = s+1; + end + end + if yesPrL(nn) == 1 % Pressure Link + riga6temp(s,1) = {'Pressure Link'}; + riga6short(s,1) = {'Press. Link'}; + s = s+1; + end + if yesEL(nn) == 1% Extensometer Link + riga6temp(s,1) = {'Extensometer Link'}; + riga6short(s,1) = {'Extens. Link'}; + s = s+1; + end + if yes3DEL(nn) == 1 % 3D Extensometer Link + riga6temp(s,1) = {'3D Extensometer Link'}; + riga6short(s,1) = {'3D Ext. Link'}; + s = s+1; + end + if yesWEL(nn) == 1 % Wire Extensometer Link + riga6temp(s,1) = {'Wire Extensometer Link'}; + riga6short(s,1) = {'Wire Ex. Link'}; + s = s+1; + end + if yesMPBEL(nn) == 1 % Multi Point Borehole Extensometer Link + riga6temp(s,1) = {'Multi Point Borehole Extensometer Link'}; + riga6short(s,1) = {'MPBX Link'}; + s = s+1; + end + if yesCrL(nn) == 1 % Crack Link + riga6temp(s,1) = {'Crack Link'}; + riga6short(s,1) = {'Crack Link'}; + s = s+1; + end + if yes2DCrL(nn) == 1 % 2D Crack Link + riga6temp(s,1) = {'2D Crack Link'}; + riga6short(s,1) = {'2D Crack Link'}; + s = s+1; + end + if yes3DCrL(nn) == 1 % 3D Crack Link + riga6temp(s,1) = {'3D Crack Link'}; + riga6short(s,1) = {'3D Cr. Link'}; + s = s+1; + end + if yesHL(nn) == 1 % Humidity Link + riga6temp(s,1) = {'Humidity Link'}; + riga6short(s,1) = {'Humidity Link'}; + s = s+1; + end + if yesLuxL(nn) == 1 % Lux Link + riga6temp(s,1) = {'Lux Link'}; + riga6short(s,1) = {'Lux Link'}; + s = s+1; + end + if yesCO2(nn) == 1 % CO2 Link + riga6temp(s,1) = {'CO2 Link'}; + riga6short(s,1) = {'CO2 Link'}; + s = s+1; + end + if yesRSN(nn) == 1 % RSN Link + if yesRSNHR(nn) == 1 % se ho RSN Link HR elimino RSN Link dalla lista + if rPRSN(nn) == rRSNHR(nn) + riga6temp(s,1) = {'RSN Link HR 3D'}; + riga6short(s,1) = {'RSN Link HR 3D'}; + else + riga6temp(s,1) = {'RSN Link'}; + riga6short(s,1) = {'RSN Link'}; + end + else + riga6temp(s,1) = {'RSN Link'}; + riga6short(s,1) = {'RSN Link'}; + end + s = s+1; + end + if yesRSNHR(nn) == 1 % RSN Link HR + if yesRSN(nn) ~= 1 % RSN Link + riga6temp(s,1) = {'RSN Link HR'}; + riga6short(s,1) = {'RSN Link HR'}; + s = s+1; + end + end + if yesTrL(nn) == 1 % Trigger Link + riga6temp(s,1) = {'Trigger Link'}; + riga6short(s,1) = {'Trigger Link'}; + s = s+1; + end + if yesPE(nn) == 1 % Pendulum + riga6temp(s,1) = {'Pendulum'}; + riga6short(s,1) = {'Pendulum'}; + s = s+1; + end + if yesWL(nn) == 1 % Weir Link + riga6temp(s,1) = {'Weir Link'}; + riga6short(s,1) = {'Weir Link'}; + s = s+1; + end + if yesGF(nn) == 1 % G-Flow Link + riga6temp(s,1) = {'G-Flow Link'}; + riga6short(s,1) = {'G-Flow Link'}; + s = s+1; + end + if yesGS(nn) == 1 % G-Shock Link + riga6temp(s,1) = {'G-Shock Link'}; + riga6short(s,1) = {'G-Shock Link'}; + s = s+1; + end + if yesWiL(nn) == 1 % Wind Link + riga6temp(s,1) = {'Wind Link'}; + riga6short(s,1) = {'Wind Link'}; + s = s+1; + end + if s == 2 + colonna6(1,nn+1) = riga6temp(:,1); + colonna6_short(1,nn+1) = riga6short(:,1); + clear riga6temp + clear riga6short + else + colonna6{1,nn+1} = splitlines(strjoin(cellstr(riga6temp(:,1)), '\n')); + colonna6_short{1,nn+1} = splitlines(strjoin(cellstr(riga6short(:,1)), '\n')); + clear riga6temp; + clear riga6short + end +end +if cCT > 1 + ct = 1; % conta dispositivi di tipo diverso + for mm = 1:nCT + if strcmp(char(tipoalarms(mm)),'Variable Message System') + CTtemp(ct,1) = {'Pannello a messaggio variabile'}; + CTtemp_short(ct,1) = {'PMV'}; + ct = ct +1; + elseif strcmp(char(tipoalarms(mm)),'Traffic Lights') + CTtemp(ct,1) = {'Impianto semaforico'}; + CTtemp_short(ct,1) = {'Semafori'}; + ct = ct +1; + elseif strcmp(char(tipoalarms(mm)),'Alarms') + CTtemp(ct,1) = {'Allarme acustico e/o visivo'}; + CTtemp_short(ct,1) = {'Sistema di Allarme'}; + ct = ct +1; + elseif strcmp(char(tipoalarms(mm)),'Camera') + CTtemp(ct,1) = {'Camera'}; + CTtemp_short(ct,1) = {'Camera'}; + ct = ct +1; + end + colonna6{1,rS+1+mm} = strjoin(cellstr(CTtemp(mm,1)), ', '); + colonna6_short{1,rS+1+mm} = strjoin(cellstr(CTtemp_short(mm,1)), ', '); + end + c6trigger = colonna6{1,rS+2:end}; +else + c6trigger = []; + clear CTtemp +end +colonna6 = colonna6'; +colonna6_short = colonna6_short'; + +% Riga 7 - numero sensori +colonna7(1,1)={'Numero di sensori o dispositivi'}; +for s = 1:rS + if strcmp(cellstr(colonna4(s+1,1)),'Vertical Array') || strcmp(cellstr(colonna4(s+1,1)),'In Place Array')... + || strcmp(cellstr(colonna4(s+1,1)),'Therm Array') || strcmp(cellstr(colonna4(s+1,1)),'Piezo Array')... + || strcmp(cellstr(colonna4(s+1,1)),'Cir Array') || strcmp(cellstr(colonna4(s+1,1)),'Rad Array')... + || strcmp(cellstr(colonna4(s+1,1)),'PreConv Array') || strcmp(cellstr(colonna4(s+1,1)),'Horizontal Array')... + || strcmp(cellstr(colonna4(s+1,1)),'Vertical Array Structure')||strcmp(cellstr(colonna4(s+1,1)),'Stazione Meteo') + colonna7(s+1,1) = cellstr(num2str(num_nodi(s,1)-1)); + else + colonna7(s+1,1) = cellstr(num2str(num_nodi(s,1))); + end +end +if cCT > 1 + colonna7(rS+2:rS+1+rCT) = cellstr('1'); +end + +text = 'report_table function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/report_table_ENG.m b/Tilt/report_table_ENG.m new file mode 100755 index 0000000..de9b293 --- /dev/null +++ b/Tilt/report_table_ENG.m @@ -0,0 +1,608 @@ +function [status,firstdata_num,datasample,colonna1,colonna2,colonna2bis,colonna3,... + colonna4,colonna5,colonna6,colonna6_short,colonna7,yesKLHR3D,c1trigger,c6trigger,cA]... + = report_table_ENG(info_sito,controlsito,tipoarray,tipoalarms,alarms,chainID,Chain_Scheme,... + yesTL,yesTLHR,yesTLH,yesTLHRH,yesPL,yesBL,yesLL,yesRL,yesKL,yesKLHR,yesThL,... + yesPT100,yesIPL,yesIPLHR,yesTuL,yesRaL,yesPCL,yesPCLHR,yesPrL,yesEL,yes3DEL,... + yesWEL,yesMPBEL,yesCrL,yes3DCrL,yesBML,yesHL,yesLuxL,yesCO2,yesRSN,yesRSNHR,yesTrL,... + yesPE,yesWL,yes2DCrL,yesGF,yesGS,yesWiL,rTL,rTLHR,rTLH,rTLHRH,rKL,rKLHR,rIPL,rIPLHR,nCT,... + num_nodi,time,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_table_ENG started executed'; +fprintf(fileID,fmt,text); + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'report_table_ENG function started'; +fprintf(fileID,fmt,text); + +[rS,~] = size(info_sito); +[~,cCT] = size(controlsito); +rCT = nCT; +status = zeros(rS,1); % Stato dei Tool presenti in sito + +% Riga 1 - ID +for j = 1:rS + coppia = {char(info_sito(j,1)) ' ' char(info_sito(j,2))}; + info = cellstr(strjoin(coppia)); + colonna1(1,j+1) = info; +end +colonna1(1,1) = {'ID'}; +[rA,cA] = size(alarms); +if cA > 1 + for j = 1:rA + IDallarme = {char(alarms(j,2))}; + colonna1(1,rS+1+j) = IDallarme; + end + c1trigger = colonna1{1,rS+2:end}; +else + c1trigger = []; +end +colonna1 = colonna1'; + +% Riga 2 - prima lettura valida disponibile +date_start = '2010-01-01'; % data "artificiale" per trovare la prima lettura +Data(1,1) = cellstr(date_start); +Data(1,2) = cellstr(time); +colonna2(1,1) = {'First available reading date [dd-mm-yyyy]'}; +for t = 1:rS + datalogger = num2str(cell2mat((chainID(t,1)))); + array = char(info_sito(t,2)); + comando = ['select statustool_id from tools where unit_ID like ''' ... + datalogger ''' and name like ''' array ''' ']; + status(t,1) = cell2mat(fetch(conn,comando)); + if status(t,1) == 1 % Inactive + colonna2{t+1,1} = 'Tool not installed or inactive'; + firstdata_num{t+1,1} = 0; + elseif status(t,1) == 3 % Monitoring Completed + colonna2{t+1,1} = 'Monitoring Completed'; + firstdata_num{t+1,1} = 0; + elseif status(t,1) == 2 || status(t,1) == 4 % Active o Manual Upload + comando = ['select prod_date from tools where unit_ID like ''' ... + datalogger ''' and name like ''' array ''' ']; + data_ini = fetch(conn,comando); + Datab = datestr(data_ini(1,1),'yyyy-mm-dd HH:MM:SS'); + [rI,cI] = size(Datab); + if rI && cI == 1 + data1b = 0; + else + data1b = datenum(Datab); + end + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + if data1b > data1a + data1 = data1b; + else + data1 = data1a; + end + if data1 == data1a + colonna2{t+1,1} = 'Tool not installed'; + firstdata_num{t+1,1} = 0; + else + colonna2{t+1,1} = datestr(data1,'dd-mm-yyyy'); + firstdata_num{t+1,1} = data1; % mi serve per definire catena più recente in Centralina + end + else + firstdata_num{t+1,1} = 0; + end +end +if cCT > 1 + for t = 1:rCT + array = char(alarms(t,2)); + comando = ['select EventDate, EventTime from ELABDATACTRL where EventDate > ''' ... + date_start ''' and CtrlToolName = ''' ... + array ''' and NodeNum = 1 ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + Data_num_ini = [cell2mat(D_num_ini(1,1)) repmat(' ', [1,1]) cell2mat(D_num_ini(1,2))]; + [rI,cI] = size(D_num_ini); + if rI && cI == 1 + Data_num_ini = 0; + end + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = datenum(Data_num_ini(1,:)); + if data1b > data1a + data1 = data1b; + else + data1 = data1a; + end + if data1 == data1a + colonna2{t+rS+1,1} = 'Device not installed'; + firstdata_num{t+1,1} = 0; + else + colonna2{t+rS+1,1} = datestr(data1,'dd-mm-yyyy'); + firstdata_num{t+1,1} = data1; % mi serve per definire catena più recente in Centralina + end + end +end + +% Riga 2 Bis - Lettura di riferimento +date_start = '2010-01-01'; % data "artificiale" per trovare la prima lettura +Data(1,1) = cellstr(date_start); +Data(1,2) = cellstr(time); +colonna2bis(1,1) = {'Reference reading date [dd-mm-yyyy]'}; +for t = 1:rS + if status(t,1) == 1 % Inactive + colonna2bis{t+1,1} = '-'; + elseif status(t,1) == 3 % Monitoring Completed + colonna2bis{t+1,1} = '-'; + elseif status(t,1) == 2 || status(t,1) == 4 % Active o Manual Upload + datalogger = num2str(cell2mat((chainID(t,1)))); + array = char(info_sito(t,2)); + comando = ['select graph_prod_date from tools where unit_ID like ''' datalogger ''' and name like ''' array ''' ']; + data_ini = fetch(conn,comando); + stringa = cell2mat(data_ini); + [~,cS] = size(stringa); + esci = 0; + if cS == 4 + esci = 1; + else + date = stringa(1,1:10); + time = stringa(1,11:21); + clear Datab + Datab(1,1) = cellstr(date); + Datab(1,2) = cellstr(time); + Datab = [cell2mat(Datab(1,1)) repmat(' ', [1,1]) cell2mat(Datab(1,2))]; + data1b = datenum(Datab); + end + if esci == 0 + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + if data1b > data1a + data1 = data1b; + else + data1 = data1a; + end + if data1 == data1a + colonna2bis{t+1,1} = 'Tool not installed'; + else + colonna2bis{t+1,1} = datestr(data1,'dd-mm-yyyy'); + firstdata_num{t+1,1} = data1; % mi serve per definire catena più recente in Centralina + end + else + colonna2bis{t+1,1} = colonna2{t+1,1}; + end + end +end +if nCT > 0 + for c = 1:nCT + colonna2bis{rS+1+c:rS+c+1,1} = colonna2{rS+1+c:rS+c+1,1}; + end +end + +% Riga 3 - Ultima lettura disponibile +colonna3(1,1) = {'Last available reading date [dd-mm-yyyy]'}; +for i = 1:rS + datalogger = char(info_sito(i,1)); + array = char(info_sito(i,2)); + dataU = datestr(today,'yyyy-mm-dd'); + OK = 0; + if status(i,1) == 1 % Inactive + colonna3{i+1,1} = '-'; + datasample{i+1,1} = 9999; + OK = 1; + end + while OK == 0 + % trovo la data dell'ultima lettura disponibile + if strcmp(tipoarray(i),'MUSA') == 1 + comando = ['select EventDate, EventTime from ElabDataMusaView where EventDate >= ''' dataU ''' and UnitName = ''' datalogger... + ''' and ToolNameID = ''' array ''' and NodeNum = 1 ']; + else + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' dataU ''' and UnitName = ''' datalogger... + ''' and ToolNameID = ''' array ''' and NodeNum = 1 ']; + end + curs = exec(conn,comando); + curs = fetch(curs); + Letture = curs.Data; + [~,cu] = size(Letture); + if cu == 1 % nessun dato trovato + dataU = datestr((datenum(dataU) - 1),'yyyy-mm-dd'); % provo con la data precedente + else + dataUL = datestr(dataU,'dd-mm-yyyy'); + datasample{i+1,1} = datenum(dataU); % date numeriche per scegliere, a partità di centralina, la catena con i dati più recenti + colonna3{i+1,1} = dataUL; + OK = 1; + end + end +end +if cCT > 1 + for t = 1:rCT + array = char(alarms(t,2)); + comando = ['select EventDate, EventTime from ELABDATACTRL where EventDate > ''' ... + date_start ''' and CtrlToolName = ''' ... + array ''' and NodeNum = 1 ']; + curs = exec(conn,comando); + curs = fetch(curs); + D_num_ini = curs.Data; + Data_num_ini = [cell2mat(D_num_ini(end,1)) repmat(' ', [1,1]) cell2mat(D_num_ini(end,2))]; + [rI,cI] = size(D_num_ini); + if rI && cI == 1 + Data_num_ini = 0; + end + Date = [cell2mat(Data(1,1)) repmat(' ', [1,1]) cell2mat(Data(1,2))]; + data1a = datenum(Date); + data1b = datenum(Data_num_ini(1,:)); + if data1b > data1a + data1 = data1b; + else + data1 = data1a; + end + if data1 == data1a + colonna3{t+rS+1,1} = 'Device not installed'; + else + colonna3{t+rS+1,1} = datestr(data1,'dd-mm-yyyy'); + end + end +end + +% Riga 4 - tipologia catena +colonna4(1,1) = {'Array typology'}; +colonna4 = [colonna4, tipoarray']; +if cCT > 1 + colonna4 = [colonna4, tipoalarms']; +end +colonna4 = colonna4'; + +% Riga 5 - Lunghezza catena +colonna5(1,1) = {'Length [m]'}; +c = 0; +for k = 1:rS + L(k+1,1) = max(cell2mat(Chain_Scheme(:,2+c))); + conv2 = num2str(L(k+1,1)); + [~,cc2] = size(conv2); + corretto = 0; + for cc = 1:cc2 + if strcmp(conv2(cc),'.') % Cerco la virgola + corretto = 1; % Significa che ho trovato la virgola + if cc == cc2-1 % Un solo decimale + conv2 =[conv2 '0']; + break + end + end + end + if corretto == 0 + conv2 = [conv2 '.00']; + end + colonna5(k+1,1) = {conv2}; + if strcmp(colonna5(k+1,1),'0') || strcmp(colonna5(k+1,1),'0.00') + colonna5(k+1,1) = cellstr('-'); + end + c = c+3; +end +if cCT > 1 + colonna5(rS+2:rS+rCT+1,1) = cellstr('-'); +end + +% Riga 6 - tipologia sensori +colonna6(1,1) = {'Typology of sensors/devices'}; +colonna6_short(1,1) = {'Typology of sensors/devices'}; +for nn = 1:rS + s = 1; % conta sensori di tipo diverso + if yesTL(nn) == 1 % Tilt Link V + if yesTLHR(nn) == 1 % se ho Tilt Link HR elimino Tilt Link dalla lista + if rTL(nn) == rTLHR(nn) + riga6temp(s,1) = {'Tilt Link HR 3D V'}; + riga6short(s,1) = {'Tilt Link HR 3D V'}; + else + riga6temp(s,1) = {'Tilt Link V'}; + riga6short(s,1) = {'Tilt Link V'}; + end + else + riga6temp(s,1) = {'Tilt Link V'}; + riga6short(s,1) = {'Tilt Link V'}; + end + s = s+1; + end + if yesTLHR(nn) == 1 % Tilt Link HR V + if yesTL(nn) ~= 1 % Tilt Link V + riga6temp(s,1) = {'Tilt Link HR V'}; + riga6short(s,1) = {'Tilt Link HR V'}; + s = s+1; + end + end + if yesTLH(nn) == 1 % Tilt Link H + if yesTLHRH(nn) == 1 % se ho Tilt Link HR H elimino Tilt Link H dalla lista + if rTLH(nn) == rTLHRH(nn) + riga6temp(s,1) = {'Tilt Link HR 3D H'}; + riga6short(s,1) = {'Tilt Link HR 3D H'}; + else + riga6temp(s,1) = {'Tilt Link H'}; + riga6short(s,1) = {'Tilt Link H'}; + end + else + riga6temp(s,1) = {'Tilt Link H'}; + riga6short(s,1) = {'Tilt Link H'}; + end + s = s+1; + end + if yesTLHRH(nn) == 1 % Tilt Link HR H + if yesTLH(nn) ~= 1 % Tilt Link H + riga6temp(s,1) = {'Tilt Link HR H'}; + riga6short(s,1) = {'Tilt Link HR H'}; + s = s+1; + end + end + if yesPL(nn) == 1 % Piezo Link + riga6temp(s,1) = {'Piezo Link'}; + riga6short(s,1) = {'Piezo Link'}; + s = s+1; + end + if yesBL(nn) == 1 || yesBML(nn) == 1 % Baro Link (normale o MUSA) + riga6temp(s,1) = {'Baro Link'}; + riga6short(s,1) = {'Baro Link'}; + s = s+1; + end + if yesLL(nn) == 1 % Load Link + riga6temp(s,1) = {'Load Link'}; + riga6short(s,1) = {'Load Link'}; + s = s+1; + end + if yesRL(nn) == 1 % Rain Link + riga6temp(s,1) = {'Rain Link'}; + riga6short(s,1) = {'Rain Link'}; + s = s+1; + end + if yesKL(nn) == 1 % Klino Link + if yesKLHR(nn) == 1 % se ho Klino Link HR elimino Klino Link dalla lista + if rKL(nn) == rKLHR(nn) + yesKLHR3D(nn,1) = 1; + riga6temp(s,1) = {'Klino Link HR 3D'}; + riga6short(s,1) = {'Klino Link HR 3D'}; + else + yesKLHR3D(nn,1) = 0; + riga6temp(s,1) = {'Klino Link'}; + riga6short(s,1) = {'Klino Link'}; + end + else + yesKLHR3D(nn,1) = 0; + riga6temp(s,1) = {'Klino Link'}; + riga6short(s,1) = {'Klino Link'}; + end + s = s+1; + else + yesKLHR3D(nn,1) = 0; + end + if yesKLHR(nn) == 1 % Klino Link HR + if yesKL(nn) ~= 1 % Klino Link + riga6temp(s,1) = {'Klino Link HR'}; + riga6short(s,1) = {'Klino Link HR'}; + s = s+1; + end + end + if yesThL(nn) == 1 % Therm Link + riga6temp(s,1) = {'Therm Link'}; + riga6short(s,1) = {'Therm Link'}; + s = s+1; + end + if yesPT100(nn) == 1 % PT100 Link + riga6temp(s,1) = {'PT100 Link'}; + riga6short(s,1) = {'PT100 Link'}; + s = s+1; + end + if yesIPL(nn) == 1 % In Place Link + if yesIPLHR(nn) == 1 % se ho In Place Link HR elimino In Place Link dalla lista + if rIPL(nn) == rIPLHR(nn) + riga6temp(s,1) = {'In Place Link HR 3D'}; + riga6short(s,1) = {'IP Link HR 3D'}; + else + riga6temp(s,1) = {'In Place Link'}; + riga6short(s,1) = {'In Place Link'}; + end + else + riga6temp(s,1) = {'In Place Link'}; + riga6short(s,1) = {'In Place Link'}; + end + s = s+1; + end + if yesIPLHR(nn) == 1 % In Place Link HR + if yesIPL(nn) ~= 1 % In Place Link + riga6temp(s,1) = {'In Place Link HR'}; + riga6short(s,1) = {'IP Link HR'}; + s = s+1; + end + end + if yesTuL(nn) == 1 % Tunnel Link + riga6temp(s,1) = {'Tunnel Link'}; + riga6short(s,1) = {'Tunnel Link'}; + s = s+1; + end + if yesRaL(nn) == 1 % Radial Link + riga6temp(s,1) = {'Radial Link'}; + riga6short(s,1) = {'Radial Link'}; + s = s+1; + end + if yesPCL(nn) == 1 % PreConv Link + if yesPCLHR(nn) == 1 % se ho PreConv Link HR elimino PreConv Link dalla lista + if rPCL(nn) == rPCLHR(nn) + riga6temp(s,1) = {'PreConv Link HR 3D'}; + riga6short(s,1) = {'PC Link HR 3D'}; + else + riga6temp(s,1) = {'PreConv Link'}; + riga6short(s,1) = {'PreConv Link'}; + end + else + riga6temp(s,1) = {'PreConv Link'}; + riga6short(s,1) = {'PreConv Link'}; + end + s = s+1; + end + if yesPCLHR(nn) == 1 % PreConv Link HR + if yesPCL(nn) ~= 1 % PreConv Link + riga6temp(s,1) = {'PreConv Link HR'}; + riga6short(s,1) = {'PC Link HR'}; + s = s+1; + end + end + if yesPrL(nn) == 1 % Pressure Link + riga6temp(s,1) = {'Pressure Link'}; + riga6short(s,1) = {'Press. Link'}; + s = s+1; + end + if yesEL(nn) == 1% Extensometer Link + riga6temp(s,1) = {'Extensometer Link'}; + riga6short(s,1) = {'Extens. Link'}; + s = s+1; + end + if yes3DEL(nn) == 1 % 3D Extensometer Link + riga6temp(s,1) = {'3D Extensometer Link'}; + riga6short(s,1) = {'3D Ext. Link'}; + s = s+1; + end + if yesWEL(nn) == 1 % Wire Extensometer Link + riga6temp(s,1) = {'Wire Extensometer Link'}; + riga6short(s,1) = {'Wire Ex. Link'}; + s = s+1; + end + if yesMPBEL(nn) == 1 % Multi Point Borehole Extensometer Link + riga6temp(s,1) = {'Multi Point Borehole Extensometer Link'}; + riga6short(s,1) = {'MPBX Link'}; + s = s+1; + end + if yesCrL(nn) == 1 % Crack Link + riga6temp(s,1) = {'Crack Link'}; + riga6short(s,1) = {'Crack Link'}; + s = s+1; + end + if yes2DCrL(nn) == 1 % 2D Crack Link + riga6temp(s,1) = {'2D Crack Link'}; + riga6short(s,1) = {'2D Crack Link'}; + s = s+1; + end + if yes3DCrL(nn) == 1 % 3D Crack Link + riga6temp(s,1) = {'3D Crack Link'}; + riga6short(s,1) = {'3D Cr. Link'}; + s = s+1; + end + if yesHL(nn) == 1 % Humidity Link + riga6temp(s,1) = {'Humidity Link'}; + riga6short(s,1) = {'Humidity Link'}; + s = s+1; + end + if yesLuxL(nn) == 1 % Lux Link + riga6temp(s,1) = {'Lux Link'}; + riga6short(s,1) = {'Lux Link'}; + s = s+1; + end + if yesCO2(nn) == 1 % CO2 Link + riga6temp(s,1) = {'CO2 Link'}; + riga6short(s,1) = {'CO2 Link'}; + s = s+1; + end + if yesRSN(nn) == 1 % RSN Link + if yesRSNHR(nn) == 1 % se ho RSN Link HR elimino RSN Link dalla lista + if rPRSN(nn) == rRSNHR(nn) + riga6temp(s,1) = {'RSN Link HR 3D'}; + riga6short(s,1) = {'RSN Link HR 3D'}; + else + riga6temp(s,1) = {'RSN Link'}; + riga6short(s,1) = {'RSN Link'}; + end + else + riga6temp(s,1) = {'RSN Link'}; + riga6short(s,1) = {'RSN Link'}; + end + s = s+1; + end + if yesRSNHR(nn) == 1 % RSN Link HR + if yesRSN(nn) ~= 1 % RSN Link + riga6temp(s,1) = {'RSN Link HR'}; + riga6short(s,1) = {'RSN Link HR'}; + s = s+1; + end + end + if yesTrL(nn) == 1 % Trigger Link + riga6temp(s,1) = {'Trigger Link'}; + riga6short(s,1) = {'Trigger Link'}; + end + if yesPE(nn) == 1 % Pendulum + riga6temp(s,1) = {'Pendulum'}; + riga6short(s,1) = {'Pendulum'}; + end + if yesWL(nn) == 1 % Weir Link + riga6temp(s,1) = {'Weir Link'}; + riga6short(s,1) = {'Weir Link'}; + end + if yesGF(nn) == 1 % G-Flow Link + riga6temp(s,1) = {'G-Flow Link'}; + riga6short(s,1) = {'G-Flow Link'}; + s = s+1; + end + if yesGS(nn) == 1 % G-Shock Link + riga6temp(s,1) = {'G-Shock Link'}; + riga6short(s,1) = {'G-Shock Link'}; + s = s+1; + end + if yesWiL(nn) == 1 % Wind Link + riga6temp(s,1) = {'Wind Link'}; + riga6short(s,1) = {'Wind Link'}; + s = s+1; + end + if s == 2 + colonna6(1,nn+1) = riga6temp(:,1); + colonna6_short(1,nn+1) = riga6short(:,1); + clear riga6temp + clear riga6short + else + colonna6{1,nn+1} = splitlines(strjoin(cellstr(riga6temp(:,1)), '\n')); + colonna6_short{1,nn+1} = splitlines(strjoin(cellstr(riga6short(:,1)), '\n')); + clear riga6temp; + clear riga6short + end +end +if cCT > 1 + ct = 1; % conta dispositivi di tipo diverso + for mm = 1:nCT + if strcmp(char(tipoalarms(mm)),'Variable Message System') + CTtemp(ct,1) = {'Variable Message System'}; + CTtemp_short(ct,1) = {'VMS'}; + ct = ct +1; + elseif strcmp(char(tipoalarms(mm)),'Traffic Lights') + CTtemp(ct,1) = {'Traffic Lights'}; + CTtemp_short(ct,1) = {'Traffic Lights'}; + ct = ct +1; + elseif strcmp(char(tipoalarms(mm)),'Alarms') + CTtemp(ct,1) = {'Visual-acoustic alarm'}; + CTtemp_short(ct,1) = {'Alarm system'}; + ct = ct +1; + elseif strcmp(char(tipoalarms(mm)),'Camera') + CTtemp(ct,1) = {'Camera'}; + CTtemp_short(ct,1) = {'Camera'}; + ct = ct +1; + end + + colonna6{1,rS+1+mm} = strjoin(cellstr(CTtemp(mm,1)), ', '); + colonna6_short{1,rS+1+mm} = strjoin(cellstr(CTtemp_short(mm,1)), ', '); + end + c6trigger = colonna6{1,rS+2:end}; +else + c6trigger = []; + clear CTtemp +end +colonna6 = colonna6'; +colonna6_short = colonna6_short'; + +% Riga 7 - numero sensori +colonna7(1,1)={'Number of sensors/devices'}; +for s = 1:rS + if strcmp(cellstr(colonna4(s+1,1)),'Vertical Array') || strcmp(cellstr(colonna4(s+1,1)),'In Place Array')... + || strcmp(cellstr(colonna4(s+1,1)),'Therm Array') || strcmp(cellstr(colonna4(s+1,1)),'Piezo Array')... + || strcmp(cellstr(colonna4(s+1,1)),'Cir Array') || strcmp(cellstr(colonna4(s+1,1)),'Rad Array')... + || strcmp(cellstr(colonna4(s+1,1)),'PreConv Array') || strcmp(cellstr(colonna4(s+1,1)),'Horizontal Array')... + || strcmp(cellstr(colonna4(s+1,1)),'Vertical Array Structure') + colonna7(s+1,1) = cellstr(num2str(num_nodi(s,1)-1)); + else + colonna7(s+1,1) = cellstr(num2str(num_nodi(s,1))); + end +end +if cCT > 1 + colonna7(rS+2:rS+1+rCT) = cellstr('1'); +end + +text = 'report_table_ENG function executed correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/rotate_v_by_q.m b/Tilt/rotate_v_by_q.m new file mode 100755 index 0000000..5b8d46a --- /dev/null +++ b/Tilt/rotate_v_by_q.m @@ -0,0 +1,7 @@ +function u=rotate_v_by_q(v,q) + +q_inv= [q(1) -q(2) -q(3) -q(4)]'; + +u = q_mult2(q,q_mult2(v,q_inv)); + +end diff --git a/Tilt/schema.m b/Tilt/schema.m new file mode 100755 index 0000000..30abd57 --- /dev/null +++ b/Tilt/schema.m @@ -0,0 +1,17 @@ +% Funzione che mi ricostruisce la composizione della catena + +function catena = schema(idTool,conn,FileName) + +text = 'schema function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +comando = ['select nodetype_id, depth, num from nodes where tool_id = ''' idTool ''' order by num']; +catena = fetch(conn,comando); + +text = 'Array scheme defined correctly. schema function ended'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end diff --git a/Tilt/schemaSP.m b/Tilt/schemaSP.m new file mode 100755 index 0000000..d3cdbee --- /dev/null +++ b/Tilt/schemaSP.m @@ -0,0 +1,1020 @@ +% Funzione che ricostrusice i segmenti di pertinenza e la profondità dello +% spostamento relativo. +% Aggiornato il 18 Marzo 2021 +function [SpeTL,PsTL,SpeTLHR,PsTLHR,SpeTLH,PsTLH,SpeTLHRH,PsTLHRH,SpeIPL,PsIPL,Inverti,... + SpeIPLHR,PsIPLHR,SpeHD,PsHD,SpeHDVR,PsHDVR] = schemaSP(yesTL,yesTLHR,yesTLH,yesTLHRH,yesTLHR3D,yesTLHR3DH,... + yesIPL,yesIPLHR,yesIPLHR3D,yesHD,yesHDVR,NodoTiltLink,NodoTiltLinkHR,NodoTiltLinkHR3D,... + NodoTiltLinkH,NodoTiltLinkHRH,NodoTiltLinkHR3DH,NodoInPlaceLink,NodoInPlaceLinkHR,... + NodoInPlaceLinkHR3D,NodoTiltLinkHD,NodoTiltLinkHDVR,Anchor_real,... + rTL,rTLH,rTLHR,rTLHRH,rIPL,rIPLHR,rHD,rHDVR,catena,IDcentralina,DTcatena,FileName) + +% Apro file di testo +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'schemaSP function started'; +fprintf(fileID,fmt,text); + +Shift = Anchor_real; +Nodi = [cell2mat(catena(:,3)) cell2mat(catena(:,2))+Shift cell2mat(catena(:,1))]; + +% if Anchor_real == 0 +% Last_Node = 0; +% else +% [r,~] = size(Nodi); +% % Cerco l'ancora +% for i = 1:r +% if Nodi(i,3) == 9 +% break +% end +% end +% Last_Node = Anchor_real - Nodi(i,2) + 0.5; +% Nodi(:,2) = Nodi(:,2) + Last_Node; +% end + +%% Tilt Link V +if yesTL == 1 +% Definizione dei segmenti di pertinenza dei singoli accelerometri +% SpeTL = Segmento di Pertinenza del nodo (posizione i-esima del nodo i-esimo) +% PsTL = Profondità dello spostamento + NodiTL = -1*cell2mat(NodoTiltLink(:,2:3)); + NodiTL(:,2) = NodiTL(:,2) + Shift; + % Costruisco il segmento di pertinenza + spe0 = 0; % segmento di pertinenza dell'ancora + if rTL > 1 + spe1 = Nodi(1,2)-((NodiTL(1,2) + NodiTL(2,2))/2); % segmento di pertinenza del primo nodo + else + spe1 = 1; + end + if rTL>2 + spe2 = zeros(rTL-2,1); + for i = 2:(rTL-1) + media1 = (abs(NodiTL(i,2)) + abs(NodiTL(i-1,2)))/2; + media2 = (abs(NodiTL(i,2)) + abs(NodiTL(i+1,2)))/2; + spe2(i-1,1) = media1 - media2; + end + else + spe2 = []; + end + if rTL > 1 + spelast = (NodiTL(rTL-1,2)+NodiTL(rTL,2))/2; % segmento di pertinenza del nodo superficiale + SpeTL = [spe0; spe1; spe2; spelast]; + else + SpeTL = [spe0; spe1]; + end + + % Calcolo la profondità dello spostamento relativo + ps0 = (-1)*Nodi(1,2); % profondità dell'ancora + ps1 = (-1)*Nodi(1,2)+spe1; % la profondità del primo nodo TL è data da + % ancora + segmento di pertinenza del primo nodo + ps2 = zeros(rTL-1,1); + for j = 2:rTL + if j == 2 + psj = ps1 + SpeTL(j+1,1); + % la profondità a cui il nodo j di tipo Tilt Link rileva lo spostamento è data dalla + % somma fra il suo segmento di pertinenza e la profondità a cui rileva lo spostamento + % il nodo precedente + psPrec = psj; + % mi serve come appoggio per il calcolo della profondità dello spostamento del nodo successivo + else + psj = psPrec + SpeTL(j+1,1); + psPrec = psj; + end + ps2(j-1,1) = psj; + end + PsTL = [ps0; ps1; ps2]; + text = 'Segments of relevance and calculation points of Tilt Link V defined correctly'; + fprintf(fileID,fmt,text); +else + % Non ci sono nodi Tilt Link + SpeTL = []; + PsTL = []; +end + +%% Tilt Link HD V +if yesHD == 1 +% Definizione dei segmenti di pertinenza dei singoli accelerometri +% SpeTL = Segmento di Pertinenza del nodo (posizione i-esima del nodo i-esimo) +% PsTL = Profondità dello spostamento + NodiTLHD = -1*cell2mat(NodoTiltLinkHD(:,2:3)); + NodiTLHD(:,2) = NodiTLHD(:,2) + Shift; + % Costruisco il segmento di pertinenza + spe0 = 0; % segmento di pertinenza dell'ancora + if rHD > 1 + spe1 = Nodi(1,2)-((NodiTLHD(1,2) + NodiTLHD(2,2))/2); % segmento di pertinenza del primo nodo + else + spe1 = 1; + end + if rHD>2 + spe2 = zeros(rHD-2,1); + for i = 2:(rHD-1) + media1 = (abs(NodiTLHD(i,2)) + abs(NodiTLHD(i-1,2)))/2; + media2 = (abs(NodiTLHD(i,2)) + abs(NodiTLHD(i+1,2)))/2; + spe2(i-1,1) = media1 - media2; + end + else + spe2 = []; + end + if rHD > 1 + spelast = (NodiTLHD(rHD-1,2)+NodiTLHD(rHD,2))/2; % segmento di pertinenza del nodo superficiale + SpeHD = [spe0; spe1; spe2; spelast]; + else + SpeHD = [spe0; spe1]; + end + + % Calcolo la profondità dello spostamento relativo + ps0 = (-1)*Nodi(1,2); % profondità dell'ancora + ps1 = (-1)*Nodi(1,2)+spe1; % la profondità del primo nodo TL è data da + % ancora + segmento di pertinenza del primo nodo + ps2 = zeros(rHD-1,1); + for j = 2:rHD + if j == 2 + if SpeHD(j+1,1) <= 1 + psj = ps1 + SpeHD(j+1,1); + else + psj = cell2mat(NodoTiltLinkHD(j,3))+0.5+Shift; + end + % la profondità a cui il nodo j di tipo Tilt Link rileva lo spostamento è data dalla + % somma fra il suo segmento di pertinenza e la profondità a cui rileva lo spostamento + % il nodo precedente + psPrec = psj; + % mi serve come appoggio per il calcolo della profondità dello spostamento del nodo successivo + else + if SpeHD(j+1,1) <= 1 + psj = psPrec + SpeHD(j+1,1); + else + psj = cell2mat(NodoTiltLinkHD(j,3))+0.5+Shift; + end + psPrec = psj; + end + ps2(j-1,1) = psj; + end + PsHD = [ps0; ps1; ps2]; + text = 'Segments of relevance and calculation points of Tilt Link HD V defined correctly'; + fprintf(fileID,fmt,text); + for i = 2:rHD+1 + if SpeHD(i) > 1 + SpeHD(i) = 1; + end + end +else + % Non ci sono nodi Tilt Link + SpeHD = []; + PsHD = []; +end + +%% Tilt Link HD VR +if yesHDVR == 1 +% Definizione dei segmenti di pertinenza dei singoli accelerometri +% SpeTL = Segmento di Pertinenza del nodo (posizione i-esima del nodo i-esimo) +% PsTL = Profondità dello spostamento + NodiTLHDVR = -1*cell2mat(NodoTiltLinkHDVR(:,2:3)); + NodiTLHDVR(:,2) = NodiTLHDVR(:,2) + Shift; + % Costruisco il segmento di pertinenza + spe0 = 0; % segmento di pertinenza dell'ancora + if rHDVR > 1 + spe1 = Nodi(1,2)-((NodiTLHDVR(1,2) + NodiTLHDVR(2,2))/2); % segmento di pertinenza del primo nodo + else + spe1 = 1; + end + if rHDVR>2 + spe2 = zeros(rHDVR-2,1); + for i = 2:(rHDVR-1) + media1 = (abs(NodiTLHDVR(i,2)) + abs(NodiTLHDVR(i-1,2)))/2; + media2 = (abs(NodiTLHDVR(i,2)) + abs(NodiTLHDVR(i+1,2)))/2; + spe2(i-1,1) = media1 - media2; + end + else + spe2 = []; + end + if rHDVR > 1 + spelast = (NodiTLHDVR(rHDVR-1,2)+NodiTLHDVR(rHDVR,2))/2; % segmento di pertinenza del nodo superficiale + SpeHDVR = [spe0; spe1; spe2; spelast]; + else + SpeHDVR = [spe0; spe1]; + end + + % Calcolo la profondità dello spostamento relativo + ps0 = (-1)*Nodi(1,2); % profondità dell'ancora + ps1 = (-1)*Nodi(1,2)+spe1; % la profondità del primo nodo TL è data da + % ancora + segmento di pertinenza del primo nodo + ps2 = zeros(rHDVR-1,1); + for j = 2:rHDVR + if j == 2 + if SpeHDVR(j+1,1) <= 1 + psj = ps1 + SpeHDVR(j+1,1); + else + psj = cell2mat(NodoTiltLinkHDVR(j,3))+0.5+Shift; + end + % la profondità a cui il nodo j di tipo Tilt Link rileva lo spostamento è data dalla + % somma fra il suo segmento di pertinenza e la profondità a cui rileva lo spostamento + % il nodo precedente + psPrec = psj; + % mi serve come appoggio per il calcolo della profondità dello spostamento del nodo successivo + else + if SpeHDVR(j+1,1) <= 1 + psj = psPrec + SpeHDVR(j+1,1); + else + psj = cell2mat(NodoTiltLinkHDVR(j,3))+0.5+Shift; + end + psPrec = psj; + end + ps2(j-1,1) = psj; + end + PsHDVR = [ps0; ps1; ps2]; + text = 'Segments of relevance and calculation points of Tilt Link HD VR defined correctly'; + fprintf(fileID,fmt,text); + for i = 2:rHDVR+1 + if SpeHDVR(i) > 1 + SpeHDVR(i) = 1; + end + end +else + % Non ci sono nodi Tilt Link VR + SpeHDVR = []; + PsHDVR = []; +end + +%% Tilt Link HR V +if yesTLHR == 1 + % Definizione dei segmenti di pertinenza delle ampolle + % PsTLHR = Profondità dello spostamento + NodiTLHR = -1*cell2mat(NodoTiltLinkHR(:,2:3)); + NodiTLHR(:,2) = NodiTLHR(:,2) + Shift; + % Costruisco il segmento di pertinenza + spe0 = 0; % segmento di pertinenza dell'ancora + if rTLHR == 1 % c'è una sola ampolla + SpeTLHR = [0; 0.5]; % lo impongo di default + else + spe1 = Nodi(1,2)-((NodiTLHR(1,2) + NodiTLHR(2,2))/2); % segmento di pertinenza del primo nodo + if rTLHR>2 + spe2 = zeros(rTLHR-2,1); + for i = 2:(rTLHR-1) + media1 = (abs(NodiTLHR(i,2)) + abs(NodiTLHR(i-1,2)))/2; + media2 = (abs(NodiTLHR(i,2)) + abs(NodiTLHR(i+1,2)))/2; + spei = media1 - media2; + spe2(i-1,1) = spei; + end + else + spe2 = []; + end + spelast = (NodiTLHR(rTLHR-1,2)+NodiTLHR(rTLHR,2))/2; % segmento di pertinenza del nodo superficiale + SpeTLHR = [spe0; spe1; spe2; spelast]; + end + + % Calcolo la profondità dello spostamento relativo + ps0 = (-1)*Nodi(1,2); % profondità dell'ancora + if rTLHR == 1 % c'è una sola ampolla + PsTLHR = [ps0; -1*NodiTLHR(1,2)]; + else + ps1 = (-1)*Nodi(1,2)+spe1; % la profondità del primo nodo TLHR è data + % da ancora + segmento di pertinenza del primo nodo + ps2 = zeros(rTLHR-1,1); + for j = 2:rTLHR + if j == 2 + psj = ps1 + SpeTLHR(j+1,1); + % la profondità a cui il nodo j di tipo Tilt Link HR rileva lo + % spostamento è data dalla somma fra il suo segmento di + % pertinenza e la profondità a cui rileva lo spostamento + % il nodo precedente + psPrec = psj; % mi serve come appoggio per il calcolo della + % profondità dello spostamento del nodo successivo + else + psj = psPrec + SpeTLHR(j+1,1); + psPrec = psj; + end + ps2(j-1,1) = psj; + end + PsTLHR = [ps0; ps1; ps2]; + end + + if yesTL == 1 % Se ci sono Tilt Link, il segmento di pertinenza + % dell'ampolla lo scrivo considerando i nodi Tilt Link sopra e + % sotto (se sono presenti) + salta = zeros(rTLHR,1); + esco = 0; % entra o meno nel ciclo successivo + + if yesTLHR3D == 1 + [dim,~] = size(NodoTiltLinkHR3D); + if rTLHR == dim % vuol dire che tutti i nodi sono dopppi + esco = 1; % non entro nel ciclo successivo + end + end + + if esco == 0 + NodiTLdown = zeros(rTLHR,1); + NodiTLup = zeros(rTLHR,1); + ProfTLHR = zeros(rTLHR*3,1); + for i = 1:rTLHR + prof = NodiTLHR(i,2); + % cerco il nodo sotto all'Ampolla + B = NodiTL(:,2) > prof; % uso > perchè il segno della profondità è + + A = NodiTL(B,2); + if i == 1 % guardo se il primo nodo è Ampolla o Mems + C = isempty(A); + if C == 1 % il primo nodo è Ampolla + salta(i) = 1; + else + salta(i) = 0; + end + end + NodoTLdown = A(end); % nodo Tilt Link sotto all'Ampolla + + % cerco il nodo dopo l'Ampolla + B = NodiTL(:,2) < prof; + A = NodiTL(B,2); + CC = isempty(A); + if C == 1 % Manca il nodo Sotto + salta(i) = 1; + else + if CC == 1 % ovvero se Tilt Link e Tilt Link HR sono nello + % stesso nodo doppio, ignoro il passaggio (manca + % il nodo sopra) + salta(i) = 1; + else + salta(i) = 0; + NodoTLup = A(1); + NodiTLdown(i,1) = NodoTLdown; + NodiTLup(i,1) = NodoTLup; % Nodo Tilt Link sopra all'ampolla + end + end + end + + spe0 = 0; % segmento di pertinenza dell'ancora + if salta(1) == 1 + spe1 = Nodi(1,2)-NodiTLHR(1,2); % segmento di pertinenza del primo nodo + ii = 2; + else + spe1 = Nodi(1,2)-NodiTLdown(1,1); % segmento di pertinenza del + % primo nodo. N.B.: Per funzionare correttamente, il primo nodo + % dopo l'ancora deve per forza essere un Tilt Link! + ii = 1; + end + spe2 = zeros(rTLHR,1); + for i = ii:rTLHR + spei = (NodiTLdown(i,1)-NodiTLup(i,1))/2; + spe2(i,1) = spei; + end + SpeTLHR = [spe0; spe1; spe2]; + + % Calcolo profondità dello spostamento relativo + m = 1; + + for i = 1:rTLHR + if salta(i) == 1 + if i == 1 % considero l'ancora + a = (Nodi(i,2)+NodiTLHR(i,2))/2; + ProfTLHR = PsTLHR; + else + a = (NodiTLHR(i-1,2)+NodiTLHR(i,2))/2; + end + if i == rTLHR % ultimo nodo + if salta(i) == 1 + b = NodiTLHR(i,2); + c = NodiTLHR(i,2)+0.25; + else + b = (NodiTLHR(i,2)+NodiTLup(i))/2; + c = NodiTLup(i)-(NodiTLHR(i,2)-NodiTLup(i))/2; + end + else + if salta(i+1) == 1 + b = (NodiTLHR(i,2)+NodiTLHR(i+1,2))/2; + c = (NodiTLHR(i+1,2)-(NodiTLHR(i,2)-NodiTLHR(i+1,2)))/2; + else + b = (NodiTLHR(i,2)+NodiTLup(i))/2; + c = NodiTLup(i)-(NodiTLHR(i,2)-NodiTLup(i))/2; + end + end + else + a = (NodiTLdown(i)+NodiTLHR(i,2))/2; + b = (NodiTLHR(i,2)+NodiTLup(i))/2; + c = (NodiTLup(i)-(NodiTLHR(i,2)-NodiTLup(i))/2); + end + ProfTLHR(m,1) = a; + ProfTLHR(m+1,1) = b; + ProfTLHR(m+2,1) = c; + m = m+3; + end + end + end + text = 'Segments of relevance and calculation points of Tilt Link HR V defined correctly'; + fprintf(fileID,fmt,text); +else + % Non ci sono nodi Tilt Link HR + PsTLHR = []; + SpeTLHR = []; +end + +%% Tilt Link HR3D +% % CONTROLLA E CORREGGI. lA CORREZIONE FATTA QUI VA PURE SU TL E HR +if yesTLHR3D == 1 + NodoTLHR3D = zeros(rTL,1); + t = 1; + for i=1:rTL + for j=1:rTLHR + if NodiTL(i,2)==NodiTLHR(j,2) + NodoTLHR3D(t,1)=NodiTL(i,2); + SpeTLHR(j+1,1) = SpeTL(i+1,1); + PsTLHR(j+1,1) = PsTL(i+1,1); + % il segmento di pertinenza dell'ampolla è identico al SP del corrispondente Tilt Link V + t=t+1; + end + end + end +end + +%% Tilt Link H +if yesTLH == 1 +% Definizione dei segmenti di pertinenza dei singoli accelerometri +% SpeTLH = Segmento di Pertinenza del nodo (posizione i-esima del nodo i-esimo) +% PsTLH = Posizione dello spostamento + Nodi_H = Nodi; + NodiTLH = cell2mat(NodoTiltLinkH(:,2:3)); + + % Costruisco il segmento di pertinenza + spe0 = 0; % segmento di pertinenza dell'ancora + spe1 = -1*(Nodi_H(1,2)-((NodiTLH(1,2) + NodiTLH(2,2))/2)); % segmento di pertinenza del primo nodo, lo considero + + if rTLH>2 + spe2 = zeros(rTLH-2,1); + for i = 2:(rTLH-1) + media1 = (abs(NodiTLH(i,2)) + abs(NodiTLH(i-1,2)))/2; + media2 = (abs(NodiTLH(i,2)) + abs(NodiTLH(i+1,2)))/2; + spei = media1 - media2; + spe2(i-1,1) = -1*(spei); % li considero positivi + end + else + spe2 = []; + end + % segmento di pertinenza dell'ultimo nodo, lo considero centrando il + % nodo rispetto al nodo sotto e a un ipotetico nodo sopra equidistante + spelast = (NodiTLH(end,2)+(NodiTLH(end,2)-NodiTLH(rTLH-1,2))/2-((NodiTLH(rTLH-1,2)+NodiTLH(rTLH,2)))/2); + SpeTLH = [spe0; spe1; spe2; spelast]; % raccolgo i segmenti di pertinenza + + % Calcolo la posizione dello spostamento relativo + ps0 = Nodi_H(1,2); % posizione dell'ancora + if spe1 <= 1 + ps1 = Nodi_H(1,2)+spe1; % la posizione del primo nodo TLH è data da + else + ps1 = cell2mat(NodoTiltLinkH(1,3))+0.5; + end + % ancora + segmento di pertinenza del primo nodo + ps2 = zeros(rTLH-1,1); + for j = 2:rTLH + if j == 2 + if SpeTLH(j+1,1) <= 1 + psj = ps1 + SpeTLH(j+1,1); + else + psj = cell2mat(NodoTiltLinkH(j,3))+0.5; + end + % la posizione a cui il nodo j di tipo Tilt Link H rileva lo spostamento è data dalla + % somma fra il suo segmento di pertinenza e la posizione a cui rileva lo spostamento + % il nodo precedente + psPrec = psj; + % mi serve come appoggio per il calcolo della posizione dello spostamento del nodo successivo + else + if SpeTLH(j+1,1) <= 1 + psj = psPrec + SpeTLH(j+1,1); + else + psj = cell2mat(NodoTiltLinkH(j,3))+0.5; + end + psPrec = psj; + end + ps2(j-1,1) = psj; + end + PsTLH = [ps0; ps1; ps2]; + text = 'Segments of relevance and calculation points of Tilt Link H defined correctly'; + fprintf(fileID,fmt,text); + for i = 2:rTLH+1 + if SpeTLH(i) > 1 + SpeTLH(i) = 1; + end + end +else + % Non ci sono nodi Tilt Link H + SpeTLH = []; + PsTLH = []; +end + +%% Tilt Link HR H +if yesTLHRH == 1 + % Definizione dei segmenti di pertinenza delle ampolle + % PsTLHRH = posizione dello spostamento + Nodi_HRH = Nodi; + NodiTLHRH = cell2mat(NodoTiltLinkHRH(:,2:3)); + + % Costruisco il segmento di pertinenza + spe0 = 0; % segmento di pertinenza dell'ancora + spe1 = -1*(Nodi_HRH(1,2)-((NodiTLHRH(1,2)+NodiTLHRH(2,2))/2)); % segmento di pertinenza del primo nodo + spe2 = zeros(rTLHRH-2,1); + if rTLHRH>2 + for i = 2:(rTLHRH-1) + media1 = (abs(NodiTLHRH(i,2)) + abs(NodiTLHRH(i-1,2)))/2; + media2 = (abs(NodiTLHRH(i,2)) + abs(NodiTLHRH(i+1,2)))/2; + spei = media1 - media2; + spe2(i-1,1) = -1*(spei); % li considero positivi + end + else + spe2 = []; + end + % segmento di pertinenza dell'ultimo nodo, lo considero centrando il + % nodo rispetto al nodo sotto e a un ipotetico nodo sopra equidistante + spelast = (NodiTLHRH(end,2)+(NodiTLHRH(end,2)-NodiTLHRH(rTLH-1,2))/2-((NodiTLHRH(rTLH-1,2)+NodiTLHRH(rTLH,2)))/2); + % raccolgo i segmenti di pertinenza + SpeTLHRH = [spe0; spe1; spe2; spelast]; + + % Calcolo la posizione dello spostamento relativo + ps0 = Nodi_HRH(1,2); % posizione dell'ancora + if spe1 <= 1 + ps1 = Nodi_HRH(1,2)+spe1; % la posizione del primo nodo TLHRH è data da ancora + segmento di pertinenza del primo nodo + else + ps1 = cell2mat(NodoTiltLinkHRH(1,3))+0.5; + end + ps2 = zeros(rTLHRH-1,1); + for j = 2:rTLHRH + if j == 2 + if SpeTLHRH(j+1,1) <= 1 + psj = ps1 + SpeTLHRH(j+1,1); + else + psj = cell2mat(NodoTiltLinkHRH(j,3))+0.5; + end + % la posizione a cui il nodo j di tipo Tilt Link HR H rileva lo + % spostamento è data dalla somma fra il suo segmento di + % pertinenza e la posizione a cui rileva lo spostamento + % il nodo precedente + psPrec = psj; % mi serve come appoggio per il calcolo della + % posizione dello spostamento del nodo successivo + else + if SpeTLHRH(j+1,1) <= 1 + psj = psPrec + SpeTLHRH(j+1,1); + else + psj = cell2mat(NodoTiltLinkHRH(j,3))+0.5; + end + psPrec = psj; + end + ps2(j-1,1) = psj; + end + PsTLHRH = [ps0; ps1; ps2]; + for i = 2:rTLHRH+1 + if SpeTLHRH(i) > 1 + SpeTLHRH(i) = 1; + end + end + + if yesTLH == 1 % Se ci sono Tilt Link H, il segmento di pertinenza + % dell'ampolla lo scrivo considerando i nodi Tilt Link H prima e + % dopo (se sono presenti), a meno che questi non siano Tilt Link + % HR3D H + salta = zeros(rTLHRH,1); + esco = 0; % entra o meno nel ciclo successivo + if yesTLHR3DH == 1 + [dim,~] = size(NodoTiltLinkHR3DH); + if rTLHRH == dim % vuol dire che tutti i nodi sono dopppi + esco = 1; % esco dal ciclo successivo + end + end + + if esco == 0 + NodiTLHdown = zeros(rTLHRH,1); + NodiTLHup = zeros(rTLHRH,1); + ProfTLHRH = zeros(rTLHRH*3,1); + for i = 1:rTLHRH + prof = NodiTLHRH(i,2); + % cerco il nodo prima dell'Ampolla + B = NodiTLH(:,2) < prof; + A = NodiTLH(B,2); + if i == 1 % guardo se il primo nodo è Ampolla o Tilt Link + C = isempty(A); + if C == 1 % il primo nodo è Ampolla + salta(i) = 1; + else + salta(i) = 0; + end + end + + NodoTLHdown = A(end); % nodo Tilt Link H prima dell'Ampolla + + % cerco il nodo dopo l'Ampolla + B = NodiTLH(:,2) > prof; + A = NodiTLH(B,2); + CC = isempty(A); + if C == 1 % Manca il nodo dopo + salta(i) = 1; + else + if CC == 1 % ovvero se Tilt Link e Tilt Link HR sono nello + % stesso nodo doppio, ignoro il passaggio (manca + % il nodo sopra) + salta(i) = 1; + else + salta(i) = 0; + NodoTLHup = A(1); + NodiTLHdown(i,1) = NodoTLHdown; + NodiTLHup(i,1) = NodoTLHup; % Nodo Tilt Link H dopo l'ampolla + end + end + end + + spe0 = 0; % segmento di pertinenza dell'ancora + if salta(1) == 1 + spe1 = Nodi(1,2)-NodiTLHRH(1,2); % segmento di pertinenza del primo nodo + ii = 2; + else + spe1 = Nodi(1,2)-NodiTLHdown(1,1); % segmento di pertinenza del + % primo nodo. N.B.: Per funzionare correttamente, il primo nodo + % dopo l'ancora deve per forza essere un Tilt Link H! + ii = 1; + end + spe2 = zeros(rTLHRH,1); + for i = ii:rTLHRH + spei = (NodiTLHdown(i,1)-NodiTLHup(i,1))/2; + spe2(i,1) = spei; + end + + SpeTLHRH = [spe0; spe1; spe2]; + % Calcolo posizione dello spostamento relativo + m = 1; + + for i = 1:rTLHRH + if salta(i) == 1 + if i == 1 % considero l'ancora + a = -1*((Nodi_HRH(i,2)+NodiTLHRH(i,2))/2); + ProfTLHRH = PsTLHRH; + else + a = -1*((NodiTLHRH(i-1,2)+NodiTLHRH(i,2))/2); + end + if i == rTLHRH % ultimo nodo + if salta(i) == 1 + b = -1*(NodiTLHRH(i,2)); + c = -1*(NodiTLHRH(i,2)+0.25); + else + b = -1*((NodiTLHRH(i,2)+NodiTLHup(i))/2); + c = -1*(NodiTLHup(i)-(NodiTLHRH(i,2)-NodiTLHup(i))/2); + end + else + if salta(i+1) == 1 + b = -1*((NodiTLHRH(i,2)+NodiTLHRH(i+1,2))/2); + c = -1*(NodiTLHRH(i+1,2)-(NodiTLHRH(i,2)-NodiTLHRH(i+1,2))/2); + else + b = -1*((NodiTLHRH(i,2)+NodiTLHup(i))/2); + c = -1*(NodiTLHup(i)-(NodiTLHRH(i,2)-NodiTLHup(i))/2); + end + end + else + a = -1*((NodiTLHdown(i)+NodiTLHRH(i,2))/2); + b = -1*((NodiTLHRH(i,2)+NodiTLHup(i))/2); + c = -1*(NodiTLHup(i)-(NodiTLHRH(i,2)-NodiTLHup(i))/2); + end + ProfTLHRH(m,1) = a; + ProfTLHRH(m+1,1) = b; + ProfTLHRH(m+2,1) = c; + m = m+3; + end + end + text = 'Segments of relevance and calculation points of Tilt Link HR H defined correctly'; + fprintf(fileID,fmt,text); + end +else + % Non ci sono nodi Tilt Link HR H + PsTLHRH = []; + SpeTLHRH = []; +end + +%% Tilt Link HR3D H +if yesTLHR3DH == 1 + NodoTLHR3DH = zeros(rTLH,1); + t = 1; + for i=1:rTLH + for j=1:rTLHRH + if NodiTLH(i,2)==NodiTLHRH(j,2) + NodoTLHR3DH(t,1)=NodiTLH(i,2); + SpeTLHRH(j+1,1) = SpeTLH(i+1,1); + PsTLHRH(j+1,1) = PsTLH(i+1,1); + t=t+1; + end + end + end +end + +%% In Place Link +if yesIPL == 1 + NodiIPL = -1*cell2mat(NodoInPlaceLink(:,2:3)); + NodiIPL(:,2) = NodiIPL(:,2) + Shift; + % Controllo quale sia il numero del nodo più profondo per invertire + % eventualmente le matrici + Nodo1 = find(cell2mat(NodoInPlaceLink(:,2))==1); + Prof1 = cell2mat(NodoInPlaceLink(Nodo1,3)); + Nodo2 = find(cell2mat(NodoInPlaceLink(:,2))==2); + Prof2 = cell2mat(NodoInPlaceLink(Nodo2,3)); + if Prof22 + spe2 = zeros(rIPL-2,1); + for i = 2:(rIPL-1) + if Inverti == 0 + media1 = (abs(NodiIPL(i,2)) + abs(NodiIPL(i-1,2)))/2; + media2 = (abs(NodiIPL(i,2)) + abs(NodiIPL(i+1,2)))/2; + elseif Inverti == 1 + media1 = (abs(NodiIPL(rIPL-i+1,2)) + abs(NodiIPL(rIPL,2)))/2; + media2 = (abs(NodiIPL(rIPL-i+1,2)) + abs(NodiIPL(rIPL-i,2)))/2; + end + spe2(i-1,1) = media1 - media2; + end + else + spe2 = []; + end + if Inverti == 0 + spelast = (NodiIPL(rIPL-1,2)+NodiIPL(rIPL,2))/2; % segmento di pertinenza del nodo superficiale + elseif Inverti == 1 + spelast = (NodiIPL(2,2)+NodiIPL(1,2))/2; % segmento di pertinenza del nodo superficiale + end + SpeIPL = [spe0; spe1; spe2; spelast]; + + % Calcolo la profondità dello spostamento relativo + if Inverti == 0 + ps0 = (-1)*Nodi(1,2); % profondità dell'ancora + elseif Inverti == 1 + ps0 = (-1)*Nodi(end,2); % profondità dell'ancora + end + if spe1 <= 1 + ps1 = (-1)*Nodi(1,2)+spe1; % la profondità del primo nodo IPL è data da + else + ps1 = cell2mat(NodoInPlaceLink(1,3))+0.5; + end + % ancora + segmento di pertinenza del primo nodo + ps2 = zeros(rIPL-1,1); + for j = 2:rIPL + if j == 2 + if SpeIPL(j+1,1) <= 1 + psj = ps1 + SpeIPL(j+1,1); + else + psj = cell2mat(NodoInPlaceLink(j,3))+0.5+Shift; + end + + % la profondità a cui il nodo j di tipo In Place Link rileva lo spostamento è data dalla + % somma fra il suo segmento di pertinenza e la profondità a cui rileva lo spostamento + % il nodo precedente + psPrec = psj; + % mi serve come appoggio per il calcolo della profondità dello spostamento del nodo successivo + else + if strcmp(IDcentralina,'ID0070') == 1 && strcmp(DTcatena,'DT0111 IPI') == 1 || ... + strcmp(IDcentralina,'ID0071') == 1 && strcmp(DTcatena,'DT0112 IPI') == 1 || ... + strcmp(IDcentralina,'ID0072') == 1 && strcmp(DTcatena,'DT0113 IPI') == 1 || ... + strcmp(IDcentralina,'ID0073') == 1 && strcmp(DTcatena,'DT0114 IPI') == 1 + if SpeIPL(j+1,1) <= 0.5 + psj = psPrec + SpeIPL(j+1,1); + else + psj = cell2mat(NodoInPlaceLink(j,3))+0.25+Shift; + end + else + if SpeIPL(j+1,1) <= 1 + psj = psPrec + SpeIPL(j+1,1); + else + psj = cell2mat(NodoInPlaceLink(j,3))+0.5+Shift; + end + end + + psPrec = psj; + end + ps2(j-1,1) = psj; + end + PsIPL = [ps0; ps1; ps2]; + text = 'Segments of relevance and calculation points of In Place Link defined correctly'; + fprintf(fileID,fmt,text); + for i = 2:rIPL+1 + if SpeIPL(i) > 1 + SpeIPL(i) = 1; + end + if strcmp(IDcentralina,'ID0070') == 1 && strcmp(DTcatena,'DT0111 IPI') == 1 || ... + strcmp(IDcentralina,'ID0071') == 1 && strcmp(DTcatena,'DT0112 IPI') == 1 || ... + strcmp(IDcentralina,'ID0072') == 1 && strcmp(DTcatena,'DT0113 IPI') == 1 || ... + strcmp(IDcentralina,'ID0073') == 1 && strcmp(DTcatena,'DT0114 IPI') == 1 + if SpeIPL(i) > 0.5 + SpeIPL(i) = 0.5; + end + end + end +else + % Non ci sono nodi In Place Link + SpeIPL = []; + PsIPL = []; + Inverti = []; +end + +%% In Place Link HR +if yesIPLHR == 1 + % Definizione dei segmenti di pertinenza delle ampolle + % PsIPLHR = Profondità dello spostamento + NodiIPLHR = -1*cell2mat(NodoInPlaceLinkHR(:,2:3)); + NodiIPLHR(:,2) = NodiIPLHR(:,2) + Shift; + + % Costruisco il segmento di pertinenza + spe0 = 0; % segmento di pertinenza dell'ancora + if rIPLHR == 1 % c'è una sola ampolla + SpeIPLHR = [0; 0.5]; % lo impongo di default + else + spe1 = Nodi(1,2)-((NodiIPLHR(1,2) + NodiIPLHR(2,2))/2); % segmento di pertinenza del primo nodo + if rIPLHR>2 + spe2 = zeros(rIPLHR-2,1); + for i = 2:(rIPLHR-1) + media1 = (abs(NodiIPLHR(i,2)) + abs(NodiIPLHR(i-1,2)))/2; + media2 = (abs(NodiIPLHR(i,2)) + abs(NodiIPLHR(i+1,2)))/2; + spei = media1 - media2; + spe2(i-1,1) = spei; + end + else + spe2 = []; + end + spelast = (NodiIPLHR(rIPLHR-1,2)+NodiIPLHR(rIPLHR,2))/2; % segmento di pertinenza del nodo superficiale + SpeIPLHR = [spe0; spe1; spe2; spelast]; + end + + % Calcolo la profondità dello spostamento relativo + ps0 = (-1)*Nodi(1,2); % profondità dell'ancora + if rIPLHR == 1 % c'è una sola ampolla + PsIPLHR = [ps0; -1*NodiIPLHR(1,2)]; + else + if spe1 <= 1 + ps1 = (-1)*Nodi(1,2)+spe1; % la profondità del primo nodo IPLHR è data + % da ancora + segmento di pertinenza del primo nodo + else + ps1 = cell2mat(NodoInPlaceLinkHR(1,3))+0.5+Shift; + end + ps2 = zeros(rIPLHR-1,1); + for j = 2:rIPLHR + if j == 2 + if SpeIPLHR(j+1,1) <= 1 + psj = ps1 + SpeIPLHR(j+1,1); + else + psj = cell2mat(NodoInPlaceLinkHR(j,3))+0.5+Shift; + end + % la profondità a cui il nodo j di tipo Tilt Link HR rileva lo + % spostamento è data dalla somma fra il suo segmento di + % pertinenza e la profondità a cui rileva lo spostamento + % il nodo precedente + psPrec = psj; % mi serve come appoggio per il calcolo della + % profondità dello spostamento del nodo successivo + else + if SpeIPLHR(j+1,1) <= 1 + psj = psPrec + SpeIPLHR(j+1,1); + else + psj = cell2mat(NodoInPlaceLinkHR(j,3))+0.5+Shift; + end + psPrec = psj; + end + ps2(j-1,1) = psj; + end + PsIPLHR = [ps0; ps1; ps2]; + end + for i = 2:rIPLHR+1 + if SpeIPLHR(i) > 1 + SpeIPLHR(i) = 1; + end + end + + if yesIPL == 1 % Se ci sono In Place Link, il segmento di pertinenza + % dell'ampolla lo scrivo considerando i nodi In Place Link sopra e + % sotto (se sono presenti) + salta = zeros(rIPLHR,1); + esco = 0; % entra o meno nel ciclo successivo + + if yesIPLHR3D == 1 + [dim,~] = size(NodoInPlaceLinkHR3D); + if rIPLHR == dim % vuol dire che tutti i nodi sono dopppi + esco = 1; % non entro nel ciclo successivo + end + end + + if esco == 0 + NodiIPLdown = zeros(rIPLHR,1); + NodiIPLup = zeros(rIPLHR,1); + ProfIPLHR = zeros(rIPLHR*3,1); + for i = 1:rIPLHR + prof = NodiIPLHR(i,2); + % cerco il nodo sotto all'Ampolla + B = NodiIPL(:,2) > prof; % uso > perchè il segno della profondità è + + A = NodiIPL(B,2); + if i == 1 % guardo se il primo nodo è Ampolla o Mems + C = isempty(A); + if C == 1 % il primo nodo è Ampolla + salta(i) = 1; + else + salta(i) = 0; + end + end + NodoIPLdown = A(end); % nodo In Place Link sotto all'Ampolla + + % cerco il nodo dopo l'Ampolla + B = NodiIPL(:,2) < prof; + A = NodiIPL(B,2); + CC = isempty(A); + if C == 1 % Manca il nodo Sotto + salta(i) = 1; + else + if CC == 1 % ovvero se In Place Link e In Place Link HR sono nello + % stesso nodo doppio, ignoro il passaggio (manca + % il nodo sopra) + salta(i) = 1; + else + salta(i) = 0; + NodoIPLup = A(1); + NodiIPLdown(i,1) = NodoIPLdown; + NodiIPLup(i,1) = NodoIPLup; % Nodo In Place Link sopra all'ampolla + end + end + end + + spe0 = 0; % segmento di pertinenza dell'ancora + if salta(1) == 1 + spe1 = Nodi(1,2)-NodiIPLHR(1,2); % segmento di pertinenza del primo nodo + ii = 2; + else + spe1 = Nodi(1,2)-NodiIPLdown(1,1); % segmento di pertinenza del + % primo nodo. N.B.: Per funzionare correttamente, il primo nodo + % dopo l'ancora deve per forza essere un Tilt Link! + ii = 1; + end + spe2 = zeros(rIPLHR,1); + for i = ii:rIPLHR + spei = (NodiIPLdown(i,1)-NodiIPLup(i,1))/2; + spe2(i,1) = spei; + end + SpeIPLHR = [spe0; spe1; spe2]; + + % Calcolo profondità dello spostamento relativo + m = 1; + + for i = 1:rIPLHR + if salta(i) == 1 + if i == 1 % considero l'ancora + a = (Nodi(i,2)+NodiIPLHR(i,2))/2; + ProfIPLHR = PsIPLHR; + else + a = (NodiIPLHR(i-1,2)+NodiIPLHR(i,2))/2; + end + if i == rIPLHR % ultimo nodo + if salta(i) == 1 + b = NodiIPLHR(i,2); + c = NodiIPLHR(i,2)+0.25; + else + b = (NodiIPLHR(i,2)+NodiIPLup(i))/2; + c = NodiIPLup(i)-(NodiIPLHR(i,2)-NodiIPLup(i))/2; + end + else + if salta(i+1) == 1 + b = (NodiIPLHR(i,2)+NodiIPLHR(i+1,2))/2; + c = (NodiIPLHR(i+1,2)-(NodiIPLHR(i,2)-NodiIPLHR(i+1,2)))/2; + else + b = (NodiIPLHR(i,2)+NodiIPLup(i))/2; + c = NodiIPLup(i)-(NodiIPLHR(i,2)-NodiIPLup(i))/2; + end + end + else + a = (NodiIPLdown(i)+NodiIPLHR(i,2))/2; + b = (NodiIPLHR(i,2)+NodiIPLup(i))/2; + c = (NodiIPLup(i)-(NodiIPLHR(i,2)-NodiIPLup(i))/2); + end + ProfIPLHR(m,1) = a; + ProfIPLHR(m+1,1) = b; + ProfIPLHR(m+2,1) = c; + m = m+3; + end + end + end + text = 'Segments of relevance and calculation points of In Place Link HR defined correctly'; + fprintf(fileID,fmt,text); +else + % Non ci sono nodi In Place Link HR + PsIPLHR = []; + SpeIPLHR = []; +end + +%% In Place Link HR 3D +if yesIPLHR3D == 1 + NodoIPLHR3D = zeros(rIPL,1); + t = 1; + for i=1:rIPL + for j=1:rIPLHR + if NodiIPL(i,2)==NodiIPLHR(j,2) + NodoIPLHR3D(t,1)=NodiIPL(i,2); + SpeIPLHR(j+1,1) = SpeIPL(i+1,1); + PsIPLHR(j+1,1) = PsIPL(i+1,1); + % il segmento di pertinenza dell'ampolla è identico al SP + % del corrispondente MEMS + t=t+1; + end + end + end +end + +% Chiudo Testo +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/scrivo.m b/Tilt/scrivo.m new file mode 100755 index 0000000..d9edd3f --- /dev/null +++ b/Tilt/scrivo.m @@ -0,0 +1,177 @@ +% Funzione che attiva o disattiva la scrittura dei sensori +function [scrivoTL,scrivoTLH,scrivoIPL,scrivoHD,scrivoHDVR,scrivoTLHR,scrivoTLHRH,scrivoIPLHR,... + scrivoPL,scrivoBL,scrivoLL,scrivoKL,scrivoKLHR,scrivoRL,scrivoSL,scrivoThL,... + scrivoPT100,scrivoWL,scrivoPE,scrivoSPP] = scrivo(X,Z_TLH,X_IPL,X_HD,X_HDVR,X_HR,Z_TLHRH,X_IPLHR,... + Livello,BaroDef,DatiLoad,ANGdefKL,ANGdefKLHR,Rain,Snow,Dati_ThL,Dati_PT100,... + Dati_WL,Dati_PE,SPP,FileName) + +text = 'scrivo function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +%% Tilt Link +TL = isempty(X); +if TL == 1 + scrivoTL = 0; +else + scrivoTL = 1; +end + +%% Tilt Link H +TLH = isempty(Z_TLH); +if TLH == 1 + scrivoTLH = 0; +else + scrivoTLH = 1; +end + +%% In Place Link +IPL = isempty(X_IPL); +if IPL == 1 + scrivoIPL = 0; +else + scrivoIPL = 1; +end + +%% Tilt Link HD +HD = isempty(X_HD); +if HD == 1 + scrivoHD = 0; +else + scrivoHD = 1; +end + +%% Tilt Link HD VR +HDVR = isempty(X_HDVR); +if HDVR == 1 + scrivoHDVR = 0; +else + scrivoHDVR = 1; +end + +%% Tilt Link HR +TLHR = isempty(X_HR); +if TLHR == 1 + scrivoTLHR = 0; +else + scrivoTLHR = 1; +end + +%% Tilt Link HR H +TLHRH = isempty(Z_TLHRH); +if TLHRH == 1 + scrivoTLHRH = 0; +else + scrivoTLHRH = 1; +end + +%% In Place Link HR +IPLHR = isempty(X_IPLHR); +if IPLHR == 1 + scrivoIPLHR = 0; +else + scrivoIPLHR = 1; +end + +%% Piezo Link +PL = isempty(Livello); +if PL == 1 + scrivoPL = 0; +else + scrivoPL = 1; +end + +%% Baro Link +BL = isempty(BaroDef); +if BL == 1 + scrivoBL = 0; +else + scrivoBL = 1; +end + +%% Load Link +LL = isempty(DatiLoad); +if LL == 1 + scrivoLL = 0; +else + scrivoLL = 1; +end + +%% Klino Link +KL = isempty(ANGdefKL); +if KL == 1 + scrivoKL = 0; +else + scrivoKL = 1; +end + +%% Klino Link HR +KLHR = isempty(ANGdefKLHR); +if KLHR == 1 + scrivoKLHR = 0; +else + scrivoKLHR = 1; +end + +%% Rain Link +RL = isempty(Rain); +if RL == 1 + scrivoRL = 0; +else + scrivoRL = 1; +end + +%% Snow Link +SL = isempty(Snow); +if SL == 1 + scrivoSL = 0; +else + scrivoSL = 1; +end + +%% Therm Link +ThL = isempty(Dati_ThL); +if ThL == 1 + scrivoThL = 0; +else + scrivoThL = 1; +end + +%% PT100 Link +PT100 = isempty(Dati_PT100); +if PT100 == 1 + scrivoPT100 = 0; +else + scrivoPT100 = 1; +end + +%% Weir Link +Weir = isempty(Dati_WL); +if Weir == 1 + scrivoWL = 0; +else + scrivoWL = 1; +end + +%% Pendulum +Pendulum = isempty(Dati_PE); +if Pendulum == 1 + scrivoPE = 0; +else + scrivoPE = 1; +end + +%% SPP +SPPdati = isempty(SPP); +if SPPdati == 1 + scrivoSPP = 0; +else + scrivoSPP = 1; +end + +text = 'scrivo function worked correctly'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/sendReportmail.m b/Tilt/sendReportmail.m new file mode 100755 index 0000000..ab40db8 --- /dev/null +++ b/Tilt/sendReportmail.m @@ -0,0 +1,155 @@ +function sendReportmail(NomeSito,Coordinate,meseadesso,NomeReport,NomeReport_ENG,... + Users_Report,recipients_ASE,Mail,Mail_ASE,activeEN,rU,cU,FileName) + +text = 'sendReportmail function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); + +%% Email +setpref('Internet','E_mail','aseparma@gmail.com'); +setpref('Internet','SMTP_Server','smtp.gmail.com'); +setpref('Internet','SMTP_Username','aseparma@gmail.com'); +setpref('Internet','SMTP_Password','Mums@2016'); +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 + +recipients_ITA = cell(1); +recipients_ENG = cell(1); + +% A chi mando la mail +nI = 1; +nE = 1; +if cU >1 % sono presenti utenti a cui inviare la mail + for i = 1:rU + if Users_Report{i,4} == 2 + recipients_ITA{nI,1} = Users_Report(i,3); + nI = nI+1; + else + recipients_ENG{nE,1} = Users_Report(i,3); + nE = nE+1; + end + end +end + +% report si riferisce al mese prima di quello attuale +if meseadesso == 1 + mesemail = 'Dicembre'; + mesemailENG = 'December'; +elseif meseadesso == 2 + mesemail = 'Gennaio'; + mesemailENG = 'January'; +elseif meseadesso == 3 + mesemail = 'Febbraio'; + mesemailENG = 'February'; +elseif meseadesso == 4 + mesemail = 'Marzo'; + mesemailENG = 'March'; +elseif meseadesso == 5 + mesemail = 'Aprile'; + mesemailENG = 'April'; +elseif meseadesso == 6 + mesemail = 'Maggio'; + mesemailENG = 'May'; +elseif meseadesso == 7 + mesemail = 'Giugno'; + mesemailENG = 'June'; +elseif meseadesso == 8 + mesemail = 'Luglio'; + mesemailENG = 'July'; +elseif meseadesso == 9 + mesemail = 'Agosto'; + mesemailENG = 'August'; +elseif meseadesso == 10 + mesemail = 'Settembre'; + mesemailENG = 'September'; +elseif meseadesso == 11 + mesemail = 'Ottobre'; + mesemailENG = 'October'; +elseif meseadesso == 12 + mesemail = 'Novembre'; + mesemailENG = 'November'; +end + +if meseadesso == 1 % gennaio + annomail = datestr(today-32,'yyyy'); % anno precedente +else % altri mesi + annomail = datestr(today,'yyyy'); +end + +latNS = 'N'; +lonEO = 'E'; +lonEO_ENG = 'E'; +if Coordinate(1) < 0 + latNS = 'S'; +end +if Coordinate(2) < 0 + lonEO = 'O'; + lonEO_ENG = 'W'; +end + +allegatoPDF = [NomeReport '.pdf']; +allegatoPDF_ENG = [NomeReport_ENG '.pdf']; + +%% ita +subject_ITA = (['Report Automatico ASE - ' mesemail ' ' annomail ' ' NomeSito '']); +testo = cellstr('Gentile utente,'); +testobis = cellstr(''); +testo2 = cellstr(['in allegato alla presente mail trover' char(224) ' il Report di monitoraggio '... + 'relativo al sito ' NomeSito ', con coordinate geografiche ' num2str(abs(Coordinate(1))) ' ' latNS ', '... + num2str(abs(Coordinate(2,:))) ' ' lonEO '. Il presente documento viene generato automaticamente dal '... + 'software proprietario sviluppato da ASE S.r.l. con cadenza mensile e '... + 'riporta i dati di maggior interesse registrati dalla strumentazione installata '... + 'in sito durante il periodo temporale di riferimento, che a meno di interruzioni '... + 'prolungate di trasmissione del dato coincide con l''ultimo mese di monitoraggio. '... + 'In particolare, il Report allegato a questa mail presenta i dati raccolti nel mese di ' mesemail ' ' annomail '.']); +testo3 = cellstr(['Si vuole sottolineare che questo documento ' char(232) ' generato completamente in automatico '... + 'e non contiene pertanto alcuna valutazione o validazione di carattere tecnico '... + 'relativamente ai risultati ottenuti dalla strumentazione installata. '... + 'Si ricorda inoltre che quanto riportato nel report ' char(232) ' inteso come un riassunto dei risultati '... + 'dell''attivit' char(224) ' di monitoraggio. Per la consultazione completa di tutti i dati '... + 'relativi al sito in esame, si rimanda alla piattaforma interattiva di ASE, accessibile al seguente link: ']); +Link = cellstr('https://www2.aseltd.eu'); +testo4 = cellstr('Eventuali segnalazioni relative al report automatico possono essere inoltrate al seguente indirizzo email: alessandro.valletta@aseltd.eu'); +message_ITA = [testo; testobis; testo2; testo3; Link; testobis; testo4; testobis]; +message = cellstr('Cordiali saluti, '); +message2 = cellstr('Il team di ASE S.r.l.'); +message_ITA = [message_ITA; message; message2]; + +%% eng +subject_ENG = (['ASE Automatic Report - ' mesemailENG ', ' annomail]); +testoENG = ('Dear user, '); +testo2ENG = (['please find attached to this email a Report of the monitoring activity performed on site: ' NomeSito ', coordinates '... + num2str(abs(Coordinate(1))) ' ' latNS ', ' num2str(abs(Coordinate(2,:))) ' ' lonEO_ENG '. '... + 'This document is generated monthly by the automatic software developed by ASE, '... + 'and it reports the main data recorded by the monitoring instrumentation installed '... + 'on-site in the last month. In particular, the automatic Report attached to this email '... + 'refers to monitoring data sampled during ' mesemailENG ', ' annomail '.']); +testo3ENG = (['We would like to remind you that the main objective of this document is to summarize only the key information provided by each sensor; '... + 'please refer to the web-based interactive platform available at the following link in order to browse all available monitoring data.']); +testo4ENG = ('For any comment regarding the automatic Report, please send a message to the following email address: alessandro.valletta@aseltd.eu'); +message_ENG = [testoENG; testobis; testo2ENG; testo3ENG; Link; testobis; testo4ENG; testobis]; +messageENG = cellstr('Best regards, '); +message2ENG = cellstr('The ASE S.r.l. Team'); +message_ENG = [message_ENG; messageENG; message2ENG]; + +if Mail == 1 || Mail_ASE == 1 + if Mail == 1 && cU >1 + recipients_ITA = [recipients_ITA; recipients_ASE]; + else + recipients_ITA = recipients_ASE; + end + sendmail(recipients_ITA, subject_ITA, message_ITA, allegatoPDF) + if activeEN == 1 + sendmail(recipients_ENG, subject_ENG, message_ENG, allegatoPDF_ENG) + end +end + +%scrivo invio nel logfile +text = (['Automatic Report of ' mesemailENG ' sent! sendReportmail function closed']); +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/soglie.m b/Tilt/soglie.m new file mode 100755 index 0000000..5e5b963 --- /dev/null +++ b/Tilt/soglie.m @@ -0,0 +1,2889 @@ +function [unitID,chainID,Chain_Scheme,num_nodi] = soglie(siteID,yesTL,yesTLHR,yesTLH,... + yesTLHRH,yesKL,yesKLHR,yesIPL,yesIPLHR,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; + +text = 'soglie function started'; +fprintf(fileID,fmt,text); + +%% Raccolgo Informazioni + +% Scarico tutte le centraline presenti in sito +comando = ['select id, name from units where site_id = ''' siteID ''' order by name']; % il rapporto centralina sito è di 1 a 1 +curs = exec(conn,comando); +curs = fetch(curs); +unitID = curs.Data; + +col = size(unitID); +chainID = cell(1,4); +ini = 1; +for c = 1:col(1,1) + % dalle centraline presenti, risalgo alle catene disponibili + comando = ['select id, name from tools where unit_id = ''' num2str(cell2mat(unitID(c,1))) ''' order by name']; + curs = exec(conn,comando); + curs = fetch(curs); + chainID_down = curs.Data; % id tool, nome tool + [fin,~] = size(chainID_down); + fin = fin+ini-1; + chainID(ini:fin,3:4) = chainID_down; + for j = ini:fin + chainID(j,1:2) = unitID(c,1:2); % Id centralina, nome centralina, id tool, nome tool + end + ini = fin+1; +end + +% Scarico gli schemi delle catene +[col,~] = size(chainID); % Numero di Array +Chain_Scheme = cell(1,3); +num_nodi = zeros(col,1); +ini = 1; +cont = 1; +for c = 1:col(1,1) + comando = ['select nodetype_id, depth, num from nodes where tool_id = ''' num2str(cell2mat(chainID(c,3))) ''' order by num']; + curs = exec(conn,comando); + curs = fetch(curs); + scheme_down = curs.Data; % id nodo, profondità, numero + [fin,~] = size(scheme_down); + num_nodi(cont) = fin; + Chain_Scheme(1:fin,ini:ini+2) = scheme_down; + ini = ini+3; + cont = cont+1; +end + +if yesTL == 1 || yesTLHR == 1 || yesTLH == 1 || yesTLHRH == 1 || yesIPL == 1 ||... + yesIPLHR == 1 || yesKL == 1 || yesKLHR == 1 + + if yesKL == 1 || yesKLHR == 1 + rifKL = 1; + else + rifKL = 0; + end + + % Per ogni tipologia di nodo, riconosco se è presente o meno nella catena + yesTL = zeros(col,1); % Tilt Link V + yesTLH = zeros(col,1); % Tilt Link H + yesTLHR = zeros(col,1); % Tilt Link HR V + yesTLHRH = zeros(col,1); % Tilt Link HR H + yesPL = zeros(col,1); % Piezo Link + yesLL = zeros(col,1); % Load Link + yesKL = zeros(col,1); % Klino Link + yesKLHR = zeros(col,1); % Klino Link HR + yesRL = zeros(col,1); % Rain Link + yesIPL = zeros(col,1); % In Place Link + yesIPLHR = zeros(col,1); % In Place Link HR + yesPrL = zeros(col,1); % Pressure Link + yesEL = zeros(col,1); % Extensometer Link + yes3DEL = zeros(col,1); % 3D Extensometer Link + yesWEL = zeros(col,1); % Wire Extensometer Link + yesMPBEL = zeros(col,1); % Multi Point BoreHole Extensometer Link + yesCrL = zeros(col,1); % Crack Link + yes3DCrL = zeros(col,1); % 3D Crack Link + % Numero di nodi per catena + rTL = zeros(col,1); + rTLHR = zeros(col,1); + rTLH = zeros(col,1); + rTLHRH = zeros(col,1); + rPL = zeros(col,1); + rLL = zeros(col,1); + rKL = zeros(col,1); + rKLHR = zeros(col,1); + rRL = zeros(col,1); + rIPL = zeros(col,1); + rIPLHR = zeros(col,1); + rPrL = zeros(col,1); + rEL = zeros(col,1); + r3DEL = zeros(col,1); + rWEL = zeros(col,1); + rMPBEL = zeros(col,1); + rCrL = zeros(col,1); + r3DCrL = zeros(col,1); + indice = 1; + for a = 1:col % Array + nTL = 1; + nTLHR = 1; + nTLH = 1; + nTLHRH = 1; + nPL = 1; + nKL = 1; + nKLHR = 1; + nLL = 1; + nPrL = 1; + nEL = 1; + n3DEL = 1; + nMPBEL = 1; + nRL = 1; + nCrL = 1; + n3DCrL = 1; + nIPL = 1; + nIPLHR = 1; + nWEL = 1; + for b = 1:num_nodi(a) % Numero di nodi dell'Array + if cell2mat(Chain_Scheme(b,indice)) == 1 % Tilt Link V + yesTL(a) = 1; + NodoTiltLink(nTL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nTL = nTL+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 2 % Piezo Link + yesPL(a) = 1; + NodoPiezoLink(nPL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nPL = nPL+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 5 % Tilt Link HR V + yesTLHR(a) = 1; + NodoTiltLinkHR(nTLHR,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nTLHR = nTLHR+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 11 % Tilt Link H + yesTLH(a) = 1; + NodoTiltLinkH(nTLH,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nTLH = nTLH+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 12 % Tilt Link HR H + yesTLHRH(a) = 1; + NodoTiltLinkHRH(nTLHRH,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nTLHRH = nTLHRH+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 15 % Load Link + yesLL(a) = 1; + NodoLoadLink(nLL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nLL = nLL+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 21 % Pressure Link + yesPrL(a) = 1; + NodoPressureLink(nPrL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nPrL = nPrL+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 26 % Klino Link + yesKL(a) = 1; + NodoKlinoLink(nKL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nKL = nKL+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 27 % Rain Link + yesRL(a) = 1; + NodoRainLink(nRL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nRL = nRL+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 42 % In Place Link + yesIPL(a) = 1; + NodoInPlaceLink(nIPL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nIPL = nIPL+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 43 % In Place Link HR + yesIPLHR(a) = 1; + NodoInPlaceLinkHR(nIPLHR,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nIPLHR = nIPLHR+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 44 % Klino Link HR + yesKLHR(a) = 1; + NodoKlinoLinkHR(nKLHR,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nKLHR = nKLHR+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 16 % Extensometer Link + yesEL(a) = 1; + NodoExtensometerLink(nEL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nEL = nEL+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 19 % 3D Extensometer Link + yes3DEL(a) = 1; + Nodo3DExtensometerLink(n3DEL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + n3DEL = n3DEL+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 22 % Wire Extensometer Link + yesWEL(a) = 1; + NodoWireExtensometerLink(nWEL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nWEL = nWEL+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 25 % Multi Point Borehole Extensometer Link + yesMPBEL(a) = 1; + NodoMultiPointExtensometerLink(nMPBEL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nMPBEL = nMPBEL+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 36 % Crack Link + yesCrL(a) = 1; + NodoCrackLink(nCrL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + nCrL = nCrL+1; + elseif cell2mat(Chain_Scheme(b,indice)) == 37 % 3D Crack Link + yes3DCrL(a) = 1; + Nodo3DCrackLink(n3DCrL,a) = Chain_Scheme(b,indice+2); % Ogni colonna riporta i nodi di un array + n3DCrL = n3DCrL+1; + end + end + indice = indice+3; + rTL(a) = nTL-1; + rTLHR(a) = nTLHR-1; + rTLH(a) = nTLH-1; + rTLHRH(a) = nTLHRH-1; + rPL(a) = nPL-1; + rKL(a) = nKL-1; + rKLHR(a) = nKLHR-1; + rPrL(a) = nPrL-1; + rIPL(a) = nIPL-1; + rIPLHR(a) = nIPLHR-1; + rRL(a) = nRL-1; + rCrL(a) = nCrL-1; + r3DCrL(a) = n3DCrL-1; + rEL(a) = nEL-1; + r3DEL(a) = n3DEL-1; + rWEL(a) = nWEL-1; + rMPBEL(a) = nMPBEL-1; + end + try + % --- Analizzo i singoli nodi --- + %% Tilt Link V + if isempty(find(yesTL)) == 1 % Non ho Tilt Link V + text = 'Tilt Link V have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_TL = 0; + else + TL = cumsum(rTL); + Alert_TL = zeros(1,TL(end)); % Livello di Allerta + Date_Alert_TL = zeros(1,TL(end)); % Data di Allerta + Node_Alert_TL = zeros(1,TL(end)); % Numero di nodo in Allerta + ID_Alert_TL = cell(1,TL(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesTL(n) == 1 + if rifKL == 1 + break + end + date_rif = now-15; % 15 giorni + for nn = 1:rTL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoTiltLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo la matrice date usando il primo nodo + end + comando = ['select XShift, YShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoTiltLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); % Dati del nodo N dell'Array X + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index:index+1) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index:index+1) = Control; + DatiElab(rCD+1:rDE,index:index+1) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index:index+1) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = sqrt((diff(cell2mat(DatiElab(index1(1):end,index))))... + .^2+(diff(cell2mat(DatiElab(index1(1):end,index+1)))).^2); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = sqrt((diff(cell2mat(DatiElab(:,index)))).^2+(diff(cell2mat(DatiElab(:,index+1)))).^2); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = sqrt((diff(cell2mat(DatiElab(index7(1):index1(1),index)))).^2+(diff(cell2mat(DatiElab(index7(1):index1(1),index+1)))).^2); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = sqrt((diff(cell2mat(DatiElab(index3(1):index1(1),index)))).^2+(diff(cell2mat(DatiElab(index3(1):index1(1),index+1)))).^2); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_TL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_TL(s,prog) = Date_1gg(s,n); + Node_Alert_TL(s,prog) = cell2mat(NodoTiltLink(nn,n)); + ID_Alert_TL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_TL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_TL(s,prog) = Date_1gg(s,n); + Node_Alert_TL(s,prog) = cell2mat(NodoTiltLink(nn,n)); + ID_Alert_TL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_TL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_TL(s,prog) = Date_1gg(s,n); + Node_Alert_TL(s,prog) = cell2mat(NodoTiltLink(nn,n)); + ID_Alert_TL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+2; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' Tilt Link V have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_TL,~] = size(rTL); + ini = 1; + fin = cumsum(rTL); + Num_Allarmi_TL = zeros(1,num_TL); + for AL = 1:num_TL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_TL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_TL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Tilt Link HR V + if isempty(find(yesTLHR)) == 1 % Non ho Tilt Link HR V + text = 'Tilt Link HR V have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_TLHR = 0; + else + clear Date_1gg + TLHR = cumsum(rTLHR); + Alert_TLHR = zeros(1,TLHR(end)); % Livello di Allerta + Date_Alert_TLHR = zeros(1,TLHR(end)); % Data di Allerta + Node_Alert_TLHR = zeros(1,TLHR(end)); % Numero di nodo in Allerta + ID_Alert_TLHR = cell(1,TLHR(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesTLHR(n) == 1 + if rifKL == 1 + break + end + date_rif = now-15; % 15 giorni + for nn = 1:rTLHR(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoTiltLinkHR(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select XShift, YShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoTiltLinkHR(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index:index+1) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index:index+1) = Control; + DatiElab(rCD+1:rDE,index:index+1) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index:index+1) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = sqrt((diff(cell2mat(DatiElab(index1(1):end,index))))... + .^2+(diff(cell2mat(DatiElab(index1(1):end,index+1)))).^2); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = sqrt((diff(cell2mat(DatiElab(:,index)))).^2+(diff(cell2mat(DatiElab(:,index+1)))).^2); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = sqrt((diff(cell2mat(DatiElab(index7(1):index1(1),index)))).^2+(diff(cell2mat(DatiElab(index7(1):index1(1),index+1)))).^2); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = sqrt((diff(cell2mat(DatiElab(index3(1):index1(1),index)))).^2+(diff(cell2mat(DatiElab(index3(1):index1(1),index+1)))).^2); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_TLHR(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_TLHR(s,prog) = Date_1gg(s,n); + Node_Alert_TLHR(s,prog) = cell2mat(NodoTiltLinkHR(nn,n)); + ID_Alert_TLHR(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_TLHR(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_TLHR(s,prog) = Date_1gg(s,n); + Node_Alert_TLHR(s,prog) = cell2mat(NodoTiltLinkHR(nn,n)); + ID_Alert_TLHR(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_TLHR(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_TLHR(s,prog) = Date_1gg(s,n); + Node_Alert_TLHR(s,prog) = cell2mat(NodoTiltLinkHR(nn,n)); + ID_Alert_TLHR(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+2; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' Tilt Link HR V have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_TLHR,~] = size(rTLHR); + ini = 1; + fin = cumsum(rTLHR); + Num_Allarmi_TLHR = zeros(1,num_TLHR); + for AL = 1:num_TLHR + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_TLHR(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_TLHR(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% In Place Link + if isempty(find(yesIPL)) == 1 % Non ho In Place Link + text = 'In Place Link have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_IPL = 0; + else + IPL = cumsum(rIPL); + Alert_IPL = zeros(1,IPL(end)); % Livello di Allerta + Date_Alert_IPL = zeros(1,IPL(end)); % Data di Allerta + Node_Alert_IPL = zeros(1,IPL(end)); % Numero di nodo in Allerta + ID_Alert_IPL = cell(1,IPL(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesIPL(n) == 1 + if rifKL == 1 + break + end + date_rif = now-15; % 15 giorni + for nn = 1:rIPL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' ... + num2str(cell2mat(NodoInPlaceLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo la matrice date usando il primo nodo + end + comando = ['select XShift, YShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' ... + num2str(cell2mat(NodoInPlaceLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); % Dati del nodo N dell'Array X + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index:index+1) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index:index+1) = Control; + DatiElab(rCD+1:rDE,index:index+1) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index:index+1) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = sqrt((diff(cell2mat(DatiElab(index1(1):end,index))))... + .^2+(diff(cell2mat(DatiElab(index1(1):end,index+1)))).^2); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = sqrt((diff(cell2mat(DatiElab(:,index)))).^2+(diff(cell2mat(DatiElab(:,index+1)))).^2); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = sqrt((diff(cell2mat(DatiElab(index7(1):index1(1),index)))).^2+(diff(cell2mat(DatiElab(index7(1):index1(1),index+1)))).^2); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = sqrt((diff(cell2mat(DatiElab(index3(1):index1(1),index)))).^2+(diff(cell2mat(DatiElab(index3(1):index1(1),index+1)))).^2); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_IPL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_IPL(s,prog) = Date_1gg(s,n); + Node_Alert_IPL(s,prog) = cell2mat(NodoInPlaceLink(nn,n)); + ID_Alert_IPL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_IPL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_IPL(s,prog) = Date_1gg(s,n); + Node_Alert_IPL(s,prog) = cell2mat(NodoInPlaceLink(nn,n)); + ID_Alert_IPL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_IPL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_IPL(s,prog) = Date_1gg(s,n); + Node_Alert_IPL(s,prog) = cell2mat(NodoInPlaceLink(nn,n)); + ID_Alert_IPL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+2; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' In Place Link have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_IPL,~] = size(rIPL); + ini = 1; + fin = cumsum(rIPL); + Num_Allarmi_IPL = zeros(1,num_IPL); + for AL = 1:num_IPL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_IPL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_IPL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% In Place Link HR + if isempty(find(yesIPLHR)) == 1 % Non ho In Place Link HR + text = 'In Place Link HR have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_IPLHR = 0; + else + clear Date_1gg + IPLHR = cumsum(rIPLHR); + Alert_IPLHR = zeros(1,IPLHR(end)); % Livello di Allerta + Date_Alert_IPLHR = zeros(1,IPLHR(end)); % Data di Allerta + Node_Alert_IPLHR = zeros(1,IPLHR(end)); % Numero di nodo in Allerta + ID_Alert_IPLHR = cell(1,IPLHR(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesIPLHR(n) == 1 + if rifKL == 1 + break + end + date_rif = now-15; % 15 giorni + for nn = 1:rIPLHR(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' ... + num2str(cell2mat(NodoInPlaceLinkHR(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select XShift, YShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' ... + num2str(cell2mat(NodoInPlaceLinkHR(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index:index+1) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index:index+1) = Control; + DatiElab(rCD+1:rDE,index:index+1) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index:index+1) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = sqrt((diff(cell2mat(DatiElab(index1(1):end,index))))... + .^2+(diff(cell2mat(DatiElab(index1(1):end,index+1)))).^2); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = sqrt((diff(cell2mat(DatiElab(:,index)))).^2+(diff(cell2mat(DatiElab(:,index+1)))).^2); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = sqrt((diff(cell2mat(DatiElab(index7(1):index1(1),index)))).^2+(diff(cell2mat(DatiElab(index7(1):index1(1),index+1)))).^2); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = sqrt((diff(cell2mat(DatiElab(index3(1):index1(1),index)))).^2+(diff(cell2mat(DatiElab(index3(1):index1(1),index+1)))).^2); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_IPLHR(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_IPLHR(s,prog) = Date_1gg(s,n); + Node_Alert_IPLHR(s,prog) = cell2mat(NodoInPlaceLinkHR(nn,n)); + ID_Alert_IPLHR(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_IPLHR(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_IPLHR(s,prog) = Date_1gg(s,n); + Node_Alert_IPLHR(s,prog) = cell2mat(NodoInPlaceLinkHR(nn,n)); + ID_Alert_IPLHR(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_IPLHR(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_IPLHR(s,prog) = Date_1gg(s,n); + Node_Alert_IPLHR(s,prog) = cell2mat(NodoInPlaceLinkHR(nn,n)); + ID_Alert_IPLHR(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+2; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' In Place Link HR have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_IPLHR,~] = size(rIPLHR); + ini = 1; + fin = cumsum(rIPLHR); + Num_Allarmi_IPLHR = zeros(1,num_IPLHR); + for AL = 1:num_IPLHR + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_IPLHR(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_IPLHR(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Tilt Link H + if isempty(find(yesTLH)) == 1 % Non ho Tilt Link H + text = 'Tilt Link H have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_TLH = 0; + else + clear Date_1gg + TLH = cumsum(rTLH); + Alert_TLH = zeros(1,TLH(end)); % Livello di Allerta + Date_Alert_TLH = zeros(1,TLH(end)); % Data di Allerta + Node_Alert_TLH = zeros(1,TLH(end)); % Numero di nodo in Allerta + ID_Alert_TLH = cell(1,TLH(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesTLH(n) == 1 + if rifKL == 1 + break + end + date_rif = now-15; % 15 giorni + for nn = 1:rTLH(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoTiltLinkH(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select ZShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoTiltLinkH(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index) = Control; + DatiElab(rCD+1:rDE,index) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_TLH(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_TLH(s,prog) = Date_1gg(s,n); + Node_Alert_TLH(s,prog) = cell2mat(NodoTiltLinkH(nn,n)); + ID_Alert_TLH(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_TLH(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_TLH(s,prog) = Date_1gg(s,n); + Node_Alert_TLH(s,prog) = cell2mat(NodoTiltLinkH(nn,n)); + ID_Alert_TLH(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_TLH(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_TLH(s,prog) = Date_1gg(s,n); + Node_Alert_TLH(s,prog) = cell2mat(NodoTiltLinkH(nn,n)); + ID_Alert_TLH(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+1; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' Tilt Link H have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_TLH,~] = size(rTLH); + ini = 1; + fin = cumsum(rTLH); + Num_Allarmi_TLH = zeros(1,num_TLH); + for AL = 1:num_TLH + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_TLH(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_TLH(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Tilt Link HR H + if isempty(find(yesTLHRH)) == 1 % Non ho Tilt Link HR H + text = 'Tilt Link HR H have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_TLHRH = 0; + else + clear Date_1gg + TLHRH = cumsum(rTLHRH); + Alert_TLHRH = zeros(1,TLHRH(end)); % Livello di Allerta + Date_Alert_TLHRH = zeros(1,TLHRH(end)); % Data di Allerta + Node_Alert_TLHRH = zeros(1,TLHRH(end)); % Numero di nodo in Allerta + ID_Alert_TLHRH = cell(1,TLHRH(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesTLHRH(n) == 1 + if rifKL == 1 + break + end + date_rif = now-15; % 15 giorni + for nn = 1:rTLHRH(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoTiltLinkHRH(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select ZShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoTiltLinkHRH(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index) = Control; + DatiElab(rCD+1:rDE,index) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_TLHRH(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_TLHRH(s,prog) = Date_1gg(s,n); + Node_Alert_TLHRH(s,prog) = cell2mat(NodoTiltLinkHRH(nn,n)); + ID_Alert_TLHRH(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_TLHRH(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_TLHRH(s,prog) = Date_1gg(s,n); + Node_Alert_TLHRH(s,prog) = cell2mat(NodoTiltLinkHRH(nn,n)); + ID_Alert_TLHRH(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_TLHRH(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_TLHRH(s,prog) = Date_1gg(s,n); + Node_Alert_TLHRH(s,prog) = cell2mat(NodoTiltLinkHRH(nn,n)); + ID_Alert_TLHRH(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+1; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' Tilt Link HR H have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_TLHRH,~] = size(rTLHRH); + ini = 1; + fin = cumsum(rTLHRH); + Num_Allarmi_TLHRH = zeros(1,num_TLHRH); + for AL = 1:num_TLHRH + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_TLHRH(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_TLHRH(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Piezo Link + if isempty(find(yesPL)) == 1 % Non ho Piezo Link + text = 'Piezo Link have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_PL = 0; + else + clear Date_1gg + PL = cumsum(rPL); + Alert_PL = zeros(1,PL(end)); % Livello di Allerta + Date_Alert_PL = zeros(1,PL(end)); % Data di Allerta + Node_Alert_PL = zeros(1,PL(end)); % Numero di nodo in Allerta + ID_Alert_PL = cell(1,PL(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesPL(n) == 1 + date_rif = now-15; % 15 giorni + for nn = 1:rPL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoPiezoLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo la matrice date usando il primo nodo + end + comando = ['select water_level from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoPiezoLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index) = Control; + DatiElab(rCD+1:rDE,index) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_PL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_PL(s,prog) = Date_1gg(s,n); + Node_Alert_PL(s,prog) = cell2mat(NodoPiezoLink(nn,n)); + ID_Alert_PL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_PL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_PL(s,prog) = Date_1gg(s,n); + Node_Alert_PL(s,prog) = cell2mat(NodoPiezoLink(nn,n)); + ID_Alert_PL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_PL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_PL(s,prog) = Date_1gg(s,n); + Node_Alert_PL(s,prog) = cell2mat(NodoPiezoLink(nn,n)); + ID_Alert_PL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+1; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' Piezo Link have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_PL,~] = size(rPL); + ini = 1; + fin = cumsum(rPL); + Num_Allarmi_PL = zeros(1,num_PL); + for AL = 1:num_PL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_PL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_PL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Klino Link + if isempty(find(yesKL)) == 1 % Non ho Klino Link + text = 'Klino Link have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_KL = 0; + else + clear Date_1gg + K = cumsum(rKL); + Alert_KL = zeros(1,K(end)); % Livello di Allerta + Date_Alert_KL = zeros(1,K(end)); % Data di Allerta + Node_Alert_KL = zeros(1,K(end)); % Numero di nodo in Allerta + ID_Alert_KL = cell(1,K(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesKL(n) == 1 + date_rif = now-15; % 15 giorni + for nn = 1:rKL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoKlinoLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select XShift, YShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoKlinoLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index:index+1) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index:index+1) = Control; + DatiElab(rCD+1:rDE,index:index+1) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index:index+1) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index:index+1)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index:index+1)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index:index+1)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index:index+1)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_KL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_KL(s,prog) = Date_1gg(s,n); + Node_Alert_KL(s,prog) = cell2mat(NodoKlinoLink(nn,n)); + ID_Alert_KL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_KL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_KL(s,prog) = Date_1gg(s,n); + Node_Alert_KL(s,prog) = cell2mat(NodoKlinoLink(nn,n)); + ID_Alert_KL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_KL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_KL(s,prog) = Date_1gg(s,n); + Node_Alert_KL(s,prog) = cell2mat(NodoKlinoLink(nn,n)); + ID_Alert_KL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+2; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' Klino Link have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_KL,~] = size(rKL); + ini = 1; + fin = cumsum(rKL); + Num_Allarmi_KL = zeros(1,num_KL); + for AL = 1:num_KL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_KL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_KL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Klino Link HR + if isempty(find(yesKLHR)) == 1 % Non ho Klino Link HR + text = 'Klino Link HR have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_KLHR = 0; + else + clear Date_1gg + KHR = cumsum(rKLHR); + Alert_KLHR = zeros(1,KHR(end)); % Livello di Allerta + Date_Alert_KLHR = zeros(1,KHR(end)); % Data di Allerta + Node_Alert_KLHR = zeros(1,KHR(end)); % Numero di nodo in Allerta + ID_Alert_KLHR = cell(1,KHR(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesKLHR(n) == 1 + date_rif = now-15; % 15 giorni + for nn = 1:rKLHR(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoKlinoLinkHR(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select XShift, YShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoKlinoLinkHR(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index:index+1) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index:index+1) = Control; + DatiElab(rCD+1:rDE,index:index+1) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index:index+1) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index:index+1)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index:index+1)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index:index+1)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index:index+1)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_KLHR(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_KLHR(s,prog) = Date_1gg(s,n); + Node_Alert_KLHR(s,prog) = cell2mat(NodoKlinoLinkHR(nn,n)); + ID_Alert_KLHR(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_KLHR(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_KLHR(s,prog) = Date_1gg(s,n); + Node_Alert_KLHR(s,prog) = cell2mat(NodoKlinoLinkHR(nn,n)); + ID_Alert_KLHR(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_KLHR(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_KLHR(s,prog) = Date_1gg(s,n); + Node_Alert_KLHR(s,prog) = cell2mat(NodoKlinoLinkHR(nn,n)); + ID_Alert_KLHR(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+2; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' Klino Link HR have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_KLHR,~] = size(rKLHR); + ini = 1; + fin = cumsum(rKLHR); + Num_Allarmi_KLHR = zeros(1,num_KLHR); + for AL = 1:num_KLHR + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_KLHR(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_KLHR(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Load Link + if isempty(find(yesLL)) == 1 % Non ho Load Link + text = 'Load Link have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_LL = 0; + else + clear Date_1gg + LL = cumsum(rLL); + Alert_LL = zeros(1,LL(end)); % Livello di Allerta + Date_Alert_LL = zeros(1,LL(end)); % Data di Allerta + Node_Alert_LL = zeros(1,LL(end)); % Numero di nodo in Allerta + ID_Alert_LL = cell(1,LL(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesLL(n) == 1 + status = system(['/usr/local/matlab_func/run_ATD_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 ' char(chainID(n,2)) ' ' char(chainID(n,4)) '']); + if status == 1 + break % se crasha il SW salto l'analisi + end + date_rif = now-15; % 15 giorni + for nn = 1:rLL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoLoadLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select load_value from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoLoadLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index) = Control; + DatiElab(rCD+1:rDE,index) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_LL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_LL(s,prog) = Date_1gg(s,n); + Node_Alert_LL(s,prog) = cell2mat(NodoLoadLink(nn,n)); + ID_Alert_LL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_LL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_LL(s,prog) = Date_1gg(s,n); + Node_Alert_LL(s,prog) = cell2mat(NodoLoadLink(nn,n)); + ID_Alert_LL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_LL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_LL(s,prog) = Date_1gg(s,n); + Node_Alert_LL(s,prog) = cell2mat(NodoLoadLink(nn,n)); + ID_Alert_LL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+1; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' Load Link have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_LL,~] = size(rLL); + ini = 1; + fin = cumsum(rLL); + Num_Allarmi_LL = zeros(1,num_LL); + for AL = 1:num_LL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_LL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_LL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Pressure Link + if isempty(find(yesPrL)) == 1 % Non ho Pressure Link + text = 'Pressure Link have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_PrL = 0; + else + clear Date_1gg + PrL = cumsum(rPrL); + Alert_PrL = zeros(1,PrL(end)); % Livello di Allerta + Date_Alert_PrL = zeros(1,PrL(end)); % Data di Allerta + Node_Alert_PrL = zeros(1,PrL(end)); % Numero di nodo in Allerta + ID_Alert_PrL = cell(1,PrL(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesPrL(n) == 1 + status = system(['/usr/local/matlab_func/run_ATD_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 ' char(chainID(n,2)) ' ' char(chainID(n,4)) '']); + if status == 1 + break % se crasha il SW salto l'analisi + end + date_rif = now-15; % 15 giorni + for nn = 1:rPrL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoPressureLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select pressure from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoPressureLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index) = Control; + DatiElab(rCD+1:rDE,index) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_PrL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_PrL(s,prog) = Date_1gg(s,n); + Node_Alert_PrL(s,prog) = cell2mat(NodoPressureLink(nn,n)); + ID_Alert_PrL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_PrL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_PrL(s,prog) = Date_1gg(s,n); + Node_Alert_PrL(s,prog) = cell2mat(NodoPressureLink(nn,n)); + ID_Alert_PrL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_PrL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_PrL(s,prog) = Date_1gg(s,n); + Node_Alert_PrL(s,prog) = cell2mat(NodoPressureLink(nn,n)); + ID_Alert_PrL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+1; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' Pressure Link have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_PrL,~] = size(rPrL); + ini = 1; + fin = cumsum(rPrL); + Num_Allarmi_PrL = zeros(1,num_PrL); + for AL = 1:num_PrL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_PrL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_PrL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Crack Link + if isempty(find(yesCrL)) == 1 % Non ho Crack Link + text = 'Crack Link have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_CrL = 0; + else + clear Date_1gg + C = cumsum(rCrL); + Alert_CrL = zeros(1,C(end)); % Livello di Allerta + Date_Alert_CrL = zeros(1,C(end)); % Data di Allerta + Node_Alert_CrL = zeros(1,C(end)); % Numero di nodo in Allerta + ID_Alert_CrL = cell(1,C(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesCrL(n) == 1 + status = system(['/usr/local/matlab_func/run_ATD_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 ' char(chainID(n,2)) ' ' char(chainID(n,4)) '']); + if status == 1 + break % se crasha il SW salto l'analisi + end + date_rif = now-15; % 15 giorni + for nn = 1:rCrL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoCrackLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select XShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoCrackLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index) = Control; + DatiElab(rCD+1:rDE,index) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_CrL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_CrL(s,prog) = Date_1gg(s,n); + Node_Alert_CrL(s,prog) = cell2mat(NodoCrackLink(nn,n)); + ID_Alert_CrL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_CrL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_CrL(s,prog) = Date_1gg(s,n); + Node_Alert_CrL(s,prog) = cell2mat(NodoCrackLink(nn,n)); + ID_Alert_CrL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_CrL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_CrL(s,prog) = Date_1gg(s,n); + Node_Alert_CrL(s,prog) = cell2mat(NodoCrackLink(nn,n)); + ID_Alert_CrL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+1; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' Crack Link have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_CrL,~] = size(rCrL); + ini = 1; + fin = cumsum(rCrL); + Num_Allarmi_CrL = zeros(1,num_CrL); + for AL = 1:num_CrL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_CrL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_CrL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% 3D Crack Link + if isempty(find(yes3DCrL)) == 1 % Non ho 3D Crack Link + text = '3D Crack Link have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_3DCrL = 0; + else + clear Date_1gg + CrL3D = cumsum(r3DCrL); + Alert_3DCrL = zeros(1,CrL3D(end)); % Livello di Allerta + Date_Alert_3DCrL = zeros(1,CrL3D(end)); % Data di Allerta + Node_Alert_3DCrL = zeros(1,CrL3D(end)); % Numero di nodo in Allerta + ID_Alert_3DCrL = cell(1,CrL3D(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yes3DCrL(n) == 1 + status = system(['/usr/local/matlab_func/run_ATD_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 ' char(chainID(n,2)) ' ' char(chainID(n,4)) '']); + if status == 1 + break % se crasha il SW salto l'analisi + end + date_rif = now-15; % 15 giorni + for nn = 1:r3DCrL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(Nodo3DCrackLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select XShift, YShift, ZShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(Nodo3DCrackLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index:index+2) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index:index+2) = Control; + DatiElab(rCD+1:rDE,index:index+2) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index:index+2) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index:index+2)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index:index+2)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index:index+2)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index:index+2)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_3DCrL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_3DCrL(s,prog) = Date_1gg(s,n); + Node_Alert_3DCrL(s,prog) = cell2mat(Nodo3DCrackLink(nn,n)); + ID_Alert_3DCrL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_3DCrL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_3DCrL(s,prog) = Date_1gg(s,n); + Node_Alert_3DCrL(s,prog) = cell2mat(Nodo3DCrackLink(nn,n)); + ID_Alert_3DCrL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_3DCrL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_3DCrL(s,prog) = Date_1gg(s,n); + Node_Alert_3DCrL(s,prog) = cell2mat(Nodo3DCrackLink(nn,n)); + ID_Alert_3DCrL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+3; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' 3D Crack Link have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_3DCrL,~] = size(r3DCrL); + ini = 1; + fin = cumsum(r3DCrL); + Num_Allarmi_3DCrL = zeros(1,num_3DCrL); + for AL = 1:num_3DCrL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_3DCrL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_3DCrL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Rain Link + if isempty(find(yesRL)) == 1 % Non ho Rain Link + text = 'Rain Link have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_RL = 0; + else + clear Date_1gg + RL = cumsum(rRL); + Alert_RL = zeros(1,RL(end)); % Livello di Allerta + Date_Alert_RL = zeros(1,RL(end)); % Data di Allerta + Node_Alert_RL = zeros(1,RL(end)); % Numero di nodo in Allerta + ID_Alert_RL = cell(1,RL(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesRL(n) == 1 + date_rif = now-15; % 15 giorni + for nn = 1:rRL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoRainLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select Z from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoRainLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index) = Control; + DatiElab(rCD+1:rDE,index) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_RL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_RL(s,prog) = Date_1gg(s,n); + Node_Alert_RL(s,prog) = cell2mat(NodoRainLink(nn,n)); + ID_Alert_RL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_RL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_RL(s,prog) = Date_1gg(s,n); + Node_Alert_RL(s,prog) = cell2mat(NodoRainLink(nn,n)); + ID_Alert_RL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_RL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_RL(s,prog) = Date_1gg(s,n); + Node_Alert_RL(s,prog) = cell2mat(NodoRainLink(nn,n)); + ID_Alert_RL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+1; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' Rain Link have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_RL,~] = size(rRL); + ini = 1; + fin = cumsum(rRL); + Num_Allarmi_RL = zeros(1,num_RL); + for AL = 1:num_RL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_RL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_RL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Extensometer Link + if isempty(find(yesEL)) == 1 % Non ho Extensometer Link + text = 'Extensometer Link have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_EL = 0; + else + clear Date_1gg + EL = cumsum(rEL); + Alert_EL = zeros(1,EL(end)); % Livello di Allerta + Date_Alert_EL = zeros(1,EL(end)); % Data di Allerta + Node_Alert_EL = zeros(1,EL(end)); % Numero di nodo in Allerta + ID_Alert_EL = cell(1,EL(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesEL(n) == 1 + status = system(['/usr/local/matlab_func/run_ATD_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 ' char(chainID(n,2)) ' ' char(chainID(n,4)) '']); + if status == 1 + break % se crasha il SW salto l'analisi + end + date_rif = now-15; % 15 giorni + for nn = 1:rEL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoExtensometerLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo la matrice date usando il primo nodo + end + comando = ['select XShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoExtensometerLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index) = Control; + DatiElab(rCD+1:rDE,index) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_EL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_EL(s,prog) = Date_1gg(s,n); + Node_Alert_EL(s,prog) = cell2mat(NodoExtensometerLink(nn,n)); + ID_Alert_EL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_EL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_EL(s,prog) = Date_1gg(s,n); + Node_Alert_EL(s,prog) = cell2mat(NodoExtensometerLink(nn,n)); + ID_Alert_EL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_EL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_EL(s,prog) = Date_1gg(s,n); + Node_Alert_EL(s,prog) = cell2mat(NodoExtensometerLink(nn,n)); + ID_Alert_EL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+1; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' Extensometer Link have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_EL,~] = size(rEL); + ini = 1; + fin = cumsum(rEL); + Num_Allarmi_EL = zeros(1,num_EL); + for AL = 1:num_EL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_EL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_EL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% 3D Extensometer Link + if isempty(find(yes3DEL)) == 1 % Non ho 3D Extensometer Link + text = '3D Extensometer Link have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_3DEL = 0; + else + clear Date_1gg + EL3D = cumsum(r3DEL); + Alert_3DEL = zeros(1,EL3D(end)); % Livello di Allerta + Date_Alert_3DEL = zeros(1,EL3D(end)); % Data di Allerta + Node_Alert_3DEL = zeros(1,EL3D(end)); % Numero di nodo in Allerta + ID_Alert_3DEL = cell(1,EL3D(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yes3DEL(n) == 1 + status = system(['/usr/local/matlab_func/run_ATD_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 ' char(chainID(n,2)) ' ' char(chainID(n,4)) '']); + if status == 1 + break % se crasha il SW salto l'analisi + end + date_rif = now-15; % 15 giorni + for nn = 1:r3DEL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(Nodo3DExtensometerLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select XShift, YShift, ZShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(Nodo3DExtensometerLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index:index+2) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index:index+2) = Control; + DatiElab(rCD+1:rDE,index:index+2) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index:index+2)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index:index+2)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index:index+2)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index:index+2)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_3DEL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_3DEL(s,prog) = Date_1gg(s,n); + Node_Alert_3DEL(s,prog) = cell2mat(Nodo3DExtensometerLink(nn,n)); + ID_Alert_3DEL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_3DEL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_3DEL(s,prog) = Date_1gg(s,n); + Node_Alert_3DEL(s,prog) = cell2mat(Nodo3DExtensometerLink(nn,n)); + ID_Alert_3DEL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_3DEL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_3DEL(s,prog) = Date_1gg(s,n); + Node_Alert_3DEL(s,prog) = cell2mat(Nodo3DExtensometerLink(nn,n)); + ID_Alert_3DEL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+3; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' 3D Extensometer Link have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_3DEL,~] = size(r3DEL); + ini = 1; + fin = cumsum(r3DEL); + Num_Allarmi_3DEL = zeros(1,num_3DEL); + for AL = 1:num_3DEL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_3DEL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_3DEL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Wire Extensometer Link + if isempty(find(yesWEL)) == 1 % Non ho Wire Extensometer Link + text = 'Wire Extensometer Link have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_WEL = 0; + else + clear Date_1gg + WEL = cumsum(rWEL); + Alert_WEL = zeros(1,WEL(end)); % Livello di Allerta + Date_Alert_WEL = zeros(1,WEL(end)); % Data di Allerta + Node_Alert_WEL = zeros(1,WEL(end)); % Numero di nodo in Allerta + ID_Alert_WEL = cell(1,WEL(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesWEL(n) == 1 + status = system(['/usr/local/matlab_func/run_ATD_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 ' char(chainID(n,2)) ' ' char(chainID(n,4)) '']); + if status == 1 + break % se crasha il SW salto l'analisi + end + date_rif = now-15; % 15 giorni + for nn = 1:rWEL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoWireExtensometerLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select XShift from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoWireExtensometerLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index) = Control; + DatiElab(rCD+1:rDE,index) = Control(end,:); + RIF = rDE; + end + else + DatiElab(:,index) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rDE; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_WEL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_WEL(s,prog) = Date_1gg(s,n); + Node_Alert_WEL(s,prog) = cell2mat(NodoWireExtensometerLink(nn,n)); + ID_Alert_WEL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_WEL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_WEL(s,prog) = Date_1gg(s,n); + Node_Alert_WEL(s,prog) = cell2mat(NodoWireExtensometerLink(nn,n)); + ID_Alert_WEL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_WEL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_WEL(s,prog) = Date_1gg(s,n); + Node_Alert_WEL(s,prog) = cell2mat(NodoWireExtensometerLink(nn,n)); + ID_Alert_WEL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+1; + prog = prog+1; + end + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' Wire Extensometer Link have been analyzed']; + fprintf(fileID,fmt,text); + index = 1; + end + end + [num_WEL,~] = size(rWEL); + ini = 1; + fin = cumsum(rWEL); + Num_Allarmi_WEL = zeros(1,num_WEL); + for AL = 1:num_WEL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_WEL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_WEL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Multi Point Borehole Extensometer Link + if isempty(find(yesMPBEL)) == 1 % Non ho In Place Link + text = 'Multi Point Borehole Extensometer Link have not been analyzed during the execution of soglie function'; + fprintf(fileID,fmt,text); + Num_Allarmi_MPBEL = 0; + else + clear Date_1gg + MPBEL = cumsum(rMPBEL); + Alert_MPBEL = zeros(1,MPBEL(end)); % Livello di Allerta + Date_Alert_MPBEL = zeros(1,MPBEL(end)); % Data di Allerta + Node_Alert_MPBEL = zeros(1,MPBEL(end)); % Numero di nodo in Allerta + ID_Alert_MPBEL = cell(1,MPBEL(end)); % ID centralina - ID catena in Allerta + index = 1; + prog = 1; + for n = 1:col % Ripeto per ogni Array + DatiElab = cell(1); + Date = zeros(1); + if yesMPBEL(n) == 1 + status = system(['/usr/local/matlab_func/run_ATD_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 ' char(chainID(n,2)) ' ' char(chainID(n,4)) '']); + if status == 1 + break % se crasha il SW salto l'analisi + end + date_rif = now-15; % 15 giorni + for nn = 1:rMPBEL(n) % Ripeto per ogni nodo + comando = ['select EventDate, EventTime from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoMultiPointExtensometerLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DateElab = curs.Data; + % Modifico il formato di data e ora in DATini. + [rD,cD] = size(DateElab); + if rD ~= 1 && cD ~= 1 + T = [cell2mat(DateElab(:,1)) repmat(' ', [rD,1]) cell2mat(DateElab(:,2))]; + if nn == 1 + Date(1:rD,n) = datenum(T); % scrivo lamatrice date usando il primo nodo + end + comando = ['select XShift, YShift, ZShift, X, Y, Z from ElabDataView where EventDate >= ''' ... + datestr(date_rif,'yyyy-mm-dd') ''' and ToolNameID = ''' char(chainID(n,4))... + ''' and UnitName = ''' char(chainID(n,2)) ''' and NodeNum = ''' num2str(cell2mat(NodoMultiPointExtensometerLink(nn,n))) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + Control = curs.Data; + [rCD,~] = size(Control); + [rDE,~] = size(DatiElab); + if rCD ~= rDE + if rCD > rDE + DatiElab(1:rCD,index:index+5) = Control; + RIF = rCD; + elseif rCD < rDE + DatiElab(1:rCD,index:index+5) = Control; + DatiElab(rCD+1:rDE,index) = Control(end,1); + DatiElab(rCD+1:rDE,index+1) = Control(end,2); + DatiElab(rCD+1:rDE,index+2) = Control(end,3); + DatiElab(rCD+1:rDE,index+3) = Control(end,4); + DatiElab(rCD+1:rDE,index+4) = Control(end,5); + DatiElab(rCD+1:rDE,index+5) = Control(end,6); + RIF = rDE; + end + else + DatiElab(:,index:index+5) = Control; % Tutti i dati dei sensori dell'Array n + RIF = rCD; + end + % Guardo le soglie + [rCheck,cCheck] = size(DatiElab); + if rCheck > 1 && cCheck > 1 + % Da Ieri + index1 = find(datenum(Date(:,n))>(now-1)); + [rID,~] = size(index1); + if isempty(index1) == 0 && rID ~= 1 % non posso fare la diff + Incrementi_1gg = abs(diff(cell2mat(DatiElab(index1(1):end,index:index+5)))); + Date_1gg(1:RIF-index1(1),n) = Date(index1(2):index1(end),n); + % 15 gg + Incrementi_15gg = abs(diff(cell2mat(DatiElab(:,index:index+5)))); + ST15 = std(Incrementi_15gg(1:index1(1),:)); % 1 Deviazione standard per i 15 giorni + MAX15 = max(Incrementi_15gg(1:index1(1),:)); + % 7 gg + index7 = find(datenum(Date(:,n))>(now-7)); + Incrementi_7gg = abs(diff(cell2mat(DatiElab(index7(1):index1(1),index:index+5)))); + ST7 = 3*std(Incrementi_7gg); % 3 Deviazioni standard per i 7 giorni + MAX7 = max(Incrementi_7gg); + % 3 gg + index3 = find(datenum(Date(:,n))>(now-3)); + Incrementi_3gg = abs(diff(cell2mat(DatiElab(index3(1):index1(1),index:index+5)))); + ST3 = 5*std(Incrementi_3gg); % 5 Deviazioni standard per i 3 giorni + MAX3 = max(Incrementi_3gg); + [rI,cI] = size(Incrementi_1gg); % Dati per quel nodo + soglia3 = zeros(rI,cI); + soglia7 = zeros(rI,cI); + soglia15 = zeros(rI,cI); + for cc = 1:cI + for s = 1:rI + if Incrementi_1gg(s,cc) > ST15+MAX15 + soglia15(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST7+MAX7 + soglia7(s,cc) = 1; + end + if Incrementi_1gg(s,cc) > ST3+MAX3 + soglia3(s,cc) = 1; + end + if soglia3(s,cc) == 1 && soglia7(s,cc) == 1 && soglia15(s,cc) == 1 + Alert_MPBEL(s,prog) = 3; % Allerta del nodo di Livello 3 + Date_Alert_MPBEL(s,prog) = Date_1gg(s,n); + Node_Alert_MPBEL(s,prog) = cell2mat(NodoMultiPointExtensometerLink(nn,n)); + ID_Alert_MPBEL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 && soglia7(s,cc) == 1 || soglia3(s,cc) == 1 && soglia15(s,cc) == 1 || soglia15(s,cc) == 1 && soglia7(s,cc) == 1 + Alert_MPBEL(s,prog) = 2; % Allerta del nodo di Livello 2 + Date_Alert_MPBEL(s,prog) = Date_1gg(s,n); + Node_Alert_MPBEL(s,prog) = cell2mat(NodoMultiPointExtensometerLink(nn,n)); + ID_Alert_MPBEL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + elseif soglia3(s,cc) == 1 || soglia7(s,cc) == 1 || soglia15(s,cc) == 1 + Alert_MPBEL(s,prog) = 1; % Allerta del nodo di Livello 1 + Date_Alert_MPBEL(s,prog) = Date_1gg(s,n); + Node_Alert_MPBEL(s,prog) = cell2mat(NodoMultiPointExtensometerLink(nn,n)); + ID_Alert_MPBEL(1,prog) = cellstr([char(chainID(n,2)) '-' char(chainID(n,4))]); + end + end + end + end + end + end + index = index+6; + prog = prog+1; + end + fprintf(fileID,fmt,text); + text = ['Data of ' char(chainID(n,2)) '-' char(chainID(n,4)) ' MultiPoint Extensometer Link have been analyzed']; + index = 1; + end + end + [num_MPBEL,~] = size(rMPBEL); + ini = 1; + fin = cumsum(rMPBEL); + Num_Allarmi_MPBEL = zeros(1,num_MPBEL); + for AL = 1:num_MPBEL + if ini > fin(AL) % si va a quello dopo + else + Livello = max(max(Alert_MPBEL(:,ini:fin(AL)))); + if isempty(Livello) == 1 + Livello = 0; + end + Num_Allarmi_MPBEL(1,AL) = Livello; + ini = fin(AL)+1; + end + end + end + + %% Valuto il numero di Array e Sensori che ho in sito + % In questa parte del codice ogni sensore posto in una posizione conta "1". + % Ad esempio due Vertical Array con 20 sensori Tilt Link V per ognuno conta + % 2 Sensori, mentre 3 clinometri in una stessa catena contano 3 + Num_Sensori = cumsum(yesTL + yesTLHR + yesTLH + yesTLHRH + rCrL + r3DCrL +... + rEL + r3DEL + yesIPL + yesIPLHR + rKL + rKLHR + rLL + rPrL + ... + rMPBEL + yesPL + rRL + rWEL); + Num_Sensori = Num_Sensori(end); + + Num_Allarmi = cumsum(Num_Allarmi_CrL) + cumsum(Num_Allarmi_KL) + cumsum(Num_Allarmi_KLHR) +... + cumsum(Num_Allarmi_PL) + cumsum(Num_Allarmi_RL) + cumsum(Num_Allarmi_TL) + cumsum(Num_Allarmi_TLHR) +... + cumsum(Num_Allarmi_MPBEL) + cumsum(Num_Allarmi_WEL) + cumsum(Num_Allarmi_3DEL) +... + cumsum(Num_Allarmi_EL) + cumsum(Num_Allarmi_3DCrL) + cumsum(Num_Allarmi_PrL) +... + cumsum(Num_Allarmi_LL) + cumsum(Num_Allarmi_IPLHR) + cumsum(Num_Allarmi_IPL) +... + cumsum(Num_Allarmi_TLHRH) + cumsum(Num_Allarmi_TLH); + Num_Allarmi = Num_Allarmi(end); + + Codice_Allerta = Num_Allarmi*100/(Num_Sensori*3); + if isnan(Codice_Allerta) == 1 + Codice_Allerta = 0; + end + + alert = 0; + alarm = 0; + Code = 0; + if Codice_Allerta <= 25 + Codex = 'White'; + Code = 1; + elseif Codice_Allerta > 25 && Codice_Allerta <= 50 + Codex = 'Green'; + Code = 2; + elseif Codice_Allerta > 50 && Codice_Allerta <= 75 + Codex = 'Yellow'; + Codice = 'Giallo'; + alert = 1; + Code = 3; + elseif Codice_Allerta > 75 && Codice_Allerta <= 90 + Codex = 'Orange'; + Codice = 'Arancione'; + alert = 1; + Code = 4; + elseif Codice_Allerta > 90 + Codex = 'Red'; + Codice = 'Rosso'; + if Num_Sensori < 5 + alarm = 0; + alert = 1; + Code = 4.5; + else + alarm = 1; + Code = 5; + end + end + + comando = ['select name from sites where id = ''' num2str(cell2mat(siteID)) ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + sito = char(curs.Data); + FileNameFIFA = ['' sito '.txt']; + Date = importdata(FileNameFIFA); + if now > Date(1,1) +1 || Code > Date(2,1) + if alert == 1 || alarm == 1 + % Email + setpref('Internet','E_mail','aseparma@gmail.com'); + setpref('Internet','SMTP_Server','smtp.gmail.com'); + setpref('Internet','SMTP_Username','aseparma@gmail.com'); + setpref('Internet','SMTP_Password','Mums@2016'); + 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 + % A chi mando la mail + recipients_ITA{1,1} = 'alessandro.valletta@aseltd.eu'; + recipients_ITA{2,1} = 'andrea.carri@aseltd.eu'; + % Messaggio + if alert == 1 + text = 'Alert procedure activated'; + fprintf(fileID,fmt,text); + subject_ITA = ['ASE Alert: ALLERTA di codice ''' Codice ''' registrata nel sito di ''' sito ''' ']; + message_ITA = cellstr(['Gentile utente, si segnala un''allerta di codice ''' Codice... + ''' nel sito di ''' sito ''' con indice pari a ''' num2str(Codice_Allerta)... + ''' /100 .']); + elseif alarm == 1 + text = 'Alarm procedure activated'; + fprintf(fileID,fmt,text); + subject_ITA = ['ASE Alert: ALLARME di codice ''' Codice ''' registrato nel sito di ''' sito ''' ']; + message_ITA = cellstr(['Gentile utente, si segnala un''allarme di codice ''' Codice... + ''' nel sito di ''' sito ''' con indice pari a ''' num2str(Codice_Allerta)... + ''' /100 .']); +% Criterio = 'FIFA'; +% SMS(IDcentralina,DTcatena,Sito,siteID,conn,Criterio,FileName); + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + end + message = cellstr('Il team di ASE S.r.l.'); + message_ITA = [message_ITA; message]; + % Mando la mail + sendmail(recipients_ITA, subject_ITA, message_ITA) + end + end + + outdat = fopen(FileNameFIFA,'wt+'); + fileID_site = fopen(FileNameFIFA,'a'); + fmt_site = '%.10f \r'; + text = now; + fprintf(fileID_site,fmt_site,text); + text = Code; + fprintf(fileID_site,fmt_site,text); + fclose(fileID_site); + + text = 'soglie function worked correctly.'; + fprintf(fileID,fmt,text); + fclose(fileID); + + catch + text = 'soglie function CRASHED.'; + fprintf(fileID,fmt,text); + fclose(fileID); + end +else + text = 'soglie function executed with no calculations.'; + fprintf(fileID,fmt,text); + fclose(fileID); +end + +end + + \ No newline at end of file diff --git a/Tilt/template.m b/Tilt/template.m new file mode 100755 index 0000000..c30b355 --- /dev/null +++ b/Tilt/template.m @@ -0,0 +1,18 @@ +function template(rpt) + +% If compiling, make the DOM compilable +makeDOMCompilable() + +%% Intestazione e piè di pagina +import mlreportgen.dom.* +import mlreportgen.report.* + +wmPAG = Watermark('sfondoPAG.png'); + +% Construct the header +header = PDFPageHeader(); +footer = PDFPageFooter(); + +rpt.Layout.Watermark = wmPAG; + +end diff --git a/Tilt/template_cover.m b/Tilt/template_cover.m new file mode 100755 index 0000000..462bb63 --- /dev/null +++ b/Tilt/template_cover.m @@ -0,0 +1,18 @@ +function template_cover(rpt) + +%% Intestazione e piè di pagina +import mlreportgen.dom.* +import mlreportgen.report.* + +% If compiling, make the DOM compilable +makeDOMCompilable() + +% Construct the header +header = PDFPageHeader(); +footer = PDFPageFooter(); +wm = Watermark('sfondo.png'); + +% %Adjust the space for the header and top page margin +rpt.Layout.Watermark = wm; + +end diff --git a/Tilt/threshold.m b/Tilt/threshold.m new file mode 100755 index 0000000..6a8cbfd --- /dev/null +++ b/Tilt/threshold.m @@ -0,0 +1,42 @@ +function threshold(yesHD,ARRAYdateHD,Xlocal_HD,Ylocal_HD,X_HD,Y_HD,HShift_local_HD,... + HShift_HD,NodoTiltLinkHD,unitID,IDcentralina,DTcatena,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'threshold function started'; +fprintf(fileID,fmt,text); +fclose(fileID); + +% Scarico la data di riferimento +comando = ['select graph_prod_date from tools where unit_ID like ''' unitID ''' and name like ''' DTcatena ''' ']; +data_ini = fetch(conn,comando); +stringa = cell2mat(data_ini); +[lS] = length(stringa); +dataRif = stringa(1,1:10); +timeRif = stringa(1,12:lS); + +if lS == 4 % Codice null - non c'è data di riferimento + Riferimento = 0; +else + Riferimento = 1; +end + +comando = ['select soglie from tools where unit_id like ''' ... + unitID ''' and name like ''' DTcatena ''' ']; + +Soglie = fetch(conn,comando); +value = jsondecode(char(Soglie)); +if isempty(value) == 0 + %% Tilt Link HD + if yesHD == 1 + threshold_TiltLinkHD(value,ARRAYdateHD,HShift_local_HD,HShift_HD,... + Xlocal_HD,Ylocal_HD,X_HD,Y_HD,Riferimento,dataRif,timeRif,... + NodoTiltLinkHD,IDcentralina,DTcatena,conn,FileName); + end +end + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'threshold function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); \ No newline at end of file diff --git a/Tilt/threshold_TiltLinkHD.m b/Tilt/threshold_TiltLinkHD.m new file mode 100755 index 0000000..c45c7d5 --- /dev/null +++ b/Tilt/threshold_TiltLinkHD.m @@ -0,0 +1,951 @@ +function threshold_TiltLinkHD(value,ARRAYdateHD,HShift_local_HD,HShift_HD,... + Xlocal_HD,Ylocal_HD,X_HD,Y_HD,Riferimento,dataRif,timeRif,... + NodoTiltLinkHD,IDcentralina,DTcatena,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'threshold_TiltLinkHD function started'; +fprintf(fileID,fmt,text); + +[rHD,cHD]=size(HShift_local_HD); % riga nodi - colonna valori +XLoc_rif = zeros(rHD,1); +YLoc_rif = zeros(rHD,1); +X_rif = zeros(rHD,1); +Y_rif = zeros(rHD,1); + +if Riferimento == 1 + + NodeType = 'Tilt Link HD'; + NTiltLinkHD = cell2mat(NodoTiltLinkHD(:,2)); + for ii = 1:rHD + nN = num2str(NTiltLinkHD(ii,1)); + % Scarico di dati di spostamenti + comando = ['select EventDate, EventTime, XShift, YShift, X, Y '... + 'from ElabDataView where EventDate = ''' dataRif ''' and EventTime >= ''' timeRif... + ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoHDd = curs.Data; + % Giorni successivi + comando = ['select EventDate, EventTime, XShift, YShift, X, Y '... + 'from ElabDataView where EventDate > ''' dataRif ''' and UnitName = ''' IDcentralina ''' and ToolNameID = '''... + DTcatena ''' and NodeType = ''' NodeType ''' and NodeNum = ''' nN ''' ']; + curs = exec(conn,comando); + curs = fetch(curs); + DATnodoHD = curs.Data; + [~,c1] = size(DATnodoHD); + [~,c2] = size(DATnodoHDd); + if c1 == c2 + DATnodoHD = [DATnodoHDd; DATnodoHD]; + elseif c1 < c2 % solo giorno di riferimento + DATnodoHD = DATnodoHDd; + end + XLoc_rif(ii,1) = cell2mat(DATnodoHD(1,3)); + YLoc_rif(ii,1) = cell2mat(DATnodoHD(1,4)); + X_rif(ii,1) = cell2mat(DATnodoHD(1,5)); + Y_rif(ii,1) = cell2mat(DATnodoHD(1,6)); + end + + Xloc_HD = Xlocal_HD-XLoc_rif; + Yloc_HD = Ylocal_HD-YLoc_rif; + HShift_local_HD = sqrt(Xloc_HD.^2+Yloc_HD.^2); + X_HD = X_HD-X_rif; + Y_HD = Y_HD-Y_rif; + HShift_HD = sqrt(X_HD.^2+Y_HD.^2); +end + +for i=1:length(value) + if strcmp(value(i).type,'Tilt Link HD') + Valori = value(i).data; + break + end +end +attivaX = Valori.cumx; +attivaY = Valori.cumy; +attiva2D = Valori.cum2d; +attivaLoc2D = Valori.loc2d; +alert = 0; +if attivaX == 0 && attivaY == 0 && attiva2D == 0 && attivaLoc2D == 0 % Nessuna soglia attiva +else + % X Cum + SogliaX = zeros(3,4); % Riga 1 - Livello 1, Riga 2 - Livello 2, Colonna 1 - Attivo/Disattivo, Colonna 2 - Mail, Colonna 3 - SMS, COlonna 4 - Valore + if attivaX == 1 + % Livello 1 + if Valori.cumx_uno == 1 + SogliaX(1,1) = 1; + SogliaX(1,4) = str2double(Valori.cumx_uno_value); + if Valori.cumx_uno_email == 1 + SogliaX(1,2) = 1; + end + if Valori.cumx_uno_sms == 1 + SogliaX(1,3) = 1; + end + end + % Livello 2 + if Valori.cumx_due == 1 + SogliaX(2,1) = 1; + SogliaX(2,4) = str2double(Valori.cumx_due_value); + if Valori.cumx_due_email == 1 + SogliaX(2,2) = 1; + end + if Valori.cumx_due_sms == 1 + SogliaX(2,3) = 1; + end + end + % Livello 3 + if Valori.cumx_tre == 1 + SogliaX(3,1) = 1; + SogliaX(3,4) = str2double(Valori.cumx_tre_value); + if Valori.cumx_tre_email == 1 + SogliaX(3,2) = 1; + end + if Valori.cumx_tre_sms == 1 + SogliaX(3,3) = 1; + end + end + end + % Y Cum + SogliaY = zeros(3,4); % Riga 1 - Livello 1, Riga 2 - Livello 2, Colonna 1 - Attivo/Disattivo, Colonna 2 - Mail, Colonna 3 - SMS, COlonna 4 - Valore + if attivaY == 1 + % Livello 1 + if Valori.cumy_uno == 1 + SogliaY(1,1) = 1; + SogliaY(1,4) = str2double(Valori.cumy_uno_value); + if Valori.cumy_uno_email == 1 + SogliaY(1,2) = 1; + end + if Valori.cumy_uno_sms == 1 + SogliaY(1,3) = 1; + end + end + % Livello 2 + if Valori.cumy_due == 1 + SogliaY(2,1) = 1; + SogliaY(2,4) = str2double(Valori.cumy_due_value); + if Valori.cumy_due_email == 1 + SogliaY(2,2) = 1; + end + if Valori.cumy_due_sms == 1 + SogliaY(2,3) = 1; + end + end + % Livello 3 + if Valori.cumy_tre == 1 + SogliaY(3,1) = 1; + SogliaY(3,4) = str2double(Valori.cumy_tre_value); + if Valori.cumy_tre_email == 1 + SogliaY(3,2) = 1; + end + if Valori.cumy_tre_sms == 1 + SogliaY(3,3) = 1; + end + end + end + % 2D Cum + Soglia2D = zeros(3,4); % Riga 1 - Livello 1, Riga 2 - Livello 2, Colonna 1 - Attivo/Disattivo, Colonna 2 - Mail, Colonna 3 - SMS, COlonna 4 - Valore + if attiva2D == 1 + % Livello 1 + if Valori.cum2d_uno == 1 + Soglia2D(1,1) = 1; + Soglia2D(1,4) = str2double(Valori.cum2d_uno_value); + if Valori.cum2d_uno_email == 1 + Soglia2D(1,2) = 1; + end + if Valori.cum2d_uno_sms == 1 + Soglia2D(1,3) = 1; + end + end + % Livello 2 + if Valori.cum2d_due == 1 + Soglia2D(2,1) = 1; + Soglia2D(2,4) = str2double(Valori.cum2d_due_value); + if Valori.cum2d_due_email == 1 + Soglia2D(2,2) = 1; + end + if Valori.cum2d_due_sms == 1 + Soglia2D(2,3) = 1; + end + end + % Livello 3 + if Valori.cum2d_tre == 1 + Soglia2D(3,1) = 1; + Soglia2D(3,4) = str2double(Valori.cum2d_tre_value); + if Valori.cum2d_tre_email == 1 + Soglia2D(3,2) = 1; + end + if Valori.cum2d_tre_sms == 1 + Soglia2D(3,3) = 1; + end + end + end + % 2D Loc + Soglia2DLoc = zeros(3,4); % Riga 1 - Livello 1, Riga 2 - Livello 2, Colonna 1 - Attivo/Disattivo, Colonna 2 - Mail, Colonna 3 - SMS, COlonna 4 - Valore + if attivaLoc2D == 1 + % Livello 1 + if Valori.loc2d_uno == 1 + Soglia2DLoc(1,1) = 1; + Soglia2DLoc(1,4) = str2double(Valori.loc2d_uno_value); + if Valori.loc2d_uno_email == 1 + Soglia2DLoc(1,2) = 1; + end + if Valori.loc2d_uno_sms == 1 + Soglia2DLoc(1,3) = 1; + end + end + % Livello 2 + if Valori.loc2d_due == 1 + Soglia2DLoc(2,1) = 1; + Soglia2DLoc(2,4) = str2double(Valori.loc2d_due_value); + if Valori.loc2d_due_email == 1 + Soglia2DLoc(2,2) = 1; + end + if Valori.loc2d_due_sms == 1 + Soglia2DLoc(2,3) = 1; + end + end + % Livello 3 + if Valori.loc2d_tre == 1 + Soglia2DLoc(3,1) = 1; + Soglia2DLoc(3,4) = str2double(Valori.loc2d_tre_value); + if Valori.loc2d_tre_email == 1 + Soglia2DLoc(3,2) = 1; + end + if Valori.loc2d_tre_sms == 1 + Soglia2DLoc(3,3) = 1; + end + end + end + + NomeFile = [IDcentralina '-' DTcatena '-HD.mat']; + if isfile(NomeFile)==1 + load(NomeFile); + else + ALARM_HD = []; + end + + File = 0; + Data_HD = zeros(rHD,1); + value_HD = zeros(rHD,7); % colonna 1: valore, colonna 2: livello, colonna 3: nodo, colonna 4: x(1), y(2), 2D Cum(3) o 2D Loc(4), colonna 5: email S/N, colonna 6: sms S/N, colonna 7: ultimo valore in allarme (1) o rientrato (0) + % Per ogni livello (colonna) mi segno se l'ultimo valore è fuori soglia + ultimoX = zeros(rHD,3); + ultimoY = zeros(rHD,3); + ultimo2D = zeros(rHD,3); + ultimo2DLoc = zeros(rHD,3); + a = 1; + for d=1:rHD + % Nodo + Nodo = cell2mat(NodoTiltLinkHD(d,2)); + for k=2:cHD + Continua = 0; + % Soglia X + Tipologia = 1; + if attivaX == 1 + Livello = 0; + % Livello 1 + if SogliaX(1,1)==1 + if abs(1000*X_HD(d,k))>SogliaX(1,4) + Livello = 1; + Continua = 1; + if 1000*X_HD(d,cHD)>SogliaX(1,4) + ultimoX(d,1) = 1; + end + end + end + % Livello 2 + if SogliaX(2,1)==1 + if abs(1000*X_HD(d,k))>SogliaX(2,4) + Livello = 2; + Continua = 1; + if 1000*X_HD(d,cHD)>SogliaX(2,4) + ultimoX(d,2) = 1; + end + end + end + % Livello 3 + if SogliaX(3,1)==1 + if abs(1000*X_HD(d,k))>SogliaX(3,4) + Livello = 3; + Continua = 1; + if 1000*X_HD(d,cHD)>SogliaX(3,4) + ultimoX(d,3) = 1; + end + end + end + end + % controlli + if isempty(ALARM_HD)==0 % Ci sono già degli allarmi + Check = find(ALARM_HD(:,1)==ARRAYdateHD(k,1)); % Data + if isempty(Check)==0 % C'è già quella data + ALARM_HD1 = ALARM_HD(Check,:); + Check2 = find(ALARM_HD1(:,4)==Nodo); % Nodo + if isempty(Check2)==0 + ALARM_HD2 = ALARM_HD1(Check2,:); + Check3 = find(ALARM_HD2(:,3)>=Livello); % Livello + if isempty(Check3)==0 + ALARM_HD3 = ALARM_HD2(Check3,:); + Check4 = find(ALARM_HD3(:,5)==Tipologia); % Tipologia + if isempty(Check4)==0 + Continua = 0; % L'allerta esiste già (o è precedente) + end + end + end + else + % Cerco la data immediatamente precedente + Check5 = find(ALARM_HD(:,1)==ARRAYdateHD(k-1,1)); % Data + ALARM_HD1 = ALARM_HD(Check5,:); + Check2 = find(ALARM_HD1(:,4)==Nodo); % Nodo + if isempty(Check2)==0 + ALARM_HD2 = ALARM_HD1(Check2,:); + Check3 = find(ALARM_HD2(:,3)>=Livello); % Livello + if isempty(Check3)==0 + ALARM_HD3 = ALARM_HD2(Check3,:); + Check4 = find(ALARM_HD3(:,5)==Tipologia); % Tipologia + if isempty(Check4)==0 + Continua = 0; % L'allerta esiste già (o è precedente) + end + end + end + end + end + if Continua == 1 + % Livello 1 + if Livello == 1 && SogliaX(1,1) == 1 % Livello attivo + if SogliaX(1,2) == 1 || SogliaX(1,3) == 1 % c'è uno fra email e sms + Data_HD(a,1) = ARRAYdateHD(k,1); + value_HD(a,1) = 1000*X_HD(d,k); % mm + value_HD(a,2) = Livello; + value_HD(a,3) = Nodo; + value_HD(a,4) = Tipologia; + if SogliaX(1,2) == 1 + value_HD(a,5) = 1; % mando la mail + else + value_HD(a,5) = 0; + end + if SogliaX(1,3) == 1 + value_HD(a,6) = 1; % mando sms + else + value_HD(a,6) = 0; + end + if ultimoX(d,1) == 1 + value_HD(a,7) = 1; + else + value_HD(a,7) = 0; + end + a=a+1; + File = 1; + alert = 1; + end + end + % Livello 2 + if Livello == 2 && SogliaX(2,1) == 1 % Livello attivo + if SogliaX(2,2) == 1 || SogliaX(2,3) == 1 % c'è uno fra email e sms + Data_HD(a,1) = ARRAYdateHD(k,1); + value_HD(a,1) = 1000*X_HD(d,k); % mm + value_HD(a,2) = Livello; + value_HD(a,3) = Nodo; + value_HD(a,4) = Tipologia; + if SogliaX(2,2) == 1 + value_HD(a,5) = 1; % mando la mail + else + value_HD(a,5) = 0; + end + if SogliaX(2,3) == 1 + value_HD(a,6) = 1; % mando sms + else + value_HD(a,6) = 0; + end + if ultimoX(d,2) == 1 + value_HD(a,7) = 1; + else + value_HD(a,7) = 0; + end + a=a+1; + File = 1; + alert = 1; + end + end + % Livello 3 + if Livello == 3 && SogliaX(3,1) == 1 % Livello attivo + if SogliaX(3,2) == 1 || SogliaX(3,3) == 1 % c'è uno fra email e sms + Data_HD(a,1) = ARRAYdateHD(k,1); + value_HD(a,1) = 1000*X_HD(d,k); % mm + value_HD(a,2) = Livello; + value_HD(a,3) = Nodo; + value_HD(a,4) = Tipologia; + if SogliaX(3,2) == 1 + value_HD(a,5) = 1; % mando la mail + else + value_HD(a,5) = 0; + end + if SogliaX(3,3) == 1 + value_HD(a,6) = 1; % mando sms + else + value_HD(a,6) = 0; + end + if ultimoX(d,3) == 1 + value_HD(a,7) = 1; + else + value_HD(a,7) = 0; + end + a=a+1; + File = 1; + alert = 1; + end + end + end + + Continua = 0; + % ---- Soglia Y --- + Tipologia = 2; + if attivaY == 1 + Livello = 0; + % Livello 1 + if SogliaY(1,1)==1 + if abs(1000*Y_HD(d,k))>SogliaY(1,4) + Livello = 1; + Continua = 1; + if 1000*Y_HD(d,cHD)>SogliaY(1,4) + ultimoY(d,1) = 1; + end + end + end + % Livello 2 + if SogliaY(2,1)==1 + if abs(1000*Y_HD(d,k))>SogliaY(2,4) + Livello = 2; + Continua = 1; + if 1000*Y_HD(d,cHD)>SogliaY(2,4) + ultimoY(d,2) = 1; + end + end + end + % Livello 3 + if SogliaY(3,1)==1 + if abs(1000*Y_HD(d,k))>SogliaY(3,4) + Livello = 3; + Continua = 1; + if 1000*Y_HD(d,cHD)>SogliaY(3,4) + ultimoY(d,3) = 1; + end + end + end + end + % controlli + if isempty(ALARM_HD)==0 % Ci sono già degli allarmi + Check = find(ALARM_HD(:,1)==ARRAYdateHD(k,1)); % Data + if isempty(Check)==0 % C'è già quella data + ALARM_HD1 = ALARM_HD(Check,:); + Check2 = find(ALARM_HD1(:,4)==Nodo); % Nodo + if isempty(Check2)==0 + ALARM_HD2 = ALARM_HD1(Check2,:); + Check3 = find(ALARM_HD2(:,3)>=Livello); % Livello + if isempty(Check3)==0 + ALARM_HD3 = ALARM_HD2(Check3,:); + Check4 = find(ALARM_HD3(:,5)==Tipologia); % Tipologia + if isempty(Check4)==0 + Continua = 0; % L'allerta esiste già (o è precedente) + end + end + end + else + % Cerco la data immediatamente precedente + Check5 = find(ALARM_HD(:,1)==ARRAYdateHD(k-1,1)); % Data + ALARM_HD1 = ALARM_HD(Check5,:); + Check2 = find(ALARM_HD1(:,4)==Nodo); % Nodo + if isempty(Check2)==0 + ALARM_HD2 = ALARM_HD1(Check2,:); + Check3 = find(ALARM_HD2(:,3)>=Livello); % Livello + if isempty(Check3)==0 + ALARM_HD3 = ALARM_HD2(Check3,:); + Check4 = find(ALARM_HD3(:,5)==Tipologia); % Tipologia + if isempty(Check4)==0 + Continua = 0; % L'allerta esiste già (o è precedente) + end + end + end + end + end + if Continua == 1 + % Livello 1 + if Livello == 1 && SogliaY(1,1) == 1 % Livello attivo + if SogliaY(1,2) == 1 || SogliaY(1,3) == 1 % c'è uno fra email e sms + Data_HD(a,1) = ARRAYdateHD(k,1); + value_HD(a,1) = 1000*Y_HD(d,k); % mm + value_HD(a,2) = Livello; + value_HD(a,3) = Nodo; + value_HD(a,4) = Tipologia; + if SogliaY(1,2) == 1 + value_HD(a,5) = 1; % mando la mail + else + value_HD(a,5) = 0; + end + if SogliaY(1,3) == 1 + value_HD(a,6) = 1; % mando sms + else + value_HD(a,6) = 0; + end + if ultimoY(d,1) == 1 + value_HD(a,7) = 1; + else + value_HD(a,7) = 0; + end + a=a+1; + File = 1; + alert = 1; + end + end + % Livello 2 + if Livello == 2 && SogliaY(2,1) == 1 % Livello attivo + if SogliaY(2,2) == 1 || SogliaY(2,3) == 1 % c'è uno fra email e sms + Data_HD(a,1) = ARRAYdateHD(k,1); + value_HD(a,1) = 1000*Y_HD(d,k); % mm + value_HD(a,2) = Livello; + value_HD(a,3) = Nodo; + value_HD(a,4) = Tipologia; + if SogliaY(2,2) == 1 + value_HD(a,5) = 1; % mando la mail + else + value_HD(a,5) = 0; + end + if SogliaY(2,3) == 1 + value_HD(a,6) = 1; % mando sms + else + value_HD(a,6) = 0; + end + if ultimoY(d,2) == 1 + value_HD(a,7) = 1; + else + value_HD(a,7) = 0; + end + a=a+1; + File = 1; + alert = 1; + end + end + % Livello 3 + if Livello == 3 && SogliaY(3,1) == 1 % Livello attivo + if SogliaY(3,2) == 1 || SogliaY(3,3) == 1 % c'è uno fra email e sms + Data_HD(a,1) = ARRAYdateHD(k,1); + value_HD(a,1) = 1000*Y_HD(d,k); % mm + value_HD(a,2) = Livello; + value_HD(a,3) = Nodo; + value_HD(a,4) = Tipologia; + if SogliaY(3,2) == 1 + value_HD(a,5) = 1; % mando la mail + else + value_HD(a,5) = 0; + end + if SogliaY(3,3) == 1 + value_HD(a,6) = 1; % mando sms + else + value_HD(a,6) = 0; + end + if ultimoY(d,3) == 1 + value_HD(a,7) = 1; + else + value_HD(a,7) = 0; + end + a=a+1; + File = 1; + alert = 1; + end + end + end + + Continua = 0; + % --- Soglia 2D --- + Tipologia = 3; + if attiva2D == 1 + Livello = 0; + % Livello 1 + if Soglia2D(1,1)==1 + if 1000*HShift_HD(d,k)>Soglia2D(1,4) + Livello = 1; + Continua = 1; + if 1000*HShift_HD(d,cHD)>Soglia2D(1,4) + ultimo2D(d,1) = 1; + end + end + end + % Livello 2 + if Soglia2D(2,1)==1 + if 1000*HShift_HD(d,k)>Soglia2D(2,4) + Livello = 2; + Continua = 1; + if 1000*HShift_HD(d,cHD)>Soglia2D(2,4) + ultimo2D(d,2) = 1; + end + end + end + % Livello 3 + if Soglia2D(3,1)==1 + if 1000*HShift_HD(d,k)>Soglia2D(3,4) + Livello = 3; + Continua = 1; + if 1000*HShift_HD(d,cHD)>Soglia2D(3,4) + ultimo2D(d,3) = 1; + end + end + end + end + % controlli + if isempty(ALARM_HD)==0 % Ci sono già degli allarmi + Check = find(ALARM_HD(:,1)==ARRAYdateHD(k,1)); % Data + if isempty(Check)==0 % C'è già quella data + ALARM_HD1 = ALARM_HD(Check,:); + Check2 = find(ALARM_HD1(:,4)==Nodo); % Nodo + if isempty(Check2)==0 + ALARM_HD2 = ALARM_HD1(Check2,:); + Check3 = find(ALARM_HD2(:,3)>=Livello); % Livello + if isempty(Check3)==0 + ALARM_HD3 = ALARM_HD2(Check3,:); + Check4 = find(ALARM_HD3(:,5)==Tipologia); % Tipologia + if isempty(Check4)==0 + Continua = 0; % L'allerta esiste già (o è precedente) + end + end + end + else + % Cerco la data immediatamente precedente + Check5 = find(ALARM_HD(:,1)==ARRAYdateHD(k-1,1)); % Data + ALARM_HD1 = ALARM_HD(Check5,:); + Check2 = find(ALARM_HD1(:,4)==Nodo); % Nodo + if isempty(Check2)==0 + ALARM_HD2 = ALARM_HD1(Check2,:); + Check3 = find(ALARM_HD2(:,3)>=Livello); % Livello + if isempty(Check3)==0 + ALARM_HD3 = ALARM_HD2(Check3,:); + Check4 = find(ALARM_HD3(:,5)==Tipologia); % Tipologia + if isempty(Check4)==0 + Continua = 0; % L'allerta esiste già (o è precedente) + end + end + end + end + end + if Continua == 1 + % Livello 1 + if Livello == 1 && Soglia2D(1,1) == 1 % Livello attivo + if Soglia2D(1,2) == 1 || Soglia2D(1,3) == 1 % c'è uno fra email e sms + Data_HD(a,1) = ARRAYdateHD(k,1); + value_HD(a,1) = 1000*HShift_HD(d,k); % mm + value_HD(a,2) = Livello; + value_HD(a,3) = Nodo; + value_HD(a,4) = Tipologia; + if Soglia2D(1,2) == 1 + value_HD(a,5) = 1; % mando la mail + else + value_HD(a,5) = 0; + end + if Soglia2D(1,3) == 1 + value_HD(a,6) = 1; % mando sms + else + value_HD(a,6) = 0; + end + if ultimo2D(d,1) == 1 + value_HD(a,7) = 1; + else + value_HD(a,7) = 0; + end + a=a+1; + File = 1; + alert = 1; + end + end + % Livello 2 + if Livello == 2 && Soglia2D(2,1) == 1 % Livello attivo + if Soglia2D(2,2) == 1 || Soglia2D(2,3) == 1 % c'è uno fra email e sms + Data_HD(a,1) = ARRAYdateHD(k,1); + value_HD(a,1) = 1000*HShift_HD(d,k); % mm + value_HD(a,2) = Livello; + value_HD(a,3) = Nodo; + value_HD(a,4) = Tipologia; + if Soglia2D(2,2) == 1 + value_HD(a,5) = 1; % mando la mail + else + value_HD(a,5) = 0; + end + if Soglia2D(2,3) == 1 + value_HD(a,6) = 1; % mando sms + else + value_HD(a,6) = 0; + end + if ultimo2D(d,2) == 1 + value_HD(a,7) = 1; + else + value_HD(a,7) = 0; + end + a=a+1; + File = 1; + alert = 1; + end + end + % Livello 3 + if Livello == 3 && Soglia2D(3,1) == 1 % Livello attivo + if Soglia2D(3,2) == 1 || Soglia2D(3,3) == 1 % c'è uno fra email e sms + Data_HD(a,1) = ARRAYdateHD(k,1); + value_HD(a,1) = 1000*HShift_HD(d,k); % mm + value_HD(a,2) = Livello; + value_HD(a,3) = Nodo; + value_HD(a,4) = Tipologia; + if Soglia2D(3,2) == 1 + value_HD(a,5) = 1; % mando la mail + else + value_HD(a,5) = 0; + end + if Soglia2D(3,3) == 1 + value_HD(a,6) = 1; % mando sms + else + value_HD(a,6) = 0; + end + if ultimo2D(d,3) == 1 + value_HD(a,7) = 1; + else + value_HD(a,7) = 0; + end + a=a+1; + File = 1; + alert = 1; + end + end + end + + Continua = 0; + % --- Soglia 2D locale --- + Tipologia = 4; + if attivaLoc2D == 1 + Livello = 0; + % Livello 1 + if Soglia2DLoc(1,1)==1 + if 1000*HShift_local_HD(d,k)>Soglia2DLoc(1,4) + Livello = 1; + Continua = 1; + if 1000*HShift_local_HD(d,cHD)>Soglia2DLoc(1,4) + ultimo2DLoc(d,1) = 1; + end + end + end + % Livello 2 + if Soglia2DLoc(2,1)==1 + if 1000*HShift_local_HD(d,k)>Soglia2DLoc(2,4) + Livello = 2; + Continua = 1; + if 1000*HShift_local_HD(d,cHD)>Soglia2DLoc(2,4) + ultimo2DLoc(d,2) = 1; + end + end + end + % Livello 3 + if Soglia2DLoc(3,1)==1 + if 1000*HShift_local_HD(d,k)>Soglia2DLoc(3,4) + Livello = 3; + Continua = 1; + if 1000*HShift_local_HD(d,cHD)>Soglia2DLoc(3,4) + ultimo2DLoc(d,3) = 1; + end + end + end + end + % controlli + if isempty(ALARM_HD)==0 % Ci sono già degli allarmi + Check = find(ALARM_HD(:,1)==ARRAYdateHD(k,1)); % Data + if isempty(Check)==0 % C'è già quella data + ALARM_HD1 = ALARM_HD(Check,:); + Check2 = find(ALARM_HD1(:,4)==Nodo); % Nodo + if isempty(Check2)==0 + ALARM_HD2 = ALARM_HD1(Check2,:); + Check3 = find(ALARM_HD2(:,3)>=Livello); % Livello + if isempty(Check3)==0 + ALARM_HD3 = ALARM_HD2(Check3,:); + Check4 = find(ALARM_HD3(:,5)==Tipologia); % Tipologia + if isempty(Check4)==0 + Continua = 0; % L'allerta esiste già (o è precedente) + end + end + end + else + % Cerco la data immediatamente precedente + Check5 = find(ALARM_HD(:,1)==ARRAYdateHD(k-1,1)); % Data + ALARM_HD1 = ALARM_HD(Check5,:); + Check2 = find(ALARM_HD1(:,4)==Nodo); % Nodo + if isempty(Check2)==0 + ALARM_HD2 = ALARM_HD1(Check2,:); + Check3 = find(ALARM_HD2(:,3)>=Livello); % Livello + if isempty(Check3)==0 + ALARM_HD3 = ALARM_HD2(Check3,:); + Check4 = find(ALARM_HD3(:,5)==Tipologia); % Tipologia + if isempty(Check4)==0 + Continua = 0; % L'allerta esiste già (o è precedente) + end + end + end + end + end + if Continua == 1 + % Livello 1 + if Livello == 1 && Soglia2DLoc(1,1) == 1 % Livello attivo + if Soglia2DLoc(1,2) == 1 || Soglia2DLoc(1,3) == 1 % c'è uno fra email e sms + Data_HD(a,1) = ARRAYdateHD(k,1); + value_HD(a,1) = 1000*HShift_local_HD(d,k); % mm + value_HD(a,2) = Livello; + value_HD(a,3) = Nodo; + value_HD(a,4) = Tipologia; + if Soglia2DLoc(1,2) == 1 + value_HD(a,5) = 1; % mando la mail + else + value_HD(a,5) = 0; + end + if Soglia2DLoc(1,3) == 1 + value_HD(a,6) = 1; % mando sms + else + value_HD(a,6) = 0; + end + if ultimo2DLoc(d,1) == 1 + value_HD(a,7) = 1; + else + value_HD(a,7) = 0; + end + a=a+1; + File = 1; + alert = 1; + end + end + % Livello 2 + if Livello == 2 && Soglia2DLoc(2,1) == 1 % Livello attivo + if Soglia2DLoc(2,2) == 1 || Soglia2DLoc(2,3) == 1 % c'è uno fra email e sms + Data_HD(a,1) = ARRAYdateHD(k,1); + value_HD(a,1) = 1000*HShift_local_HD(d,k); % mm + value_HD(a,2) = Livello; + value_HD(a,3) = Nodo; + value_HD(a,4) = Tipologia; + if Soglia2DLoc(2,2) == 1 + value_HD(a,5) = 1; % mando la mail + else + value_HD(a,5) = 0; + end + if Soglia2DLoc(2,3) == 1 + value_HD(a,6) = 1; % mando sms + else + value_HD(a,6) = 0; + end + if ultimo2DLoc(d,2) == 1 + value_HD(a,7) = 1; + else + value_HD(a,7) = 0; + end + a=a+1; + File = 1; + alert = 1; + end + end + % Livello 3 + if Livello == 3 && Soglia2DLoc(3,1) == 1 % Livello attivo + if Soglia2DLoc(3,2) == 1 || Soglia2DLoc(3,3) == 1 % c'è uno fra email e sms + Data_HD(a,1) = ARRAYdateHD(k,1); + value_HD(a,1) = 1000*HShift_local_HD(d,k); % mm + value_HD(a,2) = Livello; + value_HD(a,3) = Nodo; + value_HD(a,4) = Tipologia; + if Soglia2DLoc(3,2) == 1 + value_HD(a,5) = 1; % mando la mail + else + value_HD(a,5) = 0; + end + if Soglia2DLoc(3,3) == 1 + value_HD(a,6) = 1; % mando sms + else + value_HD(a,6) = 0; + end + if ultimo2DLoc(d,3) == 1 + value_HD(a,7) = 1; + else + value_HD(a,7) = 0; + end + a=a+1; + File = 1; + alert = 1; + end + end + end + end + end + Data_HD(a:end)=[]; + value_HD(a:end,:)=[]; + if File == 1 + ALARM_HD = [ALARM_HD; Data_HD value_HD]; + save(NomeFile,'ALARM_HD') + end +end + +if alert == 1 + AL = 1; + DATAinsert = cell(1,9); + [rAL,~]=size(value_HD); + for ii = 1:rAL % numero di allerte + Data = datestr(Data_HD(ii,1),'yyyy-mm-dd HH:MM:SS'); + Valore = value_HD(ii,1); + Level = value_HD(ii,2); + NodeNum = value_HD(ii,3); + Tipologia = value_HD(ii,4); + Email = value_HD(ii,5); + sms = value_HD(ii,6); + if value_HD(ii,7) == 1 + desc = 'L''ultima lettura del sensore risulta fuori soglia'; + else + desc = 'L''ultima lettura del sensore NON risulta fuori soglia'; + end + + DATAinsert{AL,1} = 3; % Allarme tipologia Soglie tradizionali + DATAinsert{AL,2} = IDcentralina; + DATAinsert{AL,3} = DTcatena; + DATAinsert{AL,4} = NodeNum; + DATAinsert{AL,5} = Data; + DATAinsert{AL,6} = Valore; + DATAinsert{AL,7} = Level; + DATAinsert{AL,8} = Email; + DATAinsert{AL,9} = sms; + DATAinsert{AL,10} = Tipologia; + DATAinsert{AL,11} = desc; + AL = AL+1; + end + + AL = AL-1; % Numero totale di allarmi + for a = 1:AL + % Cerco se il dato è già presente + Data = DATAinsert{a,5}; % Data + nNodo = num2str(DATAinsert{a,4}); % Numero nodo + type = num2str(DATAinsert{a,1}); % tipologia soglia + level = num2str(DATAinsert{a,7}); % livello allarme + value = num2str(DATAinsert{a,6}); % Valore + grandezza = num2str(DATAinsert{a,10}); % grandezza fisica soglia (X,Y,etc.) + desc = DATAinsert{a,11}; % Descrizione + comando = ['select id, type_id, date_time from alarms where unit_name = ''' ... + IDcentralina ''' and tool_name = ''' DTcatena ''' and node_num = ''' ... + nNodo ''' and date_time = ''' Data ''' and type_id = ''' type ... + ''' and alarm_level = ''' level ''' and registered_value = ''' value ... + ''' and tipologia = ''' grandezza ''' and description like ''' desc ''' order by date_time']; + curs = exec(conn,comando); + curs = fetch(curs); + idDate = curs.Data; + [~,cI] = size(idDate); + if cI == 1 + idElabData = 0; % 0 indica che il dato non è presente su DB + else + idElabData = cell2mat(idDate(:,1)); + end + tablename = 'alarms'; + colnames = {'type_id','unit_name','tool_name','node_num','date_time',... + 'registered_value','alarm_level','send_email','send_sms','tipologia','description'}; + data = [DATAinsert(a,1),DATAinsert(a,2),DATAinsert(a,3),DATAinsert(a,4),... + DATAinsert(a,5),DATAinsert(a,6),DATAinsert(a,7),DATAinsert(a,8),DATAinsert(a,9),... + DATAinsert(a,10),DATAinsert(a,11)]; + if idElabData == 0 % Scrivo + fastinsert(conn,tablename,colnames,data); + end + end + + text = 'threshold_TiltLinkHD function closed'; + fprintf(fileID,fmt,text); + fclose(fileID); +end \ No newline at end of file diff --git a/Tilt/tipologiaNodi.m b/Tilt/tipologiaNodi.m new file mode 100755 index 0000000..8aaef89 --- /dev/null +++ b/Tilt/tipologiaNodi.m @@ -0,0 +1,696 @@ +% Funzione che ricostruisce la tipologia di nodi presenti +% NodoTiltLink ad esempio contiene numero del nodo e profondità per tutti i +% nodi di questo tipo +% idTool rappresenta l'identificativo con cui sono definite le +% installazioni su DB, serve più avanti nell'elaborazione +% idNode scrive gli identificativi dei nodi del DB. E' un output di +% controllo + +function [idTool,NodoTiltLink,NodoTiltLinkHR,NodoTiltLinkH,NodoTiltLinkHRH,... + NodoTiltLinkHR3D,NodoTiltLinkHR3DH,NodoPiezoLink,NodoBaroLink,... + NodoThermLink,NodoAnalogLink,NodoLoadLink,NodoKlinoLink,NodoKlinoLinkHR,... + NodoRainLink,NodoPT100Link,NodoInPlaceLink,NodoInPlaceLinkHR,NodoInPlaceLinkHR3D,... + NodoWeirLink,NodoPendulum,NodoWind,NodoTiltLinkHD,NodoTiltLinkHDVR,NodoSPPLink,NodoSnowLink,... + rTL,rTLHR,rTLH,rTLHRH,rTLHR3D,rTLHR3DH,rPL,rBL,rThL,rAL,rLL,rKL,rKLHR,... + rRL,rPT100,rIPL,rIPLHR,rIPLHR3D,rWL,rPE,rWI,rHD,rHDVR,rSPP,rSL]... + = tipologiaNodi(DTcatena,unitID,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'tipologiaNodi function started'; +fprintf(fileID,fmt,text); + +%% A partire dal nome della catena, risalgo all'identificativo con cui è +% definita nel Database (mi serve successivamente) +comando = ['select id from tools where name = ''' DTcatena ''' and unit_id = ''' unitID ''' ']; +idTool = num2str(cell2mat(fetch(conn,comando))); % leggo e converto in stringa + +%% Tilt Link V +% carico le informazioni relative al numero e alla profondità per TILT LINK +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 1 order by num']; +Leggo = fetch(conn,comando); +[rTL,cL] = size(Leggo); +if rTL <= 1 && cL <= 1 + textTL = 'There are not Tilt Link V; '; + NodoTiltLink = []; + nodoTL = 0; % mi serve nei Tilt Link HR3D + rTL = 0; +else + nodoTL = 1; % mi serve nei Tilt Link HR3D + % cambio il segno della profondità (nel DB è positivo) + depth = (-1)*cell2mat(Leggo(:,2)); + depth = num2cell(depth); + nome = cell(rTL,1); + for i=1:rTL + nome(i,1) = cellstr('Tilt Link V'); + end + NodoTiltLink = [nome Leggo(:,1) depth Leggo(:,3)]; + textTL = ['There are ',num2str(rTL),' Tilt Link V nodes; ']; +end +fprintf(fileID,fmt,textTL); + +%% Piezo Link +% carico le informazioni relative al numero e alla profondità per PIEZO LINK +comando = ['select num, depth, measurment, therm from nodes where tool_id = ''' idTool ''' and nodetype_id = 2 order by num']; +curs = exec(conn,comando); +curs = fetch(curs); +Leggo = curs.Data; +[rPL,cL] = size(Leggo); +if rPL == 1 && cL == 1 + textPL = 'There are not Piezo Link; '; + rPL = 0; + NodoPiezoLink = []; +else + % cambio il segno della profondità (nel DB è positivo) + depth = (-1)*cell2mat(Leggo(:,2)); + depth = num2cell(depth); + nome = cell(rPL,1); + for i=1:rPL + nome(i,1) = cellstr('Piezo Link'); + end + NodoPiezoLink = [nome Leggo(:,1) depth Leggo(:,3) Leggo(:,4)]; + textPL = ['There are ',num2str(rPL),' Piezo Link nodes; ']; +end +fprintf(fileID,fmt,textPL); + +%% Baro Link +% carico le informazioni relative al numero e alla profondità per BARO LINK +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 3 order by num']; +curs = exec(conn,comando); +curs = fetch(curs); +Leggo = curs.Data; +[rBL,cL] = size(Leggo); +if rBL == 1 && cL == 1 + textBL = 'There are not Baro Link; '; + NodoBaroLink = []; + rBL = 0; +else + % cambio il segno della profondità (nel DB è positivo) + depth = (-1)*cell2mat(Leggo(:,2)); + depth = num2cell(depth); + nome = cell(rBL,1); + for i=1:rBL + nome(i,1) = cellstr('Baro Link'); + end + NodoBaroLink = [nome Leggo(:,1) depth Leggo(:,3)]; + textBL = ['There are ',num2str(rBL),' Baro Link nodes; ']; +end +fprintf(fileID,fmt,textBL); + +%% Therm Link +% carico le informazioni relative al numero e alla profondità per THERM LINK +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 4 order by num']; +curs = exec(conn,comando); +curs = fetch(curs); +Leggo = curs.Data; +[rThL,cL] = size(Leggo); +if rThL == 1 && cL == 1 + textThL = 'There are not Therm Link; '; + NodoThermLink = []; + rThL = 0; +else + % cambio il segno della profondità (nel DB è positivo) + depth = (-1)*cell2mat(Leggo(:,2)); + depth = num2cell(depth); + nome = cell(rThL,1); + for i=1:rThL + nome(i,1) = cellstr('Therm Link'); + end + NodoThermLink = [nome Leggo(:,1) depth Leggo(:,3)]; + textThL = ['There are ',num2str(rThL),' Therm Link nodes; ']; +end +fprintf(fileID,fmt,textThL); + +%% Tilt Link HR V +% carico le informazioni relative al numero e alla profondità per TILT LINK HR V +comando = ['select num, depth from nodes where tool_id = ''' idTool ''' and nodetype_id = 5 order by num']; +curs = exec(conn,comando); +curs = fetch(curs); +Leggo = curs.Data; +[rTLHR,cL] = size(Leggo); +if rTLHR == 1 && cL == 1 + textTLHR = 'There are not Tilt Link HR V; '; + NodoTiltLinkHR = []; + nodoTLHR = 0; % mi serve a riconoscere i Tilt Link HR3D + rTLHR = 0; +else + nodoTLHR = 1; % mi serve a riconoscere i Tilt Link HR3D + % cambio il segno della profondità (nel DB è positivo) + depth = (-1)*cell2mat(Leggo(:,2)); + depth = num2cell(depth); + nome = cell(rTLHR,1); + for i=1:rTLHR + nome(i,1) = cellstr('Tilt Link HR V'); + end + NodoTiltLinkHR = [nome Leggo(:,1) depth]; + textTLHR = ['There are ',num2str(rTLHR),' Tilt Link HR V nodes; ']; +end +fprintf(fileID,fmt,textTLHR); + +% confrontando le profondità di Tilt Link e Tilt Link HR riconosco i TILT LINK HR 3D +if nodoTL == 1 && nodoTLHR == 1 + NodoTiltLinkHR3Dwork = cell(rTL,4); % creo matrice di zeri + p=1; + Control = 0; + for i=1:rTL + for j=1:rTLHR + if cell2mat(NodoTiltLink(i,3)) == cell2mat(NodoTiltLinkHR(j,3)) + prof = NodoTiltLink(i,3); + nome = cellstr('Tilt Link HR 3D V'); + % il numero nodo del Tilt Link lo faccio diventare il numero nodo del Tilt Link HR3D + num = NodoTiltLink(i,2); + num2 = NodoTiltLinkHR(j,2); + Leggo = [nome,num,num2,prof]; + NodoTiltLinkHR3Dwork(p,:) = Leggo; + p = p+1; + Control = 1; + break + end + end + end + % elimino gli zeri in più + q = 1; + rCONT = 0; + [s,~] = size(NodoTiltLinkHR3Dwork); + a = 1; + while a == 1 + if q > s + a = 0; + else + if strcmp(cell2mat(NodoTiltLinkHR3Dwork(q,1)),'Tilt Link HR 3D V') + rCONT = 1+rCONT; % ultima riga con dati che non siano celle vuote + end + end + q = q+1; + end + if Control == 1 + NodoTiltLinkHR3D = NodoTiltLinkHR3Dwork(1:rCONT,:); + elseif Control == 0 + NodoTiltLinkHR3D = []; + end + textTLHR3D = ['There are ',num2str(rCONT),' Tilt Link HR 3D V nodes; ']; +else + textTLHR3D = 'There are not Tilt Link HR 3D V; '; + NodoTiltLinkHR3D = []; + rCONT = 0; +end +rTLHR3D = rCONT; +fprintf(fileID,fmt,textTLHR3D); + +%% Tilt Link H +% carico le informazioni relative al numero e alla profondità per TILT LINK H +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 11 order by num']; +curs = exec(conn,comando); +curs = fetch(curs); +Leggo = curs.Data; +[rTLH,cL] = size(Leggo); +if rTLH == 1 && cL == 1 + textTLH = 'There are not Tilt Link H; '; + NodoTiltLinkH = []; + nodoTLH = 0; % mi serve nei Tilt Link H HR3D + rTLH = 0; +else + nodoTLH = 1; % mi serve nei Tilt Link H HR3D + % depth in questo caso è la lunghezza in orizzontale + depth = Leggo(:,2); + nome = cell(rTLH,1); + for i=1:rTLH + nome(i,1) = cellstr('Tilt Link H'); + end + NodoTiltLinkH = [nome Leggo(:,1) depth Leggo(:,3)]; + textTLH = ['There are ',num2str(rTLH),' Tilt Link H nodes; ']; +end +fprintf(fileID,fmt,textTLH); + +%% Tilt Link HR H +% carico le informazioni relative al numero e alla profondità per TILT LINK HR H +comando = ['select num, depth from nodes where tool_id = ''' idTool ''' and nodetype_id = 12 order by num']; +curs = exec(conn,comando); +curs = fetch(curs); +Leggo = curs.Data; +[rTLHRH,cL] = size(Leggo); +if rTLHRH == 1 && cL == 1 + textTLHRH = 'There are not Tilt Link HR H; '; + NodoTiltLinkHRH = []; + nodoTLHRH = 0; % mi serve a riconoscere i Tilt Link HR3D H + rTLHRH = 0; +else + nodoTLHRH = 1; % mi serve a riconoscere i Tilt Link HR3D H + % la profondità in realtà indica la lunghezza in orizzontale + depth = Leggo(:,2); + nome = cell(rTLHRH,1); + for i=1:rTLHRH + nome(i,1) = cellstr('Tilt Link HR H'); + end + NodoTiltLinkHRH = [nome Leggo(:,1) depth]; + textTLHRH = ['There are ',num2str(rTLHRH),' Tilt Link HR H nodes; ']; +end +fprintf(fileID,fmt,textTLHRH); + +% confrontando le profondità (in realtà lunghezze in orizzontale) di Tilt +% Link H e Tilt Link HR H riconosco i TILT LINK HR 3D H +if nodoTLH == 1 && nodoTLHRH == 1 + NodoTiltLinkHR3Dwork = cell(rTLH,4); % creo matrice di zeri + p=1; + Control = 0; + for i=1:rTLH + for j=1:rTLHRH + if cell2mat(NodoTiltLinkH(i,3)) == cell2mat(NodoTiltLinkHRH(j,3)) + prof = NodoTiltLinkH(i,3); + nome = cellstr('Tilt Link HR 3D H'); + % il numero nodo del Tilt Link H lo faccio diventare il + % numero nodo del Tilt Link HR3D H + num = NodoTiltLinkH(i,2); + num2 = NodoTiltLinkHRH(i,2); + Leggo = [nome,num,num2,prof]; + NodoTiltLinkHR3Dwork(p,:) = Leggo; + p = p+1; + Control = 1; + end + end + end + % elimino gli zeri in più + q = 1; + rCONT = 0; + + while strcmp(NodoTiltLinkHR3Dwork(q,1),'Tilt Link HR 3D H') + q = q+1; + rCONT = 1+rCONT; % ultima riga con dati che non siano celle vuote + if q > rTLH || q > rTLHRH + break % esco dal ciclo while + end + end + if Control == 1 + NodoTiltLinkHR3DH = NodoTiltLinkHR3Dwork(1:rCONT,:); + elseif Control == 0 + NodoTiltLinkHR3DH = []; + end + textTLHR3DH = ['There are ',num2str(rCONT),' Tilt Link HR 3D H nodes; ']; +else + textTLHR3DH = 'There are Tilt Link HR 3D H nodes; '; + NodoTiltLinkHR3DH = []; +end +fprintf(fileID,fmt,textTLHR3DH); +rTLHR3DH = rCONT; + +%% Analog Link +% carico le informazioni relative al numero e alla profondità per ANALOG LINK +comando = ['select num, depth from nodes where tool_id = ''' idTool ''' and nodetype_id = 8 order by num']; +curs = exec(conn,comando); +curs = fetch(curs); +Leggo = curs.Data; +[rAL,cL] = size(Leggo); +if rAL == 1 && cL == 1 + textAL = 'There are not Analog Link; '; + NodoAnalogLink = []; + rAL = 0; +else + % cambio il segno della profondità (nel DB è positivo) + depth = (-1)*cell2mat(Leggo(:,2)); + depth = num2cell(depth); + nome = cell(rAL,1); + for i=1:rAL + nome(i,1) = cellstr('Analog Link'); + end + NodoAnalogLink = [nome Leggo(:,1) depth]; + % inverto la matrice Nodi (il primo nodo è il più profondo) + textAL = ['There are ',num2str(rAL),' Analog Link nodes; ']; +end +fprintf(fileID,fmt,textAL); + +%% Load Link +% carico le informazioni relative al numero e alla profondità per LOAD LINK +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 15 order by num']; +curs = exec(conn,comando); +curs = fetch(curs); +Leggo = curs.Data; +[rLL,cL] = size(Leggo); +if rLL == 1 && cL == 1 + textLL = 'There are not Load Link; '; + NodoLoadLink = []; + rLL = 0; +else + % cambio il segno della profondità (nel DB è positivo) + depth = (-1)*cell2mat(Leggo(:,2)); + depth = num2cell(depth); + nome = cell(rLL,1); + for i=1:rLL + nome(i,1) = cellstr('Load Link'); + end + NodoLoadLink = [nome Leggo(:,1) depth Leggo(:,3)]; + % inverto la matrice Nodi (il primo nodo è il più profondo) + textLL = ['There are ',num2str(rLL),' Load Link nodes; ']; +end +fprintf(fileID,fmt,textLL); + +%% Klino Link +% carico le informazioni relative al numero e alla profondità per Klino Link +comando = ['select num, depth, measurment, channels from nodes where tool_id = ''' idTool ''' and nodetype_id = 26 order by num']; +curs = exec(conn,comando); +curs = fetch(curs); +Leggo = curs.Data; +[rKL,cL] = size(Leggo); +if rKL == 1 && cL == 1 + textKL = 'There are not Klino Link; '; + NodoKlinoLink = []; + rKL = 0; +else + depth = Leggo(:,2); + nome = cell(rKL,1); + for i=1:rKL + nome(i,1) = cellstr('Klino Link'); + end + NodoKlinoLink = [nome Leggo(:,1) depth Leggo(:,3) Leggo(:,4)]; + textKL = ['There are ',num2str(rKL),' Klino Link nodes; ']; +end +fprintf(fileID,fmt,textKL); + +%% Klino Link HR +% carico le informazioni relative al numero e alla profondità per Klino +% Link HR +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 44 order by num']; +curs = exec(conn,comando); +curs = fetch(curs); +Leggo = curs.Data; +[rKLHR,cL] = size(Leggo); +if rKLHR == 1 && cL == 1 + textKLHR = 'There are not Klino Link HR; '; + NodoKlinoLinkHR = []; + rKLHR = 0; +else + depth = Leggo(:,2); + nome = cell(rKLHR,1); + for i=1:rKLHR + nome(i,1) = cellstr('Klino Link HR'); + end + NodoKlinoLinkHR = [nome Leggo(:,1) depth Leggo(:,3)]; + textKLHR = ['There are ',num2str(rKLHR),' Klino Link HR nodes; ']; +end +fprintf(fileID,fmt,textKLHR); + +%% Rain Link +% carico le informazioni relative al numero e alla profondità per Rain Link +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 27 order by num']; +curs = exec(conn,comando); +curs = fetch(curs); +Leggo = curs.Data; +[rRL,cL] = size(Leggo); +if rRL == 1 && cL == 1 + textRL = 'There are not Rain Link; '; + NodoRainLink = []; + rRL = 0; +else + nome = cell(rRL,1); + for i=1:rRL + nome(i,1) = cellstr('Rain Link'); + end + NodoRainLink = [nome Leggo(:,1:3)]; + textRL = ['There are ',num2str(rRL),' Rain Link nodes; ']; +end +fprintf(fileID,fmt,textRL); + +%% PT100 Link +% carico le informazioni relative al numero e alla profondità per PT100 Link +comando = ['select num, depth from nodes where tool_id = ''' idTool ''' and nodetype_id = 28 order by num']; +curs = exec(conn,comando); +curs = fetch(curs); +Leggo = curs.Data; +[rPT100,cL] = size(Leggo); +if rPT100 == 1 && cL == 1 + textPT100 = 'There are not PT100 Link; '; + NodoPT100Link = []; + rPT100 = 0; +else + depth = (-1)*cell2mat(Leggo(:,2)); + depth = num2cell(depth); + nome = cell(rPT100,1); + for i=1:rPT100 + nome(i,1) = cellstr('PT100 Link'); + end + NodoPT100Link = [nome Leggo(:,1) depth]; + textPT100 = ['There are ',num2str(rPT100),' PT100 Link nodes; ']; +end +fprintf(fileID,fmt,textPT100); + +%% In Place Link +% carico le informazioni relative al numero e alla profondità per In Place Link +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool... + ''' and nodetype_id = 42 order by num']; +Leggo = fetch(conn,comando); +[rIPL,cL] = size(Leggo); +if rIPL <= 1 && cL <= 1 + textIPL = 'There are not In Place Link; '; + NodoInPlaceLink = []; + nodoIPL = 0; % mi serve nei In Place Link HR 3D + rIPL = 0; +else + nodoIPL = 1; % mi serve nei In Place Link HR 3D + % cambio il segno della profondità (nel DB è positivo) + depth = (-1)*cell2mat(Leggo(:,2)); + depth = num2cell(depth); + nome = cell(rIPL,1); + for i=1:rIPL + nome(i,1) = cellstr('In Place Link'); + end + NodoInPlaceLink = [nome Leggo(:,1) depth Leggo(:,3)]; + textIPL = ['There are ',num2str(rIPL),' In Place Link nodes; ']; +end +fprintf(fileID,fmt,textIPL); + +%% In Place Link HR +% carico le informazioni relative al numero e alla profondità per In Place +% Link HR +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool ''' and nodetype_id = 43 order by num']; +curs = exec(conn,comando); +curs = fetch(curs); +Leggo = curs.Data; +[rIPLHR,cL] = size(Leggo); +if rIPLHR == 1 && cL == 1 + textIPLHR = 'There are not In Place Link HR; '; + NodoInPlaceLinkHR = []; + nodoIPLHR = 0; % mi serve a riconoscere In Place Link HR 3D + rIPLHR = 0; +else + nodoIPLHR = 1; % mi serve a riconoscere In Place Link HR 3D + % cambio il segno della profondità (nel DB è positivo) + depth = (-1)*cell2mat(Leggo(:,2)); + depth = num2cell(depth); + nome = cell(rIPLHR,1); + for i=1:rIPLHR + nome(i,1) = cellstr('In Place Link HR'); + end + NodoInPlaceLinkHR = [nome Leggo(:,1) depth Leggo(:,3)]; + textIPLHR = ['There are ',num2str(rTLHR),' In Place Link HR nodes; ']; +end +fprintf(fileID,fmt,textIPLHR); + +% confrontando le profondità di Tilt Link e Tilt Link HR riconosco i TILT LINK HR 3D +if nodoIPL == 1 && nodoIPLHR == 1 + NodoInPlaceLinkHR3Dwork = cell(rIPL,4); % creo matrice di zeri + p=1; + Control = 0; + for i=1:rIPL + for j=1:rIPLHR + if cell2mat(NodoInPlaceLink(i,3)) == cell2mat(NodoInPlaceLinkHR(j,3)) + prof = NodoInPlaceLink(i,3); + nome = cellstr('In Place Link HR 3D'); + % il numero nodo del In Place Link lo faccio diventare il numero nodo del In Place Link HR3D + num = NodoInPlaceLink(i,2); + num2 = NodoInPlaceLinkHR(j,2); + Leggo = [nome,num,num2,prof]; + NodoInPlaceLinkHR3Dwork(p,:) = Leggo; + p = p+1; + Control = 1; + break + end + end + end + % elimino gli zeri in più + q = 1; + rCONT = 0; + [s,~] = size(NodoInPlaceLinkHR3Dwork); + a = 1; + while a == 1 + if q > s + a = 0; + else + if strcmp(cell2mat(NodoInPlaceLinkHR3Dwork(q,1)),'In Place Link HR 3D') + rCONT = 1+rCONT; % ultima riga con dati che non siano celle vuote + end + end + q = q+1; + end + if Control == 1 + NodoInPlaceLinkHR3D = NodoInPlaceLinkHR3Dwork(1:rCONT,:); + elseif Control == 0 + NodoInPlaceLinkHR3D = []; + end + textIPL3D = ['There are ',num2str(rCONT),' In Place HR 3D nodes; ']; +else + textIPL3D = 'There are not In Place HR 3D; '; + NodoInPlaceLinkHR3D = []; +end +rIPLHR3D = rCONT; +fprintf(fileID,fmt,textIPL3D); + +%% Weir Link +% carico le informazioni relative al numero e alla profondità per Weir Link +comando = ['select num, depth, measurment, channels, therm from nodes where tool_id = ''' ... + idTool ''' and nodetype_id = 53 order by num']; +Leggo = fetch(conn,comando); +[rWL,cL] = size(Leggo); +if rWL <= 1 && cL <= 1 + textWL = 'There are not Weir Link; '; + NodoWeirLink = []; + rWL = 0; +else + % cambio il segno della profondità (nel DB è positivo) + depth = (-1)*cell2mat(Leggo(:,2)); + depth = num2cell(depth); + nome = cell(rWL,1); + for i=1:rWL + nome(i,1) = cellstr('Weir Link'); + end + NodoWeirLink = [nome Leggo(:,1) depth Leggo(:,3) Leggo(:,4) Leggo(:,5)]; + textWL = ['There are ',num2str(rWL),' Weir Link nodes; ']; +end +fprintf(fileID,fmt,textWL); + +%% Pendulum +% carico le informazioni relative al numero e alla profondità per Pendulum +comando = ['select num, depth, measurment, channels from nodes where tool_id = ''' idTool... + ''' and nodetype_id = 52 order by num']; +Leggo = fetch(conn,comando); +[rPE,cL] = size(Leggo); +if rPE <= 1 && cL <= 1 + textPE = 'There are not Pendulums; '; + NodoPendulum = []; + rPE = 0; +else + % cambio il segno della profondità (nel DB è positivo) + depth = (-1)*cell2mat(Leggo(:,2)); + depth = num2cell(depth); + nome = cell(rPE,1); + for i=1:rPE + nome(i,1) = cellstr('Pendulum'); + end + NodoPendulum = [nome Leggo(:,1) depth Leggo(:,3) Leggo(:,4)]; + textPE = ['There are ',num2str(rPE),' Pendulum nodes; ']; +end +fprintf(fileID,fmt,textPE); + +%% Wind Link +% carico le informazioni relative al numero e alla profondità per Pendulum +comando = ['select num, depth, measurment, channels from nodes where tool_id = ''' idTool... + ''' and nodetype_id = 55 order by num']; +Leggo = fetch(conn,comando); +[rWI,cL] = size(Leggo); +if rWI <= 1 && cL <= 1 + textWI = 'There are not Wind Link; '; + NodoWind = []; + rWI = 0; +else + % cambio il segno della profondità (nel DB è positivo) + nome = cell(rWI,1); + for i=1:rWI + nome(i,1) = cellstr('Wind Link'); + end + NodoWind = [nome Leggo(:,1) Leggo(:,3) Leggo(:,4)]; + textWI = ['There are ',num2str(rWI),' Wind Link nodes; ']; +end +fprintf(fileID,fmt,textWI); + +%% Tilt Link HD VR +% carico le informazioni relative al numero e alla profondità per TILT LINK +comando = ['select num, depth, measurment, magnetometro from nodes where tool_id = ''' idTool... + ''' and nodetype_id = 61 order by num']; +Leggo = fetch(conn,comando); +[rHDVR,cL] = size(Leggo); +if rHDVR <= 1 && cL <= 1 + textHDVR = 'There are not Tilt Link HD VR; '; + NodoTiltLinkHDVR = []; + rHDVR = 0; +else + % cambio il segno della profondità (nel DB è positivo) + depth = (-1)*cell2mat(Leggo(:,2)); + depth = num2cell(depth); + nome = cell(rHDVR,1); + for i=1:rHDVR + nome(i,1) = cellstr('Tilt Link HD VR'); + end + NodoTiltLinkHDVR = [nome Leggo(:,1) depth Leggo(:,3) Leggo(:,4)]; + textHDVR = ['There are ',num2str(rHDVR),' Tilt Link HD VR nodes; ']; +end +fprintf(fileID,fmt,textHDVR); + +%% Tilt Link HD +comando = ['select num, depth, measurment, magnetometro from nodes where tool_id = ''' idTool... + ''' and nodetype_id = 67 order by num']; +Leggo = fetch(conn,comando); +[rHD,cL] = size(Leggo); +if rHD <= 1 && cL <= 1 + textHD = 'There are not Tilt Link HD; '; + NodoTiltLinkHD = []; + rHD = 0; +else + % cambio il segno della profondità (nel DB è positivo) + depth = (-1)*cell2mat(Leggo(:,2)); + depth = num2cell(depth); + nome = cell(rHD,1); + for i=1:rHD + nome(i,1) = cellstr('Tilt Link HD'); + end + NodoTiltLinkHD = [nome Leggo(:,1) depth Leggo(:,3) Leggo(:,4)]; + textHD = ['There are ',num2str(rHD),' Tilt Link HD nodes; ']; +end +fprintf(fileID,fmt,textHD); + +%% Sensore Presenza Pioggia +% carico le informazioni relative al numero e alla profondità per SPP Link +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool... + ''' and nodetype_id = 64 order by num']; +curs = exec(conn,comando); +curs = fetch(curs); +Leggo = curs.Data; +[rSPP,cSPP] = size(Leggo); +if rSPP == 1 && cSPP == 1 + textSPP = 'There are not SPP Link; '; + NodoSPPLink = []; + rSPP = 0; +else + nome = cell(rSPP,1); + for i=1:rSPP + nome(i,1) = cellstr('SPP Link'); + end + NodoSPPLink = [nome Leggo(:,1:3)]; + textSPP = ['There are ',num2str(rSPP),' SPP Link nodes; ']; +end +fprintf(fileID,fmt,textSPP); + +%% Snow Link +% carico le informazioni relative al numero e alla profondità per Snow Link +comando = ['select num, depth, measurment from nodes where tool_id = ''' idTool... + ''' and nodetype_id = 78 order by num']; +curs = exec(conn,comando); +curs = fetch(curs); +Leggo = curs.Data; +[rSL,cL] = size(Leggo); +if rSL == 1 && cL == 1 + textSL = 'There are not Snow Link; '; + NodoSnowLink = []; + rSL = 0; +else + nome = cell(rSL,1); + for i=1:rSL + nome(i,1) = cellstr('Snow Link'); + end + NodoSnowLink = [nome Leggo(:,1:3)]; + textSL = ['There are ',num2str(rSL),' Snow Link nodes; ']; +end +fprintf(fileID,fmt,textSL); + +text = 'tipologiaNodi function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/triax_HD.m b/Tilt/triax_HD.m new file mode 100755 index 0000000..41a8944 --- /dev/null +++ b/Tilt/triax_HD.m @@ -0,0 +1,525 @@ +%% Funzione che calcola gli spostamenti in modalità triassiale per i Tilt Link +function [X_HD,Y_HD,Z_HD,Xlocal_HD,Ylocal_HD,Zlocal_HD,HShift_HD,HShift_local_HD,... + AlfaX_HD,AlfaY_HD,Azimuth_HD,Speed_local_HD,Speed_HD,Acceleration_local_HD,... + Acceleration_HD,tempHD,ARRAYdateHD,ErrTiltLinkHD] = triax_HD(rHD,... + ACCdef_HD,ACCdefRisHD,MAGdef_HD,tempHD,SpeHD,PsHD,NodoTiltLinkHD,tolleranzaAcc,... + tolleranzaMag,DatiElabTiltLinkHD,Ndevst,Wdevst,ARRAYdateHD,Tmax,Tmin,NuovoZeroHD,... + NdatiMedia,Ndatidespike,ErrTiltLinkHD,margine,datainiHD,MEMS,IDcentralina,DTcatena,FileName) + +%% Inizializzazione +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'triax_HD function started'; +fprintf(fileID,fmt,text); + +if NuovoZeroHD == 1 + if NdatiMedia > Ndatidespike + Ndati = NdatiMedia; + else + Ndati = Ndatidespike; + end + ini = round(Ndati/2)+1; + if rem(Ndati,2) == 0 + ini = ini+1; + end + clear NDati + ini = ini + margine; + if ini < 6 + ini = 6; + end + [letture,~]=size(DatiElabTiltLinkHD); + if ini > letture + ini = letture-1; + end + if Ndevst ~= 0 % Allora prendo tutti i dati e solo in seguito considero i nuovi, a valle della funzione filtro + ini = 1; + end + ACCdefRisHD = ACCdefRisHD(ini:end,:); + tempHD = tempHD(ini:end,:); + DatiElabTiltLinkHD = DatiElabTiltLinkHD(ini:end,:); + ARRAYdateHD = ARRAYdateHD(ini:end,1); + ErrTiltLinkHD = ErrTiltLinkHD(ini:end,:); +end + +%% Controllo e correzione dei campi magnetici +[rA,cA] = size(ACCdef_HD); % righe -> date, colonna -> nodi +conf_acc = zeros(rA,cA); +contM = 0; % contatore correzioni campi magnetici +contT = rA*cA; + +% Se le accelerazioni variano meno della confidenza, NON cambio i valori di +% cambio magnetico e prendo quelli della lettura precedente +for d = 2:rA + % seconda lettura e successive, confronto i risultati dei magnetometri + % e degli accelerometri + conf_acc(d,:) = abs(ACCdef_HD(d,:) - ACCdef_HD(d-1,:)); + for dd = 1:cA + if abs(conf_acc(d,dd)) < tolleranzaMag % SOGLIA ACCELERAZIONE + MAGdef_HD(d,dd) = MAGdef_HD(d-1,dd); + contM = contM+1; + end + end +end + +text = ['' num2str(contM) ' corrections of magnetometers executed on a total amount of ' num2str(contT)... + ' data, which represent the ' num2str(contM*100/contT) '% for Tilt Link HD']; +fprintf(fileID,fmt,text); + +if NuovoZeroHD == 1 + ACCdef_HD = ACCdef_HD(ini:end,:); + MAGdef_TL2 = MAGdef_HD(ini:end,:); +else + MAGdef_TL2 = MAGdef_HD; +end + +%% Definisco i dati +Nnodi = rHD; +[r,~] = size(ACCdef_HD); % Numero di dati +[Ndati,~] = size(ARRAYdateHD); +ax = zeros(r,Nnodi); +ay = zeros(r,Nnodi); +az = zeros(r,Nnodi); +mx = zeros(r,Nnodi); +my = zeros(r,Nnodi); +mz = zeros(r,Nnodi); +for i=1:Nnodi + ax(:,i) = ACCdef_HD(:,(i-1)*3+1); % ax + ay(:,i) = ACCdef_HD(:,(i-1)*3+2:(i-1)*3+2); % ay + az(:,i) = ACCdef_HD(:,(i-1)*3+3:(i-1)*3+3); % az + mx(:,i) = MAGdef_TL2(:,(i-1)*3+1); % mx + my(:,i) = MAGdef_TL2(:,(i-1)*3+2:(i-1)*3+2); % my + mz(:,i) = MAGdef_TL2(:,(i-1)*3+3:(i-1)*3+3); % mz +end + +%% Costruzione delle matrici spostamento e rotazione +NordSud = zeros(Nnodi,Ndati); % in riga i nodi, in colonna le date +EstOvest = zeros(Nnodi,Ndati); % in riga i nodi, in colonna le date +Zlocal_HD = zeros(Nnodi,Ndati); + +% parametri per il calcolo +SpeHD = SpeHD(2:end,1); % salto il segmento di pertinenza dell'ancora +c = 1; + +% Inizio del ciclo di elaborazione +text = 'Triaxial Elaboration of Tilt Link HD started'; +fprintf(fileID,fmt,text); + +% Inizializzo le matrici +deltaNS = zeros(rHD,1); +deltaEO = zeros(rHD,1); +deltaZ = zeros(rHD,1); +BECCHEGGIO = zeros(rHD,1); +ROLLIO = zeros(rHD,1); +IMBARDATA = zeros(rHD,1); +qf = zeros(rHD,4); +qfy = zeros(rHD,4); +for jj = 1:Ndati + for jjj=1:rHD + axb = ax(jj,jjj)'; + ayb = ay(jj,jjj)'; + azb = az(jj,jjj)'; + mxb = mx(jj,jjj)'; + myb = my(jj,jjj)'; + mzb = mz(jj,jjj)'; + SP = SpeHD(jjj); + [DNS,DEO,Dz,becc,roll,imba,q,qy] = QuaternioniASE(axb,ayb,azb,mxb,myb,mzb,SP,MEMS,FileName); + deltaNS(jjj) = DNS; + deltaEO(jjj) = DEO; + deltaZ(jjj) = Dz; + BECCHEGGIO(jjj) = becc; + ROLLIO(jjj) = roll; + IMBARDATA(jjj) = imba; + qf(jjj,:) = q; + qfy(jjj,:) = qy; + dq = q-qy; + if any(dq>0.000001) + text = (['Cicle Number ' num2str(jj) ' during Quaternion Calculation']); + text2 = (['Node Number ' num2str(jjj)]); + fprintf(fileID,fmt,text); + fprintf(fileID,fmt,text2); + end + end +% Le seguenti matrici sono organizzate come segue: +% - ciascuna riga è relativa a un nodo (1a riga = fondo catena); +% - ciascuna colonna è relativa a una data. + NordSud(:,c) = deltaNS; + EstOvest(:,c) = deltaEO; + Zlocal_HD(:,c) = deltaZ; + c = c+1; +end + +text = 'Quaternion calculation executed'; +fprintf(fileID,fmt,text); + +% dNS e dEO raccolgono i dati del singolo nodo nella singola data +dNS = diff(NordSud,1,2); +dEO = diff(EstOvest,1,2); +dZ = diff(Zlocal_HD,1,2); + +%% Controllo delle risultanti di accelerazione e campo magnetico +clear r +clear rr +clear c +clear cc +ACCdefRisHD = ACCdefRisHD'; % Nodi in riga, date in colonna +[r,c] = size(ACCdefRisHD); +[rr,cc] = size(NordSud); + +% controllo che le matrici con le risultanti delle accelerazioni e +% le matrici con i dati di spostamento abbiano le stesse dimensioni +if r~=rr + text = '---Warning! Number of row of displacement data do not correspond to the number of acceleration cosine vector!---'; + fprintf(fileID,fmt,text); +end +if c~=cc + text = '---Warning! Number of column of displacement data do not correspond to the number of acceleration cosine vector!---'; + fprintf(fileID,fmt,text); +end +clear i +clear j +cont = 1; % contatore +cont2 = 1; % contatore +cont3 = 1; % contatore +tempHD = tempHD'; +textA = 'There are not correction of Tilt Link HD based on acceleration vectors filter'; +textA2 = 'There are not correction of Tilt Link HD based on uncalibrated acceleration vectors'; +textT = 'There are not correction of Tilt Link HD based on temperature filter'; +for j = 2:c % Data + for i = 1:r % Nodo + % se il valore assoluto della differenza è maggiore della + % tolleranza, pongo gli spostamenti giornalieri pari a 0 + if abs(ACCdefRisHD(i,j)-ACCdefRisHD(i,j-1)) > tolleranzaAcc + dNS(i,j-1) = 0; + dEO(i,j-1) = 0; + dZ(i,j-1) = 0; + textA = ['' num2str(cont) ' correction executed for Tilt Link HD - Acceleration vector filter!']; + cont = cont+1; + end + if ACCdefRisHD(i,j) < 0.9 || ACCdefRisHD(i,j) > 1.1 % Il nodo è fuori taratura! + dNS(i,j-1) = 0; + dEO(i,j-1) = 0; + dZ(i,j-1) = 0; + tempHD(i,j) = tempHD(i,j-1); + textA2 = ['' num2str(cont) ' correction executed for Tilt Link HD - uncalibrated Acceleration vector!']; + cont3 = cont3+1; + end + end +end + +FileTemperature = ['' IDcentralina '-' DTcatena '-HD-Therm.csv']; +if isfile(FileTemperature) == 1 + DatiRaw = csvread(FileTemperature); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; +else + rDR = 1; + cDR = 1; +end +for b = 1:c % Data + for a = 1:r % Nodo + % NON considero i dati al di sopra dei 80 °C o al di sotto dei -30 °C! + if tempHD(a,b) > Tmax || tempHD(a,b) < Tmin + cont2 = cont2+1; + if b == 1 + if isfile(FileTemperature) == 1 + RawDate = find(DatiRaw(:,1)<=datenum(datainiHD)); + if isempty(RawDate) == 1 + cc = 2; + while cc <= c + if tempHD(a,cc) > Tmax || tempHD(a,cc) < Tmin + cc = cc+1; + else + break + end + end + tempHD(a,b) = tempHD(a,cc); + else + if isnan(DatiRaw(RawDate(end),a+1)) == 0 + tempHD(a,b) = DatiRaw(RawDate(end),a+1); + ErrTiltLinkHD(b,a) = 0.5; + wardat = 'Temperature data of Tilt Link HD nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + else + cc = 2; + while cc <= c + if tempHD(a,cc) > Tmax || tempHD(a,cc) < Tmin + cc = cc+1; + else + break + end + end + tempHD(a,b) = tempHD(a,cc); + end + end + else + cc = 2; + while cc <= c + if tempHD(a,cc) > Tmax || tempHD(a,cc) < Tmin + cc = cc+1; + else + break + end + end + tempHD(a,b) = tempHD(a,cc); + end + else + tempHD(a,b) = tempHD(a,b-1); + dNS(a,b-1) = 0; + dEO(a,b-1) = 0; + dZ(a,b-1) = 0; + ErrTiltLinkHD(b,a) = 0.5; + end + textT = ['' num2str(cont2) ' correction executed for Tilt Link HD - Temperature filter!']; + end + end +end + +if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=ARRAYdateHD(1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(ARRAYdateHD(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(ARRAYdateHD(:,1)>DatiRaw(RawDate1(end)+1,1)); + end +else + RawDate1 = []; + RawDate2 = 1; +end +if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:); ARRAYdateHD(RawDate2(1):end) tempHD(:,RawDate2(1):end)']; +elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = [ARRAYdateHD tempHD']; +else + Dati = DatiRaw; +end +% Elimino appoggio più vecchio di un mese +RawDate3 = find(Dati(:,1) Ndatidespike + NdatiF = NdatiMedia; + else + NdatiF = Ndatidespike; + end + ini = round(NdatiF/2)+1; + if rem(NdatiF,2) == 0 + ini = ini+1; + end + clear NDatiF + iniST = round(Wdevst/2); + if rem(Wdevst,2) == 0 + iniST = iniST+1; + end + iniST = iniST + margine; + if iniST > ini + ini = iniST; + end + if ini < 6 + ini = 6; + end + dNS = dNS(:,ini:end); + dEO = dEO(:,ini:end); + dZ = dZ(:,ini:end); + tempHD = tempHD(ini:end,:); + DatiElabTiltLinkHD = DatiElabTiltLinkHD(ini:end,:); + ARRAYdateHD = ARRAYdateHD(ini:end,1); + ErrTiltLinkHD = ErrTiltLinkHD(ini:end,:); +end + +%% Finalizzo i calcoli +[rNS,cNS] = size(dNS); +sommaX = zeros(rHD,1); +Xlocal_HD = zeros(rNS,cNS+1); % locale nello spazio, cumulato nel tempo +AlfaX_HD = zeros(rNS,cNS+1); % Angoli +sommaY = zeros(rHD,1); +Ylocal_HD = zeros(rNS,cNS+1); +AlfaY_HD = zeros(rNS,cNS+1); % Angoli +sommaZ = zeros(rNS,cNS); +Zlocal_HD = zeros(rNS,cNS+1); +X_HD = zeros(rNS,cNS+1); % cumulato nel tempo e nello spazio +Y_HD = zeros(rNS,cNS+1); +Z_HD = zeros(rNS,cNS+1); +HShift_HD = zeros(rNS,cNS+1); % massima pendenza cumulato nel tempo e nello spazio +HShift_local_HD = zeros(rNS,cNS+1); % massima pendenza locale +Azimuth_HD = zeros(rNS,cNS+1); % azimut +azim = zeros(rNS,cNS+1); % matrice di appoggio per il calcolo dell'azimuth +Speed_HD = zeros(rHD,cNS+1); % Velocità 2D Cumulata +Speed_local_HD = zeros(rHD,cNS+1); % Velocità 2D locale +Acceleration_HD = zeros(rHD,cNS+1); % Accelerazione 2D Cumulata +Acceleration_local_HD = zeros(rHD,cNS+1); % Accelerazione 2D Locale + +% Recupero i dati già elaborati +if NuovoZeroHD == 1 + [rE,cE] = size(DatiElabTiltLinkHD); + cont = 3; + n = 1; + while cont<=cE + sommaX(n,1) = cell2mat(DatiElabTiltLinkHD(1,cont))'; + Xlocal_HD(n,1) = sommaX(n,1); + X_HD(n,1) = cell2mat(DatiElabTiltLinkHD(1,cont+3))'; + sommaY(n,1) = cell2mat(DatiElabTiltLinkHD(1,cont+1))'; + Ylocal_HD(n,1) = sommaY(n,1); + Y_HD(n,1) = cell2mat(DatiElabTiltLinkHD(1,cont+4))'; + for j = 1:rHD + AlfaX_HD(j,1) = asind(Xlocal_HD(j,1)/SpeHD(j)); + AlfaY_HD(j,1) = asind(Ylocal_HD(j,1)/SpeHD(j)); + end + Zlocal_HD(n,1) = cell2mat(DatiElabTiltLinkHD(1,cont+2))'; + Z_HD(n,1) = cell2mat(DatiElabTiltLinkHD(1,cont+5))'; + HShift_HD(n,1) = cell2mat(DatiElabTiltLinkHD(1,cont+6))'; + HShift_local_HD(n,1) = cell2mat(DatiElabTiltLinkHD(1,cont+7))'; + Azimuth_HD(n,1) = cell2mat(DatiElabTiltLinkHD(1,cont+8))'; + Speed_HD(n,1:rE) = cell2mat(DatiElabTiltLinkHD(:,cont+10))'; + Speed_local_HD(n,1:rE) = cell2mat(DatiElabTiltLinkHD(:,cont+11))'; + Acceleration_HD(n,1:rE) = cell2mat(DatiElabTiltLinkHD(:,cont+12))'; + Acceleration_local_HD(n,1:rE) = cell2mat(DatiElabTiltLinkHD(:,cont+13))'; + cont=cont+16; + n = n+1; + end +else + Zlocal_HD(:,1) = SpeHD; + Z_HD(:,1) = PsHD(2:end); +end + +% elaboro i dati nuovi +for iii = 1:cNS + Xlocal_HD(:,iii+1) = sum(dNS(:,1:iii),2)+sommaX(:,1); + Ylocal_HD(:,iii+1) = sum(dEO(:,1:iii),2)+sommaY(:,1); + for j = 1:rHD + AlfaX_HD(j,iii+1) = asind(Xlocal_HD(j,iii+1)/SpeHD(j)); + AlfaY_HD(j,iii+1) = asind(Ylocal_HD(j,iii+1)/SpeHD(j)); + end + sommaZ(:,iii+1) = sum(dZ(:,1:iii),2); + X_HD(:,iii+1) = cumsum(Xlocal_HD(:,iii+1)); + Y_HD(:,iii+1) = cumsum(Ylocal_HD(:,iii+1)); + Z_HD(:,iii+1) = cumsum(sommaZ(:,iii+1))+ Z_HD(:,1); + HShift_HD(:,iii+1) = (X_HD(:,iii+1).^2+Y_HD(:,iii+1).^2).^0.5; + HShift_local_HD(:,iii+1) = (Xlocal_HD(:,iii+1).^2+Ylocal_HD(:,iii+1).^2).^0.5; + Zlocal_HD(:,iii+1) = sommaZ(:,iii+1) + SpeHD; % Zeta è il singolo abbassamento di quel nodo + for rr = 1:rHD + azim(rr,iii) = (acos(abs(X_HD(rr,iii))/HShift_HD(rr,iii)))*180/3.141592654; % Angolo Teta in gradi 0° - 90° + segnoNS = sign(X_HD(rr,iii)); + segnoEO = sign(Y_HD(rr,iii)); + % L'azimuth si calcola con NS = 0, positivo in senso orario + % (90° = Est) + if segnoNS == 1 && segnoEO == 1 % quadrante 1 + Azimuth_HD(rr,iii+1) = azim(rr,iii); % Teta lo tengo come è (1 quadrante) + elseif segnoNS == -1 && segnoEO == 1 % quadrante 2 + Azimuth_HD(rr,iii+1) = 180 - azim(rr,iii); % 180-teta + elseif segnoNS == -1 && segnoEO == -1 % quadrante 3 + Azimuth_HD(rr,iii+1) = 180 + azim(rr,iii); % 180+teta + elseif segnoNS == 1 && segnoEO == -1 % quadrante 4 + Azimuth_HD(rr,iii+1) = 360 - azim(rr,iii); % 360-teta + elseif segnoNS == 0 && segnoEO == -1 % 270° + Azimuth_HD(rr,iii+1) = 270; + elseif segnoNS == -1 && segnoEO == 0 % 180° + Azimuth_HD(rr,iii+1) = 180; + end + end +end +Azimuth_HD = real(Azimuth_HD); + +%% Calcolo velocità di spostamento giornaliera +[numDate,~] = size(ARRAYdateHD); % numero di date +d = 1; +p = 1; +diffDate = 0; +n = 1; +period = 1; % calcolo giornaliero +ContSUP = []; +for dd = 1:numDate + while diffDate < period + d = d+1; + if d > numDate % Se d supera le date disponibili, esco dal ciclo while + break + end + diffDate = ARRAYdateHD(d) - ARRAYdateHD(p); + end + if d >numDate + break + end + ContSUP(n,1) = d; %#ok<*AGROW> % Creo matrice indici dell'estremo superiore della differenza + ContINF(n,1) = p; % Creo matrice indici dell'estremo inferiore della differenza + p = p+1; % passo alla data di partenza successiva + d = p; % resetto il conto di d + n = n+1; + diffDate = 0; +end + +check = isempty(ContSUP); +if check == 0 + [nDate,~] = size(ContSUP); + for s = 1:rHD + N = 1; + for dd = 1:nDate + Speed_HD(s,ContSUP(N,1)) = (HShift_HD(s,ContSUP(N,1))-HShift_HD(s,ContINF(N,1)))/(ARRAYdateHD(ContSUP(N,1))-ARRAYdateHD(ContINF(N,1))); + Speed_local_HD(s,ContSUP(N,1)) = (HShift_local_HD(s,ContSUP(N,1))-HShift_local_HD(s,ContINF(N,1)))/(ARRAYdateHD(ContSUP(N,1))-ARRAYdateHD(ContINF(N,1))); + Acceleration_HD(s,ContSUP(N,1)) = (Speed_HD(s,ContSUP(N,1))-Speed_HD(s,ContINF(N,1)))/(ARRAYdateHD(ContSUP(N,1))-ARRAYdateHD(ContINF(N,1))); + Acceleration_local_HD(s,ContSUP(N,1)) = (Speed_local_HD(s,ContSUP(N,1))-Speed_local_HD(s,ContINF(N,1)))/(ARRAYdateHD(ContSUP(N,1))-ARRAYdateHD(ContINF(N,1))); + N = N+1; + end + end +end + +% Approssimo i dati con il corretto numero di cifre decimali +[X_HD,Y_HD,Z_HD,Xlocal_HD,Ylocal_HD,Zlocal_HD,HShift_HD,HShift_local_HD,Azimuth_HD,Speed_HD,... + Speed_local_HD,Acceleration_HD,Acceleration_local_HD,tempHD] = approx_HD(X_HD,Y_HD,Z_HD,... + Xlocal_HD,Ylocal_HD,Zlocal_HD,HShift_HD,HShift_local_HD,Azimuth_HD,Speed_HD,Speed_local_HD,... + Acceleration_HD,Acceleration_local_HD,tempHD,FileName); + +% Riordino matrice errori +[r,~] = size(ErrTiltLinkHD); +Matrice_err = zeros(r,rHD); +for i = 1:r % date + d = 1; + for n = 1:rHD % nodi + j = 1; + err = ErrTiltLinkHD(i,d:d+6); + while j <= 7 + if err(1,j) == 1 + Matrice_err(i,n) = 1; + break + end + if err(1,j) == 0.5 + Matrice_err(i,n) = 0.5; + end + j = j+1; + end + d = d+7; + end +end +ErrTiltLinkHD = Matrice_err'; + +text = 'Tilt Link HD triaxial calculation executed correctly. triax_HD function ended'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/triax_HDVR.m b/Tilt/triax_HDVR.m new file mode 100755 index 0000000..8962cf0 --- /dev/null +++ b/Tilt/triax_HDVR.m @@ -0,0 +1,525 @@ +%% Funzione che calcola gli spostamenti in modalità triassiale per i Tilt Link +function [X_HDVR,Y_HDVR,Z_HDVR,Xlocal_HDVR,Ylocal_HDVR,Zlocal_HDVR,HShift_HDVR,HShift_local_HDVR,... + AlfaX_HDVR,AlfaY_HDVR,Azimuth_HDVR,Speed_local_HDVR,Speed_HDVR,Acceleration_local_HDVR,... + Acceleration_HDVR,tempHDVR,ARRAYdateHDVR,ErrTiltLinkHDVR] = triax_HDVR(rHDVR,... + ACCdef_HDVR,ACCdefRisHDVR,MAGdef_HDVR,tempHDVR,SpeHDVR,PsHDVR,NodoTiltLinkHDVR,tolleranzaAcc,... + tolleranzaMag,DatiElabTiltLinkHDVR,Ndevst,Wdevst,ARRAYdateHDVR,Tmax,Tmin,NuovoZeroHDVR,... + NdatiMedia,Ndatidespike,ErrTiltLinkHDVR,margine,datainiHDVR,MEMS,IDcentralina,DTcatena,FileName) + +%% Inizializzazione +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'triax_HDVR function started'; +fprintf(fileID,fmt,text); + +if NuovoZeroHDVR == 1 + if NdatiMedia > Ndatidespike + Ndati = NdatiMedia; + else + Ndati = Ndatidespike; + end + ini = round(Ndati/2)+1; + if rem(Ndati,2) == 0 + ini = ini+1; + end + clear NDati + ini = ini + margine; + if ini < 6 + ini = 6; + end + [letture,~]=size(DatiElabTiltLinkHDVR); + if ini > letture + ini = letture-1; + end + if Ndevst ~= 0 % Allora prendo tutti i dati e solo in seguito considero i nuovi, a valle della funzione filtro + ini = 1; + end + ACCdefRisHDVR = ACCdefRisHDVR(ini:end,:); + tempHDVR = tempHDVR(ini:end,:); + DatiElabTiltLinkHDVR = DatiElabTiltLinkHDVR(ini:end,:); + ARRAYdateHDVR = ARRAYdateHDVR(ini:end,1); + ErrTiltLinkHDVR = ErrTiltLinkHDVR(ini:end,:); +end + +%% Controllo e correzione dei campi magnetici +[rA,cA] = size(ACCdef_HDVR); % righe -> date, colonna -> nodi +conf_acc = zeros(rA,cA); +contM = 0; % contatore correzioni campi magnetici +contT = rA*cA; + +% Se le accelerazioni variano meno della confidenza, NON cambio i valori di +% cambio magnetico e prendo quelli della lettura precedente +for d = 2:rA + % seconda lettura e successive, confronto i risultati dei magnetometri + % e degli accelerometri + conf_acc(d,:) = abs(ACCdef_HDVR(d,:) - ACCdef_HDVR(d-1,:)); + for dd = 1:cA + if abs(conf_acc(d,dd)) < tolleranzaMag % SOGLIA ACCELERAZIONE + MAGdef_HDVR(d,dd) = MAGdef_HDVR(d-1,dd); + contM = contM+1; + end + end +end + +text = ['' num2str(contM) ' corrections of magnetometers executed on a total amount of ' num2str(contT)... + ' data, which represent the ' num2str(contM*100/contT) '% for Tilt Link HD VR']; +fprintf(fileID,fmt,text); + +if NuovoZeroHDVR == 1 + ACCdef_HDVR = ACCdef_HDVR(ini:end,:); + MAGdef_TL2 = MAGdef_HDVR(ini:end,:); +else + MAGdef_TL2 = MAGdef_HDVR; +end + +%% Definisco i dati +Nnodi = rHDVR; +[r,~] = size(ACCdef_HDVR); % Numero di dati +[Ndati,~] = size(ARRAYdateHDVR); +ax = zeros(r,Nnodi); +ay = zeros(r,Nnodi); +az = zeros(r,Nnodi); +mx = zeros(r,Nnodi); +my = zeros(r,Nnodi); +mz = zeros(r,Nnodi); +for i=1:Nnodi + ax(:,i) = ACCdef_HDVR(:,(i-1)*3+1); % ax + ay(:,i) = ACCdef_HDVR(:,(i-1)*3+2:(i-1)*3+2); % ay + az(:,i) = ACCdef_HDVR(:,(i-1)*3+3:(i-1)*3+3); % az + mx(:,i) = MAGdef_TL2(:,(i-1)*3+1); % mx + my(:,i) = MAGdef_TL2(:,(i-1)*3+2:(i-1)*3+2); % my + mz(:,i) = MAGdef_TL2(:,(i-1)*3+3:(i-1)*3+3); % mz +end + +%% Costruzione delle matrici spostamento e rotazione +NordSud = zeros(Nnodi,Ndati); % in riga i nodi, in colonna le date +EstOvest = zeros(Nnodi,Ndati); % in riga i nodi, in colonna le date +Zlocal_HDVR = zeros(Nnodi,Ndati); + +% parametri per il calcolo +SpeHDVR = SpeHDVR(2:end,1); % salto il segmento di pertinenza dell'ancora +c = 1; + +% Inizio del ciclo di elaborazione +text = 'Triaxial Elaboration of Tilt Link HD VR started'; +fprintf(fileID,fmt,text); + +% Inizializzo le matrici +deltaNS = zeros(rHDVR,1); +deltaEO = zeros(rHDVR,1); +deltaZ = zeros(rHDVR,1); +BECCHEGGIO = zeros(rHDVR,1); +ROLLIO = zeros(rHDVR,1); +IMBARDATA = zeros(rHDVR,1); +qf = zeros(rHDVR,4); +qfy = zeros(rHDVR,4); +for jj = 1:Ndati + for jjj=1:rHDVR + axb = ax(jj,jjj)'; + ayb = ay(jj,jjj)'; + azb = az(jj,jjj)'; + mxb = mx(jj,jjj)'; + myb = my(jj,jjj)'; + mzb = mz(jj,jjj)'; + SP = SpeHDVR(jjj); + [DNS,DEO,Dz,becc,roll,imba,q,qy] = QuaternioniASE(axb,ayb,azb,mxb,myb,mzb,SP,MEMS,FileName); + deltaNS(jjj) = DNS; + deltaEO(jjj) = DEO; + deltaZ(jjj) = Dz; + BECCHEGGIO(jjj) = becc; + ROLLIO(jjj) = roll; + IMBARDATA(jjj) = imba; + qf(jjj,:) = q; + qfy(jjj,:) = qy; + dq = q-qy; + if any(dq>0.000001) + text = (['Cicle Number ' num2str(jj) ' during Quaternion Calculation']); + text2 = (['Node Number ' num2str(jjj)]); + fprintf(fileID,fmt,text); + fprintf(fileID,fmt,text2); + end + end +% Le seguenti matrici sono organizzate come segue: +% - ciascuna riga è relativa a un nodo (1a riga = fondo catena); +% - ciascuna colonna è relativa a una data. + NordSud(:,c) = deltaNS; + EstOvest(:,c) = deltaEO; + Zlocal_HDVR(:,c) = deltaZ; + c = c+1; +end + +text = 'Quaternion calculation executed'; +fprintf(fileID,fmt,text); + +% dNS e dEO raccolgono i dati del singolo nodo nella singola data +dNS = diff(NordSud,1,2); +dEO = diff(EstOvest,1,2); +dZ = diff(Zlocal_HDVR,1,2); + +%% Controllo delle risultanti di accelerazione e campo magnetico +clear r +clear rr +clear c +clear cc +ACCdefRisHDVR = ACCdefRisHDVR'; % Nodi in riga, date in colonna +[r,c] = size(ACCdefRisHDVR); +[rr,cc] = size(NordSud); + +% controllo che le matrici con le risultanti delle accelerazioni e +% le matrici con i dati di spostamento abbiano le stesse dimensioni +if r~=rr + text = '---Warning! Number of row of displacement data do not correspond to the number of acceleration cosine vector!---'; + fprintf(fileID,fmt,text); +end +if c~=cc + text = '---Warning! Number of column of displacement data do not correspond to the number of acceleration cosine vector!---'; + fprintf(fileID,fmt,text); +end +clear i +clear j +cont = 1; % contatore +cont2 = 1; % contatore +cont3 = 1; % contatore +tempHDVR = tempHDVR'; +textA = 'There are not correction of Tilt Link HD VR based on acceleration vectors filter'; +textA2 = 'There are not correction of Tilt Link HD VR based on uncalibrated acceleration vectors'; +textT = 'There are not correction of Tilt Link HD VR based on temperature filter'; +for j = 2:c % Data + for i = 1:r % Nodo + % se il valore assoluto della differenza è maggiore della + % tolleranza, pongo gli spostamenti giornalieri pari a 0 + if abs(ACCdefRisHDVR(i,j)-ACCdefRisHDVR(i,j-1)) > tolleranzaAcc + dNS(i,j-1) = 0; + dEO(i,j-1) = 0; + dZ(i,j-1) = 0; + textA = ['' num2str(cont) ' correction executed for Tilt Link HD VR - Acceleration vector filter!']; + cont = cont+1; + end + if ACCdefRisHDVR(i,j) < 0.9 || ACCdefRisHDVR(i,j) > 1.1 % Il nodo è fuori taratura! + dNS(i,j-1) = 0; + dEO(i,j-1) = 0; + dZ(i,j-1) = 0; + tempHDVR(i,j) = tempHDVR(i,j-1); + textA2 = ['' num2str(cont) ' correction executed for Tilt Link HD VR - uncalibrated Acceleration vector!']; + cont3 = cont3+1; + end + end +end + +FileTemperature = ['' IDcentralina '-' DTcatena '-HDVR-Therm.csv']; +if isfile(FileTemperature) == 1 + DatiRaw = csvread(FileTemperature); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; +else + rDR = 1; + cDR = 1; +end +for b = 1:c % Data + for a = 1:r % Nodo + % NON considero i dati al di sopra dei 80 °C o al di sotto dei -30 °C! + if tempHDVR(a,b) > Tmax || tempHDVR(a,b) < Tmin + cont2 = cont2+1; + if b == 1 + if isfile(FileTemperature) == 1 + RawDate = find(DatiRaw(:,1)<=datenum(datainiHDVR)); + if isempty(RawDate) == 1 + cc = 2; + while cc <= c + if tempHDVR(a,cc) > Tmax || tempHDVR(a,cc) < Tmin + cc = cc+1; + else + break + end + end + tempHDVR(a,b) = tempHDVR(a,cc); + else + if isnan(DatiRaw(RawDate(end),a+1)) == 0 + tempHDVR(a,b) = DatiRaw(RawDate(end),a+1); + ErrTiltLinkHDVR(b,a) = 0.5; + wardat = 'Temperature data of Tilt Link HD VR nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + else + cc = 2; + while cc <= c + if tempHDVR(a,cc) > Tmax || tempHDVR(a,cc) < Tmin + cc = cc+1; + else + break + end + end + tempHDVR(a,b) = tempHDVR(a,cc); + end + end + else + cc = 2; + while cc <= c + if tempHDVR(a,cc) > Tmax || tempHDVR(a,cc) < Tmin + cc = cc+1; + else + break + end + end + tempHDVR(a,b) = tempHDVR(a,cc); + end + else + tempHDVR(a,b) = tempHDVR(a,b-1); + dNS(a,b-1) = 0; + dEO(a,b-1) = 0; + dZ(a,b-1) = 0; + ErrTiltLinkHDVR(b,a) = 0.5; + end + textT = ['' num2str(cont2) ' correction executed for Tilt Link HD VR - Temperature filter!']; + end + end +end + +if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=ARRAYdateHDVR(1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(ARRAYdateHDVR(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(ARRAYdateHDVR(:,1)>DatiRaw(RawDate1(end)+1,1)); + end +else + RawDate1 = []; + RawDate2 = 1; +end +if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:); ARRAYdateHDVR(RawDate2(1):end) tempHDVR(:,RawDate2(1):end)']; +elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = [ARRAYdateHDVR tempHDVR']; +else + Dati = DatiRaw; +end +% Elimino appoggio più vecchio di un mese +RawDate3 = find(Dati(:,1) Ndatidespike + NdatiF = NdatiMedia; + else + NdatiF = Ndatidespike; + end + ini = round(NdatiF/2)+1; + if rem(NdatiF,2) == 0 + ini = ini+1; + end + clear NDatiF + iniST = round(Wdevst/2); + if rem(Wdevst,2) == 0 + iniST = iniST+1; + end + iniST = iniST + margine; + if iniST > ini + ini = iniST; + end + if ini < 6 + ini = 6; + end + dNS = dNS(:,ini:end); + dEO = dEO(:,ini:end); + dZ = dZ(:,ini:end); + tempHDVR = tempHDVR(ini:end,:); + DatiElabTiltLinkHDVR = DatiElabTiltLinkHDVR(ini:end,:); + ARRAYdateHDVR = ARRAYdateHDVR(ini:end,1); + ErrTiltLinkHDVR = ErrTiltLinkHDVR(ini:end,:); +end + +%% Finalizzo i calcoli +[rNS,cNS] = size(dNS); +sommaX = zeros(rHDVR,1); +Xlocal_HDVR = zeros(rNS,cNS+1); % locale nello spazio, cumulato nel tempo +AlfaX_HDVR = zeros(rNS,cNS+1); % Angoli +sommaY = zeros(rHDVR,1); +Ylocal_HDVR = zeros(rNS,cNS+1); +AlfaY_HDVR = zeros(rNS,cNS+1); % Angoli +sommaZ = zeros(rNS,cNS); +Zlocal_HDVR = zeros(rNS,cNS+1); +X_HDVR = zeros(rNS,cNS+1); % cumulato nel tempo e nello spazio +Y_HDVR = zeros(rNS,cNS+1); +Z_HDVR = zeros(rNS,cNS+1); +HShift_HDVR = zeros(rNS,cNS+1); % massima pendenza cumulato nel tempo e nello spazio +HShift_local_HDVR = zeros(rNS,cNS+1); % massima pendenza locale +Azimuth_HDVR = zeros(rNS,cNS+1); % azimut +azim = zeros(rNS,cNS+1); % matrice di appoggio per il calcolo dell'azimuth +Speed_HDVR = zeros(rHDVR,cNS+1); % Velocità 2D Cumulata +Speed_local_HDVR = zeros(rHDVR,cNS+1); % Velocità 2D locale +Acceleration_HDVR = zeros(rHDVR,cNS+1); % Accelerazione 2D Cumulata +Acceleration_local_HDVR = zeros(rHDVR,cNS+1); % Accelerazione 2D Locale + +% Recupero i dati già elaborati +if NuovoZeroHDVR == 1 + [rE,cE] = size(DatiElabTiltLinkHDVR); + cont = 3; + n = 1; + while cont<=cE + sommaX(n,1) = cell2mat(DatiElabTiltLinkHDVR(1,cont))'; + Xlocal_HDVR(n,1) = sommaX(n,1); + X_HDVR(n,1) = cell2mat(DatiElabTiltLinkHDVR(1,cont+3))'; + sommaY(n,1) = cell2mat(DatiElabTiltLinkHDVR(1,cont+1))'; + Ylocal_HDVR(n,1) = sommaY(n,1); + Y_HDVR(n,1) = cell2mat(DatiElabTiltLinkHDVR(1,cont+4))'; + for j = 1:rHDVR + AlfaX_HDVR(j,1) = asind(Xlocal_HDVR(j,1)/SpeHDVR(j)); + AlfaY_HDVR(j,1) = asind(Ylocal_HDVR(j,1)/SpeHDVR(j)); + end + Zlocal_HDVR(n,1) = cell2mat(DatiElabTiltLinkHDVR(1,cont+2))'; + Z_HDVR(n,1) = cell2mat(DatiElabTiltLinkHDVR(1,cont+5))'; + HShift_HDVR(n,1) = cell2mat(DatiElabTiltLinkHDVR(1,cont+6))'; + HShift_local_HDVR(n,1) = cell2mat(DatiElabTiltLinkHDVR(1,cont+7))'; + Azimuth_HDVR(n,1) = cell2mat(DatiElabTiltLinkHDVR(1,cont+8))'; + Speed_HDVR(n,1:rE) = cell2mat(DatiElabTiltLinkHDVR(:,cont+10))'; + Speed_local_HDVR(n,1:rE) = cell2mat(DatiElabTiltLinkHDVR(:,cont+11))'; + Acceleration_HDVR(n,1:rE) = cell2mat(DatiElabTiltLinkHDVR(:,cont+12))'; + Acceleration_local_HDVR(n,1:rE) = cell2mat(DatiElabTiltLinkHDVR(:,cont+13))'; + cont=cont+16; + n = n+1; + end +else + Zlocal_HDVR(:,1) = SpeHDVR; + Z_HDVR(:,1) = PsHDVR(2:end); +end + +% elaboro i dati nuovi +for iii = 1:cNS + Xlocal_HDVR(:,iii+1) = sum(dNS(:,1:iii),2)+sommaX(:,1); + Ylocal_HDVR(:,iii+1) = sum(dEO(:,1:iii),2)+sommaY(:,1); + for j = 1:rHDVR + AlfaX_HDVR(j,iii+1) = asind(Xlocal_HDVR(j,iii+1)/SpeHDVR(j)); + AlfaY_HDVR(j,iii+1) = asind(Ylocal_HDVR(j,iii+1)/SpeHDVR(j)); + end + sommaZ(:,iii+1) = sum(dZ(:,1:iii),2); + X_HDVR(:,iii+1) = cumsum(Xlocal_HDVR(:,iii+1)); + Y_HDVR(:,iii+1) = cumsum(Ylocal_HDVR(:,iii+1)); + Z_HDVR(:,iii+1) = cumsum(sommaZ(:,iii+1))+ Z_HDVR(:,1); + HShift_HDVR(:,iii+1) = (X_HDVR(:,iii+1).^2+Y_HDVR(:,iii+1).^2).^0.5; + HShift_local_HDVR(:,iii+1) = (Xlocal_HDVR(:,iii+1).^2+Ylocal_HDVR(:,iii+1).^2).^0.5; + Zlocal_HDVR(:,iii+1) = sommaZ(:,iii+1) + SpeHDVR; % Zeta è il singolo abbassamento di quel nodo + for rr = 1:rHDVR + azim(rr,iii) = (acos(abs(X_HDVR(rr,iii))/HShift_HDVR(rr,iii)))*180/3.141592654; % Angolo Teta in gradi 0° - 90° + segnoNS = sign(X_HDVR(rr,iii)); + segnoEO = sign(Y_HDVR(rr,iii)); + % L'azimuth si calcola con NS = 0, positivo in senso orario + % (90° = Est) + if segnoNS == 1 && segnoEO == 1 % quadrante 1 + Azimuth_HDVR(rr,iii+1) = azim(rr,iii); % Teta lo tengo come è (1 quadrante) + elseif segnoNS == -1 && segnoEO == 1 % quadrante 2 + Azimuth_HDVR(rr,iii+1) = 180 - azim(rr,iii); % 180-teta + elseif segnoNS == -1 && segnoEO == -1 % quadrante 3 + Azimuth_HDVR(rr,iii+1) = 180 + azim(rr,iii); % 180+teta + elseif segnoNS == 1 && segnoEO == -1 % quadrante 4 + Azimuth_HDVR(rr,iii+1) = 360 - azim(rr,iii); % 360-teta + elseif segnoNS == 0 && segnoEO == -1 % 270° + Azimuth_HDVR(rr,iii+1) = 270; + elseif segnoNS == -1 && segnoEO == 0 % 180° + Azimuth_HDVR(rr,iii+1) = 180; + end + end +end +Azimuth_HDVR = real(Azimuth_HDVR); + +%% Calcolo velocità di spostamento giornaliera +[numDate,~] = size(ARRAYdateHDVR); % numero di date +d = 1; +p = 1; +diffDate = 0; +n = 1; +period = 1; % calcolo giornaliero +ContSUP = []; +for dd = 1:numDate + while diffDate < period + d = d+1; + if d > numDate % Se d supera le date disponibili, esco dal ciclo while + break + end + diffDate = ARRAYdateHDVR(d) - ARRAYdateHDVR(p); + end + if d >numDate + break + end + ContSUP(n,1) = d; %#ok<*AGROW> % Creo matrice indici dell'estremo superiore della differenza + ContINF(n,1) = p; % Creo matrice indici dell'estremo inferiore della differenza + p = p+1; % passo alla data di partenza successiva + d = p; % resetto il conto di d + n = n+1; + diffDate = 0; +end + +check = isempty(ContSUP); +if check == 0 + [nDate,~] = size(ContSUP); + for s = 1:rHDVR + N = 1; + for dd = 1:nDate + Speed_HDVR(s,ContSUP(N,1)) = (HShift_HDVR(s,ContSUP(N,1))-HShift_HDVR(s,ContINF(N,1)))/(ARRAYdateHDVR(ContSUP(N,1))-ARRAYdateHDVR(ContINF(N,1))); + Speed_local_HDVR(s,ContSUP(N,1)) = (HShift_local_HDVR(s,ContSUP(N,1))-HShift_local_HDVR(s,ContINF(N,1)))/(ARRAYdateHDVR(ContSUP(N,1))-ARRAYdateHDVR(ContINF(N,1))); + Acceleration_HDVR(s,ContSUP(N,1)) = (Speed_HDVR(s,ContSUP(N,1))-Speed_HDVR(s,ContINF(N,1)))/(ARRAYdateHDVR(ContSUP(N,1))-ARRAYdateHDVR(ContINF(N,1))); + Acceleration_local_HDVR(s,ContSUP(N,1)) = (Speed_local_HDVR(s,ContSUP(N,1))-Speed_local_HDVR(s,ContINF(N,1)))/(ARRAYdateHDVR(ContSUP(N,1))-ARRAYdateHDVR(ContINF(N,1))); + N = N+1; + end + end +end + +% Approssimo i dati con il corretto numero di cifre decimali +[X_HDVR,Y_HDVR,Z_HDVR,Xlocal_HDVR,Ylocal_HDVR,Zlocal_HDVR,HShift_HDVR,HShift_local_HDVR,Azimuth_HDVR,Speed_HDVR,... + Speed_local_HDVR,Acceleration_HDVR,Acceleration_local_HDVR,tempHDVR] = approx_HD(X_HDVR,Y_HDVR,Z_HDVR,... + Xlocal_HDVR,Ylocal_HDVR,Zlocal_HDVR,HShift_HDVR,HShift_local_HDVR,Azimuth_HDVR,Speed_HDVR,Speed_local_HDVR,... + Acceleration_HDVR,Acceleration_local_HDVR,tempHDVR,FileName); + +% Riordino matrice errori +[r,~] = size(ErrTiltLinkHDVR); +Matrice_err = zeros(r,rHDVR); +for i = 1:r % date + d = 1; + for n = 1:rHDVR % nodi + j = 1; + err = ErrTiltLinkHDVR(i,d:d+6); + while j <= 7 + if err(1,j) == 1 + Matrice_err(i,n) = 1; + break + end + if err(1,j) == 0.5 + Matrice_err(i,n) = 0.5; + end + j = j+1; + end + d = d+7; + end +end +ErrTiltLinkHDVR = Matrice_err'; + +text = 'Tilt Link HD VR triaxial calculation executed correctly. triax_HDVR function ended'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/triax_IPL.m b/Tilt/triax_IPL.m new file mode 100755 index 0000000..5e10726 --- /dev/null +++ b/Tilt/triax_IPL.m @@ -0,0 +1,548 @@ +%% Funzione che calcola gli spostamenti in modalità triassiale per i Tilt Link +function [X_IPL,Y_IPL,Z_IPL,Xlocal_IPL,Ylocal_IPL,Zlocal_IPL,HShift_IPL,... + HShift_local_IPL,AlfaX_IPL,AlfaY_IPL,Azimuth_IPL,Speed_local_IPL,... + Speed_IPL,Acceleration_local_IPL,Acceleration_IPL,TempDef_IPL,... + ARRAYdateIPL,ErrInPlaceLink,MAGdef_IPL] = triax_IPL(IDcentralina,... + DTcatena,rIPL,ACCdef_IPL,ACCdefRis_IPL,MAGdef_IPL,TempDef_IPL,SpeIPL,PsIPL,... + NodoInPlaceLink,tolleranzaAcc,tolleranzaMag,DatiElabInPlaceLink,... + segnoNS,segnoEO,MEMS,Ndevst,Wdevst,ARRAYdateIPL,NuovoZeroIPL,Tmax,Tmin,... + NdatiMedia,Ndatidespike,ErrInPlaceLink,Corr_Azimuth,margine,datainiIPL,FileName) + +%% Inizializzazione +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'triax_IPL function started'; +fprintf(fileID,fmt,text); + +if NuovoZeroIPL == 1 + if NdatiMedia > Ndatidespike + Ndati = NdatiMedia; + else + Ndati = Ndatidespike; + end + ini = round(Ndati/2)+1; + if rem(Ndati,2) == 0 + ini = ini+1; + end + clear NDati + ini = ini + margine; + if ini < 6 + ini = 6; + end + if Ndevst ~= 0 % Allora prendo tutti i dati e solo in seguito considero i nuovi, a valle della funzione filtro + ini = 1; + end + ACCdefRis_IPL = ACCdefRis_IPL(ini:end,:); + TempDef_IPL = TempDef_IPL(ini:end,:); + DatiElabInPlaceLink = DatiElabInPlaceLink(ini:end,:); + ARRAYdateIPL = ARRAYdateIPL(ini:end,1); + ErrInPlaceLink = ErrInPlaceLink(ini:end,:); +end + +%% Controllo e correzione dei campi magnetici +[rA,cA] = size(ACCdef_IPL); % righe -> date, colonna -> nodi +conf_acc = zeros(rA,cA); +contM = 0; % contatore correzioni campi magnetici +contT = rA*cA; + +% Se le accelerazioni variano meno della confidenza, NON cambio i valori di +% cambio magnetico e prendo quelli della lettura precedente +for d = 2:rA + % seconda lettura e successive, confronto i risultati dei magnetometri + % e degli accelerometri + conf_acc(d,:) = abs(ACCdef_IPL(d,:) - ACCdef_IPL(d-1,:)); + for dd = 1:cA + if abs(conf_acc(d,dd)) < tolleranzaMag % SOGLIA ACCELERAZIONE + MAGdef_IPL(d,dd) = MAGdef_IPL(d-1,dd); + contM = contM+1; + end + end +end + +text = ['' num2str(contM) ' corrections of magnetometers executed on a total amount of ' ... + num2str(contT) ' data, which represent the ' num2str(contM*100/contT) '% for In Place Link']; +fprintf(fileID,fmt,text); + +if NuovoZeroIPL == 1 + ACCdef_IPL = ACCdef_IPL(ini:end,:); + MAGdef_IPL2 = MAGdef_IPL(ini:end,:); +else + MAGdef_IPL2 = MAGdef_IPL; +end + +%% Definisco i dati +Nnodi = rIPL; +[r,~] = size(ACCdef_IPL); % Numero di dati +[Ndati,~] = size(ARRAYdateIPL); +ax = zeros(r,Nnodi); +ay = zeros(r,Nnodi); +az = zeros(r,Nnodi); +mx = zeros(r,Nnodi); +my = zeros(r,Nnodi); +mz = zeros(r,Nnodi); +for i=1:Nnodi + ax(:,i) = ACCdef_IPL(:,(i-1)*3+1); % ax + ay(:,i) = ACCdef_IPL(:,(i-1)*3+2); % ay + az(:,i) = ACCdef_IPL(:,(i-1)*3+3); % az + mx(:,i) = MAGdef_IPL2(:,(i-1)*3+1); % mx + my(:,i) = MAGdef_IPL2(:,(i-1)*3+2); % my + mz(:,i) = MAGdef_IPL2(:,(i-1)*3+3); % mz +end + +%% Costruzione delle matrici spostamento e rotazione +NordSud = zeros(Nnodi,Ndati); % in riga i nodi, in colonna le date +EstOvest = zeros(Nnodi,Ndati); % in riga i nodi, in colonna le date +Zlocal_IPL = zeros(Nnodi,Ndati); + +% parametri per il calcolo +SpeIPL = SpeIPL(2:end,1); % salto il segmento di pertinenza dell'ancora +c = 1; + +% Inizio del ciclo di elaborazione +text = 'Triaxial Elaboration of In Place Link started'; +fprintf(fileID,fmt,text); + +% Inizializzo le matrici +deltaNS = zeros(rIPL,1); +deltaEO = zeros(rIPL,1); +deltaZ = zeros(rIPL,1); +BECCHEGGIO = zeros(rIPL,1); +ROLLIO = zeros(rIPL,1); +IMBARDATA = zeros(rIPL,1); +qf = zeros(rIPL,4); +qfy = zeros(rIPL,4); +for jj = 1:Ndati + for jjj=1:rIPL + axb = ax(jj,jjj)'; + ayb = ay(jj,jjj)'; + azb = az(jj,jjj)'; + mxb = mx(jj,jjj)'; + myb = my(jj,jjj)'; + mzb = mz(jj,jjj)'; + SP = SpeIPL(jjj); + [DNS,DEO,Dz,becc,roll,imba,q,qy] = QuaternioniASE(axb,ayb,azb,mxb,myb,mzb,SP,MEMS,FileName); + deltaNS(jjj) = DNS; + deltaEO(jjj) = DEO; + deltaZ(jjj) = Dz; + BECCHEGGIO(jjj) = becc; + ROLLIO(jjj) = roll; + IMBARDATA(jjj) = imba; + qf(jjj,:) = q; + qfy(jjj,:) = qy; + dq = q-qy; + if any(dq>0.000001) + text = (['Cicle Number ' num2str(jj) ' during Quaternion Calculation']); + text2 = (['Node Number ' num2str(jjj)]); + fprintf(fileID,fmt,text); + fprintf(fileID,fmt,text2); + end + end +% Le seguenti matrici sono organizzate come segue: +% - ciascuna riga è relativa a un nodo (1a riga = fondo catena); +% - ciascuna colonna è relativa a una data. + NordSud(:,c) = deltaNS; + EstOvest(:,c) = deltaEO; + Zlocal_IPL(:,c) = deltaZ; + c = c+1; +end + +% dNS e dEO raccolgono i dati del singolo nodo nella singola data +dNS = diff(NordSud,1,2); +dEO = diff(EstOvest,1,2); +dZ = diff(Zlocal_IPL,1,2); + +%% Cambio di segno alle direzioni! +if segnoNS == 0 + dNS = -1*dNS; +end +if segnoEO == 0 + dEO = -1*dEO; +end + +%% Controllo delle risultanti di accelerazione e campo magnetico +clear r +clear rr +clear c +clear cc +ACCdefRis_IPL = ACCdefRis_IPL'; % Nodi in riga, date in colonna +[r,c] = size(ACCdefRis_IPL); +[rr,cc] = size(NordSud); + +% controllo che le matrici con le risultanti delle accelerazioni e +% le matrici con i dati di spostamento abbiano le stesse dimensioni +if r~=rr + text = '---Warning! Number of row of displacement data do not correspond to the number of acceleration cosine vector!---'; + fprintf(fileID,fmt,text); +end +if c~=cc + text = '---Warning! Number of column of displacement data do not correspond to the number of acceleration cosine vector!---'; + fprintf(fileID,fmt,text); +end +clear i +clear j +cont = 1; % contatore +cont2 = 1; % contatore +cont3 = 1; % contatore +TempDef_IPL = TempDef_IPL'; +textA = 'There are not correction of In Place Link based on acceleration vectors filter'; +textA2 = 'There are not correction of In Place Link based on uncalibrated acceleration vectors'; +textT = 'There are not correction of In Place Link based on temperature filter'; +for j = 2:c % Data + for i = 1:r % Nodo + % se il valore assoluto della differenza è maggiore della + % tolleranza, pongo gli spostamenti giornalieri pari a 0 + if abs(ACCdefRis_IPL(i,j)-ACCdefRis_IPL(i,j-1)) > tolleranzaAcc + dNS(i,j-1) = 0; + dEO(i,j-1) = 0; + dZ(i,j-1) = 0; + textA = ['' num2str(cont) ' correction executed for In Place Link - Acceleration vector filter!']; + cont = cont+1; + end + if strcmp(IDcentralina,'ID0115') == 1 + if ACCdefRis_IPL(i,j) < 0.9 || ACCdefRis_IPL(i,j) > 1.17 % Il nodo è fuori taratura! + dNS(i,j-1) = 0; + dEO(i,j-1) = 0; + dZ(i,j-1) = 0; + TempDef_IPL(i,j) = TempDef_IPL(i,j-1); + textA2 = ['' num2str(cont) ' correction executed for In Place Link - uncalibrated Acceleration vector!']; + cont3 = cont3+1; + end + else + if ACCdefRis_IPL(i,j) < 0.9 || ACCdefRis_IPL(i,j) > 1.12 % Il nodo è fuori taratura! + dNS(i,j-1) = 0; + dEO(i,j-1) = 0; + dZ(i,j-1) = 0; + TempDef_IPL(i,j) = TempDef_IPL(i,j-1); + textA2 = ['' num2str(cont) ' correction executed for In Place Link - uncalibrated Acceleration vector!']; + cont3 = cont3+1; + end + end + end +end + +FileTemperature = ['' IDcentralina '-' DTcatena '-IPL-Therm.csv']; +if isfile(FileTemperature) == 1 + DatiRaw = csvread(FileTemperature); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; +else + rDR = 1; + cDR = 1; +end +for b = 1:c % Data + for a = 1:r % Nodo + % NON considero i dati al di sopra dei 80 °C o al di sotto dei -30 °C! + if TempDef_IPL(a,b) > Tmax || TempDef_IPL(a,b) < Tmin + cont2 = cont2+1; + if b == 1 + if isfile(FileTemperature) == 1 + RawDate = find(DatiRaw(:,1)<=datenum(datainiIPL)); + if isempty(RawDate) == 1 + cc = 2; + while cc <= c + if TempDef_IPL(a,cc) > Tmax || TempDef_IPL(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_IPL(a,b) = TempDef_IPL(a,cc); + else + if isnan(DatiRaw(RawDate(end),a+1)) == 0 + TempDef_IPL(a,b) = DatiRaw(RawDate(end),a+1); + ErrInPlaceLink(b,a) = 0.5; + wardat = 'Temperature data of In Place Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + else + cc = 2; + while cc <= c + if TempDef_IPL(a,cc) > Tmax || TempDef_IPL(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_IPL(a,b) = TempDef_IPL(a,cc); + end + end + else + cc = 2; + while cc <= c + if TempDef_IPL(a,cc) > Tmax || TempDef_IPL(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_IPL(a,b) = TempDef_IPL(a,cc); + end + else + TempDef_IPL(a,b) = TempDef_IPL(a,b-1); + dNS(a,b-1) = 0; + dEO(a,b-1) = 0; + dZ(a,b-1) = 0; + ErrInPlaceLink(b,a) = 0.5; + end + textT = ['' num2str(cont2) ' correction executed for In Place Link - Temperature filter!']; + end + end +end + +if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=ARRAYdateIPL(1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(ARRAYdateIPL(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(ARRAYdateIPL(:,1)>DatiRaw(RawDate1(end)+1,1)); + end +else + RawDate1 = []; + RawDate2 = 1; +end +if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:); ARRAYdateIPL(RawDate2(1):end) TempDef_IPL(:,RawDate2(1):end)']; +elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = [ARRAYdateIPL TempDef_IPL']; +else + Dati = DatiRaw; +end +% Elimino appoggio più vecchio di un mese +RawDate3 = find(Dati(:,1) Ndatidespike + NdatiF = NdatiMedia; + else + NdatiF = Ndatidespike; + end + ini = round(NdatiF/2)+1; + if rem(NdatiF,2) == 0 + ini = ini+1; + end + clear NDatiF + iniST = round(Wdevst/2); + if rem(Wdevst,2) == 0 + iniST = iniST+1; + end + iniST = iniST + margine; + if iniST > ini + ini = iniST; + end + if ini < 6 + ini = 6; + end + dNS = dNS(:,ini:end); + dEO = dEO(:,ini:end); + dZ = dZ(:,ini:end); + TempDef_IPL = TempDef_IPL(ini:end,:); + DatiElabInPlaceLink = DatiElabInPlaceLink(ini:end,:); + ARRAYdateIPL = ARRAYdateIPL(ini:end,1); + ErrInPlaceLink = ErrInPlaceLink(ini:end,:); +end + +%% Finalizzo i calcoli +[rNS,cNS] = size(dNS); +sommaX = zeros(rIPL,1); +Xlocal_IPL = zeros(rNS,cNS+1); % locale nello spazio, cumulato nel tempo +AlfaX_IPL = zeros(rNS,cNS+1); % Angoli +sommaY = zeros(rIPL,1); +Ylocal_IPL = zeros(rNS,cNS+1); +AlfaY_IPL = zeros(rNS,cNS+1); % Angoli +sommaZ = zeros(rNS,cNS); +Zlocal_IPL = zeros(rNS,cNS+1); +X_IPL = zeros(rNS,cNS+1); % cumulato nel tempo e nello spazio +Y_IPL = zeros(rNS,cNS+1); +Z_IPL = zeros(rNS,cNS+1); +HShift_IPL = zeros(rNS,cNS+1); % massima pendenza cumulato nel tempo e nello spazio +HShift_local_IPL = zeros(rNS,cNS+1); % massima pendenza locale +Azimuth_IPL = zeros(rNS,cNS+1); % azimut +azim = zeros(rNS,cNS+1); % matrice di appoggio per il calcolo dell'azimuth +Speed_IPL = zeros(rIPL,cNS+1); % Velocità 2D Cumulata +Speed_local_IPL = zeros(rIPL,cNS+1); % Velocità 2D locale +Acceleration_IPL = zeros(rIPL,cNS+1); % Accelerazione 2D Cumulata +Acceleration_local_IPL = zeros(rIPL,cNS+1); % Accelerazione 2D Locale + +% Recupero i dati già elaborati +if NuovoZeroIPL == 1 + [rE,cE] = size(DatiElabInPlaceLink); + cont = 3; + n = 1; + while cont<=cE + sommaX(n,1) = cell2mat(DatiElabInPlaceLink(1,cont))'; + Xlocal_IPL(n,1) = sommaX(n,1); + X_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,cont+3))'; + sommaY(n,1) = cell2mat(DatiElabInPlaceLink(1,cont+1))'; + Ylocal_IPL(n,1) = sommaY(n,1); + Y_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,cont+4))'; + for j = 1:rIPL + AlfaX_IPL(j,1) = asind(Xlocal_IPL(j,1)/SpeIPL(j)); + AlfaY_IPL(j,1) = asind(Ylocal_IPL(j,1)/SpeIPL(j)); + end + Zlocal_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,cont+2))'; + Z_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,cont+5))'; + HShift_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,cont+6))'; + HShift_local_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,cont+7))'; + Azimuth_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,cont+8))'; + Speed_IPL(n,1:rE) = cell2mat(DatiElabInPlaceLink(:,cont+10))'; + Speed_local_IPL(n,1:rE) = cell2mat(DatiElabInPlaceLink(:,cont+11))'; + Acceleration_IPL(n,1:rE) = cell2mat(DatiElabInPlaceLink(:,cont+12))'; + Acceleration_local_IPL(n,1:rE) = cell2mat(DatiElabInPlaceLink(:,cont+13))'; + cont=cont+16; + n = n+1; + end +else + Zlocal_IPL(:,1) = SpeIPL; + Z_IPL(:,1) = PsIPL(2:end); +end + +% elaboro i dati nuovi +for iii = 1:cNS + Xlocal_IPL(:,iii+1) = sum(dNS(:,1:iii),2)+sommaX(:,1); + Ylocal_IPL(:,iii+1) = sum(dEO(:,1:iii),2)+sommaY(:,1); + for j = 1:rIPL + AlfaX_IPL(j,iii+1) = asind(Xlocal_IPL(j,iii+1)/SpeIPL(j)); + AlfaY_IPL(j,iii+1) = asind(Ylocal_IPL(j,iii+1)/SpeIPL(j)); + end + sommaZ(:,iii+1) = sum(dZ(:,1:iii),2); + X_IPL(:,iii+1) = cumsum(Xlocal_IPL(:,iii+1)); + Y_IPL(:,iii+1) = cumsum(Ylocal_IPL(:,iii+1)); + Z_IPL(:,iii+1) = cumsum(sommaZ(:,iii+1))+ Z_IPL(:,1); + HShift_IPL(:,iii+1) = (X_IPL(:,iii+1).^2+Y_IPL(:,iii+1).^2).^0.5; + HShift_local_IPL(:,iii+1) = (Xlocal_IPL(:,iii+1).^2+Ylocal_IPL(:,iii+1).^2).^0.5; + Zlocal_IPL(:,iii+1) = sommaZ(:,iii+1) + SpeIPL; % Zeta è il singolo abbassamento di quel nodo + for rr = 1:rIPL + azim(rr,iii) = (acos(abs(X_IPL(rr,iii))/HShift_IPL(rr,iii)))*180/3.141592654; % Angolo Teta in gradi 0° - 90° + segnoNS = sign(X_IPL(rr,iii)); + segnoEO = sign(Y_IPL(rr,iii)); + % L'azimuth si calcola con NS = 0, positivo in senso orario + % (90° = Est) + if segnoNS == 1 && segnoEO == 1 % quadrante 1 + Azimuth_IPL(rr,iii+1) = azim(rr,iii); % Teta lo tengo come è (1 quadrante) + elseif segnoNS == -1 && segnoEO == 1 % quadrante 2 + Azimuth_IPL(rr,iii+1) = 180 - azim(rr,iii); % 180-teta + elseif segnoNS == -1 && segnoEO == -1 % quadrante 3 + Azimuth_IPL(rr,iii+1) = 180 + azim(rr,iii); % 180+teta + elseif segnoNS == 1 && segnoEO == -1 % quadrante 4 + Azimuth_IPL(rr,iii+1) = 360 - azim(rr,iii); % 360-teta + elseif segnoNS == 0 && segnoEO == -1 % 270° + Azimuth_IPL(rr,iii+1) = 270; + elseif segnoNS == -1 && segnoEO == 0 % 180° + Azimuth_IPL(rr,iii+1) = 180; + end + end +end +Azimuth_IPL = real(Azimuth_IPL); +Azimuth_IPL = Azimuth_IPL+Corr_Azimuth; +[rAz,cAz] = size(Azimuth_IPL); +for a = 1:rAz + for b = 1:cAz + if Azimuth_IPL(a,b) >= 360 + Azimuth_IPL(a,b) = Azimuth_IPL(a,b)-360; + end + end +end + +%% Calcolo velocità di spostamento giornaliera +[numDate,~] = size(ARRAYdateIPL); % numero di date +d = 1; +p = 1; +diffDate = 0; +n = 1; +period = 1; % calcolo giornaliero +ContSUP = []; +for dd = 1:numDate + while diffDate < period + d = d+1; + if d > numDate % Se d supera le date disponibili, esco dal ciclo while + break + end + diffDate = ARRAYdateIPL(d) - ARRAYdateIPL(p); + end + if d >numDate + break + end + ContSUP(n,1) = d; %#ok<*AGROW> % Creo matrice indici dell'estremo superiore della differenza + ContINF(n,1) = p; % Creo matrice indici dell'estremo inferiore della differenza + p = p+1; % passo alla data di partenza successiva + d = p; % resetto il conto di d + n = n+1; + diffDate = 0; +end + +check = isempty(ContSUP); +if check == 0 + [nDate,~] = size(ContSUP); + for s = 1:rIPL + N = 1; + for dd = 1:nDate + Speed_IPL(s,ContSUP(N,1)) = (HShift_IPL(s,ContSUP(N,1))-HShift_IPL(s,ContINF(N,1)))/(ARRAYdateIPL(ContSUP(N,1))-ARRAYdateIPL(ContINF(N,1))); + Speed_local_IPL(s,ContSUP(N,1)) = (HShift_local_IPL(s,ContSUP(N,1))-HShift_local_IPL(s,ContINF(N,1)))/(ARRAYdateIPL(ContSUP(N,1))-ARRAYdateIPL(ContINF(N,1))); + Acceleration_IPL(s,ContSUP(N,1)) = (Speed_IPL(s,ContSUP(N,1))-Speed_IPL(s,ContINF(N,1)))/(ARRAYdateIPL(ContSUP(N,1))-ARRAYdateIPL(ContINF(N,1))); + Acceleration_local_IPL(s,ContSUP(N,1)) = (Speed_local_IPL(s,ContSUP(N,1))-Speed_local_IPL(s,ContINF(N,1)))/(ARRAYdateIPL(ContSUP(N,1))-ARRAYdateIPL(ContINF(N,1))); + N = N+1; + end + end +end + +% Approssimo i dati con il corretto numero di cifre decimali +[X_IPL,Y_IPL,Z_IPL,Xlocal_IPL,Ylocal_IPL,Zlocal_IPL,HShift_IPL,HShift_local_IPL,Azimuth_IPL,Speed_IPL,... + Speed_local_IPL,Acceleration_IPL,Acceleration_local_IPL,TempDef_IPL] = approx(X_IPL,Y_IPL,Z_IPL,... + Xlocal_IPL,Ylocal_IPL,Zlocal_IPL,HShift_IPL,HShift_local_IPL,Azimuth_IPL,Speed_IPL,Speed_local_IPL,... + Acceleration_IPL,Acceleration_local_IPL,TempDef_IPL,FileName); + +% Riordino matrice errori +[r,~] = size(ErrInPlaceLink); +Matrice_err = zeros(r,rIPL); +for i = 1:r % date + d = 1; + for n = 1:rIPL % nodi + j = 1; + err = ErrInPlaceLink(i,d:d+6); + while j <= 7 + if err(1,j) == 1 + Matrice_err(i,n) = 1; + break + end + if err(1,j) == 0.5 + Matrice_err(i,n) = 0.5; + end + j = j+1; + end + d = d+7; + end +end +ErrInPlaceLink = Matrice_err'; + +text = 'In Place Link triaxial calculation executed correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/Tilt/triax_TL.m b/Tilt/triax_TL.m new file mode 100755 index 0000000..97be93e --- /dev/null +++ b/Tilt/triax_TL.m @@ -0,0 +1,533 @@ +%% Funzione che calcola gli spostamenti in modalità triassiale per i Tilt Link +function [X,Y,Z,Xlocal,Ylocal,Zlocal,HShift,HShift_local,AlfaX,AlfaY,Azimuth,... + Speed_local,Speed,Acceleration_local,Acceleration,TempDef_TL,ARRAYdateTL,... + ErrTiltLink,MAGdef_TL] = triax_TL(IDcentralina,DTcatena,rTL,ACCdef_TL,... + ACCdefRis_TL,MAGdef_TL,TempDef_TL,SpeTL,PsTL,NodoTiltLink,tolleranzaAcc,... + tolleranzaMag,DatiElabTiltLink,segnoNS,segnoEO,MEMS,Ndevst,Wdevst,ARRAYdateTL,... + Tmax,Tmin,NuovoZeroTL,NdatiMedia,Ndatidespike,ErrTiltLink,margine,datainiTL,FileName) + +%% Inizializzazione +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'triax_TL function started'; +fprintf(fileID,fmt,text); + +if NuovoZeroTL == 1 + if NdatiMedia > Ndatidespike + Ndati = NdatiMedia; + else + Ndati = Ndatidespike; + end + ini = round(Ndati/2)+1; + if rem(Ndati,2) == 0 + ini = ini+1; + end + clear NDati + ini = ini + margine; + if ini < 6 + ini = 6; + end + [letture,~]=size(DatiElabTiltLink); + if ini > letture + ini = letture-1; + end + if Ndevst ~= 0 % Allora prendo tutti i dati e solo in seguito considero i nuovi, a valle della funzione filtro + ini = 1; + end + ACCdefRis_TL = ACCdefRis_TL(ini:end,:); + TempDef_TL = TempDef_TL(ini:end,:); + DatiElabTiltLink = DatiElabTiltLink(ini:end,:); + ARRAYdateTL = ARRAYdateTL(ini:end,1); + ErrTiltLink = ErrTiltLink(ini:end,:); +end + +%% Controllo e correzione dei campi magnetici +[rA,cA] = size(ACCdef_TL); % righe -> date, colonna -> nodi +conf_acc = zeros(rA,cA); +contM = 0; % contatore correzioni campi magnetici +contT = rA*cA; + +% Se le accelerazioni variano meno della confidenza, NON cambio i valori di +% cambio magnetico e prendo quelli della lettura precedente +for d = 2:rA + % seconda lettura e successive, confronto i risultati dei magnetometri + % e degli accelerometri + conf_acc(d,:) = abs(ACCdef_TL(d,:) - ACCdef_TL(d-1,:)); + for dd = 1:cA + if abs(conf_acc(d,dd)) < tolleranzaMag % SOGLIA ACCELERAZIONE + MAGdef_TL(d,dd) = MAGdef_TL(d-1,dd); + contM = contM+1; + end + end +end + +text = ['' num2str(contM) ' corrections of magnetometers executed on a total amount of ' num2str(contT)... + ' data, which represent the ' num2str(contM*100/contT) '% for Tilt Link V']; +fprintf(fileID,fmt,text); + +if NuovoZeroTL == 1 + ACCdef_TL = ACCdef_TL(ini:end,:); + MAGdef_TL2 = MAGdef_TL(ini:end,:); +else + MAGdef_TL2 = MAGdef_TL; +end + +%% Definisco i dati +Nnodi = rTL; +[r,~] = size(ACCdef_TL); % Numero di dati +[Ndati,~] = size(ARRAYdateTL); +ax = zeros(r,Nnodi); +ay = zeros(r,Nnodi); +az = zeros(r,Nnodi); +mx = zeros(r,Nnodi); +my = zeros(r,Nnodi); +mz = zeros(r,Nnodi); +for i=1:Nnodi + ax(:,i) = ACCdef_TL(:,(i-1)*3+1); % ax + ay(:,i) = ACCdef_TL(:,(i-1)*3+2:(i-1)*3+2); % ay + az(:,i) = ACCdef_TL(:,(i-1)*3+3:(i-1)*3+3); % az + mx(:,i) = MAGdef_TL2(:,(i-1)*3+1); % mx + my(:,i) = MAGdef_TL2(:,(i-1)*3+2:(i-1)*3+2); % my + mz(:,i) = MAGdef_TL2(:,(i-1)*3+3:(i-1)*3+3); % mz +end + +%% Costruzione delle matrici spostamento e rotazione +NordSud = zeros(Nnodi,Ndati); % in riga i nodi, in colonna le date +EstOvest = zeros(Nnodi,Ndati); % in riga i nodi, in colonna le date +Zlocal = zeros(Nnodi,Ndati); + +% parametri per il calcolo +SpeTL = SpeTL(2:end,1); % salto il segmento di pertinenza dell'ancora +c = 1; + +% Inizio del ciclo di elaborazione +text = 'Triaxial Elaboration of Tilt Link V started'; +fprintf(fileID,fmt,text); + +% Inizializzo le matrici +deltaNS = zeros(rTL,1); +deltaEO = zeros(rTL,1); +deltaZ = zeros(rTL,1); +BECCHEGGIO = zeros(rTL,1); +ROLLIO = zeros(rTL,1); +IMBARDATA = zeros(rTL,1); +qf = zeros(rTL,4); +qfy = zeros(rTL,4); +for jj = 1:Ndati + for jjj=1:rTL + axb = ax(jj,jjj)'; + ayb = ay(jj,jjj)'; + azb = az(jj,jjj)'; + mxb = mx(jj,jjj)'; + myb = my(jj,jjj)'; + mzb = mz(jj,jjj)'; + SP = SpeTL(jjj); + [DNS,DEO,Dz,becc,roll,imba,q,qy] = QuaternioniASE(axb,ayb,azb,mxb,myb,mzb,SP,MEMS,FileName); + deltaNS(jjj) = DNS; + deltaEO(jjj) = DEO; + deltaZ(jjj) = Dz; + BECCHEGGIO(jjj) = becc; + ROLLIO(jjj) = roll; + IMBARDATA(jjj) = imba; + qf(jjj,:) = q; + qfy(jjj,:) = qy; + dq = q-qy; + if any(dq>0.000001) + text = (['Cicle Number ' num2str(jj) ' during Quaternion Calculation']); + text2 = (['Node Number ' num2str(jjj)]); + fprintf(fileID,fmt,text); + fprintf(fileID,fmt,text2); + end + end +% Le seguenti matrici sono organizzate come segue: +% - ciascuna riga è relativa a un nodo (1a riga = fondo catena); +% - ciascuna colonna è relativa a una data. + NordSud(:,c) = deltaNS; + EstOvest(:,c) = deltaEO; + Zlocal(:,c) = deltaZ; + c = c+1; +end + +text = 'Quaternion calculation executed'; +fprintf(fileID,fmt,text); + +% dNS e dEO raccolgono i dati del singolo nodo nella singola data +dNS = diff(NordSud,1,2); +dEO = diff(EstOvest,1,2); +dZ = diff(Zlocal,1,2); + +%% Cambio di segno alle direzioni! +if segnoNS == 0 + dNS = -1*dNS; +end +if segnoEO == 0 + dEO = -1*dEO; +end + +%% Controllo delle risultanti di accelerazione e campo magnetico +clear r +clear rr +clear c +clear cc +ACCdefRis_TL = ACCdefRis_TL'; % Nodi in riga, date in colonna +[r,c] = size(ACCdefRis_TL); +[rr,cc] = size(NordSud); + +% controllo che le matrici con le risultanti delle accelerazioni e +% le matrici con i dati di spostamento abbiano le stesse dimensioni +if r~=rr + text = '---Warning! Number of row of displacement data do not correspond to the number of acceleration cosine vector!---'; + fprintf(fileID,fmt,text); +end +if c~=cc + text = '---Warning! Number of column of displacement data do not correspond to the number of acceleration cosine vector!---'; + fprintf(fileID,fmt,text); +end +clear i +clear j +cont = 1; % contatore +cont2 = 1; % contatore +cont3 = 1; % contatore +TempDef_TL = TempDef_TL'; +textA = 'There are not correction of Tilt Link V based on acceleration vectors filter'; +textA2 = 'There are not correction of Tilt Link V based on uncalibrated acceleration vectors'; +textT = 'There are not correction of Tilt Link V based on temperature filter'; +for j = 2:c % Data + for i = 1:r % Nodo + % se il valore assoluto della differenza è maggiore della + % tolleranza, pongo gli spostamenti giornalieri pari a 0 + if abs(ACCdefRis_TL(i,j)-ACCdefRis_TL(i,j-1)) > tolleranzaAcc + dNS(i,j-1) = 0; + dEO(i,j-1) = 0; + dZ(i,j-1) = 0; + textA = ['' num2str(cont) ' correction executed for Tilt Link V - Acceleration vector filter!']; + cont = cont+1; + end + if ACCdefRis_TL(i,j) < 0.9 || ACCdefRis_TL(i,j) > 1.3 % Il nodo è fuori taratura! + dNS(i,j-1) = 0; + dEO(i,j-1) = 0; + dZ(i,j-1) = 0; + TempDef_TL(i,j) = TempDef_TL(i,j-1); + textA2 = ['' num2str(cont) ' correction executed for Tilt Link V - uncalibrated Acceleration vector!']; + cont3 = cont3+1; + end + end +end + +FileTemperature = ['' IDcentralina '-' DTcatena '-TL-Therm.csv']; +if isfile(FileTemperature) == 1 + DatiRaw = csvread(FileTemperature); + [rDR,cDR] = size(DatiRaw); + DatiRaw(:,1) = DatiRaw(:,1) + 730000; +else + rDR = 1; + cDR = 1; +end +for b = 1:c % Data + for a = 1:r % Nodo + % NON considero i dati al di sopra dei 80 °C o al di sotto dei -30 °C! + if TempDef_TL(a,b) > Tmax || TempDef_TL(a,b) < Tmin + cont2 = cont2+1; + if b == 1 + if isfile(FileTemperature) == 1 + RawDate = find(DatiRaw(:,1)<=datenum(datainiTL)); + if isempty(RawDate) == 1 + cc = 2; + while cc <= c + if TempDef_TL(a,cc) > Tmax || TempDef_TL(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_TL(a,b) = TempDef_TL(a,cc); + else + if isnan(DatiRaw(RawDate(end),a+1)) == 0 + TempDef_TL(a,b) = DatiRaw(RawDate(end),a+1); + ErrTiltLink(b,a) = 0.5; + wardat = 'Temperature data of Tilt Link nodes corrected using Raw Data of reference Csv file.'; + fprintf(fileID,fmt,wardat); + else + cc = 2; + while cc <= c + if TempDef_TL(a,cc) > Tmax || TempDef_TL(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_TL(a,b) = TempDef_TL(a,cc); + end + end + else + cc = 2; + while cc <= c + if TempDef_TL(a,cc) > Tmax || TempDef_TL(a,cc) < Tmin + cc = cc+1; + else + break + end + end + TempDef_TL(a,b) = TempDef_TL(a,cc); + end + else + TempDef_TL(a,b) = TempDef_TL(a,b-1); + dNS(a,b-1) = 0; + dEO(a,b-1) = 0; + dZ(a,b-1) = 0; + ErrTiltLink(b,a) = 0.5; + end + textT = ['' num2str(cont2) ' correction executed for Tilt Link V - Temperature filter!']; + end + end +end + +if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 + RawDate1 = find(DatiRaw(:,1)<=ARRAYdateTL(1)); + if isempty(RawDate1) == 1 + RawDate2 = 1; + elseif RawDate1(end) == rDR + RawDate2 = find(ARRAYdateTL(:,1)>DatiRaw(end,1)); + else + RawDate2 = find(ARRAYdateTL(:,1)>DatiRaw(RawDate1(end)+1,1)); + end +else + RawDate1 = []; + RawDate2 = 1; +end +if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 + Dati = [DatiRaw(1:RawDate1(end),:); ARRAYdateTL(RawDate2(1):end) TempDef_TL(:,RawDate2(1):end)']; +elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 + Dati = [ARRAYdateTL TempDef_TL']; +else + Dati = DatiRaw; +end +% Elimino appoggio più vecchio di un mese +RawDate3 = find(Dati(:,1) Ndatidespike + NdatiF = NdatiMedia; + else + NdatiF = Ndatidespike; + end + ini = round(NdatiF/2)+1; + if rem(NdatiF,2) == 0 + ini = ini+1; + end + clear NDatiF + iniST = round(Wdevst/2); + if rem(Wdevst,2) == 0 + iniST = iniST+1; + end + iniST = iniST + margine; + if iniST > ini + ini = iniST; + end + if ini < 6 + ini = 6; + end + dNS = dNS(:,ini:end); + dEO = dEO(:,ini:end); + dZ = dZ(:,ini:end); + TempDef_TL = TempDef_TL(ini:end,:); + DatiElabTiltLink = DatiElabTiltLink(ini:end,:); + ARRAYdateTL = ARRAYdateTL(ini:end,1); + ErrTiltLink = ErrTiltLink(ini:end,:); +end + +%% Finalizzo i calcoli +[rNS,cNS] = size(dNS); +sommaX = zeros(rTL,1); +Xlocal = zeros(rNS,cNS+1); % locale nello spazio, cumulato nel tempo +AlfaX = zeros(rNS,cNS+1); % Angoli +sommaY = zeros(rTL,1); +Ylocal = zeros(rNS,cNS+1); +AlfaY = zeros(rNS,cNS+1); % Angoli +sommaZ = zeros(rNS,cNS); +Zlocal = zeros(rNS,cNS+1); +X = zeros(rNS,cNS+1); % cumulato nel tempo e nello spazio +Y = zeros(rNS,cNS+1); +Z = zeros(rNS,cNS+1); +HShift = zeros(rNS,cNS+1); % massima pendenza cumulato nel tempo e nello spazio +HShift_local = zeros(rNS,cNS+1); % massima pendenza locale +Azimuth = zeros(rNS,cNS+1); % azimut +azim = zeros(rNS,cNS+1); % matrice di appoggio per il calcolo dell'azimuth +Speed = zeros(rTL,cNS+1); % Velocità 2D Cumulata +Speed_local = zeros(rTL,cNS+1); % Velocità 2D locale +Acceleration = zeros(rTL,cNS+1); % Accelerazione 2D Cumulata +Acceleration_local = zeros(rTL,cNS+1); % Accelerazione 2D Locale + +% Recupero i dati già elaborati +if NuovoZeroTL == 1 + [rE,cE] = size(DatiElabTiltLink); + cont = 3; + n = 1; + while cont<=cE + sommaX(n,1) = cell2mat(DatiElabTiltLink(1,cont))'; + Xlocal(n,1) = sommaX(n,1); + X(n,1) = cell2mat(DatiElabTiltLink(1,cont+3))'; + sommaY(n,1) = cell2mat(DatiElabTiltLink(1,cont+1))'; + Ylocal(n,1) = sommaY(n,1); + Y(n,1) = cell2mat(DatiElabTiltLink(1,cont+4))'; + for j = 1:rTL + AlfaX(j,1) = asind(Xlocal(j,1)/SpeTL(j)); + AlfaY(j,1) = asind(Ylocal(j,1)/SpeTL(j)); + end + Zlocal(n,1) = cell2mat(DatiElabTiltLink(1,cont+2))'; + Z(n,1) = cell2mat(DatiElabTiltLink(1,cont+5))'; + HShift(n,1) = cell2mat(DatiElabTiltLink(1,cont+6))'; + HShift_local(n,1) = cell2mat(DatiElabTiltLink(1,cont+7))'; + Azimuth(n,1) = cell2mat(DatiElabTiltLink(1,cont+8))'; + Speed(n,1:rE) = cell2mat(DatiElabTiltLink(:,cont+10))'; + Speed_local(n,1:rE) = cell2mat(DatiElabTiltLink(:,cont+11))'; + Acceleration(n,1:rE) = cell2mat(DatiElabTiltLink(:,cont+12))'; + Acceleration_local(n,1:rE) = cell2mat(DatiElabTiltLink(:,cont+13))'; + cont=cont+16; + n = n+1; + end +else + Zlocal(:,1) = SpeTL; + Z(:,1) = PsTL(2:end); +end + +% elaboro i dati nuovi +for iii = 1:cNS + Xlocal(:,iii+1) = sum(dNS(:,1:iii),2)+sommaX(:,1); + Ylocal(:,iii+1) = sum(dEO(:,1:iii),2)+sommaY(:,1); + for j = 1:rTL + AlfaX(j,iii+1) = asind(Xlocal(j,iii+1)/SpeTL(j)); + AlfaY(j,iii+1) = asind(Ylocal(j,iii+1)/SpeTL(j)); + end + sommaZ(:,iii+1) = sum(dZ(:,1:iii),2); + X(:,iii+1) = cumsum(Xlocal(:,iii+1)); + Y(:,iii+1) = cumsum(Ylocal(:,iii+1)); + Z(:,iii+1) = cumsum(sommaZ(:,iii+1))+ Z(:,1); + HShift(:,iii+1) = (X(:,iii+1).^2+Y(:,iii+1).^2).^0.5; + HShift_local(:,iii+1) = (Xlocal(:,iii+1).^2+Ylocal(:,iii+1).^2).^0.5; + Zlocal(:,iii+1) = sommaZ(:,iii+1) + SpeTL; % Zeta è il singolo abbassamento di quel nodo + for rr = 1:rTL + azim(rr,iii) = (acos(abs(X(rr,iii))/HShift(rr,iii)))*180/3.141592654; % Angolo Teta in gradi 0° - 90° + segnoNS = sign(X(rr,iii)); + segnoEO = sign(Y(rr,iii)); + % L'azimuth si calcola con NS = 0, positivo in senso orario + % (90° = Est) + if segnoNS == 1 && segnoEO == 1 % quadrante 1 + Azimuth(rr,iii+1) = azim(rr,iii); % Teta lo tengo come è (1 quadrante) + elseif segnoNS == -1 && segnoEO == 1 % quadrante 2 + Azimuth(rr,iii+1) = 180 - azim(rr,iii); % 180-teta + elseif segnoNS == -1 && segnoEO == -1 % quadrante 3 + Azimuth(rr,iii+1) = 180 + azim(rr,iii); % 180+teta + elseif segnoNS == 1 && segnoEO == -1 % quadrante 4 + Azimuth(rr,iii+1) = 360 - azim(rr,iii); % 360-teta + elseif segnoNS == 0 && segnoEO == -1 % 270° + Azimuth(rr,iii+1) = 270; + elseif segnoNS == -1 && segnoEO == 0 % 180° + Azimuth(rr,iii+1) = 180; + end + end +end +Azimuth = real(Azimuth); + +%% Calcolo velocità di spostamento giornaliera +[numDate,~] = size(ARRAYdateTL); % numero di date +d = 1; +p = 1; +diffDate = 0; +n = 1; +period = 1; % calcolo giornaliero +ContSUP = []; +for dd = 1:numDate + while diffDate < period + d = d+1; + if d > numDate % Se d supera le date disponibili, esco dal ciclo while + break + end + diffDate = ARRAYdateTL(d) - ARRAYdateTL(p); + end + if d >numDate + break + end + ContSUP(n,1) = d; %#ok<*AGROW> % Creo matrice indici dell'estremo superiore della differenza + ContINF(n,1) = p; % Creo matrice indici dell'estremo inferiore della differenza + p = p+1; % passo alla data di partenza successiva + d = p; % resetto il conto di d + n = n+1; + diffDate = 0; +end + +check = isempty(ContSUP); +if check == 0 + [nDate,~] = size(ContSUP); + for s = 1:rTL + N = 1; + for dd = 1:nDate + Speed(s,ContSUP(N,1)) = (HShift(s,ContSUP(N,1))-HShift(s,ContINF(N,1)))/(ARRAYdateTL(ContSUP(N,1))-ARRAYdateTL(ContINF(N,1))); + Speed_local(s,ContSUP(N,1)) = (HShift_local(s,ContSUP(N,1))-HShift_local(s,ContINF(N,1)))/(ARRAYdateTL(ContSUP(N,1))-ARRAYdateTL(ContINF(N,1))); + Acceleration(s,ContSUP(N,1)) = (Speed(s,ContSUP(N,1))-Speed(s,ContINF(N,1)))/(ARRAYdateTL(ContSUP(N,1))-ARRAYdateTL(ContINF(N,1))); + Acceleration_local(s,ContSUP(N,1)) = (Speed_local(s,ContSUP(N,1))-Speed_local(s,ContINF(N,1)))/(ARRAYdateTL(ContSUP(N,1))-ARRAYdateTL(ContINF(N,1))); + N = N+1; + end + end +end + +% Approssimo i dati con il corretto numero di cifre decimali +[X,Y,Z,Xlocal,Ylocal,Zlocal,HShift,HShift_local,Azimuth,Speed,... + Speed_local,Acceleration,Acceleration_local,TempDef_TL] = approx(X,Y,Z,... + Xlocal,Ylocal,Zlocal,HShift,HShift_local,Azimuth,Speed,Speed_local,... + Acceleration,Acceleration_local,TempDef_TL,FileName); + +% Riordino matrice errori +[r,~] = size(ErrTiltLink); +Matrice_err = zeros(r,rTL); +for i = 1:r % date + d = 1; + for n = 1:rTL % nodi + j = 1; + err = ErrTiltLink(i,d:d+6); + while j <= 7 + if err(1,j) == 1 + Matrice_err(i,n) = 1; + break + end + if err(1,j) == 0.5 + Matrice_err(i,n) = 0.5; + end + j = j+1; + end + d = d+7; + end +end +ErrTiltLink = Matrice_err'; + +text = 'Tilt Link V triaxial calculation executed correctly. triax_TL function ended'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/checkBattery.m b/checkBattery.m new file mode 100755 index 0000000..cb2b8fa --- /dev/null +++ b/checkBattery.m @@ -0,0 +1,215 @@ +function checkBattery(Batteria,Batteria_LoRa,IDcentralina,DTcatena,Unit,Mail,conn,FileName) + +text = 'checkBattery function started'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +% Centralina +if strcmp(Unit,'GEI G801') == 1 || strcmp(Unit,'GEI G802') == 1 || strcmp(Unit,'GEI G201') == 1 ... + || strcmp(Unit,'GEI G301') == 1 % G801, G802, G201, G301 + Batt = 12; + Threshold = 11; + Dato = cellstr('12 V'); +elseif strcmp(Unit,'GEI D2W') == 1 + Batt = 6; + Threshold = 5.6; + Dato = cellstr('6 V'); +elseif strcmp(Unit,'Nesa') == 1 + Batt = 3.4; + Threshold = 3; + Dato = cellstr('3.4 V'); +elseif strcmp(Unit,'Nesa evolution') == 1 + Batt = 12.2; + Threshold = 11.8; + Dato = cellstr('12.2 V'); +elseif strcmp(Unit,'Campbell CRX1000') == 1 + Batt = 12; + Threshold = 10; + Dato = cellstr('12 V'); +elseif strcmp(Unit,'SISGEO WR-GW-868') == 1 + Batt = 5; + Threshold = 4.5; + Dato = cellstr('5 V'); +end + +% Modulo LoRa +if isempty(Batteria_LoRa) == 0 + if strcmp(Unit,'GEI G802') == 1 + Threshold_LoRa = 6.5; + Dato_LoRa = cellstr('7.2 V'); + elseif strcmp(Unit,'SISGEO WR-GW-868') == 1 + Threshold_LoRa = 3; + Dato_LoRa = cellstr('5 V'); + end +else + Threshold_LoRa = []; + Dato_LoRa = []; +end + +FileNameBattery = strcat(IDcentralina,'-Batteria.txt'); +if isfile(FileNameBattery) == 0 % NON Esiste + outdat = fopen(FileNameBattery,'wt+'); + fileID_site = fopen(FileNameBattery,'a'); + fmt = '%f \r'; + fprintf(fileID_site,fmt,Batt); + fmt = '%.10f \r'; + text = now; + fprintf(fileID_site,fmt,text); + fclose(fileID_site); +end + +% Scarico dati di riferimento +FileNameBattery = ['' IDcentralina '-Batteria.txt']; +Dati = importdata(FileNameBattery); +[rA,~] = size(Dati); +if rA == 0 + Livello_Rif = 0; + Data_Rif = 0; +elseif rA == 1 + Livello_Rif = Dati(1,1); + Data_Rif = 0; +else + Livello_Rif = Dati(1,1); + Data_Rif = Dati(2,1); +end + +if strcmp(Unit,'Nesa evolution') == 1 + Level = str2double(cell2mat(Batteria(end,2))); +else + Level = cell2mat(Batteria(end,3)); +end +activate = 0; +Centralina = 0; +LoRa = 0; + +% Check Centralina +if Level < Threshold + if Level > 0 + if now-Data_Rif > 1 % || Level < Livello_Rif + Data_Rif = now; + activate = 1; + Centralina = 1; + end + end +end + +% Check Modulo LoRa +if isnan(cell2mat(Batteria_LoRa(end,3))) == 0 + Level_LoRa = cell2mat(Batteria_LoRa(end,3)); + if Level_LoRa < Threshold_LoRa + if Level_LoRa > 0 + if now-Data_Rif > 1 + Data_Rif = now; + activate = 1; + LoRa = 1; + end + end + end +end + +if activate == 0 + Mail = 0; +end + +if Mail == 1 + sms = 0; + % Centralina + if Centralina == 1 + DATAinsert = cell(1,6); + if strcmp(Unit,'Nesa evolution') == 1 + Data = datestr(datenum(Batteria(end,1)),'yyyy-mm-dd HH:MM:SS'); + else + Data = datestr(strjoin([Batteria(end,1) Batteria(end,2)]),'yyyy-mm-dd HH:MM:SS'); + end + desc = Dato; + DATAinsert{1,1} = 2; % Allarme tipologia batteria + DATAinsert{1,2} = IDcentralina; + DATAinsert{1,3} = Data; + DATAinsert{1,4} = Level; + DATAinsert{1,5} = sms; + DATAinsert{1,6} = desc; + + % Cerco se il dato è già presente + comando = ['select id, type_id, date_time from alarms where unit_name = ''' ... + IDcentralina ''' and date_time = ''' Data ''' and type_id = ''' DATAinsert{1,1} ... + ''' and registered_value = ''' Level ''' and description like ''' desc ''' order by date_time']; + curs = exec(conn,comando); + curs = fetch(curs); + idDate = curs.Data; + [~,cI] = size(idDate); + if cI == 1 + idElabData = 0; % 0 indica che il dato non è presente su DB + else + idElabData = cell2mat(idDate(:,1)); + end + tablename = 'alarms'; + colnames = {'type_id','unit_name','date_time','battery_level','send_sms','description'}; + data = [DATAinsert(1,1),DATAinsert(1,2),DATAinsert(1,3),DATAinsert(1,4),... + DATAinsert(1,5),DATAinsert(1,6)]; + if idElabData == 0 % Scrivo + fastinsert(conn,tablename,colnames,data); + text = ['ALERT was written in the DB by checkBattery function for date: ''' Data ''' ']; + end + end + + if LoRa == 1 + DATAinsert = cell(1,7); + Data = datestr(strjoin([Batteria_LoRa(end,1) Batteria_LoRa(end,2)]),'yyyy-mm-dd HH:MM:SS'); + desc = Dato_LoRa; + DATAinsert{1,1} = 2; % Allarme tipologia batteria + DATAinsert{1,2} = IDcentralina; + DATAinsert{1,3} = DTcatena; + DATAinsert{1,4} = Data; + DATAinsert{1,5} = Level_LoRa; + DATAinsert{1,6} = sms; + DATAinsert{1,7} = desc; + + % Cerco se il dato è già presente + comando = ['select id, type_id, date_time from alarms where unit_name = ''' ... + IDcentralina ''' and tool_name = ''' DTcatena ''' and date_time = ''' Data ... + ''' and type_id = ''' DATAinsert{1,1} ''' and registered_value = ''' Level ... + ''' and description like ''' desc ''' order by date_time']; + curs = exec(conn,comando); + curs = fetch(curs); + idDate = curs.Data; + [~,cI] = size(idDate); + if cI == 1 + idElabData = 0; % 0 indica che il dato non è presente su DB + else + idElabData = cell2mat(idDate(:,1)); + end + tablename = 'alarms'; + colnames = {'type_id','unit_name','tool_name','date_time','battery_level','send_sms','description'}; + data = [DATAinsert(1,1),DATAinsert(1,2),DATAinsert(1,3),DATAinsert(1,4),... + DATAinsert(1,5),DATAinsert(1,6),DATAinsert(1,6)]; + if idElabData == 0 % Scrivo + fastinsert(conn,tablename,colnames,data); + text = ['ALERT was written in the DB by checkBattery function for date: ''' Data ''' ']; + end + end + + fileID = fopen(FileName,'a'); + fmt = '%s \r'; + fprintf(fileID,fmt,text); + fclose(fileID); +end + +outdat = fopen(FileNameBattery,'wt+'); +fileID_site = fopen(FileNameBattery,'a'); +text_B = Level; +fmt = '%f \r'; +fprintf(fileID_site,fmt,text_B); +fmt = '%.10f \r'; +text = Data_Rif; +fprintf(fileID_site,fmt,text); +fclose(fileID_site); + +text = 'checkBattery function worked correctly'; +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +fprintf(fileID,fmt,text); +fclose(fileID); + +end \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..921d129 --- /dev/null +++ b/main.py @@ -0,0 +1,6 @@ +def main(): + print("Hello from matlab-func!") + + +if __name__ == "__main__": + main() diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..d0f06b0 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,7 @@ +[project] +name = "matlab-func" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +requires-python = ">=3.9" +dependencies = [] diff --git a/sync_server_file.sh b/sync_server_file.sh new file mode 100755 index 0000000..602b030 --- /dev/null +++ b/sync_server_file.sh @@ -0,0 +1,53 @@ +#!/bin/bash + +# Script per sincronizzare file .m da un server remoto a una directory locale +# e fare il commit delle modifiche in un repository Git locale. + +REMOTE_USER="alex" +REMOTE_HOST="80.211.60.65" +REMOTE_PORT="2022" +REMOTE_SRC="/usr/local/matlab_func" +LOCAL_DST="/home/alex/devel/matlab-ase" +# ------------------------------------------------ +# 1. Esecuzione di Rsync (Mirroring dal remoto al locale) +# Include: -a (archive), -v (verbose), -z (compress), --delete (mirroring) +# Filtri: include directory (*/), include solo *.m, esclude *mcrCache*, esclude tutto il resto (*) +echo "Inizio sincronizzazione da ${REMOTE_HOST}..." + +rsync -avz --delete -e "ssh -p ${REMOTE_PORT}" \ + --include='*/' \ + --include='*.m' \ + --exclude='*' \ + "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_SRC}" "${LOCAL_DST}" + +# 2. Verifica se rsync è andato a buon fine +if [ $? -eq 0 ]; then + echo "Sincronizzazione completata con successo." +else + echo "Errore durante la sincronizzazione Rsync." + exit 1 +fi + +# 3. Preparazione del messaggio di commit con la data attuale +SYNC_DATE=$(date +"%Y-%m-%d %H:%M:%S") +COMMIT_MSG="Sync from remote server: ${SYNC_DATE}" + +# 4. Aggiungi tutte le modifiche (nuovi file, modificati, eliminati) all'area di staging +# Usiamo 'git add .' per nuovi/modificati e 'git add -u' per le eliminazioni/modifiche. +# 'git add -A' (o 'git add --all') è la soluzione più semplice e completa. +echo "Aggiungo modifiche al Git staging area..." +git add -A "${LOCAL_DST}" + +# 5. Esegui il commit con il messaggio datato +echo "Eseguo il commit con messaggio: \"${COMMIT_MSG}\"" +git commit -m "${COMMIT_MSG}" + +# 6. Verifica se il commit ha prodotto modifiche +if [ $? -eq 0 ]; then + echo "Commit completato con successo." +else + # Questo succede se non ci sono state modifiche (rsync non ha trovato nulla da aggiornare) + echo "Nessuna modifica rilevata; commit saltato." +fi + +echo "Processo completato." \ No newline at end of file diff --git a/threshold.m b/threshold.m new file mode 100755 index 0000000..032a22b --- /dev/null +++ b/threshold.m @@ -0,0 +1,50 @@ +function threshold(yesEL,ARRAYdate_EL,DatiExtensometer,NodoExtensometerLink,... + yesCrL,ARRAYdate_CrL,DatiCrack,NodoCrackLink,... + unitID,idTool,IDcentralina,DTcatena,conn,FileName) + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'threshold function started'; +fprintf(fileID,fmt,text); +fclose(fileID); + +% Scarico la data di riferimento +comando = ['select graph_prod_date from tools where unit_ID like ''' unitID ''' and name like ''' DTcatena ''' ']; +data_ini = fetch(conn,comando); +stringa = cell2mat(data_ini); +[lS] = length(stringa); +if lS == 4 % Codice null - non c'è data di riferimento + Riferimento = 0; + dataRif = []; + timeRif = []; +else + Riferimento = 1; + dataRif = stringa(1,1:10); + timeRif = stringa(1,12:lS); +end + +comando = ['select soglie from tools where unit_id like ''' ... + unitID ''' and name like ''' DTcatena ''' ']; + +Soglie = fetch(conn,comando); +value = jsondecode(char(Soglie)); +if isempty(value) == 0 + + %% Extensometer Link + if yesEL == 1 + threshold_ExtensometerLink(value,ARRAYdate_EL,DatiExtensometer,... + Riferimento,dataRif,timeRif,NodoExtensometerLink,IDcentralina,DTcatena,idTool,conn,FileName); + end + +% %% Crack Link +% if yesCrL == 1 +% threshold_CrackLink(value,ARRAYdate_CrL,DatiCrack,... +% Riferimento,dataRif,timeRif,NodoCrackLink,IDcentralina,DTcatena,conn,FileName); +% end +end + +fileID = fopen(FileName,'a'); +fmt = '%s \r'; +text = 'threshold function closed'; +fprintf(fileID,fmt,text); +fclose(fileID); \ No newline at end of file