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