plot_flight_borders: add flags for flexibility. tm_wheel_parser.py: plot data distribution

This commit is contained in:
Danila Gamkov
2025-08-07 14:13:43 +03:00
parent cf3c9290b0
commit d91039ca21
12 changed files with 820 additions and 202 deletions

1
.gitignore vendored
View File

@@ -1,4 +1,5 @@
*.csv *.csv
*.xml
*.png *.png
*.swp *.swp
*.swo *.swo

View File

@@ -28,6 +28,8 @@ This project contains tools for decoding, converting, and visualizing telemetry
-> `/plots/` — folder where output plots are saved. -> `/plots/` — folder where output plots are saved.
## Requirements ## Requirements
- git
- Python version 3.10 or upper. For checking type: - Python version 3.10 or upper. For checking type:
```bash ```bash
python3 --version python3 --version

View File

@@ -445,7 +445,7 @@ def cut_norm_data(data, time_begin, duration_sec, channel='ch1',
orig_data = pd.DataFrame({ 'timestamp': time_l, 'temp': temp_l }) orig_data = pd.DataFrame({ 'timestamp': time_l, 'temp': temp_l })
interp_data = orig_data.set_index('timestamp') interp_data = orig_data.set_index('timestamp')
interp_data = interp_data.resample('S').mean().interpolate(method=interp["method"], interp_data = interp_data.resample('s').mean().interpolate(method=interp["method"],
order=interp["order"]) order=interp["order"])
interp_data = interp_data.reset_index(names=['timestamp']) interp_data = interp_data.reset_index(names=['timestamp'])
@@ -498,7 +498,7 @@ def plot_step_response_in_thermocycle(data_info, thermocycle_info, interp,
data_info['data'], thermocycle_info, channel=data_info['channel'], data_info['data'], thermocycle_info, channel=data_info['channel'],
interp=interp, accuracy=data_info['find_accuracy']) interp=interp, accuracy=data_info['find_accuracy'])
fig = plt.figure(figsize=(9, 6), dpi=200) fig = plt.figure(figsize=(8, 7), dpi=200)
fig.suptitle(title, fontsize=plot_info['font']) fig.suptitle(title, fontsize=plot_info['font'])
ax1 = fig.add_subplot(2,1,1) ax1 = fig.add_subplot(2,1,1)
ax2 = fig.add_subplot(2,1,2) ax2 = fig.add_subplot(2,1,2)
@@ -510,6 +510,10 @@ def plot_step_response_in_thermocycle(data_info, thermocycle_info, interp,
idx = find_best_time_idx(step_interp_cycle.timestamp, step_begin, idx = find_best_time_idx(step_interp_cycle.timestamp, step_begin,
accuracy=data_info['find_accuracy']) accuracy=data_info['find_accuracy'])
if idx == -1:
print(f'index corresponding to time {step_begin} in times array not found!')
return
ax1.axvline(x = step_interp_cycle.timestamp[idx], color='r', linestyle='-.', ax1.axvline(x = step_interp_cycle.timestamp[idx], color='r', linestyle='-.',
label= thermocycle_info['type_ru'] + ' воздействие, начало') label= thermocycle_info['type_ru'] + ' воздействие, начало')
@@ -531,8 +535,8 @@ def plot_step_response_in_thermocycle(data_info, thermocycle_info, interp,
fancybox=True, framealpha=0.4) fancybox=True, framealpha=0.4)
ax2.grid(True) ax2.grid(True)
ax2.tick_params(axis='both', width=1, labelsize=plot_info['font']) ax2.tick_params(axis='both', width=1, labelsize=plot_info['font'])
ax2.set_xlabel('Время, ЧЧ:MM:CC', fontsize=plot_info['font']) ax2.set_xlabel('Время, ЧЧ:MM', fontsize=plot_info['font'])
ax2.set_ylabel(r'$T_{norm}$, $^\circ$C', fontsize=plot_info['font']) ax2.set_ylabel(r'$T_{норм}$, $^\circ$C', fontsize=plot_info['font'])
fig.suptitle(title, fontsize=plot_info['font']) fig.suptitle(title, fontsize=plot_info['font'])
plt.tight_layout() plt.tight_layout()
@@ -555,7 +559,7 @@ def plot_imp_response(data, data_info, plot_info, thermocycle_info):
ax1.grid(True) ax1.grid(True)
ax1.tick_params(axis='both', width=1, labelsize=plot_info['font']) ax1.tick_params(axis='both', width=1, labelsize=plot_info['font'])
ax1.set_xlabel('время', fontsize=plot_info['font']) ax1.set_xlabel('время', fontsize=plot_info['font'])
ax1.set_ylabel(r'$t_{norm}$, $^\circ$C', fontsize=plot_info['font']) ax1.set_ylabel(r'$t_{норм}$, $^\circ$C', fontsize=plot_info['font'])
fig.suptitle(title, fontsize=plot_info['font']) fig.suptitle(title, fontsize=plot_info['font'])
plt.tight_layout() plt.tight_layout()

207
bin/asotr_kdi.py Normal file
View File

@@ -0,0 +1,207 @@
import sys
from importlib import reload
sys.path.append('./')
import asotr
reload(asotr)
import matplotlib.pyplot as plt
from matplotlib import dates
import pandas as pd
from datetime import datetime, timedelta
import os
import json
def cmd_parse(asotr_data):
decode_list = []
for elem in asotr_data.itertuples():
elem_msg = asotr.cmd_decode(elem.cmd.strip())
if elem_msg != '':
str_ = f'{elem.timestamp};{elem_msg}'
decode_list.append(str_)
return decode_list
def pow_temp_parse(elem, tstamp_format='%d.%m.%Y %H:%M:%S.%f'):
timestamp = pd.to_datetime(elem.timestamp, format=tstamp_format)
if "*1" not in elem.data:
return ('none', [])
l = []
data = elem.data[2:]
l = []
l.append(asotr.get_utc_seconds(elem.timestamp, tstamp_format))
l.append(timestamp)
if "status 3" in elem.cmd:
l.extend(list(map(float, data.split())))
return ('t', l)
elif "status 4" in elem.cmd:
l.extend(list(map(int, data.split())))
return ('p', l)
else:
return ('none', [])
def get_cmd_data(fname, tstamp_format='%d.%m.%Y %H:%M:%S.%f'):
t = []
p = []
asotr_data = pd.read_csv(fname, delimiter=';', names=['timestamp', 'cmd', 'data'])
cmd_list = cmd_parse(asotr_data)
for elem in asotr_data.itertuples():
data = pow_temp_parse(elem, tstamp_format)
if data[0] == 't':
t.append(data[1])
elif data[0] == 'p':
p.append(data[1])
temp = pd.DataFrame(t,
columns=['timestamp_sec', 'timestamp', 'ch1', 'ch2', 'ch3', 'ch4', 'ch5', 'ch6'])
power = pd.DataFrame(p,
columns=['timestamp_sec', 'timestamp', 'ch1', 'ch2', 'ch3', 'ch4', 'ch5', 'ch6'])
return (cmd_list, temp, power)
def decode_collect_data(uart_server_log_path, asotr_kit):
files = os.listdir(uart_server_log_path)
files1 = [file for file in files if 'cmd_data' in file]
files1 = sorted(files1)
cmd_list_itog = []
temp_itog = []
pow_itog = []
cmd_list, temp, power = get_cmd_data(uart_server_log_path + files1[0])
cmd_list_itog.extend(cmd_list)
temp_itog = temp
pow_itog = power
print(files1[0])
for i, file in enumerate(files1):
if i > 0:
print(file)
cmd_list, temp, power = get_cmd_data(uart_server_log_path + file)
cmd_list_itog.extend(cmd_list)
temp_itog = pd.concat([temp_itog, temp], ignore_index=True)
pow_itog = pd.concat([pow_itog, power], ignore_index=True)
temp_itog = temp_itog.sort_values(by='timestamp_sec')
pow_itog = pow_itog.sort_values(by='timestamp_sec')
temp_itog['timestamp'] = temp_itog['timestamp'].dt.strftime('%d.%m.%Y %H:%M:%S.%f')
pow_itog['timestamp'] = pow_itog['timestamp'].dt.strftime('%d.%m.%Y %H:%M:%S.%f')
temp_itog.to_csv(f'./data/asotr0{asotr_kit}_data_T.csv', index=False, sep=';',
encoding='utf-8-sig', decimal='.')
pow_itog.to_csv(f'./data/asotr0{asotr_kit}_data_P.csv', index=False, sep=';',
encoding='utf-8-sig', decimal='.')
with open('./data/cmd_human.csv', 'w') as file:
for elem in cmd_list_itog:
file.write(f'{elem}\n')
def load_ps_cmd_decode(fname):
with open(fname, 'r') as file:
ps_cmd_decode = json.load(file)
return ps_cmd_decode
def get_ps_cmd_data(fname, ps_model):
decode = load_ps_cmd_decode('./decode_ps_cmd.json')
ps_data = pd.read_csv(fname, sep=';', names=['timestamp', 'cmd', 'cmd_answer'])
out = {'cmd_write': [], 'cmd_read': [], 'cmd_read_desc': []}
if ps_model == 'PSH-3630A':
for elem in decode:
if elem['ps_model'] == ps_model:
decode_cmd_write = elem['cmd_write']
decode_cmd_read = elem['cmd_read']
decode_cmd_read_desc = elem['cmd_read_desc']
break
cmd_write = []
cmd_read_desc = []
cmd_read = []
for row in ps_data.itertuples():
# check if current row is cmd_write:
cmd_str = row.cmd.split(' ')
timestamp_sec = asotr.get_utc_seconds(row.timestamp, '%d.%m.%Y %H:%M:%S.%f')
if (len(cmd_str) > 1):
elem = [timestamp_sec, row.timestamp,
decode_cmd_write[cmd_str[0]], cmd_str[1]]
cmd_write.append(elem)
elif (len(cmd_str) == 1):
elem = [timestamp_sec, row.timestamp,
decode_cmd_read[cmd_str[0]], row.cmd_answer.strip()]
cmd_read.append(elem)
elem = [timestamp_sec, row.timestamp,
decode_cmd_read_desc[cmd_str[0]], row.cmd_answer.strip()]
cmd_read_desc.append(elem)
out['cmd_write'] = cmd_write
out['cmd_read'] = cmd_read
out['cmd_read_desc'] = cmd_read_desc
return out
def convert_data_date_format(directory, fname_pattern, column_names,
old_date_fmt = "%Y.%m.%d %H:%M:%S.%f",
new_date_fmt = '%d.%m.%Y %H:%M:%S.%f'):
files = os.listdir(directory)
dateparse = lambda x: datetime.strptime(x, old_date_fmt)
for file in files:
fname = directory + file
if 'cmd_data' in fname:
print(fname)
df = pd.read_csv(fname, sep=';', decimal='.',
names=column_names,
parse_dates=['timestamp'], date_parser=dateparse)
df['timestamp'] = df['timestamp'].dt.strftime(new_date_fmt)
df.to_csv(fname, header=False, index=False, sep=';',
decimal='.', encoding='utf-8-sig')
def plot_data(fname, title, ox_dtime_format, events={}, hlines={}, ch='ch1'):
cmd_list, temp, power = get_cmd_data(fname)
fig = plt.figure(figsize=(10, 8), dpi=150)
ax1 = fig.add_subplot(2,1,1)
ax2 = fig.add_subplot(2,1,2, sharex=ax1)
ax1.plot(temp.timestamp, temp[ch])
if len(hlines) > 0:
for label, value in hlines.items():
ax1.axhline(y = value, color='b', linestyle='--')
ax1.text(temp.timestamp[len(temp.timestamp) - 1], value, label, va='bottom')
if len(events) > 0:
for time, event in events.items():
idx = asotr.find_best_time_idx(temp.timestamp, time, accuracy='seconds')
ax1.axvline(x = temp.timestamp[idx], color='r', linestyle='-.')
ax1.text(temp.timestamp[idx], max(temp[ch]) + 1, event, rotation=45, va='bottom')
ax2.plot(power.timestamp, power[ch])
date_formatter = dates.DateFormatter(ox_dtime_format)
ax1.xaxis.set_major_formatter(date_formatter)
ax1.set_xlabel('время')
ax1.set_ylabel('Температура, $^\circ$C')
ax1.grid(True)
ax2.xaxis.set_major_formatter(date_formatter)
ax2.set_ylabel('Мощность, %')
ax2.grid(True)
fig.suptitle(title)
plt.legend()
plt.tight_layout()
fig.savefig('plot_experim_data.png')
plt.show()

32
bin/kdi_noize.py Normal file
View File

@@ -0,0 +1,32 @@
import sys
from importlib import reload
sys.path.append('./')
import asotr_kdi
import asotr
reload(asotr_kdi)
reload(asotr)
fname = '/home/danila/Danila/work/MVN/Soft/PID/rust/uart_server/log_experim/cmd_data_asotr/asotr01/cmd_data_20250314_asotr.log'
# fname = '/home/danila/Danila/work/MVN/Soft/PID/rust/uart_server/log_experim/cmd_data_asotr/asotr01/cmd_data_20250324_asotr_step_var_cond.log'
# fname = '/home/danila/Danila/work/MVN/Soft/PID/rust/uart_server/log_experim/cmd_data_asotr/asotr01/cmd_data_20250325_asotrPD_thermostat.log'
# fname_save = '../data/experiments/noize_20250325_12.csv'
# begin_time = '25.03.2025 11:55:00'
# end_time = '25.03.2025 12:10:00'
fname_save = '../data/experiments/noize_20250314_14.csv'
begin_time = '14.03.2025 14:20:00'
end_time = '14.03.2025 14:35:00'
cmd_list, temp, power = asotr_kdi.get_cmd_data(fname)
begin = asotr.find_best_time_idx(temp.timestamp, begin_time, accuracy='seconds')
end = asotr.find_best_time_idx(temp.timestamp, end_time, accuracy='seconds')
temp1 = temp[begin:end]
print(temp1)
temp1.to_csv(fname_save, date_format='%d.%m.%Y %H:%M:%S.%f', index=False, sep=';', columns=['timestamp', 'ch1', 'ch2', 'ch3', 'ch4', 'ch5', 'ch6'])

View File

@@ -0,0 +1,180 @@
import matplotlib.pyplot as plt
from matplotlib import dates
import pandas as pd
from datetime import datetime
import sys
font = 14
print_width = 15
print_height = 8
plot_windows = 2
channels = [1, 0, 0, 0, 0, 0]
asotr_kit = '01'
xborders=False
begin=0;
end=0;
path = '../data/asotr/'
fname_B = f'{path}beta_2025.xlsx'
fname = 'asotr' + asotr_kit + '_data_T.csv'
fname_pow = 'asotr' + asotr_kit + '_data_P.csv'
pict_name = '../plots/' + 'ASOTR' + asotr_kit + '_flight_T_P_all'
ox_dtime_format = '%Y.%m.%d'
legend=['БРД1', 'БРД2', 'БРД3', 'БРД4', 'плита МУП МВН, датчик1', 'плита МУП МВН, датчик 2']
width=[1, 2, 1, 1, 1, 1]
marker = ['-', '--', '-', '-', '-.', '-'];
width_arr = [1, 0.5, 0.2, 0.1, 1, 1]
data_b = pd.read_excel(fname_B,
sheet_name=0,
usecols=[0,1,2],
header=4,
names=['turn_num', 'beta_angle', 'timestamp'],
parse_dates=['timestamp'],
date_format='%Y-%m-%d %H:%M:%S')
fname = [path + fname, path + fname_pow]
data = [pd.read_csv(fname[0], sep=';', parse_dates=['timestamp'], date_format="%d.%m.%Y %H:%M:%S.%f"),
pd.read_csv(fname[1], sep=';', parse_dates=['timestamp'], date_format="%d.%m.%Y %H:%M:%S.%f")]
ch= [[], [], [], [], [], []]
ch_signs = ["temp", "pow"]
data_dict = {"temp": ch, "pow": ch, "time": []}
data_dict["time"] = data[0]['timestamp']
col=['ch1', 'ch2', 'ch3', 'ch4', 'ch5', 'ch6', 'ch7']
for j in range(2):
for index, row, in data[j].iterrows():
for i in range(6):
ch[i].append(float(row[col[i]]))
data_dict[ch_signs[j]] = ch
ch= [[], [], [], [], [], []]
len_data = [len(data_dict['temp'][0]), len(data_dict['pow'][0])]
len_ = min(len_data)
if xborders == False:
begin = 0
end = len_ - 1
if plot_windows == 1:
fig, ax = plt.subplots(figsize=(print_width, print_height), dpi=300)
i = 0
for elem in data_dict['temp']:
if channels[i] == 1:
ax.plot(data_dict['time'][begin:end], elem[begin:end], marker[i], linewidth=width[i], label=legend[i])
i += 1
ax.tick_params(axis="both", width=1, labelsize=font)
ax.grid(visible=True, linestyle = 'dotted')
ax.set_ylabel(r"Температура, $^\circ$C", fontsize=font)
ax.set_xlabel('Время', fontsize=font)
ax.legend(fontsize=font)
date_formatter = dates.DateFormatter(ox_dtime_format)
ax.xaxis.set_major_formatter(date_formatter)
plt.tight_layout()
fig.savefig(pict_name)
plt.show()
elif plot_windows == 2:
fig = plt.figure(figsize=(print_width, print_height), dpi=600)
ax1 = fig.add_subplot(1, 1, 1)
# ax2 = fig.add_subplot(2, 1, 2, sharex=ax1)
i = 0
for elem in data_dict['temp']:
if channels[i] == 1:
ax1.plot(data_dict['time'][begin:end], elem[begin:end], marker[i], linewidth=width[i], label=legend[i])
i += 1
ax3 = ax1.twinx()
ax3.plot(data_b['timestamp'][0:3400], data_b['beta_angle'][0:3400], marker[1], color='r', linewidth=width[1], label='угол Бета')
ax3.set_ylabel('Угол Бета', fontsize=font)
ax3.tick_params(axis="y", width=1, labelsize=font)
ax3.legend(fontsize=font, loc='upper right')
# i = 0
# for elem in data_dict['pow']:
# if channels[i] == 1:
# ax2.plot(data_dict['time'][begin:end], elem[begin:end], marker[i], linewidth=width[i], label=legend[i])
# i += 1
ax1.tick_params(axis="both", width=1, labelsize=font)
ax1.grid(visible=True, linestyle = 'dotted')
ax1.set_ylabel(r"Температура, $^\circ$C", fontsize=font)
ax1.set_xlabel('Время', fontsize=font)
ax1.legend(fontsize=font, loc='lower right')
date_formatter = dates.DateFormatter(ox_dtime_format)
ax1.xaxis.set_major_formatter(date_formatter)
# ax2.tick_params(axis="both", width=1, labelsize=font)
# ax2.grid(visible=True, linestyle = 'dotted')
# ax2.set_ylabel('Мощность, %', fontsize=font)
# ax2.set_xlabel('Время', fontsize=font)
# ax2.legend(fontsize=font, loc='lower right')
# date_formatter = dates.DateFormatter(ox_dtime_format)
# ax2.xaxis.set_major_formatter(date_formatter)
plt.title('АСОТР ' + asotr_kit, fontsize=font)
plt.tight_layout()
fig.savefig(pict_name)
plt.show()
# asotr_kit2 = '02'
# fname2 = 'asotr' + asotr_kit2 + '_data_T.csv'
# fname_pow2 = 'asotr' + asotr_kit2 + '_data_P.csv'
# legend2=['2 БРД1', '2 БРД2', '2 БРД3', '2 БРД4', '2 плита МУП МВН, датчик1', '2 плита МУП МВН, датчик 2']
# fname2 = [path + fname2, path + fname_pow2]
# data2 = [pd.read_csv(fname2[0], sep=';', parse_dates=['timestamp'], date_parser=dateparse),
# pd.read_csv(fname2[1], sep=';', parse_dates=['timestamp'], date_parser=dateparse)]
# ch= [[], [], [], [], [], []]
# ch_signs = ["temp", "pow"]
# data_dict2 = {"temp": ch, "pow": ch, "time": []}
# data_dict2["time"] = data2[0]['timestamp']
# col=['ch1', 'ch2', 'ch3', 'ch4', 'ch5', 'ch6', 'ch7']
# for j in range(2):
# for index, row, in data2[j].iterrows():
# for i in range(6):
# ch[i].append(float(row[col[i]]))
# data_dict2[ch_signs[j]] = ch
# ch= [[], [], [], [], [], []]
# len_data2 = [len(data_dict2['temp'][0]), len(data_dict2['pow'][0])]
# len_2 = min(len_data2)
# if xborders == False:
# begin2 = 0
# end2 = len_2 - 1
# i = 0
# for elem in data_dict2['temp']:
# if channels[i] == 1:
# print('legend2: ' + legend2[i])
# ax1.plot(data_dict2['time'][begin2:end2], elem[begin2:end2], marker[i], linewidth=width[i], label=legend2[i])
# i += 1
# ax2.plot(pd.Series(data_dict2['temp'][0]) - pd.Series(data_dict['temp'][0]))

115
bin/plot_data.py Normal file
View File

@@ -0,0 +1,115 @@
import sys
from importlib import reload
sys.path.append('./')
import asotr_kdi
reload(asotr_kdi)
import matplotlib.pyplot as plt
import pandas as pd
import re
ox_dtime_format = "%H:%M:%S"
ch = 'ch4'
# fname = '~/Danila/work/MVN/Soft/PID/rust/uart_server/log/cmd_data_20250311.log'
# fname = '~/Danila/work/MVN/Soft/PID/rust/uart_server/log/cmd_data_20250311.log'
# events = []
# hlines = []
# date = '17.03.2025'
# fname = '~/Danila/work/MVN/Soft/PID/rust/uart_server/log_experim/cmd_data_asotr/asotr01/cmd_data_20250317_asotrD_thermostat.log'
# title = f'Эксперименты по настройке ПД-регулятора на канале {ch[2]} АСОТР КДИ СПИН-X ({date})'
# hlines = {
# 'Туст. = 27': 27,
# 'Туст. = 29': 29,
# 'Туст. = 31': 31,
# }
# events = {
# '17.03.2025 12:50:14': 'Kp=0, Kd=2000, Ki=0, Туст.=29',
# '17.03.2025 13:20:18': 'запрет работы ПИД',
# '17.03.2025 14:15:14': 'Kp=0, Kd=2000, Ki=0, Туст.=31',
# '17.03.2025 14:45:18': 'запрет работы ПИД',
# '17.03.2025 15:41:14': 'Kp=50, Kd=2000, Ki=0, Туст.=31',
# '17.03.2025 16:11:17': 'запрет работы ПИД',
# '17.03.2025 17:05:13': 'Kp=50, Kd=2000, Ki=0, Туст.=27',
# '17.03.2025 17:50:17': 'запрет работы ПИД',
# '17.03.2025 19:30:10': 'Kp=100, Kd=2000, Ki=0, Туст.=27',
# '17.03.2025 20:15:13': 'запрет работы ПИД',
# }
# date = '16.04.2025'
# fname = '/home/danila/Danila/work/MVN/Soft/PID/rust/uart_server/log_experim/cmd_data_20250416_asotrPID_thermostat.log'
# title = f'Проверка работы ПИД-регулятора (Kp=615, Ki=0.000115, Kd=1300), канал {ch[2]} АСОТР КДИ СПИН-X ({date})'
# hlines = {
# '27': 27,
# '27.5': 27.5,
# '28': 28,
# '29': 29
# }
# events = {
# '16.04.2025 15:45:11': 'Туст=27',
# '16.04.2025 16:15:15': 'Туст=27.5',
# '16.04.2025 16:45:18': 'Туст=28',
# '16.04.2025 17:15:22': 'Туст=29',
# }
events = []
hlines = []
date = '14.03.2025'
title = f'Эксперименты с АСОТР КДИ СПИН-X ({date})'
fname = '/home/danila/Danila/work/MVN/Soft/PID/rust/uart_server/log_experim/cmd_data_asotr/asotr01/cmd_data_20250314_asotr.log'
# date = '20.03.2025'
# title = f'Эксперименты с АСОТР КДИ СПИН-X ({date})'
# fname = '/home/danila/Danila/work/MVN/Soft/PID/rust/uart_server/log_experim/cmd_data_asotr/asotr01/cmd_data_20250320_asotr_step_var_cond.log'
# date = '21.03.2025'
# title = f'Эксперименты с АСОТР КДИ СПИН-X ({date})'
# fname = '/home/danila/Danila/work/MVN/Soft/PID/rust/uart_server/log_experim/cmd_data_asotr/asotr01/cmd_data_20250321_asotr_step_var_cond.log'
# date = '24.03.2025'
# title = f'Эксперименты с АСОТР КДИ СПИН-X ({date})'
# fname = '/home/danila/Danila/work/MVN/Soft/PID/rust/uart_server/log_experim/cmd_data_asotr/asotr01/cmd_data_20250324_asotr_step_var_cond.log'
# date = '01.04.2025'
# title = f'Эксперименты с АСОТР КДИ СПИН-X ({date})'
# fname = '/home/danila/Danila/work/MVN/Soft/PID/rust/uart_server/log_experim/cmd_data_asotr/asotr01/cmd_data_20250401_asotr_step_var_cond.log'
# title = f'эксперимент по подаче ступенчатого воздействия на канал {ch[2]} АСОТР КДИ СПИН-X в различных условиях ({date})'
# hlines = {
# 'Туст. = 27': 27,
# 'Туст. = 26': 26
# }
# events = {
# '25.03.2025 11:25:00': 'Kp=200, Kd=2000, Ki=0, Туст.=27',
# '25.03.2025 12:10:14': 'запрет работы ПИД',
# '25.03.2025 12:30:00': 'Kp=200, Kd=2000, Ki=0, Туст.=26',
# '25.03.2025 13:15:14': 'запрет работы ПИД',
# }
# date = '25.03.2025'
# title = f'Эксперименты по настройке ПД-регулятора на канале {ch[2]} АСОТР КДИ СПИН-X ({date})'
# fname = '~/Danila/work/MVN/Soft/PID/rust/uart_server/log_experim/cmd_data_asotr/asotr01/cmd_data_20250325_asotrPD_thermostat.log'
# hlines = {
# 'Туст. = 26': 26
# }
# events = {
# # '26.03.2025 16:15:11': 'Kp=200, Kd=2000, Ki=0, Туст.=26',
# # '26.03.2025 18:45:30': 'запрет работы ПИД',
# }
# date = '26.03.2025'
# title = f'Эксперименты по настройке ПД-регулятора на канале {ch[2]} АСОТР КДИ СПИН-X ({date})'
# fname = '~/Danila/work/MVN/Soft/PID/rust/uart_server/log_experim/cmd_data_asotr/asotr01/cmd_data_20250326_asotrPD_thermostat.log'
asotr_kdi.plot_data(fname, title, ox_dtime_format, events, hlines, ch)

View File

@@ -8,17 +8,17 @@ import asotr
reload(asotr) reload(asotr)
import pandas as pd import pandas as pd
def plot_asotr_borders(path_with_data, ch, asotr_kit, begin, end, font=14, cmd=0, show_flag=True): def plot_asotr_borders(path_with_data, ch, asotr_kit, begin, end, font=12, cmd=0,
show_flag=False, plot_windows=2, width_=1, time_format='%d.%m.%Y'):
print_width = 20 print_width = 20
print_height = 12 print_height = 12
width = 1
plot_windows = 2
channels = list(map(int, ch)) channels = list(map(int, ch))
pict_name = (f'../plots/reports/ASOTR{asotr_kit}_flight_T_P_{asotr.convert_to_str(channels)}_{begin[0:5].replace(".", "")}_{end[0:5].replace(".", "")}.png') pict_name = (f'../plots/reports/ASOTR{asotr_kit}_flight_T_P_{asotr.convert_to_str(channels)}_{begin[0:5].replace(".", "")}_{end[0:5].replace(".", "")}.png')
plot_task = {"temp": 1, "temp_set": 1, "pow": 1} plot_task = {"temp": 1, "temp_set": 1, "pow": 1}
ox_dtime_format = "%d.%m.%Y" # ox_dtime_format = "%d.%m.%Y"
ox_dtime_format = time_format
legend = [ legend = [
"канал 1 (БРД1)", "канал 1 (БРД1)",
@@ -29,10 +29,10 @@ def plot_asotr_borders(path_with_data, ch, asotr_kit, begin, end, font=14, cmd=0
"канал 6 (плита МУП МВН)", "канал 6 (плита МУП МВН)",
] ]
legend_set = list(map(lambda x: x + " уставка", legend)) legend_set = list(map(lambda x: x + " уставка", legend))
width = [1, 1, 1, 1, 1, 1] width = [width_, width_, width_, width_, width_, width_]
width_set = [3, 3, 3, 3, 3, 3] width_set = [3, 3, 3, 3, 3, 3]
marker = ["-", "--", "-.", "-", "-", "--"] marker = ["-", "-", "-.", "-", "-", "--"]
width_arr = [1, 0.5, 0.2, 0.1, 1, 1] width_arr = [1, 0.5, 0.2, 0.1, 1, 1]
# get from files and prepare data # get from files and prepare data
@@ -44,7 +44,7 @@ def plot_asotr_borders(path_with_data, ch, asotr_kit, begin, end, font=14, cmd=0
return return
if plot_windows == 1: if plot_windows == 1:
fig, ax = plt.subplots(figsize=(print_width, print_height), dpi=200) fig, ax = plt.subplots(figsize=(print_width, print_height), dpi=300)
if plot_task["temp"] == 1: if plot_task["temp"] == 1:
for i in range(len(channels)): for i in range(len(channels)):
@@ -72,7 +72,7 @@ def plot_asotr_borders(path_with_data, ch, asotr_kit, begin, end, font=14, cmd=0
elif plot_windows == 2: elif plot_windows == 2:
fig = plt.figure(figsize=(print_width, print_height), dpi=200) fig = plt.figure(figsize=(print_width, print_height), dpi=300)
ax1 = fig.add_subplot(2, 1, 1) ax1 = fig.add_subplot(2, 1, 1)
ax2 = fig.add_subplot(2, 1, 2, sharex=ax1) ax2 = fig.add_subplot(2, 1, 2, sharex=ax1)
@@ -173,10 +173,20 @@ if __name__ == '__main__':
argparser.add_argument('-f', '--font', required=False, argparser.add_argument('-f', '--font', required=False,
help='type font size (from 1 to 30)') help='type font size (from 1 to 30)')
argparser.add_argument('-d', '--cmd', required=False, argparser.add_argument('-d', '--cmd', required=False,
help='type display commands flag (0/1)') help='type display commands flag (0 or 1)')
argparser.add_argument('-p', '--plot', required=False, argparser.add_argument('-p', '--plot', required=False,
help='display data in plot flag (0/1)') help='display data in plot flag (0 or 1)')
argparser.add_argument('-w', '--plotwindows', required=False,
help='plot counts in window (1 or 2)')
argparser.add_argument('-l', '--linewidth', required=False,
help='line width in plot (1, 2, ...)')
argparser.add_argument('-t', '--timeformat', required=False,
help='specify the time format, for example: %d.%m.%Y')
args = argparser.parse_args() args = argparser.parse_args()
plot_asotr_borders(args.source, args.channel, args.asotr, args.begin, args.end, # plot_asotr_borders(args.source, args.channel, args.asotr, args.begin, args.end,
args.font, args.cmd, show_flag=args.plot) # args.font, args.cmd, show_flag=args.plot, plot_windows=int(args.plotwindows),
# width_=int(args.linewidth), time_format = args.timeformat)
plot_asotr_borders(args.source, args.channel, args.asotr, args.begin, args.end)

View File

@@ -11,11 +11,8 @@ import pandas as pd
from datetime import datetime from datetime import datetime
asotr_kit = 1 asotr_kit = 1
# fname = f'../python_cyclo/data/asotr0{asotr_kit}_data_T.csv'
fname = f'../data/asotr/asotr0{asotr_kit}_data_T.csv' fname = f'../data/asotr/asotr0{asotr_kit}_data_T.csv'
data = pd.read_csv(fname, sep=';', parse_dates=["timestamp"], date_format="%d.%m.%Y %H:%M:%S.%f")
dateparse = lambda x: datetime.strptime(x, "%d.%m.%Y %H:%M:%S.%f")
data = pd.read_csv(fname, sep=';', parse_dates=['timestamp'], date_parser=dateparse)
# date = '20.03.2025' # date = '20.03.2025'
# period = '1 мин' # period = '1 мин'
@@ -48,7 +45,6 @@ data = pd.read_csv(fname, sep=';', parse_dates=['timestamp'], date_parser=datepa
# name_fig = 'step_response_KDI_20242403.png' # name_fig = 'step_response_KDI_20242403.png'
# interp = {'method': 'polynomial', 'order': 1} # interp = {'method': 'polynomial', 'order': 1}
# thermocycle_info = {'date': '01.04.2025', # thermocycle_info = {'date': '01.04.2025',
# 'time_begin': ['01.04.2025 16:27:00', '01.04.2025 18:00:00'], # 'time_begin': ['01.04.2025 16:27:00', '01.04.2025 18:00:00'],
@@ -62,6 +58,8 @@ data = pd.read_csv(fname, sep=';', parse_dates=['timestamp'], date_parser=datepa
# 'name_fig': f'{name}.png', 'font': 10} # 'name_fig': f'{name}.png', 'font': 10}
fname = f'../../python_cyclo/data/asotr0{asotr_kit}_data_T.csv'
data = pd.read_csv(fname, sep=';', parse_dates=["timestamp"], date_format="%d.%m.%Y %H:%M:%S.%f")
interp = {'method': 'polynomial', 'order': 1} interp = {'method': 'polynomial', 'order': 1}
@@ -69,46 +67,12 @@ data_info_list = []
thermocycle_info_list = [] thermocycle_info_list = []
cut_step_resp_list = [] cut_step_resp_list = []
data_info = {'data': data, 'device': 'летный', 'channel': 'ch1', 'period': '1 мин', data_info = {'data': data, 'device': 'КДИ', 'channel': 'ch1', 'period': '1 мин',
'find_accuracy': 'seconds'} 'find_accuracy': 'seconds'}
thermocycle_info = {'date': '25.04.2025', thermocycle_info = {'date': '01.04.2025',
'time_begin': ['24.04.2025 22:46:32', '25.04.2025 00:19:33'], 'time_begin': ['01.04.2025 16:27:13', '01.04.2025 18:00:18'],
'duration_sec': 92*60, 'type': 'step', 'type_ru': 'ступенчатое'} 'duration_sec': 92*60, 'type': 'step', 'type_ru': 'ступенчатое'}
cut_step_resp = {'time_step_begin': '25.04.2025 01:18:01', 'step_duration': 30*60} cut_step_resp = {'time_step_begin': '01.04.2025 18:53:20', 'step_duration': 25*60}
data_info_list.append(data_info)
thermocycle_info_list.append(thermocycle_info)
cut_step_resp_list.append(cut_step_resp)
data_info = {'data': data, 'device': 'летный', 'channel': 'ch2', 'period': '1 мин',
'find_accuracy': 'seconds'}
thermocycle_info = {'date': '25.04.2025',
'time_begin': ['24.04.2025 22:46:32', '25.04.2025 00:19:33'],
'duration_sec': 92*60, 'type': 'step1_to2', 'type_ru': 'ступенчатое'}
cut_step_resp = {'time_step_begin': '25.04.2025 01:18:01', 'step_duration': 30*60}
data_info_list.append(data_info)
thermocycle_info_list.append(thermocycle_info)
cut_step_resp_list.append(cut_step_resp)
data_info = {'data': data, 'device': 'летный', 'channel': 'ch1', 'period': '1 мин',
'find_accuracy': 'seconds'}
thermocycle_info = {'date': '25.04.2025',
'time_begin': ['25.04.2025 01:52:34', '25.04.2025 03:25:34'],
'duration_sec': 92*60, 'type': 'impulse', 'type_ru': 'импульсное'}
cut_step_resp = {'time_step_begin': '25.04.2025 04:24:00', 'step_duration': 15*60}
data_info_list.append(data_info)
thermocycle_info_list.append(thermocycle_info)
cut_step_resp_list.append(cut_step_resp)
data_info = {'data': data, 'device': 'летный', 'channel': 'ch2', 'period': '1 мин',
'find_accuracy': 'seconds'}
thermocycle_info = {'date': '25.04.2025',
'time_begin': ['25.04.2025 01:52:34', '25.04.2025 03:25:34'],
'duration_sec': 92*60, 'type': 'impulse1_to2', 'type_ru': 'импульсное'}
cut_step_resp = {'time_step_begin': '25.04.2025 04:24:00', 'step_duration': 20*60}
data_info_list.append(data_info) data_info_list.append(data_info)
thermocycle_info_list.append(thermocycle_info) thermocycle_info_list.append(thermocycle_info)
@@ -116,144 +80,199 @@ cut_step_resp_list.append(cut_step_resp)
data_info = {'data': data, 'device': 'летный', 'channel': 'ch2', 'period': '1 мин',
'find_accuracy': 'seconds'}
thermocycle_info = {'date': '30.04.2025',
'time_begin': ['29.04.2025 22:02:54', '29.04.2025 23:35:54'],
'duration_sec': 93*60, 'type': 'step', 'type_ru': 'ступенчатое'}
cut_step_resp = {'time_step_begin': '30.04.2025 00:36:01', 'step_duration': 30*60}
data_info_list.append(data_info)
thermocycle_info_list.append(thermocycle_info)
cut_step_resp_list.append(cut_step_resp)
data_info = {'data': data, 'device': 'летный', 'channel': 'ch1', 'period': '1 мин',
'find_accuracy': 'seconds'}
thermocycle_info = {'date': '30.04.2025',
'time_begin': ['29.04.2025 22:02:54', '29.04.2025 23:35:54'],
'duration_sec': 93*60, 'type': 'step2_to1', 'type_ru': 'ступенчатое'}
cut_step_resp = {'time_step_begin': '30.04.2025 00:36:01', 'step_duration': 30*60}
data_info_list.append(data_info)
thermocycle_info_list.append(thermocycle_info)
cut_step_resp_list.append(cut_step_resp)
data_info = {'data': data, 'device': 'летный', 'channel': 'ch2', 'period': '1 мин',
'find_accuracy': 'seconds'}
thermocycle_info = {'date': '30.04.2025',
'time_begin': ['30.04.2025 01:09:55', '30.04.2025 02:41:54'],
'duration_sec': 93*60, 'type': 'impulse', 'type_ru': 'импульсное'}
cut_step_resp = {'time_step_begin': '30.04.2025 03:42:00', 'step_duration': 15*60}
data_info_list.append(data_info)
thermocycle_info_list.append(thermocycle_info)
cut_step_resp_list.append(cut_step_resp)
data_info = {'data': data, 'device': 'летный', 'channel': 'ch1', 'period': '1 мин',
'find_accuracy': 'seconds'}
thermocycle_info = {'date': '30.04.2025',
'time_begin': ['30.04.2025 01:09:55', '30.04.2025 02:41:54'],
'duration_sec': 93*60, 'type': 'impulse2_to1', 'type_ru': 'импульсное'}
cut_step_resp = {'time_step_begin': '30.04.2025 03:42:00', 'step_duration': 20*60}
data_info_list.append(data_info)
thermocycle_info_list.append(thermocycle_info)
cut_step_resp_list.append(cut_step_resp)
data_info = {'data': data, 'device': 'летный', 'channel': 'ch4', 'period': '1 мин',
'find_accuracy': 'seconds'}
thermocycle_info = {'date': '02.05.2025',
'time_begin': ['01.05.2025 22:05:30', '01.05.2025 23:38:40'],
'duration_sec': 93*60, 'type': 'step', 'type_ru': 'ступенчатое'}
cut_step_resp = {'time_step_begin': '02.05.2025 00:39:00', 'step_duration': 30*60}
data_info_list.append(data_info)
thermocycle_info_list.append(thermocycle_info)
cut_step_resp_list.append(cut_step_resp)
data_info = {'data': data, 'device': 'летный', 'channel': 'ch3', 'period': '1 мин',
'find_accuracy': 'seconds'}
thermocycle_info = {'date': '02.05.2025',
'time_begin': ['01.05.2025 22:05:30', '01.05.2025 23:38:40'],
'duration_sec': 93*60, 'type': 'step4_to3', 'type_ru': 'ступенчатое'}
cut_step_resp = {'time_step_begin': '02.05.2025 00:39:00', 'step_duration': 30*60}
data_info_list.append(data_info)
thermocycle_info_list.append(thermocycle_info)
cut_step_resp_list.append(cut_step_resp)
data_info = {'data': data, 'device': 'летный', 'channel': 'ch4', 'period': '1 мин',
'find_accuracy': 'seconds'}
thermocycle_info = {'date': '02.05.2025',
'time_begin': ['02.05.2025 01:12:30', '02.05.2025 02:46:02'],
'duration_sec': 93*60, 'type': 'impulse', 'type_ru': 'импульсное'}
cut_step_resp = {'time_step_begin': '02.05.2025 03:45:02', 'step_duration': 15*60}
data_info_list.append(data_info)
thermocycle_info_list.append(thermocycle_info)
cut_step_resp_list.append(cut_step_resp)
data_info = {'data': data, 'device': 'летный', 'channel': 'ch3', 'period': '1 мин',
'find_accuracy': 'seconds'}
thermocycle_info = {'date': '02.05.2025',
'time_begin': ['02.05.2025 01:12:30', '02.05.2025 02:46:02'],
'duration_sec': 93*60, 'type': 'impulse4_to3', 'type_ru': 'импульсное'}
cut_step_resp = {'time_step_begin': '02.05.2025 03:45:02', 'step_duration': 20*60}
data_info_list.append(data_info)
thermocycle_info_list.append(thermocycle_info)
cut_step_resp_list.append(cut_step_resp)
data_info = {'data': data, 'device': 'летный', 'channel': 'ch3', 'period': '1 мин', # interp = {'method': 'polynomial', 'order': 1}
'find_accuracy': 'seconds'}
thermocycle_info = {'date': '04.05.2025',
'time_begin': ['03.05.2025 22:12:11', '03.05.2025 23:45:10'],
'duration_sec': 93*60, 'type': 'step', 'type_ru': 'ступенчатое'}
cut_step_resp = {'time_step_begin': '04.05.2025 00:42:01', 'step_duration': 26*60}
data_info_list.append(data_info) # data_info_list = []
thermocycle_info_list.append(thermocycle_info) # thermocycle_info_list = []
cut_step_resp_list.append(cut_step_resp) # cut_step_resp_list = []
data_info = {'data': data, 'device': 'летный', 'channel': 'ch4', 'period': '1 мин', # data_info = {'data': data, 'device': 'летный', 'channel': 'ch1', 'period': '1 мин',
'find_accuracy': 'seconds'} # 'find_accuracy': 'seconds'}
thermocycle_info = {'date': '04.05.2025', # thermocycle_info = {'date': '25.04.2025',
'time_begin': ['03.05.2025 22:12:11', '03.05.2025 23:45:10'], # 'time_begin': ['24.04.2025 22:46:32', '25.04.2025 00:19:33'],
'duration_sec': 93*60, 'type': 'step3_to4', 'type_ru': 'ступенчатое'} # 'duration_sec': 92*60, 'type': 'step', 'type_ru': 'ступенчатое'}
cut_step_resp = {'time_step_begin': '04.05.2025 00:42:01', 'step_duration': 30*60} # cut_step_resp = {'time_step_begin': '25.04.2025 01:18:01', 'step_duration': 30*60}
data_info_list.append(data_info) # data_info_list.append(data_info)
thermocycle_info_list.append(thermocycle_info) # thermocycle_info_list.append(thermocycle_info)
cut_step_resp_list.append(cut_step_resp) # cut_step_resp_list.append(cut_step_resp)
data_info = {'data': data, 'device': 'летный', 'channel': 'ch3', 'period': '1 мин', # data_info = {'data': data, 'device': 'летный', 'channel': 'ch2', 'period': '1 мин',
'find_accuracy': 'seconds'} # 'find_accuracy': 'seconds'}
thermocycle_info = {'date': '04.05.2025', # thermocycle_info = {'date': '25.04.2025',
'time_begin': ['04.05.2025 01:19:10', '04.05.2025 02:52:11'], # 'time_begin': ['24.04.2025 22:46:32', '25.04.2025 00:19:33'],
'duration_sec': 93*60, 'type': 'impulse', 'type_ru': 'импульсное'} # 'duration_sec': 92*60, 'type': 'step1_to2', 'type_ru': 'ступенчатое'}
cut_step_resp = {'time_step_begin': '04.05.2025 03:48:01', 'step_duration': 15*60} # cut_step_resp = {'time_step_begin': '25.04.2025 01:18:01', 'step_duration': 30*60}
data_info_list.append(data_info) # data_info_list.append(data_info)
thermocycle_info_list.append(thermocycle_info) # thermocycle_info_list.append(thermocycle_info)
cut_step_resp_list.append(cut_step_resp) # cut_step_resp_list.append(cut_step_resp)
data_info = {'data': data, 'device': 'летный', 'channel': 'ch4', 'period': '1 мин',
'find_accuracy': 'seconds'}
thermocycle_info = {'date': '04.05.2025',
'time_begin': ['04.05.2025 01:19:10', '04.05.2025 02:52:11'],
'duration_sec': 93*60, 'type': 'impulse3_to4', 'type_ru': 'импульсное'}
cut_step_resp = {'time_step_begin': '04.05.2025 03:48:01', 'step_duration': 20*60}
data_info_list.append(data_info) # data_info = {'data': data, 'device': 'летный', 'channel': 'ch1', 'period': '1 мин',
thermocycle_info_list.append(thermocycle_info) # 'find_accuracy': 'seconds'}
cut_step_resp_list.append(cut_step_resp) # thermocycle_info = {'date': '25.04.2025',
# 'time_begin': ['25.04.2025 01:52:34', '25.04.2025 03:25:34'],
# 'duration_sec': 92*60, 'type': 'impulse', 'type_ru': 'импульсное'}
# cut_step_resp = {'time_step_begin': '25.04.2025 04:24:00', 'step_duration': 15*60}
# data_info_list.append(data_info)
# thermocycle_info_list.append(thermocycle_info)
# cut_step_resp_list.append(cut_step_resp)
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch2', 'period': '1 мин',
# 'find_accuracy2: 'seconds'}
# thermocycle_info = {'date': '25.04.2025',
# 'time_begin': ['25.04.2025 01:52:34', '25.04.2025 03:25:34'],
# 'duration_sec': 92*60, 'type': 'impulse1_to2', 'type_ru': 'импульсное'}
# cut_step_resp = {'time_step_begin': '25.04.2025 04:24:00', 'step_duration': 20*60}
# data_info_list.append(data_info)
# thermocycle_info_list.append(thermocycle_info)
# cut_step_resp_list.append(cut_step_resp)
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch2', 'period': '1 мин',
# 'find_accuracy': 'seconds'}
# thermocycle_info = {'date': '30.04.2025',
# 'time_begin': ['29.04.2025 22:02:54', '29.04.2025 23:35:54'],
# 'duration_sec': 93*60, 'type': 'step', 'type_ru': 'ступенчатое'}
# cut_step_resp = {'time_step_begin': '30.04.2025 00:36:01', 'step_duration': 30*60}
# data_info_list.append(data_info)
# thermocycle_info_list.append(thermocycle_info)
# cut_step_resp_list.append(cut_step_resp)
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch1', 'period': '1 мин',
# 'find_accuracy': 'seconds'}
# thermocycle_info = {'date': '30.04.2025',
# 'time_begin': ['29.04.2025 22:02:54', '29.04.2025 23:35:54'],
# 'duration_sec': 93*60, 'type': 'step2_to1', 'type_ru': 'ступенчатое'}
# cut_step_resp = {'time_step_begin': '30.04.2025 00:36:01', 'step_duration': 30*60}
# data_info_list.append(data_info)
# thermocycle_info_list.append(thermocycle_info)
# cut_step_resp_list.append(cut_step_resp)
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch2', 'period': '1 мин',
# 'find_accuracy': 'seconds'}
# thermocycle_info = {'date': '30.04.2025',
# 'time_begin': ['30.04.2025 01:09:55', '30.04.2025 02:41:54'],
# 'duration_sec': 93*60, 'type': 'impulse', 'type_ru': 'импульсное'}
# cut_step_resp = {'time_step_begin': '30.04.2025 03:42:00', 'step_duration': 15*60}
# data_info_list.append(data_info)
# thermocycle_info_list.append(thermocycle_info)
# cut_step_resp_list.append(cut_step_resp)
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch1', 'period': '1 мин',
# 'find_accuracy': 'seconds'}
# thermocycle_info = {'date': '30.04.2025',
# 'time_begin': ['30.04.2025 01:09:55', '30.04.2025 02:41:54'],
# 'duration_sec': 93*60, 'type': 'impulse2_to1', 'type_ru': 'импульсное'}
# cut_step_resp = {'time_step_begin': '30.04.2025 03:42:00', 'step_duration': 20*60}
# data_info_list.append(data_info)
# thermocycle_info_list.append(thermocycle_info)
# cut_step_resp_list.append(cut_step_resp)
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch4', 'period': '1 мин',
# 'find_accuracy': 'seconds'}
# thermocycle_info = {'date': '02.05.2025',
# 'time_begin': ['01.05.2025 22:05:30', '01.05.2025 23:38:40'],
# 'duration_sec': 93*60, 'type': 'step', 'type_ru': 'ступенчатое'}
# cut_step_resp = {'time_step_begin': '02.05.2025 00:39:00', 'step_duration': 30*60}
# data_info_list.append(data_info)
# thermocycle_info_list.append(thermocycle_info)
# cut_step_resp_list.append(cut_step_resp)
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch3', 'period': '1 мин',
# 'find_accuracy': 'seconds'}
# thermocycle_info = {'date': '02.05.2025',
# 'time_begin': ['01.05.2025 22:05:30', '01.05.2025 23:38:40'],
# 'duration_sec': 93*60, 'type': 'step4_to3', 'type_ru': 'ступенчатое'}
# cut_step_resp = {'time_step_begin': '02.05.2025 00:39:00', 'step_duration': 30*60}
# data_info_list.append(data_info)
# thermocycle_info_list.append(thermocycle_info)
# cut_step_resp_list.append(cut_step_resp)
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch4', 'period': '1 мин',
# 'find_accuracy': 'seconds'}
# thermocycle_info = {'date': '02.05.2025',
# 'time_begin': ['02.05.2025 01:12:30', '02.05.2025 02:46:02'],
# 'duration_sec': 93*60, 'type': 'impulse', 'type_ru': 'импульсное'}
# cut_step_resp = {'time_step_begin': '02.05.2025 03:45:02', 'step_duration': 15*60}
# data_info_list.append(data_info)
# thermocycle_info_list.append(thermocycle_info)
# cut_step_resp_list.append(cut_step_resp)
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch3', 'period': '1 мин',
# 'find_accuracy': 'seconds'}
# thermocycle_info = {'date': '02.05.2025',
# 'time_begin': ['02.05.2025 01:12:30', '02.05.2025 02:46:02'],
# 'duration_sec': 93*60, 'type': 'impulse4_to3', 'type_ru': 'импульсное'}
# cut_step_resp = {'time_step_begin': '02.05.2025 03:45:02', 'step_duration': 20*60}
# data_info_list.append(data_info)
# thermocycle_info_list.append(thermocycle_info)
# cut_step_resp_list.append(cut_step_resp)
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch3', 'period': '1 мин',
# 'find_accuracy': 'seconds'}
# thermocycle_info = {'date': '04.05.2025',
# 'time_begin': ['03.05.2025 22:12:11', '03.05.2025 23:45:10'],
# 'duration_sec': 93*60, 'type': 'step', 'type_ru': 'ступенчатое'}
# cut_step_resp = {'time_step_begin': '04.05.2025 00:42:01', 'step_duration': 26*60}
# data_info_list.append(data_info)
# thermocycle_info_list.append(thermocycle_info)
# cut_step_resp_list.append(cut_step_resp)
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch4', 'period': '1 мин',
# 'find_accuracy': 'seconds'}
# thermocycle_info = {'date': '04.05.2025',
# 'time_begin': ['03.05.2025 22:12:11', '03.05.2025 23:45:10'],
# 'duration_sec': 93*60, 'type': 'step3_to4', 'type_ru': 'ступенчатое'}
# cut_step_resp = {'time_step_begin': '04.05.2025 00:42:01', 'step_duration': 30*60}
# data_info_list.append(data_info)
# thermocycle_info_list.append(thermocycle_info)
# cut_step_resp_list.append(cut_step_resp)
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch3', 'period': '1 мин',
# 'find_accuracy': 'seconds'}
# thermocycle_info = {'date': '04.05.2025',
# 'time_begin': ['04.05.2025 01:19:10', '04.05.2025 02:52:11'],
# 'duration_sec': 93*60, 'type': 'impulse', 'type_ru': 'импульсное'}
# cut_step_resp = {'time_step_begin': '04.05.2025 03:48:01', 'step_duration': 15*60}
# data_info_list.append(data_info)
# thermocycle_info_list.append(thermocycle_info)
# cut_step_resp_list.append(cut_step_resp)
# data_info = {'data': data, 'device': 'летный', 'channel': 'ch4', 'period': '1 мин',
# 'find_accuracy': 'seconds'}
# thermocycle_info = {'date': '04.05.2025',
# 'time_begin': ['04.05.2025 01:19:10', '04.05.2025 02:52:11'],
# 'duration_sec': 93*60, 'type': 'impulse3_to4', 'type_ru': 'импульсное'}
# cut_step_resp = {'time_step_begin': '04.05.2025 03:48:01', 'step_duration': 20*60}
# data_info_list.append(data_info)
# thermocycle_info_list.append(thermocycle_info)
# cut_step_resp_list.append(cut_step_resp)
def get_step_response(data_info, thermocycle_info, cut_step_resp): def get_step_response(data_info, thermocycle_info, cut_step_resp):
name = f'{data_info["channel"]}_{thermocycle_info["type"]}_response_{data_info["device"]}_{thermocycle_info["date"].replace(".","")}' name = f'{data_info["channel"]}_{thermocycle_info["type"]}_response_{data_info["device"]}_{thermocycle_info["date"].replace(".","")}'
plot_info = {'title': 'Реакция на ' + thermocycle_info['type_ru'] + ' воздействие', plot_info = {'title': 'Реакция на ' + thermocycle_info['type_ru'] + ' воздействие',
'ox_dtime_format': "%H:%M:%S", 'legend_pos': ['upper left', 'lower left'], 'ox_dtime_format': "%H:%M", 'legend_pos': ['upper left', 'lower left'],
'name_fig': f'../plots/response/{name}.png', 'font': 10} 'name_fig': f'../plots/response/{name}.png', 'font': 10}
asotr.plot_step_response_in_thermocycle(data_info, thermocycle_info, interp, asotr.plot_step_response_in_thermocycle(data_info, thermocycle_info, interp,
@@ -270,7 +289,7 @@ def get_step_response(data_info, thermocycle_info, cut_step_resp):
title = f'{plot_info["title"]}, канал {data_info["channel"][2]} АСОТР, {data_info["device"]} СПИН-X1-МВН, период опроса {data_info["period"]} ({thermocycle_info["date"]})' title = f'{plot_info["title"]}, канал {data_info["channel"][2]} АСОТР, {data_info["device"]} СПИН-X1-МВН, период опроса {data_info["period"]} ({thermocycle_info["date"]})'
fig = plt.figure(figsize=(10, 6), dpi=200) fig = plt.figure(figsize=(6, 10), dpi=200)
fig.suptitle(title, fontsize=plot_info['font']) fig.suptitle(title, fontsize=plot_info['font'])
ax1 = fig.add_subplot(1,1,1) ax1 = fig.add_subplot(1,1,1)
@@ -282,8 +301,8 @@ def get_step_response(data_info, thermocycle_info, cut_step_resp):
ax1.legend(loc=plot_info["legend_pos"][0], fontsize=plot_info['font']) ax1.legend(loc=plot_info["legend_pos"][0], fontsize=plot_info['font'])
ax1.grid(True) ax1.grid(True)
ax1.tick_params(axis='both', width=1, labelsize=plot_info['font']) ax1.tick_params(axis='both', width=1, labelsize=plot_info['font'])
ax1.set_ylabel(r'$T_{norm}$, $^\circ$C', fontsize=plot_info['font']) ax1.set_ylabel(r'$T_{норм}$, $^\circ$C', fontsize=plot_info['font'])
ax1.set_xlabel('Время, ЧЧ:MM:CC', fontsize=plot_info['font']) ax1.set_xlabel('Время, ЧЧ:MM', fontsize=plot_info['font'])
plt.tight_layout() plt.tight_layout()
fig.savefig(plot_info["name_fig"]) fig.savefig(plot_info["name_fig"])

View File

@@ -102,7 +102,7 @@ ax1.xaxis.set_major_formatter(date_formatter)
ax1.legend(loc=plot_info["legend_pos"][0], fontsize=plot_info['font']) ax1.legend(loc=plot_info["legend_pos"][0], fontsize=plot_info['font'])
ax1.grid(True) ax1.grid(True)
ax1.tick_params(axis='both', width=1, labelsize=plot_info['font']) ax1.tick_params(axis='both', width=1, labelsize=plot_info['font'])
ax1.set_ylabel(r'$T_{norm}$, $^\circ$C', fontsize=plot_info['font']) ax1.set_ylabel(r'$T_{норм}$, $^\circ$C', fontsize=plot_info['font'])
ax1.set_xlabel('Время', fontsize=plot_info['font']) ax1.set_xlabel('Время', fontsize=plot_info['font'])
plt.tight_layout() plt.tight_layout()

View File

@@ -15,7 +15,7 @@ path_itog_brd_data = '../data/brd_data/'
class PathFileNotFound(Exception): class PathFileNotFound(Exception):
pass pass
# recursive search files by pattern in specified directory
def find_required_files(root_dir, pattern): def find_required_files(root_dir, pattern):
result = [] result = []
for dirpath, _, filenames in os.walk(root_dir): for dirpath, _, filenames in os.walk(root_dir):
@@ -30,7 +30,7 @@ def find_required_files(root_dir, pattern):
return sorted(result) return sorted(result)
# read all finded files into pandas dataFrame
def read_files_into_df(fname_list, column_list, dtype_columns={}): def read_files_into_df(fname_list, column_list, dtype_columns={}):
data_itog = pd.DataFrame() data_itog = pd.DataFrame()
epoch_start = pd.Timestamp('2000-01-01') epoch_start = pd.Timestamp('2000-01-01')
@@ -89,7 +89,7 @@ if __name__ == "__main__":
column_list = ['TIME', 'PER_1Hz', 'ST_HV'] column_list = ['TIME', 'PER_1Hz', 'ST_HV']
column_list_itog = ['TIME', 'timestamp', 'PER_1Hz', 'ST_HV'] column_list_itog = ['TIME', 'timestamp', 'PER_1Hz', 'ST_HV']
collect_tm_brd_files(root_dir_tm_data, column_list, column_list_itog) # collect_tm_brd_files(root_dir_tm_data, column_list, column_list_itog)
## plot 'evolution' 1 Hz from tm brd data ## plot 'evolution' 1 Hz from tm brd data
print('plot evolution 1 Hz from tm brd data') print('plot evolution 1 Hz from tm brd data')
@@ -97,5 +97,7 @@ if __name__ == "__main__":
fname = path_itog_brd_data + 'mvn_tm_brd01.csv' fname = path_itog_brd_data + 'mvn_tm_brd01.csv'
df = pd.read_csv(fname, sep=';', parse_dates=['timestamp'], date_format="%d.%m.%Y %H:%M:%S.%f") df = pd.read_csv(fname, sep=';', parse_dates=['timestamp'], date_format="%d.%m.%Y %H:%M:%S.%f")
# print(df)
plt.plot(df['timestamp'], df['PER_1Hz'], '.') plt.plot(df['timestamp'], df['PER_1Hz'], '.')
plt.grid()
plt.show() plt.show()

View File

@@ -3,13 +3,18 @@ import os
import re import re
from pathlib import Path from pathlib import Path
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
from matplotlib import dates
from datetime import datetime, timedelta from datetime import datetime, timedelta
import sys import sys
import seaborn as sns
tstamp_s = '%d.%m.%Y %H:%M:%S.%f' tstamp_s = '%d.%m.%Y %H:%M:%S.%f'
ox_dtime_format = '%d.%m.%Y %H:%M' ox_dtime_format = '%H:%M'
ox_date_format = '%d.%m.%Y'
path_itog_brd_data = '../data/brd_data/' path_itog_brd_data = '../data/brd_data/'
pict_name = '../plots/' + 'MVN_wheel'
font = 16
class PathFileNotFound(Exception): class PathFileNotFound(Exception):
@@ -92,23 +97,64 @@ if __name__ == "__main__":
column_list = ['TIME', 'STATE'] column_list = ['TIME', 'STATE']
column_list_itog = ['TIME', 'timestamp', 'STATE'] column_list_itog = ['TIME', 'timestamp', 'STATE']
collect_tm_brd_wheel_data(root_dir_wheel_data, column_list, column_list_itog) # collect_tm_brd_wheel_data(root_dir_wheel_data, column_list, column_list_itog)
## parse and plot wheel csv data ## parse and plot wheel csv data
print('parse and plot wheel csv data') print('parse and plot wheel csv data')
border_clr_wheel = 2 border_clr_wheel = 1
fname = path_itog_brd_data + 'mvn_wheel_brd01.csv' fname = path_itog_brd_data + 'mvn_wheel_brd01.csv'
wheel_df = pd.read_csv(fname, sep=';') wheel_df = pd.read_csv(fname, sep=';', parse_dates=['timestamp'], date_format="%d.%m.%Y %H:%M:%S.%f")
## diff between 0 and 0 - 30 sec
wheel_df['TIME_diff'] = wheel_df['TIME'].diff() wheel_df['TIME_diff'] = wheel_df['TIME'].diff()
median_tdiff = wheel_df['TIME_diff'].median()
wheel_df_clear = wheel_df[(wheel_df['TIME_diff'] > median_tdiff - border_clr_wheel) & ## sampling decimation in order to get period 60 sec
(wheel_df['TIME_diff'] < median_tdiff + border_clr_wheel)] wheel_df = wheel_df.iloc[1::2]
wheel_df['TIME_period'] = wheel_df['TIME'].diff()
# print(wheel_df)
median_tdiff = wheel_df['TIME_period'].median()
# print(median_tdiff)
wheel_df_peaks = wheel_df[(wheel_df['TIME_diff'] <= median_tdiff - border_clr_wheel) | ## discard outliers of the measured wheel period
(wheel_df['TIME_diff'] >= median_tdiff + border_clr_wheel)] wheel_df = wheel_df[
(wheel_df['TIME_period'] > median_tdiff - border_clr_wheel) &
(wheel_df['TIME_period'] < median_tdiff + border_clr_wheel)]
median = wheel_df['TIME_period'].median()
rows, cols = wheel_df.shape
median = pd.Series([median] * rows)
date_format = dates.DateFormatter(ox_date_format)
datetime_format = dates.DateFormatter(ox_dtime_format)
fig, axes = plt.subplots(3, 1, figsize=(18, 20), dpi=300, height_ratios=[1, 1, 1])
axes[0].plot(wheel_df['timestamp'], wheel_df['TIME_period'], '.',
markersize=5)
axes[0].plot(wheel_df['timestamp'], median)
axes[0].set_title("")
axes[0].set_xlabel("Время (ДД.MM.ГГГГ)", fontsize=font)
axes[0].set_ylabel("Полупериод, сек", fontsize=font)
axes[0].grid(True)
axes[0].xaxis.set_major_formatter(date_format)
axes[0].tick_params(axis="both", width=1, labelsize=font)
axes[1].plot(wheel_df['timestamp'][0:400], wheel_df['TIME_period'][0:400], '.', markersize=10)
axes[1].set_title("")
axes[1].set_xlabel("Время (ЧЧ:ММ)", fontsize=font)
axes[1].set_ylabel("Полупериод, сек", fontsize=font)
axes[1].grid(True)
axes[1].xaxis.set_major_formatter(datetime_format)
axes[1].tick_params(axis="both", width=1, labelsize=font)
sns.histplot(wheel_df['TIME_period'], kde=False, bins=300, ax=axes[2], color='red')
axes[2].set_title("")
axes[2].set_xlabel("Полупериод, сек", fontsize=font)
axes[2].set_ylabel("Частота встречаемости", fontsize=font)
axes[2].grid(True)
axes[2].tick_params(axis="both", width=1, labelsize=font)
fig.savefig(pict_name)
plt.plot(wheel_df_clear['TIME'], wheel_df_clear['TIME_diff'], '-')
plt.plot(wheel_df_peaks['TIME'], wheel_df_peaks['TIME_diff'], '.')
plt.show() plt.show()