Wizualizacja danych sensorycznych

Transkrypt

Wizualizacja danych sensorycznych
Wizualizacja danych sensorycznych
Oprogramowanie do sterowania i wizualizacji działania przetwornicy sterowanej
mikrokontrolerem
Paweł Kaczmarek
nr albumu: 163174
15 czerwca 2010
Spis treści
1 Opis projektu
2
2 Opis programu
2.1 Zapis ustawień . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
3
3 Opis interfejsu użytkownika
3.1 Główne okno programu . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2 Okno ustawień komunikacji . . . . . . . . . . . . . . . . . . . . . . . .
3.3 Okno pomiarowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
3
6
7
4 Komunikacja
4.1 Cel komunikacji i opis wybranych rozwiązań . . . . . . . . . . . . . . .
4.2 Modbus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3 Rejestry Modbus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
8
8
9
5 Podsumowanie
11
1
1 Opis projektu
Tematem projektu jest stworzenie oprogramowania do sterowania i wizualizacji działania czterokanałowej przetwornicy step - down realizowanej w ramach projektu Sterowniki Robotów, prowadzonego przez dra inż. Marka Wnuka. Przetwornica sterowana
jest mikrokontrolerem MC9S08JM32CLD z rdzeniem HC9S08, ponadto w projekcie
wykorzystywane są przetwornice LM2596ADJ o regulowanym napięciu wyjściowym i
prądzie maksymalnym 3A, halotronowe czujniki natężenia prądu ACS712 (o wyjściu
analogowym) oraz czujnik temperatury TC74 (komunikacja za pomocą interfejsu I 2C)
.
Ukończone oprogramowanie urządzenia ma pozwolić na:
• Pełną kontrolę pracy przetwornicy podczas połączenia z komputerem (zdalne
włączanie/wyłączanie kanałów, włączanie/wyłączanie monitorowania kanałów,
zadawanie alarmowej i maksymalnej temperatury pracy, zadawanie napięcia oraz
jego dopuszczalnej odchyłki i maksymalnego prądu na każdym z kanałów
• Zadanie parametrów do pracy samodzielnej (zapisywanych w pamięci FLASH
µC), pozwalających to na włączenie z zadanymi parametrami pracy zaraz po
włączeniu zasilania)
• Wizualizację przebiegów czasowych napięć, prądów i temperatury urządzenia
• Wyświetlanie statusu urządzenia (aktualne błędy, ich resetowanie)
Najistotniejsze elementy projektu to:
• Stworzenie okienkowej aplikacji sterującej (Qt4)
• Implementacja opcji sterujących
• Uruchomienie komunikacji z mikrokontrolerem (podstawowe funkcje protokołu
Modbus - zapis i odczyt n rejestrów)
• Wizualizacja działania przetwornicy (Qwt)
2 Opis programu
Stworzone oprogramowanie składa się z dwóch dwóch zasadniczych części jakimi są
interfejs użytkownika zapewniający możliwość zmiany parametrów pracy i wyświetlenia
aktualnego stanu przetwornicy oraz moduł komunikacji, oparty o protokołów Modbus
- oba zagadnienia opisane są szczegółowo w kolejnych rozdziałach. Oprócz stworzonych
własnoręcznie modułów i standardowych bibliotek Qt wykorzystane zostały biblioteki
Qwt oraz qextserialport. Schemat blokowy stworzonego programu przedstawiony jest
na rysunku 1, zaś diagram UML, ze względu na swoje rozmiary umieszczony został w
pliku z materiałami dodatkowymi.
2
2.1 Zapis ustawień
Biblioteka Qt4 dostarcza niezwykle użyteczne narzędzie do zapisu ustawień oprogramowania. Za pomocą klasy QSettings zapisać można (do pliku lub w standardowej dla
systemu operacyjnego lokalizacji) dowolne parametry oprogramowania - od rozmiaru
okien, przez zaznaczone komponenty, aż po przechowywane wartości liczbowe. W stworzonym programie możliwości klasy zostały wykorzystane do zapisu 3 grup ustawień:
• ”Rej” - zawartość pierwszych 12 rejestrów protokołu Modbus (zadane parametry
pracy)
• ”Kom” - ustawienia związane z komunikacja z µC, m.in. częstotliwość wymiany
danych czy tryb wysyłania sterowań
• ”Wyk” - ustawienia związane z wyświetlanymi wykresami (które wartości, zakres
osi)
3 Opis interfejsu użytkownika
Graficzny interfejs aplikacji ma pozwalać na realizację całej opisanej powyżej funkcjonalności, składa się ona z 3 okienek stworzonych z wykorzystaniem zintegrowanego
środowiska programistycznego Qt Creator oraz narzędzia do projektowania interfejsów
graficznych Qt Designer.
3.1 Główne okno programu
Rysunek 2 przedstawia główne okno sterujące aplikacją. Zapewnia ono następującą
funkcjonalność:
• Włączenie/wyłączenie wszystkich kanałów
• Włączenie/wyłączenie monitorowania wszystkich kanałów
• Włączanie/wyłączanie każdego kanału z osobna
• Włączanie/wyłączanie monitorowania każdego kanału z osobna
• Zadawanie alarmowej i powodującej wyłączenie temperatury pracy przetwornicy
• Zadawanie zadanego napięcia, jego dopuszczalnej odchyłki oraz maksymalnego
prądy dla każdego z kanałów
• Wywołanie okna ustawień komunikacji (Ustawienia → Ustawienia komunikacji)
• Wywołanie okna rejestracji pomiarów (ikona wykresu na pasku narzędziowym)
• Polecenie żądania pobrania danych od przetwornicy (ikona odświeżania na pasku
narzędziowym)
• Polecenie żądania przesłania sterowania do przetwornicy (ikona strzałki na pasku
narzędziowym)
3
4
Rysunek 1: Schemat blokowy oprogramowania
5
Rysunek 2: Główne okno interfejsu użytkownika
Rysunek 3: Okno ustawień komunikacji
• Wysłanie do programu specjalnych komend sterujących - włącz/wyłącz, reset
błędów, zapisz ustawienia w pamięci FLASH (Komendy sterujące → ...)
• Zapis i odczytanie aktualnych parametrów programu i jego okien (Ustawienia
programu → ...)
• Wyświetlanie aktualnie zmierzonych wartości
• Sygnalizowanie stanu urządzenia (błędów)
Opisane powyżej okno w pełni spełnia swoje zadania. Jedynym brakującym elementem jest stworzenie dodatkowego okna parametrów transmisji szeregowej - takich
jak prędkości, bit parzystości czy liczba bitów stopu - kolejna wersja oprogramowania
zostanie rozwinięta o tę funkcjonalność.
Problem podczas realizacji tej części projektu, było znalezienie optymalnego sposobu wyświetlania informacji o błędach. W Widgetach środowiska KDE znajduje się
kontrolka diody LED, która idealnie nadaje się do tego zastosowania, jednakże nie
powiodło się doinstalowywanie odpowiednich bibliotek, by uruchomić ją w środowisku GNOME (takie rozwiązanie wpłynęło by też negatywnie na przenośność kodu).
Zastosowanym rozwiązaniem jest użycie kontrolek QRadioButton, których w stanie
wyłączenia (brak błędów) nie da się kliknąć, zaś w stanie włączenia (wystąpił błąd)
po kliknięciu automatycznie włączają się z powrotem.
3.2 Okno ustawień komunikacji
Rysunek 3 przedstawia okno ustawień komunikacji. Zapewnia ono następującą funkcjonalność:
• Wybór pomiędzy pobieraniem danych pomiarowych okresowo lub jedynie po wydaniu polecenia
• Wybór częstotliwości pobierania danych
• Wybór trybu wysyłania nowych danych sterujących:
– Automatycznie po każdej zmianie parametrów pracy
– Tylko po ręcznym żądaniu przesłania
– Okresowo
• Wybór częstotliwości okresowego przesyłania danych sterujących
6
Rysunek 4: Okno przebiegów czasowych
Po zamknięciu okna i jego powtórnym uruchomieniu, zaznaczone opcje są zapamiętane.
3.3 Okno pomiarowe
Na rysunku 4 przedstawiono okno przebiegów czasowych przetwornicy. Wykres i legenda przebiegu wygenerowane są za pomocą klasy Wykres dziedziczącej klasę QwtPlot. Podstawa czasu wykresu tworzona jest w zależności od częstotliwości odbierania
nowych danych (może także przedstawiać pomiary w chwilach ręcznego wymuszenia
pobrania wartości). Oprócz wyświetlania przebiegów okno zapewnia następującą funkcjonalność:
• Wybór wyświetlanych przebiegów
• Wybór pomiędzy automatycznym dobraniem skali osi Y, a ręcznym zadaniem
zakresu
• Możliwość podania górnej i dolnej wartości zakresu osi Y
• Zmiana liczby wyświetlanych pomiarów
• Zapis pomiarów do pliku
7
• Podanie ścieżki do pliku zapisu pomiarów
Opcja zapisu pomiarów do pliku pozwala na zapisywanie w określonym pliku (gdy
plik istnieje wyniki dopisane będą na końcu, gdy nie istnieje zostanie stworzony) wartości kolejnych próbek przebiegów wybranych do wyświetlania (oraz podstawy czasu).
Liczba zapisanych próbek jest zgodna z podaną w oknie (lub równa liczbie dokonanych pomiarów, jeśli ta liczba jest mniejsza), a format zapisu to kolumny separowane
znakami tabulacji, co powoduje, że plik może być bardzo łatwo wczytany przez oprogramowanie typu MS Excel czy Arkusz Kalkulacyjny OpenOffice.org.
4 Komunikacja
4.1 Cel komunikacji i opis wybranych rozwiązań
Komunikacja oprogramowania z przetwornicą ma realizować dwa podstawowe cele, jakimi są:
• odczytywanie aktualnego stanu przetwornicy (napięcia i prądy poszczególnych
kanałów, temperatura pola masy, informacje o błędach),
• przesyłanie nowych parametrów pracy (zmiana zadanego napięcia, jego możliwej
odchyłki, maksymalnego prądu, temperatury alarmowej i krytycznej, żądanie zresetowania błędów, wyłączenia przetwornicy oraz zapisu aktualnych ustawień).
Powyższe zadania zrealizowane są za pomocą:
• dwóch podstawowych poleceń protokołu Modbus (zapis i odczyt n rejestrów),
• standardu RS485, działającego w trybie half-duplex.
Wybrany sposób komunikacji wydaje się być bardzo dobrym rozwiązaniem dla przetwornicy zasilającej konstrukcje robotyczne - standard RS485 jest w nich bardzo często wykorzystywany ze względu na możliwość jednoczesnego podłączenia do magistrali
wielu urządzeń, a protokół Modbus zapewnia łatwy sposób odczytu i zapisu danych
zawartych w rejestrach oraz, niezwykle ważną w robotach, niezawodność działania, poprzez liczenie pola kontrolnego każdej z ramek. Podłączenie przetwornicy do komputera
zrealizowane jest za pomocą konwerterów RS485↔RS232 oraz RS232↔USB. Pozwala
to na komunikowanie się z urządzeniem jak ze zwykłym portem szeregowym.
4.2 Modbus
Zaimplementowany protokół Modbus działa w trybie RTU, z jednym bitem startu,
kontrolą parzystości (parzystej) oraz jednym bitem stopu oraz prędkością 9600 bps.
Tryb RTU wybrany został z dwóch powodów:
• jest domyślnym trybem działania protokołu Modbus i wedle dołączonej dokumentacji musi być zaimplementowany w każdym urządzeniu wykorzystującym
ten protokół,
• 8-bitowy tryb transmisji idealnie nadaje się do przesyłania 16 bitowych rejestrów,
których używa przetwornica (w trybie ASCII do przesłania 8 bitów danych potrzeba 2 bajtów).
8
Wykorzystanie trybu RTU wiąże się z koniecznością wysłania całej ramki danych
jako ciągłego strumienia znaków, co wymusza sprawdzanie podczas transmisji dwóch
warunków:
• odstęp czasu między kolejnymi znakami w ramce musi być krótszy niż 1,5 czasu
wysyłania znaku (np. dla prędkości 9600 bps, czas ten wynosi 1719µs),
• odstęp czasu między kolejnymi ramkami musi być dłuższy niż 3,5 czasu wysyłania
znaku (4010µs dla prędkości 9600 bps).
Po stronie mikrokontrolera testowanie czy powyższe warunki zostały spełnione wykonywane jest za pomocą przerwania od odbiornika SCI (testowana jest flaga Idle Line
- oznaczająca ciszę na linii przez okres nadawania jednego znaku) oraz przerwań od
Timera1. Po wykryciu Idle Line Timer1 jest zerowany oraz włączany, tak aby wygenerować przerwanie po czasie równym połowie czasu przesyłania znaku. W obsłudze
tego przerwania ustawiana jest flaga Przerwa oraz ustawiane jest zgłoszenie przerwania za podwojony czas wysyłania znaku. Tym razem w obsłudze przerwania Timer1
jest wyłączany, flaga Przerwa gaszona, a flaga Cisza (oznaczająca koniec ramki) ustawiana. Gdy nowy znak nadejdzie w czasie gdy ustawiona jest flaga Przerwa oznacza
to błąd braku ciągłości strumienia danych lub zbyt szybkie nadejście kolejnej ramki
- dotychczas odebrane informacje oraz nadchodzące, aż do ustawienia flagi Cisza są
ignorowane.
Analogiczna metodę planowano wykorzystać w tworzonym oprogramowaniu. Zamiast użycia flagi Idle Line planowano uruchomić obiekt QTimer po odczytaniu każdej
z ramek na czas równy półtorej okresu przesyłania znaku. Pierwszym napotkanym
problem była niewystarczająca rozdzielczość klasy QTimer (zadawanie czasu w ms),
jednakże dla stosowanej prędkości 9600 bps, nie stanowiło to przeszkody w zastosowaniu metody. Problemem, którego nie udało się rozwiązać, był sposób odbierania danych
przez klasę QextSerialPort. Po otrzymaniu nowych danych emituje ona sygnał readyRead(), oznaczający nowe dane w buforze. Istotą problemu jest pojawianie się znacznie
większej liczby danych niż tylko jednego bajtu (spowodowane jest to sposobem działania klasy QextSerialPort lub czasem od wyemitowania sygnału do odczytu bufora,
w którym nadchodzą kolejne znaki). Dla poprawnego odbierania danych czasy t1,5 i
t3,5 zostały wydłużone, przez co program nie kontroluje w pełni poprawności ciągłości
strumienia danych w ramce. Dodać należy, że sama klasa QextSerialPort nie dostarcza
żadnych mechanizmów pomocnych w kontroli opisanych powyżej czasów - dostępny
w niej pomiar czasu ma bardzo mało rozdzielczość (wedle dokumentacji w systemach
UNIXowych jest to 0,1s).
W trybie RTU każda przesłana ramka kończy się 16 bitowym polem kontrolnym
CRC (Cyclical Redundancy Checking). Wartość pola wyliczana jest przez cykliczne
dokonywanie operacji exlusive OR pola z kolejnymi przesyłanymi rejestrami oraz przesuwanie bitów o 8 pozycji w lewo (dodatkowo gdy LSB pola jest na końcu cyklu równe
1, dokonywana jest kolejna operacja exlusive OR). W programie zastosowano metodę
wyliczania CRC w oparciu o tablice bardziej i mniej znaczącego bajtu CRC, zaczerpniętą z dołączonej dokumentacji
4.3 Rejestry Modbus
Dane sterujące przetwornicą oraz aktualne dane pomiarowe zawarte są w 22 elementowej tablicy Rejestry, która odczytywana jest przez komendy protokołu Modbus Zapisz
9
n rejestrów (kod funkcji: 0x10) oraz Odczytaj n rejestrów (kod funkcji: 0x03). Zastosowanym uproszczeniem jest traktowanie wszystkich rejestrów jako Holding Registers,
mimo, iż w rzeczywistości część z nich pełni rolę rejestrów wejściowych. Dla ułatwienia
odczytywania i zapisywania elementów tablicy Rejestry, indeksowana jest ona za pomocą zmiennej wyliczeniowej enum Nr rej. Oto opis poszczególnych elementów tablicy
Rejestry:
• 0 = Zadane napiecie1 - zadane napięcie kanału 1-ego,
• 1 = Zadany prad1 - zadany prąd maksymalny kanału 1-ego,
• 2 = Zadane napiecie2 - zadane napięcie kanału 2-ego,
• 3 = Zadany prad2 - zadany prąd maksymalny kanału 2-ego,
• 4 = Zadane napiecie3 - zadane napięcie kanału 3-ego,
• 5 = Zadany prad3 - zadany prąd maksymalny kanału 3-ego,
• 6 = Zadane napiecie4 - zadane napięcie kanału 4-ego,
• 7 = Zadany prad4 - zadany prąd maksymalny kanału 4-ego,
• 8 = Dopuszczalny blad21 - górny bajt określa dopuszczalną odchyłkę napięcia
dla kanału 2-ego, zaś dolny na kanału 1-ego,
• 9 = Dopuszczalny blad43 - górny bajt określa dopuszczalną odchyłkę napięcia
dla kanału 4-ego, zaś dolny na kanału 3-ego,
• 10 = Temp wyl alarm - górny bajt określa temperaturę wyłączenia przetwornicy,
zaś dolny temperaturę alarmową,
• 11 = Sterowanie - bity 0...3 określają czy kanały 1...4 maja zostać włączone, bity
4...7 czy kanały 1...4 mają być monitorowane, bit 13 to polecenie resetu błędów,
bit 14 to polecenie wyłączenia przetwornicy, a bit 15 to polecenie zapisu ustawień
do pamięci flash,
• 12 = Aktualne napiecie1 - aktualne napięcie kanału 1-ego,
• 13 = Aktualny prad1 - aktualny prąd kanału 1-ego,
• 14 = Aktualne napiecie2 - aktualne napięcie kanału 2-ego,
• 15 = Aktualny prad2 - aktualny prąd kanału 2-ego,
• 16 = Aktualne napiecie3 - aktualne napięcie kanału 3-ego,
• 17 = Aktualny prad3 - aktualny prąd kanału 3-ego,
• 18 = Aktualne napiecie4 - aktualne napięcie kanału 4-ego,
• 19 = Aktualny prad4 - aktualny prąd kanału 4-ego,
• 20 = Aktualna temp - aktualna temperatura pola masy,
10
• 21 = Status - aktualny status urządzenia, 1 na bitach 0,2,4,6 - napięcie kanałów
1...4 poza zakresem, 1 na bitach 1,3,5,7 - prąd kanałów 1...4 większy od maksymalnego, 1 na bicie 8 - niezerowe napięcie na wyłączonym kanale, 1 na bicie 9 niezerowy prąd w wyłączonym kanale, 1 na bicie 10 - przekroczono temperaturę
alarmową, 1 na bicie 11 - przekroczono temperaturę wyłączenia.
Pierwsze 12 rejestrów modyfikowanych jest przez stworzone oprogramowanie (bardziej
znaczący bajt rejestru nr 11 jest także zmieniany przez mikrokontroler), zaś kolejne
10 jest przez program jedynie odczytywane. Napięcia w rejestrach wyrażone są w mV,
prądy w mA, a temperatura w stopniach Celsjusza.
5 Podsumowanie
Stworzone oprogramowanie spełnia postawione na początku semestru założenia. Dotychczasowe testy pokazały, że można za jego pomocą w łatwy sposób sterować przetwornicą, a wyświetlane przebiegi czasowe i stan urządzenia są zgodne z przewidywaniami. Złe oszacowanie czasu pracy na stworzone modułu komunikacji sprawiło, że
nie jest on w pełni zgodny ze specyfikacją trybu RTU (co udało się osiągnąć po stronie przetwornicy), jednak nie wpływa to w znaczący sposób na poprawność działania
programu. Kończąc projekt zauważono kilka braków, jak np. możliwość zmiany parametrów asynchronicznej transmisji szeregowej, bez ingerencję w kod programu, które
zostaną poprawione w finalnej wersji programu, na której stworzenie zabrakło czasu.
W materiałach dodatkowych dostarczono dokumentację stworzonego oprogramowania oraz samo oprogramowanie, które jednakże nie jest w pełni ukończone, co powoduje
np. wyświetlanie dużej liczby komunikatów diagnostycznych.
11