240 likes | 453 Views
Programowanie w języku Matlab. Komunikacja z przyrządami pomiarowymi. Komunikacja z przyrządami z interfejsem RS232. s = serial( 'COM1' ); fopen(s); s.Terminator = 'CR' ; s.Timeout = 1; fprintf(s, '#02' ); t = fscanf(s); fclose(s); delete(s); clear s ;.
E N D
Programowanie w języku Matlab Komunikacja z przyrządami pomiarowymi
Komunikacja z przyrządami z interfejsem RS232 s = serial('COM1'); fopen(s); s.Terminator = 'CR'; s.Timeout = 1; fprintf(s, '#02'); t = fscanf(s); fclose(s); delete(s); clear s;
utworzenie obiektu interfejsowego otwarcie połączenia obiektu z portem szeregowym ustawienie niektórych własności obiektu interfejsowego: Terminator – znak występujący na końcu wiadomości przesyłanych między komputerem a przyrządem pomiarowym (domyślnie LF) Timeout – czas oczekiwania w sekundach na zakończenie zapisu i odczytu wiadomości (domyślnie 10 s) s = serial('COM1'); fopen(s); s.Terminator = 'CR'; s.Timeout = 1;
Ustawienia własności obiektu można dokonać przy jego tworzeniu: s = serial('COM1', 'Terminator', 'CR', 'Timeout', 1) albo przy użyciu funkcji set: set(s, 'Terminator', 'CR', 'Timeout', 1) Listę wszystkich własności obiektu uzyskuje się przy użyciu funkcji get. W tym przypadku istotne są jeszcze własności: InputBufferSize = 512 OutputBufferSize = 512 BaudRate = 9600 DataBits = 8 Parity = none StopBits = 1 Podane wartości są wartościami domyślnymi, w przyrządzie pomiarowym ustawiono taką samą prędkość transmisji i format znaku.
zapis do bufora wyjściowego komunikatu z rozkazem dla przyrządu pomiarowego, w tym przypadku na końcu komunikatu dopisywany jest znak CR odczyt z bufora wejściowego komunikatu z odpowiedzią z przyrządu pomiarowego, znak CR zostanie również zapamiętany w zmiennej t (można też użyć funkcji fgetl lub fgets) fprintf(s, '#02'); t = fscanf(s); Podane funkcje wykorzystuje się wówczas, gdy z przyrządem pomiarowym wymieniane są komunikaty tekstowe, złożone – z wyjątkiem znacznika końca – z tzw. drukowalnych znaków kodu ASCII. Jeżeli z przyrządem wymieniane są komunikaty binarne, złożone ze znaków o dowolnych kodach, trzeba użyć funkcji: fwrite i fread. zamknięcie połączenia obiektu z portem szeregowym usunięcie obiektu z pamięci oraz przestrzeni roboczej Matlaba fclose(s); delete(s); clear s;
Operacje synchroniczne i asynchroniczne • Zapis i odczyt komunikatów może się odbywać w trybie: • synchronicznym (domyślnie) – do chwili zakończenia operacji blokowany jest dostęp do wiersza poleceń Matlaba, • asynchronicznym – dostęp do wiersza poleceń nie jest blokowany, tryb przydatny przy przesyłaniu komunikatów o znacznych rozmiarach.
Koniec operacji zapisu następuje, gdy spełniony jest jeden z warunków: • zapisano wszystkie dane (fprintf, fwrite), • upłynął czas oczekiwania (j. w.). • Koniec operacji odczytu następuje, gdy spełniony jest jeden z warunków: • odebrano znak końca komunikatu (fscanf, fgetl, fgets), • odebrano zadaną liczbę danych (fscanf, fread), • upłynął czas oczekiwania (wszystkie funkcje), • bufor wejściowy został zapełniony (wszystkie funkcje). • W trybie asynchronicznym – także przy użyciu funkcji stopasync.
Zapis komunikatu w trybie asynchronicznym: fprintf(s, ..., 'async') Własność ReadAsyncMode określa, czy odbiór komunikatu z urządzenia pomiarowego ma się rozpocząć automatycznie (continuous) czy na polecenie użytkownika (manual), do czego służy funkcja readasync(). Własność TransferStatus – stan realizacji operacji asynchronicznej. Własność BytesAvailable – ilość bajtów zgromadzonych w buforze wejściowym.
Komunikacja sterowana zdarzeniami – tylko przy operacjach w trybie asynchronicznym
Funkcję obsługi zdarzenia (ang. callback function) można zapisać w m-pliku lub w łańcuchu. Przyporządkowanie funkcji obsługi zdarzenia: s.BytesAvailableFcn = @mycallback; s.BytesAvailableFcn = {'mycallback'}; Zawartość linii definicji funkcji: function mycallback(obj, event) Argumenty obowiązkowe: obj – obiekt komunikacyjny, event – struktura z informacją o zdarzeniu.
s.TimerPeriod = 5; s.TimerFcn = @pomiar fopen(s); function pomiar(obj, event) fid = fopen('Pomiary.txt', 'a'); fprintf(obj, '#02', 'async'); readasync(obj); response = fscanf(obj); fprintf(fid, '%s %s\n', datestr(event.Data.AbsTime, 13), ... response(2:end)); fclose(fid);
Funkcji obsługi zdarzenia można przekazać więcej argumentów. s.TimerFcn = {@pomiar, 'wyniki.txt'} s.TimerFcn = {'pomiar', 'wyniki.txt'} function pomiar(obj, event, filename) fid = fopen(filename, 'a'); : fclose(fid); Funkcjom, których treść podaje się w łańcuchu nie przekazuje się argumentów.
Instrument Control Toolbox • umożliwia komunikację z przyrządami pomiarowymi: • przez interfejs GPIB, • przez interfejs wspierany przez standard VISA (ang. Virtual Instrument Standard Architecture): RS232, USB, GPIB, VXI oraz GPIB-VXI, • przez sieć komputerową przy użyciu protokołów: TCP/IP oraz UDP, • użycie obiektów interfejsowych wymaga znajomości języka programowania przyrządu, • obiekty przyrządowe, których użycie nie wymaga znajomości języka programowania przyrządu, korzystają z pośrednictwa sterowników: • VXIplug&play, • IVI (ang. Interchangeable Virtual Instruments), • Matlab Instrument Driver, • możliwe wykorzystanie zdarzeń,
dostępne narzędzia z interfejsem graficznym: • Test & Measurement Tool – wykrywanie podłączonych przyrządów, ich konfigurowanie, zapis/odczyt danych, automatyczna generacja skryptów z zapisem sesji komunikacyjnej z przyrządem, wizualizacja zbieranych danych, eksport danych do przestrzeni roboczej Matlaba, • Instrument Driver Editor – tworzenie sterowników przyrządowych, • Instrument Driver Testing Tool.
Pomiar częstotliwości przy użyciu oscyloskopu firmy Tektronix d = icdevice('tektronix_tds210', gpib('ni',0,1)); connect(d); data = invoke(d, 'measure', 1); disconnect(d); delete(d); clear d;
Data Acquisition Toolbox • obsługa kart pomiarowych firm: Advantech, Measurement Computing, National Instruments, • zbieranie danych także za pośrednictwem karty dźwiękowej, • funkcje pomiarowe są realizowane przy użyciu obiektów związanych z zasobami karty – wejściami i wyjściami: analogowymi, cyfrowymi i licznikowymi, • konfigurowanie zasobów odbywa się przez ustawianie własności obiektów. • możliwe wykorzystanie zdarzeń.
Pobranie bloku danych z wejść analogowych karty pomiarowej firmy Measurement Computing AI = analoginput('mcc',1); addchannel(AI,0:1); set(AI,'SampleRate',11025); set(AI,'SamplesPerTrigger',22050); start(AI); wait(AI,3); data = getdata(AI); delete(AI); clear AI;
Wykorzystanie sterowników z bibliotek dołączanych dynamicznie loadlibrary('c:\mcc\cbw32.dll','c:\mcc\c\cbw.h'); calllib('cbw32','cbSetConfig',2,0,0,7,4); [Err, ADCRes] = calllib('cbw32','cbAIn',0,0,0,0); [Err, Voltage] = calllib('cbw32','cbToEngUnits',0,0,ADCRes,0); unloadlibrary('cbw32');
loadlibrary('c:\mcc\cbw32.dll','c:\mcc\c\cbw.h') unloadlibrary('cbw32') sprawdza, czy biblioteka jest załadowana podaje listę funkcji z biblioteki libisloaded('cbw32') libfunctions('cbw32') podaje listę funkcji wraz z ich prototypami libfunctions('cbw32','-full') Prototypy użytych funkcji w Matlab: int32 cbSetConfig(int32, int32, int32, int32, int32) [int32, uint16Ptr] cbAIn(int32, int32, int32, uint16Ptr) [int32, singlePtr] cbToEngUnits(int32, int32, uint16, singlePtr)
W dokumentacji biblioteki są podane prototypy funkcji dla języków: C/C++, Visual Basic i Delphi. Prototypy użytych funkcji w języku C/C++: int cbSetConfig(int InfoType, int BoardNum, int DevNum, int ConfigItem, int ConfigVal) int cbAIn(int BoardNum, int Channel, int Range, unsigned short *DataValue) int cbToEngUnits(int BoardNum, int Range, unsigned short DataVal, float *EngUnits)
Ustawienie liczby kanałów analogowych: calllib('cbw32','cbSetConfig',2,0,0,7,4) InfoType ConfigVal BoardNum DevNum ConfigItem UWAGA: Nie można korzystać ze stałych zawartych w pliku nagłówkowym! InfoType – kategoria danej konfiguracyjnej, 2 to wartość stałej BOARDINFO BoardNum – numer karty w systemie, nadany przez program konfiguracyjny InstaCal DevNum – numer urządzenia, istotny w przypadku wejść-wyjść cyfrowych i układów liczników ConfigItem– numer danej konfiguracyjnej, 7 to wartość stałej BINUMADCHANS ConfigVal – wartość danej konfiguracyjnej, karta USB-1208LS może mieć 4 kanały symetryczne lub 8 niesymetrycznych
Odczyt wyniku przetwarzania A/C z wybranego kanału analogowego: [Err, ADCRes] = calllib('cbw32','cbAIn',0,0,0,0) BoardNum *DataValue Channel Range Channel – numer kanału analogowego (0-3 przy kanałach symetrycznych) Range – zakres pomiarowy, 0 to wartość stałej BIP5VOLTS, zakres pomiarowy ±5V *DataValue – wskaźnik do zmiennej z wynikiem pomiaru, wartości 0 odpowiada wskaźnik pusty Obliczenie wartości napięcia: [Err, Voltage] = calllib('cbw32','cbToEngUnits',0,0,ADCRes,0) BoardNum *EngUnits Range DataValue *EngUnits – wskaźnik do zmiennej z wartością napięcia
Użycie obiektów wskaźnikowych Typ wskaźnika Wartość początkowa wskazywanej danej ADCResPtr = libpointer('uint16Ptr',0); VoltagePtr = libpointer('singlePtr',0); calllib('cbw32','cbAIn',0,0,0,ADCResPtr); calllib('cbw32','cbToEngUnits',0,0,ADCResPtr.Value,VoltagePtr); odwołanie do wskazywanej danej