Bartosz Kosiorek 116569
Olaf Józefowicz 116560
Krzysztof Tkacz 110316
Komputery w badaniach doświadczalnych
Ćwiczenie 5
Pomiary wielkości elektrycznych za pomocą multimetru cyfrowego wyposażonego w interfejs RS232.
Cel ćwiczenia
Celem tego ćwiczenia było zapoznanie się z multimetrem METEX i komunikacją tego urządzenia z komputerem przez port szeregowy RS232C. W tym celu należało napisać program, który pobiera i analizuje dane wysyłane przez multimetr.
Wstęp teoretyczny
Program napisaliśmy w języku Delphi 6, natomiast do komunikacji przez port szeregowy użyliśmy biblioteki ComPort 3.1, pobranej ze strony http://www.winsoft.sk.
Dostarczają one komponenty TComPort oraz TComSignal. W programie użyliśmy tylko komponentu TComPort, który uruchamia komunikację z urządzeniami przez port szeregowy. Dzięki temu komponentowi możliwe jest wysyłanie i odbieranie praktycznie dowolnych danych z podłączonego do portu szeregowego urządzenia.
Rys. 2.1 Multimetr METEX
Multimetr METEX (rys. 2.1) przystosowany jest do standardowych pomiarów napięć, prądów, rezystancji, częstotliwości, pojemności itd. Napisany przez nas program, był testowany na multimetrze METEX M-4660A.
Parametry komunikacji dla multimetru M-4660A:
prędkość danych: 9600 bit/s
kontrola parzystości: brak
ilość bitów danych: 7
ilość bitów stopu: 2
Dane przesyłane z miernika, a także rozkazy wydawane przez komputer są w postaci kodów ASCII. Instrukcją rozkazującą miernikowi rozpocząć nadawanie jest „D”. Po otrzymaniu tej instrukcji miernik wysyła do komputera wynik w postaci 14 bajtowych ramek (rys. 2.2).
W ramce przesyłane są dane w następującej postaci:
Pierwsze dwa znaki określają co jest mierzone, m.in.: „FR” - częstotliwość, „OH” - rezystancję, „TE” - temperaturę (tylko model M-4660A), „DC” - prąd stały, „AC” - prąd zmienny, „dB” - poziom napięcia wejściowego w decybelach (dBm) względem standardowego poziomu zerowego, „LO” - test stanów logicznych, „HF” - pomiar wzmocnienia hFE tranzystorów, „CP” - pojemność.
Trzeci symbol określa znak mierzonej wartości. Jeżeli wartość jest ujemna, wtedy znak przyjmuje wartość „-„, natomiast jeżeli dodatnia wstawiana jest spacja „ „.
W sześciu następnych znakach znajduje się wartość mierzonej wielkości. Wartość ułamkowa oddzielona jest kropką
Następne cztery znaki zawierają jednostkę mierzonej wielkości . Jeżeli jednostka jest krótsza niż cztery znaki, na początku wstawiane są spacje, np.: „ mV”, „ kHz”, „ A”
Ramka zawsze jest zakańczana symbolem końca wiersza, tzw. powrotem karetki (CR - Carriage Return)
Miernik METEX, przy pomiarze niektórych wielkości wysyła ramki dodatkowe, np.: przy pomiarze prądu zmiennego „AC”, wysyła dodatkowe ramki zawierające częstotliwość „FR” oraz moc „dB” mierzonego sygnału. Naszym zadaniem był pomiar tylko wielkości podstawowej.
Rys. 2.2 Przykład ramek odebranych przez komputer, przy pomiarze napięcia prądu zmiennego
Standard RS-232 opisuje sposób połączenia urządzeń DTE (ang. Data Terminal Equipment) tj. urządzeń końcowych danych (np. komputer) oraz urządzeń DCE (ang. Data Circuit-terminating Equipment), czyli urządzeń komunikacji danych (np. modem). Standard określa nazwy styków złącza oraz przypisane im sygnały a także specyfikację elektryczną obwodów wewnętrznych. Standard ten definiuje normy wtyczek i kabli portów szeregowych typu COM.
RS-232 jest magistralą komunikacyjną przeznaczoną do szeregowej transmisji danych. Najbardziej popularna wersja tego standardu, RS-232C pozwala na transfer na odległość nieprzekraczającą 15m z szybkością maksymalną 20 kbit/s.
W architekturze PC standardowo przewidziano istnienie 4 portów COM oznaczanych odpowiednio COM1-COM4. Specjalizowane karty rozszerzeń pozwalały na podłączenie znacznie większej ilości portów RS-232, jednak nie były one standardowo obsługiwane przez MS-DOS i wymagały specjalistycznego oprogramowania.
W przypadku komputerów PC porty RS-232 początkowo obsługiwane były przez układy 8250 (PC, XT), później 16450 (AT, 80386, pierwsze i486), następnie przez zintegrowane z płytą główną 16550A. Układy te są ze sobą wstecznie zgodne, jednak kolejne wersje posiadają coraz większy bufor FIFO. Kość 16550A posiada standardowo bufor 2x 16b. Zwiększenie długości kolejki FIFO skutkowało obniżeniem częstotliwości przerwań generowanych przez port przy przesyłaniu danych. Na potrzeby zastosowań profesjonalnych (np. równoczesna obsługa wielu szybkich modemów w systemach typu BBS) stosowano często specjalizowane karty RS-232 z jeszcze większymi buforami (np. 16650 czy karty procesorowe). Znane były rozwiązania pozwalające na podłączenie do 1024 urządzeń RS-232, przy zachowaniu pełnej prędkości na port i buforami rzędu 1024 bajty na port. Część kart tego typu pozwalała także na ustawianie wyższego zegara, wskutek czego bitrate na wyjściu układu był wyższy niż ustawienia programowe - przy dużej wielkości kolejki FIFO pozwalało to na uzyskiwanie wysokich (często niestandardowych - jak w przypadku modemów ZyXel 76800 b/s) prędkości. Spotkać można było na rynku modemy komunikujące się z portem RS-232 z prędkościami do 421 kbitów. Obecnie wobec upowszechnienia się magistrali USB powyższe informacje mają coraz bardziej historyczne znaczenie.
Specyfikacja napięcia definiuje "1" logiczną jako napięcie -3V do -15V, zaś "0" to napięcie +3V do +15V. Poziom napięcia wyjściowego natomiast może przyjmować wartości -12V, -10V, +10V, +12V, zaś napięcie na dowolnym styku nie może być większe niż +25V i mniejsze niż -25V. Należy zaznaczyć przy tym, że zwarcie dwóch styków RS-232 teoretycznie nie powoduje jego uszkodzenia. W praktyce ten zapis w specyfikacji nie zawsze jest przestrzegany.
Sygnały portu szeregowego w komputerze PC:
Widok gniazda PC (męskiego) typu D-B9 od strony wtyczki |
|||||
Numer |
Kierunek |
Oznaczenie |
Nazwa angielska |
Nazwa polska |
|
9 pin |
25 pin |
|
|
|
|
1 |
8 |
DCE —> DTE |
DCD |
Data Carrier Detected |
sygnał wykrycia nośnej |
2 |
3 |
DCE —> DTE |
RxD |
Receive Data |
odbiór danych |
3 |
2 |
DCE <— DTE |
TxD |
Transmit Data |
transmisja danych |
4 |
20 |
DCE <— DTE |
DTR |
Data Terminal Ready |
przetworzono dane (gotowość odbioru) |
5 |
7 |
DCE — DTE |
GND |
Signal Ground |
masa |
6 |
6 |
DCE <— DTE |
DSR |
Data Set Ready |
wypełniony bufor (gotowość transmisji) |
7 |
4 |
DCE <— DTE |
RTS |
Request to Send Data |
żądanie wysyłania |
8 |
5 |
DCE —> DTE |
CTS |
Clear to Send Data |
gotowość wysyłania |
9 |
22 |
DCE —> DTE |
RING |
Ring indicator |
wskaźnik dzwonka |
Pozostałe przewody nie są wykorzystywane. Do transmisji sprzęgiem RS-232C przy braku sprzętowego sterowania transmisją, potrzebne są trzy przewody połączeniowe (RxD, TxD i GND).
W przypadku sprzętowego sterowania transmisją (czyli jeżeli podłączamy multimetr METEX), wymagane jest minimum pięć przewodów połączeniowych (RxD, TxD, RTS, DTR i GND).
Instrukcja obsługi programu
Po uruchomieniu pliku „Szereg.exe”, ukaże nam się następujące okno (rys. 3.1):
Rys.3.1 Okno programu tuż po uruchomieniu
Na samej górze znajduje się suwak, którym można ustawić częstość pobierania danych z portu szeregowego. Za okresowe wykonywanie procedury odczytu odpowiada obiekt Czasomierz klasy TTimer. Standardowo „okres próbkowania” ustawiony jest na wartość 500ms.
Po ustawieniu okresu próbkowania, należy wybrać numer portu, pod który jest podłączone urządzenie, skonfigurować go oraz otworzyć port. Jeżeli nie wyświetli się komunikat o błędzie, oznacza to, że otwarcie portu zakończyło się sukcesem. Wszystkie dane konfiguracyjne dotyczące portu są umieszczane w obiekcie ComPort klasy TComPort.
Po otwarciu portu szeregowego, uaktywniają się przyciski odpowiedzialne za komunikację komputera z multimetrem. Są to przyciski „Odczyt pojedynczy” oraz „Odczyt ciągły”. Pierwszy z nich wysyła do multimetru literę „D”, co powoduje, że urządzenie zwraca aktualnie wskazywaną wartość. „Odczyt ciągły” działa na analogicznej zasadzie, lecz dane są wysyłane i odbierane w określonych odstępach czasu, ustalonych przez „Okres próbkowania”. Program w trakcie odczytu ciągłego przedstawia rys. 3.2
Rys.3.2 Program w trakcie odczytu ciągłego. Zarejestrowana została wartość napięcia prądu zmiennego
Na samym dole znajduje się terminal. Jest to obiekt klasy TMemo, z którego możemy dowiedzieć się, jakie dane aktualnie zostały odebrane, a także wysłać polecenia do multimetru. W każdej chwili możliwe jest wyczyszczenie okna terminala klawiszem „Wyczyść”.
Otrzymane dane są poddawane analizie i umieszczane w okienku „Odczytane dane”. Znajdują się tam informacje rodzaju, wartości oraz jednostce pomiaru. Program potrafi rozróżnić czy jest mierzona częstotliwość, rezystancja, temperatura, prąd stały oraz prąd zmienny.
Wszystkie pomiary które zostały przeanalizowane przez komputer, są gromadzone w oknie znajdującym się po prawej stronie. Można je poddawać dowolnej edycji, dzięki czemu mamy wpływ co zostanie zapisane do pliku. Wyniki pomiarów można zapisać na dysk klawiszem „Zapisz wyniki”. Domyślnie są one zapisywane do postaci pliku tekstowego o rozszerzeniu „txt”, lecz bez problemu można je zaimportować np. z poziomu Excela. Format zapisanych danych jest identyczny z opisanymi powyżej ramkami. Każdy nowy pomiar jest umieszczany w nowej linii. Aby zaimportować plik do Excela, należy w opcjach odczytu zaznaczyć „stała szerokość”, oraz w następnym ekranie ustalić szerokość kolumn (rys. 3.3).
Rys.3.3 Import wyników pomiarów, z pliku do Excela
Omówienie kodu programu
Jak już wspomniałem wcześniej, program napisaliśmy w języku Delphi 6, natomiast do komunikacji przez port szeregowy użyliśmy biblioteki ComPort 3.1, pobranej ze strony http://www.winsoft.sk.
Na rysunku 4.1 przedstawiłem procedurę odpowiedzialną za odczyt i analizę danych z multimetru. Procedura ta jest uruchamiana w czasie określonym zmienną Czasomierz.Interval. Algorytm procedury jest następujący:
Jeżeli jest włączony „odczyt ciągły” oraz „przełącznik” jest wyłączony, wtedy
Jeżeli port jest aktywny to
Wyczyść terminal „Memo”
Wyślij do portu szeregowego literę „D”
W przeciwnym wypadku wyświetl komunikat o błędzie
Przypisz ciąg znaków znajdujący się w terminalu „Memo” do łańcucha „a”
Jeżeli długość ciągu znaków „a” jest większa od 14, wtedy
Przypisz etykietom tekstowym wartości początkowe: „Odczyt:”, „Wartość:”, „Jednostka:”
Jeżeli dwa pierwsze znaki to „FR” to wyświetl, że mierzona jest częstotliwość
Jeżeli dwa pierwsze znaki to „OH” to wyświetl, że mierzona jest rezystancja
Jeżeli dwa pierwsze znaki to „TE” to wyświetl, że mierzona jest temperatura
Jeżeli dwa pierwsze znaki to „DC” to wyświetl, że mierzony jest prąd stały
Jeżeli dwa pierwsze znaki to „AC” to wyświetl, że mierzony jest prąd zmienny
W przeciwnym wypadku wyświetl, że odczyt jest „Nieznany”
Wyświetl wartość mierzonej wielkości
Wyświetl jednostkę
Zmień „przełącznik”. Jest to zmienna odpowiedzialna za to, aby odczyt z multimetru był wykonywany, co drugie przerwanie. Jest to zabezpieczenie przed opóźnieniami, powstającymi wskutek ze zbyt małą szybkością transmisji poprzez port szeregowy.
Rys.4.1 Fragment kodu programu odpowiedzialny za okresowy odczyt wartości z multimetru
Za odczyt i transmisję danych są odpowiedzialne metody i zdarzenia (fragment kodu, który wykorzystuje poniższe metody przedstawiony jest na rys. 4.2)
procedure WriteChar(Value: Char); - powodująca wysłanie znaku, lecz nie oczekuje aż znak zostanie wysłany
function ReadChar: Char; - odczytująca znak. Jeżeli bufor jest pusty, funkcja oczekuje aż się zapełni i zwraca znak.
function ConfigDialog: Boolean; - funkcja uruchamiająca systemowy panel konfiguracyjny portu RS. Funkcja zwraca prawdę,jeżeli parametry zostały zaktualizowane.
function ReadString: String; - funkcja odczytująca ciąg znaków. Jeżeli bufor jest pusty, funkcja zwraca pusty ciąg znaków.
property Active: Boolean; - używane do otwarcia, zamknięcia oraz sprawdzenia statusu portu szeregowego
property OnRxChar: TNotifyEvent; - wykonywane gdy otrzymano lub wpisano znak w buforze
Rys .4.2 Funkcje odpowiedzialne za komunikację z portem szeregowym.
Procedury w programie, odpowiedzialne za transmisję (rys. 4.2):
Procedura ComPortRxChar jest uruchamiana wtedy gdy pojawią się nowe dane w buforze portu szeregowego. Odczytane dane są przypisywane do zmiennej Text, w następnej linii dodawane są do terminala „Memo”, a następnie zwiększany jest licznik odebranych danych.
Procedura SpeedButtonConfigClick jest uruchamiany po naciśnięciu klawisza i wyświetla okno konfiguracyjne portu.
Procedura MemoKeyPress jest uruchamiana wtedy, gdy w terminalu zostanie wpisany jakiś znak. Automatycznie jest on wysyłany przez port szeregowy.
Procedura SpeedButtonOpenCloseClick jest uruchamiany po naciśnięciu klawisza „Otwórz”/”Zamknij”. Otwiera i zamyka ona port szeregowy. Następne linijki aktywują i deaktywują przyciski „Otwórz”/”Zamknij”.
Procedura ComPortLineError jest uruchamiana gdy wystąpi błąd. Wyświetlany jest w niej komunikat o błędzie.
Wnioski
Powyższy program nie ogranicza się tylko do pomiaru temperatury. Dzięki niemu można mierzyć praktycznie dowolne wielkości, które obsługuje multimetr. Należałoby tylko dodać rozpoznawanie przez program nowych wielkości (np. badania tranzystorów). Program bardzo ułatwia ciągłą rejestrację wartości (np. napięcia, prądu), ponieważ może pobierać dane przez praktycznie dowolny czas i z dużą częstością. Otrzymane dane z łatwością można zapisać na dysk, a następnie zaimportować do arkusza kalkulacyjnego, dzięki czemu obróbka zgromadzonych danych jest znacznie prostsza.
8