Sync from remote server: 2025-10-12 18:56:41
This commit is contained in:
304
RSN/elaborazione_RSN.m
Executable file
304
RSN/elaborazione_RSN.m
Executable file
@@ -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)<now-30);
|
||||
if isempty(RawDate3) == 0
|
||||
[rDati,~] = size(Dati);
|
||||
if RawDate3(end) == rDati
|
||||
else
|
||||
Dati = Dati(RawDate3(end)+1:end,:);
|
||||
end
|
||||
end
|
||||
if isfile(FileTemperature) == 1
|
||||
delete(FileTemperature);
|
||||
end
|
||||
Dati(:,1) = Dati(:,1) - 730000;
|
||||
csvwrite(FileTemperature,Dati);
|
||||
|
||||
TempDef_RSN = TempDef_RSN';
|
||||
angRSN = angRSN';
|
||||
fprintf(fileID,fmt,textT);
|
||||
|
||||
% modifica di alcuni nodi in particolare
|
||||
angRSN = azzeramenti(conn,IDcentralina,DTcatena,angRSN,NodoRSNLink,...
|
||||
ARRAYdateRSN,FileName);
|
||||
|
||||
AlfaX = zeros(rr,Nnodi);
|
||||
AlfaY = zeros(rr,Nnodi);
|
||||
for i = 1:Nnodi
|
||||
if pos_inst == 1
|
||||
AlfaX(:,i) = angRSN(:,(i-1)*2+1); % ax
|
||||
AlfaY(:,i) = angRSN(:,(i-1)*2+2); % ay
|
||||
elseif pos_inst == 2
|
||||
AlfaX(:,i) = -angRSN(:,(i-1)*2+1); % ax
|
||||
AlfaY(:,i) = -angRSN(:,(i-1)*2+2); % ay
|
||||
elseif pos_inst == 3
|
||||
AlfaX(:,i) = -angRSN(:,(i-1)*2+1); % ax
|
||||
AlfaY(:,i) = -angRSN(:,(i-1)*2+2); % ay
|
||||
elseif pos_inst == 4
|
||||
AlfaX(:,i) = angRSN(:,(i-1)*2+1); % ax
|
||||
AlfaY(:,i) = angRSN(:,(i-1)*2+2); % ay
|
||||
elseif pos_inst == 5
|
||||
AlfaX(:,i) = angRSN(:,(i-1)*2+2); % ay
|
||||
AlfaY(:,i) = -angRSN(:,(i-1)*2+1); % ax
|
||||
elseif pos_inst == 6
|
||||
AlfaX(:,i) = -angRSN(:,(i-1)*2+2); % ay
|
||||
AlfaY(:,i) = angRSN(:,(i-1)*2+1); % ax
|
||||
elseif pos_inst == 7
|
||||
AlfaX(:,i) = -angRSN(:,(i-1)*2+2); % ay
|
||||
AlfaY(:,i) = angRSN(:,(i-1)*2+1); % ax
|
||||
elseif pos_inst == 8
|
||||
AlfaX(:,i) = angRSN(:,(i-1)*2+2); % ay
|
||||
AlfaY(:,i) = -angRSN(:,(i-1)*2+1); % ax
|
||||
end
|
||||
end
|
||||
|
||||
fclose(fileID);
|
||||
% Approssimo i dati con il corretto numero di cifre decimali
|
||||
[AlfaX,AlfaY,TempDef_RSN] = approx(AlfaX,AlfaY,TempDef_RSN,FileName);
|
||||
|
||||
%% Calcolo differenziali
|
||||
NomeFileX = ['' IDcentralina '-' DTcatena '-RifX.csv'];
|
||||
NomeFileY = ['' IDcentralina '-' DTcatena '-RifY.csv'];
|
||||
if NuovoZeroRSN == 0 % prima elaborazione
|
||||
csvwrite(NomeFileX,AlfaX(1,:));
|
||||
AlfaX = AlfaX - AlfaX(1,:);
|
||||
csvwrite(NomeFileY,AlfaY(1,:));
|
||||
AlfaY = AlfaY - AlfaY(1,:);
|
||||
else % Ci sono già dei dati elaborati
|
||||
RIF_X = csvread(NomeFileX);
|
||||
AlfaX = AlfaX - RIF_X;
|
||||
RIF_Y = csvread(NomeFileY);
|
||||
AlfaY = AlfaY - RIF_Y;
|
||||
end
|
||||
|
||||
[r,~] = size(ErrRSNLink);
|
||||
Matrice_err = zeros(r,rRSN);
|
||||
for i = 1:r % date
|
||||
d = 1;
|
||||
for n = 1:rRSN % nodi
|
||||
j = 1;
|
||||
err = ErrRSNLink(i,d:d+3);
|
||||
while j <= 4
|
||||
if err(1,j) == 1
|
||||
Matrice_err(i,n) = 1;
|
||||
break
|
||||
elseif err(1,j) == 0.5 && Matrice_err(i,n) ~= 1
|
||||
Matrice_err(i,n) = 0.5;
|
||||
end
|
||||
j = j+1;
|
||||
end
|
||||
d = d+4;
|
||||
end
|
||||
end
|
||||
ErrRSNLink = Matrice_err';
|
||||
|
||||
text = 'RSN Link elaboration executed correctly. elaborazione_RSN function closed';
|
||||
fileID = fopen(FileName,'a');
|
||||
fmt = '%s \r';
|
||||
fprintf(fileID,fmt,text);
|
||||
fclose(fileID);
|
||||
|
||||
end
|
||||
Reference in New Issue
Block a user