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