【matlab进阶学习-6】 读取log数据data.txt文件,并做处理,导出报告/表格/图表

2023-12-13 07:00:57

原始文件

原始文件格式txt,每一行对应一个数据,数据之间由逗号分割开

对应意思

时刻,电压,电流,功率,容量,,电流,功率,,RTC时间,状态1,状态2,状态3,电量,电压,电流,故障码,工作状态,电机电流1,电机电流2,电机电流3

需求

💡

1,打开data 表格

2,删除第一列中的时间重复项,建立新表格,并保存输出

3,取出所有表格中的时间,电压,电流,容量,状态,led灯 建立新的表格,并生成图表

4,计算状态为1时候的带刀盘工作时间 worktime,

计算状态为2时的回归时间 backtime,

5,计算工作时,行走(0mA>cur >-500mA) 平均电流,最小电流,电流众数,电流中位数 walk_cur_avr min mode midian

计算工作时,切割(cur <-500mA ) 平均电流,最小电流,电流众数,电流中位数 walk_cur_avr min mode midian

6,将电量对应的最大最小电压显示出来

7,将4,5导出data.txt 报告

1,打开data 表格

clear;clc;
data_m = readtable('data.txt',"Delimiter",',');
%Delimiter 分隔符
%, 以逗号风格

2,删除第一列中的时间重复项,建立新表格,并保存输出

filename = 'data_report.xlsx';  
writetable(data_m, filename, 'Sheet', 'data_init');
%将data_m 数据写入文件名未data_report.xlsx的表格的data_init中
[data_d,n] = unique(data_m(:,1));%删除第一列中的重复项,其他列对应删除 %data_d,n,唯一列的索引
data_only=data_m(n,:);
%filename = 'data_only.xlsx';  
writetable(data_only, filename, 'Sheet', 'data_only');

3,取出所有表格中的时间,电压,电流,容量,状态,led灯 建立新的表格,并生成图表

data_time = table2array(data_only(:,1)); 
data_vol = table2array(data_only(:,2));
data_cur = table2array(data_only(:,3));
data_state = table2array(data_only(:,12));
data_led = table2array(data_only(:,14));
%读取时间,电压,电流,状态,led,并改为矩阵格式

data_led_num =[]; 

for i =1:length(data_led)
    a=cell2mat(data_led(i));  %提取每一行的数据,并将cell型转成mat型
    b=str2double(a(4));  %提取字符串的第四个数
   data_led_num=[data_led_num;b]; %保存成新的表格
    
end
plot(data_time,data_vol,data_time,data_cur,data_time,data_state.*10000,data_time,data_led_num*10000)
xlabel('time')
saveas(gcf,'picture.png'); % 将图形导出为PNG格式

%生成图表
%添加x轴
%保存图片格式

4,计算状态为1时候的带刀盘工作时间 worktime,计算状态为2时的回归时间 backtime,

worktime =floor( sum(data_state==1)/60)
backtime =floor(  sum(data_state==2)/60)
%状态1的逻辑数求和,除以60 秒转成分钟,floor 取整

5,计算工作时,行走(0mA>cur >-500mA) 平均电流,最小电流,电流众数,电流中位数 walk_cur_avr min mode midian

计算工作时,切割(cur <-500mA ) 平均电流,最小电流,电流众数,电流中位数 walk_cur_avr min mode midian

format long g
walk_index  = find(data_cur>-500 & data_cur<0);  %找出-500mA-0mA 的索引
blake_index = find(data_cur<-500 );%找出<-500mA 的索引
data_cur_walk = data_cur(walk_index); %提取行走电流
data_cur_blake = data_cur(blake_index);%提取切割电流

disp("行走电流数据")
data_cur_walk_min = min(data_cur_walk)%最小值
data_cur_walk_avr = floor(mean(data_cur_walk)) %平均值
data_cur_walk_mode = mode(data_cur_walk)%众数
data_cur_walk_median = median(data_cur_walk)%中位数




disp("切割电流数据")
data_cur_blake_min = min(data_cur_blake)
data_cur_blake_avr =floor( mean(data_cur_blake))
data_cur_blake_mode = mode(data_cur_blake)
data_cur_blake_median = median(data_cur_blake)

6,将电量对应的最大最小电压显示出来

disp_led_6_index = find(data_led_num==6);
disp_led_5_index = find(data_led_num==5);
disp_led_4_index = find(data_led_num==4);
disp_led_3_index = find(data_led_num==3);
disp_led_2_index = find(data_led_num==2);
disp_led_1_index = find(data_led_num==1);
%提取 各指示灯的电量索引
disp_vol_6_arr = data_vol(disp_led_6_index);
disp_vol_5_arr = data_vol(disp_led_5_index);
disp_vol_4_arr = data_vol(disp_led_4_index);
disp_vol_3_arr = data_vol(disp_led_3_index);
disp_vol_2_arr = data_vol(disp_led_2_index);
disp_vol_1_arr = data_vol(disp_led_1_index);
%提取各指示灯的电压

disp_vol_6_arr_max = max(disp_vol_6_arr);
disp_vol_6_arr_min = min(disp_vol_6_arr);
%计算最大最小值

disp_vol_5_arr_max = max(disp_vol_5_arr);
disp_vol_5_arr_min = min(disp_vol_5_arr);

disp_vol_4_arr_max= max(disp_vol_4_arr);
disp_vol_4_arr_min = min(disp_vol_4_arr);


disp_vol_3_arr_max = max(disp_vol_3_arr);
disp_vol_3_arr_min = min(disp_vol_3_arr);


disp_vol_2_arr_max = max(disp_vol_2_arr);
disp_vol_2_arr_min = min(disp_vol_2_arr);

disp_vol_1_arr_max = max(disp_vol_1_arr);
disp_vol_1_arr_min = min(disp_vol_1_arr);




disp_vol_6_worktime = floor(sum(data_led_num==6)/60)
disp_vol_5_worktime = floor(sum(data_led_num==5)/60)
disp_vol_4_worktime = floor(sum(data_led_num==4)/60)
disp_vol_3_worktime = floor(sum(data_led_num==3)/60)
disp_vol_2_worktime = floor(sum(data_led_num==2)/60)
disp_vol_1_worktime = floor(sum(data_led_num==1)/60)
%计算工作时间

7,将4,5导出data.txt 报告

fileID = fopen('report.txt','w');  
fprintf(fileID,'%s\n', '----report----'); 
fprintf(fileID,'%s\n', '工作时长'); 
fprintf(fileID,'带刀盘切割工作时长:%d 分钟\n', worktime); 
fprintf(fileID,'触发回归后工作时长:%d 分钟\n', backtime); 

fprintf(fileID,'%s\n', ' '); 
fprintf(fileID,'%s\n', '行走电流'); 

fprintf(fileID,'行走最小电流:%d mA\n', data_cur_walk_min); 
fprintf(fileID,'行走平均电流:%d mA\n', data_cur_walk_avr); 
fprintf(fileID,'行走众数电流:%d mA\n', data_cur_walk_mode); 
fprintf(fileID,'行走中位数电流:%d mA\n', data_cur_walk_median); 

fprintf(fileID,'%s\n', ' '); 
fprintf(fileID,'%s\n', '切割电流'); 
fprintf(fileID,'切割最小电流:%d mA\n', data_cur_blake_min); 
fprintf(fileID,'切割平均电流:%d mA\n', data_cur_blake_avr); 
fprintf(fileID,'切割众数电流:%d mA\n', data_cur_blake_mode); 
fprintf(fileID,'切割中位数电流:%d mA\n', data_cur_blake_median); 


fprintf(fileID,'%s\n', ' '); 
fprintf(fileID,'%s\n', 'LED灯对应电压及工作时长'); 
fprintf(fileID,'LED=6 :(%d mV~%d mV),%d 分钟\n', disp_vol_6_arr_max,disp_vol_6_arr_min,disp_vol_6_worktime); 
fprintf(fileID,'LED=5 :(%d mV~%d mV),%d 分钟\n', disp_vol_5_arr_max,disp_vol_5_arr_min,disp_vol_5_worktime); 
fprintf(fileID,'LED=4 :(%d mV~%d mV),%d 分钟\n', disp_vol_4_arr_max,disp_vol_4_arr_min,disp_vol_4_worktime); 
fprintf(fileID,'LED=3 :(%d mV~%d mV),%d 分钟\n', disp_vol_3_arr_max,disp_vol_3_arr_min,disp_vol_3_worktime); 
fprintf(fileID,'LED=2 :(%d mV~%d mV),%d 分钟\n', disp_vol_2_arr_max,disp_vol_2_arr_min,disp_vol_2_worktime); 
fprintf(fileID,'LED=1 :(%d mV~%d mV),%d 分钟\n', disp_vol_1_arr_max,disp_vol_1_arr_min,disp_vol_1_worktime); 
 
fclose(fileID);

生成的目录

文章来源:https://blog.csdn.net/cengqiu4314/article/details/134850927
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。