Analizator plików Air Kontroler Spider

wykres3Po otrzymaniu na testy urządzenia Air Kontroler Spider z zapisem na karcie SD, niezwłocznie przystąpiłem do testów. Urządzenie użytkuję już przez jakiś czas, jednak zabrakło mi w nim oprogramowania analizującego dane. Postanowiłem więc, że taki program napisze sobie sam. Co prawda pliki wynikowe generowane przez urządzenie to zwykły plik tekstowy CSV, co pozwala na swobodne analizowanie danych np. w Excelu, jednak wymaga to znajomości samego Excela. Mój program odczytuje plik urządzenia i przedstawia wyniki w formie wykresu. Głównym założeniem programu było stworzenie kodu początkowego. Resztę zostawiam wszystkim chętnym programistom. Udostępniam pełny kod źródłowy wraz z opisami jak przystąpić do jego rozbudowy. Licencja na program jest darmowa. Można kopiować go ile chcecie, modyfikować, ulepszać, poprawiać, etc. Warunkiem jest tylko jego darmowa dystrybucja – oraz konieczność udostępniania zmodyfikowanych przez was źródeł.

Program możecie zainstalować lub pobrać TUTAJ.

Przykładowy plik loga pobierz tutaj.
(Dane loga są wymyślone i nie wizualizują wzrostu EGT i CHT do RPM)

Wymagania: Windows XP lub nowszy, biblioteka .NET Framework 4.0.

 

Uruchom setup

Uruchom setup

Po uruchomieniu z pulpitu, zobaczycie okno główne programu analizatora.

Okno główne programu

Okno główne programu

Z menu pliki, należy wskazać plik logu urządzenia. Po włożeniu do czytnika karty wyjętej z urządzenia, pliki można wczytywać bezpośrednio z karty. W przeciwnym wypadku należy skopiować pliki log do wybranego folderu. Po wczytaniu, dane logu pojawią się w tabeli jak poniżej.

Wczytany przykładowy log

Wczytany przykładowy log

Program analizuje nagłówek loga by sprawdzić, czy plik jest zgodny z zamierzeniami producenta. W dole ekranu, wskazany jest czas utworzenia pliku oraz interwał pomiaru.

Teraz wystarczy użyć opcji Wykresy->Rysuj wykres.

Przykładowy wykres

Przykładowy wykres

Domyślnie przeprowadzana jest analiza danych: EGT, CHT oraz RPM. Oś X oznacza próbkowanie, zaś Y – temperaturę. Najechanie wskaźnikiem myszy na punkt wykresu wyświetli informację o próbce oraz wartości pomiaru.

Opis opcji okna wykresu:

  • Typ wykresu – można wybrać jeden z kilku typów wykresu.
  • Rozdzielczość X – to dopasowanie podziałki wykresu w zależności od ilości próbek.
  • Rozdzielczość Y – dopasowanie podziałki osi temperatury.
  • Drukuj – Włącza okno podglądu wydruku i umożliwia wydruk wykresu na drukarce.
Przykładowy wykres

Przykładowy wykres kolumnowy

Wykres liniowy

Wykres liniowy

 

W opcji Wykresy -> Konfiguracja można zaznaczyć lub odznaczyć serie, które są niepotrzebne.

Zmiany:

12-10-2013 – Dodałem pasek przewijania do przeglądania długich plików log.

 

Sekcja techniczna – dla programistów.
Użytkownicy nieprogramujący mogą pominąć poniższy tekst.

Program napisany został przy użyciu darmowego środowiska programistycznego Visual Studio Express 2012 for Desktop w języku C# oraz skompilowany z użyciem biblioteki .NET Framework 4.0 (dla kompatybilności z Windows XP). Środowisko programistyczne można pobrać za darmochę.

Pobierz źródło programu.

Dokumentacja źródeł:

Najpierw definicje zmiennych publicznych:

public partial class Spiderlog : Form
{
protected string FileName;
bool zaladowany;
public DataTable dt = new DataTable();

  •  Zaladowany: false, gdy plik loga nie jest wczytany do programu.
  • dt – tablica (DataTable), do której ładujemy dane pliku CSV. Z tej tablicy korzysta tez kontrolka MS Chart.

Metoda odczytująca plik CSV oddzielony przecinkiem i wrzucająca oddzielone dane do tabeli dt wygląda następująco. Proszę zwrócić uwagę na kontrolę nagłówka (gdyby producent urządzenia coś w przyszłości zmienił)

W tablicy Lines mamy wczytany kompletny plik loga a do poszczególnej linii odwołujemy się poprzez podanie indeksu tablicy Lines[x], gdzie x, to linia pliku log. Metoda sama dobiera sobie pola dataGridView w zależności od pliku, więc jeśli producent w przyszłości dorzuci jeszcze jakieś pola, program nie będzie miał problemów z odczytem.
private bool ReadFile(string filename)
{
string[] Lines = File.ReadAllLines(filename);
string[] Fields;
if (Lines[0] != "AIR CONTROLLER LOG FILE Version 1.00")
{
MessageBox.Show("To nie jest poprawny nagłówek pliku log urządzenia SPIDER!");
} else
{
statusStrip1.Items[0].Text = Lines[1];
statusStrip1.Items[1].Text = Lines[2];
Fields = Lines[3].Split(new char[] { ',' });
int Cols = Fields.GetLength(0);


// Najpierw utworzymy nagłówek z pliku zawarty w zmiennej Fields[]
for (int i = 0; i < Cols; i++)
dt.Columns.Add(Fields[i].ToUpper(), typeof(string));
// Teraz wczytujemy dane do DataTable
DataRow Row;
for (int i = 4; i < Lines.GetLength(0); i++)
{
Fields = Lines[i].Split(new char[] { ',' }); // Tu jest oznaczenie oddzielenie kolumn przecinkiem
Row = dt.NewRow();
for (int f = 0; f < Cols; f++)
Row[f] = Fields[f];
dt.Rows.Add(Row);
}
return true;
} return false;
}

Rysowanie wykresu Wykresy->Rysuj wykres.

Rozważałem użycie różnych komponentów, ale po co się męczyć, jeśli od Net Framework 3.5 mamy komponent MS Chart. Można także z powodzeniem użyć ZedGraph – jest fajnie opisany.

public void RysujWykres()
{
Wykresy wyk = new Wykresy();
wyk.chart1.ChartAreas.Add("seria1"); // Dodajemy jedną serię danych do wykresu.
wyk.chart1.ChartAreas["seria1"].AxisX.Interval = 1; // Domyślnie interwał na wykresie wynosi 1
wyk.chart1.ChartAreas["seria1"].AxisX.Minimum = 1; // Minimalna wartość osi X
wyk.chart1.ChartAreas["seria1"].AxisX.Maximum = dt.Rows.Count; // Max X to ilość próbek czyli ilość rekordów dt.
wyk.chart1.ChartAreas["seria1"].AxisX.Title = "Próbka"; // Dowolna nazwa osi X
wyk.chart1.ChartAreas["seria1"].AxisY.Title = "Temperatura"; // Dowolna nazwa osi Y
//wyk.chart1.ChartAreas["seria1"].AxisY.Interval = 50; // Domyślny interwał osi Y


wyk.chart1.Series.Add("Temp. CHT"); // Dodajemy serię danych CHT.
wyk.chart1.Series["Temp. CHT"].ChartType = (SeriesChartType)Enum.Parse(typeof(SeriesChartType), "Line");
wyk.chart1.Series["Temp. CHT"].Color = Color.Orange;  // Kolor linii wykresu CHT

wyk.chart1.Series.Add(„Temp. EGT”); // Dodajemuy serię danych EGT.
wyk.chart1.Series[„Temp. CHT”].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
wyk.chart1.Series[„Temp. EGT”].Color = Color.Red;  // Kolor linii wykresu EGT

wyk.chart1.Series.Add(„RPM”); // Dodajemuy serię danych RPM (obroty silnika).
wyk.chart1.Series[„Temp. CHT”].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
wyk.chart1.Series[„RPM”].Color = Color.Green;  // Kolor linii wykresu RPM

for (int i = 0; i < dt.Rows.Count; i++) // Teraz dodajemy serie – w zależności od konfiguracji!!!
{
if (SpiderLog.Properties.Settings.Default.czyEGT) wyk.chart1.Series[„Temp. EGT”].Points.AddXY(i, dt.Rows[i][5]);
if (SpiderLog.Properties.Settings.Default.czyCHT) wyk.chart1.Series[„Temp. CHT”].Points.AddXY(i, dt.Rows[i][4]);
if (SpiderLog.Properties.Settings.Default.czyRPM) wyk.chart1.Series[„RPM”].Points.AddXY(i, dt.Rows[i][3]);
}
wyk.ShowDialog(); // Wyświetlamy okno wykresy.
}

Uwagi wymaga konfiguracja programu, która jest zapisywana w SpiderLog.Properties.Settings.Default. Tutaj możecie dowolnie kombinować. Może ktoś doda inne dane konfiguracyjne?

A oto konfiguracja:

Konfiguracja programu służy do wybierania serii wykresu. Zdążyłem dodać tylko 3 serie, ale możecie to zmienić…

Konfiguracja

Konfiguracja

Zaraz po utworzeniu okna, wywoływana jest metoda odczytu konfiguracji i przypisania wartości początkowych dla przycisków:
 private void ustawienia_Load(object sender, EventArgs e)
{
checkCHT.Checked = SpiderLog.Properties.Settings.Default.czyCHT;
checkEGT.Checked = SpiderLog.Properties.Settings.Default.czyEGT;
checkRPM.Checked = SpiderLog.Properties.Settings.Default.czyRPM;
}

Oczywiście można to zrobić jeszcze prościej – w środowisku VS:

Inna metoda przypisania

Inna metoda przypisania

Ja jednak wolę metodę bardziej pracochłonną – zboczenie od starego C++, gdzie mam źródła pod kontrolą i lepiej to ogarniam.

Pod przyciskiem Zapisz (konfigurację), kryje się metoda:
private void bt_zapisz_Click(object sender, EventArgs e)
{
SpiderLog.Properties.Settings.Default.czyCHT = checkCHT.Checked;
SpiderLog.Properties.Settings.Default.czyEGT = checkEGT.Checked;
SpiderLog.Properties.Settings.Default.czyRPM = checkRPM.Checked;
SpiderLog.Properties.Settings.Default.Save();
Close();
}

Jeśli więc chcesz dodać nową opcję konfiguracyjną, zrób tak:

Najpierw dodaj opcję w Menu Projekt->Właściwości SpiderLog -> zakładka Ustawienia.

Nazwa – nazwa opcji, typ – tym zmiennej konfiguracyjnej, zakres – użytkownik, wartość – wartość początkowa opcji.

Potem dodaj w oknie konfiguracji odpowiednią kontrolkę, np. pole CheckBox, RadioButton, itp. i przypisz wartość Chcecked w środowisku VS lub programowo:

odczyt (metoda ustawienia_Load): NazwaTwojejKontrolki.Checked = SpiderLog.Properties.Settings.Default.NazwaTwojejZmiennej;

zapis (metoda bt_zapisz_Click): SpiderLog.Properties.Settings.Default.NazwaTwojejZmiennej = NazwaTwojejKontrolki.Checked;
Jak dodać inne typy wykresów do programu?

Za definiowanie typów wykresów odpowiada metoda Wykresy_Load uruchamiana wraz z otwarciem okna wykresy. „Ręczne” przypisanie typu wykresu może wyglądać tak:

wyk.chart1.Series[„Nazwa_serii”].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line; <- mamy tu typ wykresu liniowego.

 private void Wykresy_Load(object sender, EventArgs e)
{
//TypWykresu.Items.AddRange(Enum.GetNames(typeof(SeriesChartType)));  // <- Tak można dodać wszystkie typy wykresów
// TypWykresu.Items.Remove("Column"); // Niektóre typy jednak nie będą działać, więc należy je tutaj ukryć.
TypWykresu.Items.Add("Line"); // Ja jednak wolę dodać ręcznie tylko kilka
TypWykresu.Items.Add("Point");
TypWykresu.Items.Add("Area");
TypWykresu.Items.Add("RangeColumn");
}

Należy zauważyć, że nie wszystkie typy wykresów będą współpracować i przy wyborze niektórych, program zawiesi swoje działanie. Dlatego dodałem dwa wiersze służące do załadowania do pola ComboBox wszystkich możliwych typów wykresów komponentu Chart, jednak program może zawiesić się, jeśli użytkownik wybierze typ wykresu, który nie jest przystosowany do naszych danych. Wówczas należy przetestować działanie wykresów i wyeliminować te, które nie działają. Do eliminacji służy następne polecenie: TypWykresu.Items.Remove(„Nazwa typu wykresu”); Poświęcając trochę czasu możesz jednak w łatwy sposób rozbudować program o dużą ilość dostępnych wykresów. Ja nie miałem czasu na zabawę z testowaniem, tylko po prostu dodałem ręcznie 3 typy wykresów. Jeśli zdecydujesz się na pracochłonne testy, to metoda ta będzie wyglądać tak:

 private void Wykresy_Load(object sender, EventArgs e)
{
TypWykresu.Items.AddRange(Enum.GetNames(typeof(SeriesChartType)));  // <- Tak można dodać wszystkie typy wykresów
TypWykresu.Items.Remove("Nazwa1"); // Niektóre typy jednak nie będą działać, więc należy je tutaj ukryć.
TypWykresu.Items.Remove("Nazwa2");
TypWykresu.Items.Remove("Nazwa3");
}

I po sprawie – będą wszystkie typy wykresów. Tylko pamiętaj o dołożeniu Remove dla każdego niedziałającego typu wykresu.

Przydałoby się też dodać konfigurację grubości linii i wybór kolorów wykresów. Ale to już pozostawiam Wam 🙂

Na koniec Publikujemy projekt i udostępniamy użytkownikom.

To chyba wszystko.

Życzę miłej zabawy z programowaniem 🙂

W razie pytań odnośnie programowania, piszcie: leszek.klich@gmail.com

Leszek Klich

Otagowano .Dodaj do zakładek Link.

Możliwość komentowania została wyłączona.