Rigol na smyczy

sterowanie oscyloskopem DS1054Z przez SCPI/LXI

Rigol na smyczy vol.2 - część druga, o SCPI na diagramach LabVIEW
Rigol na smyczy vol.3 - część trzecia, o dekodowaniu DTMF w LabVIEW

Aby błysnąć w towarzystwie...

...warto znać kilka nowoczesnych, fajnie brzmiących branżowych skrótów, można nimi ewentualnie zaskoczyć przy kawie współrozmówców osiągając tak zwany efekt łoooł. W przypadku maszyny Rigol 1054z dwa aktualnie dla mnie najważniejsze pojęcia to:
LXI - 'LAN eXtensions for Instrumentation' czyli tak ogólnie możliwość pracy urządzenia laboratoryjnego (oscyloskop/generator/zasilacz) w otoczeniu sieciowym, póki co to najczęściej jest miedziany Ethernet z TCP/IP v.4
SCPI - 'Standard Commands for Programmable Instruments' to zestaw ogólnych poleceń, czy raczej specyfikacja takiego zestawu, mających strukturę hierarchiczną (ogół-szczegół) i umożliwiających wpływanie na różne, różniste aspekty funkcjonowania urządzenia, a także na pozyskiwanie informacji o aktualnym jego stanie. Medium komunikacyjnym jest w tym przypadku to, co urządzonko tam sobie posiada: sieć (LXI), a może USB, a może zwykły RS232 czy RS485. Rigol ma dwa pierwsze, z czego sieć jest dla mnie wygodniejsza, bo nie jestem przywiązana kabelkiem USB do kompa, oscyloskop może stać w drugim końcu pokoju, aby skrętka sięgnęła. Dodatkowo kablwy Ethernet zapewnia mi izolację galwaniczną masy przyrządu od masy komputera i reszty sprzętu. O SCPI w sieci jest masę opracowań, nie silę się zatem na pisanie kolejnego kondensatu streszczenia, ale zapraszam do lektury kilku wartych (moim zadniem) uwagi opracowań:

Standard Commands for Programmable Instruments (Wiki)
Standardowe polecenia programowanych urządzeń (PWR, B.Kasprzak, L.Stańczyk)
ACPI-99 (IVI Foundation)
specyfikacje IVI Foundation

Rigol Programming Guide

Wskazuję megaważny dokument: DS1000Z_ProgrammingGuide_EN.pdf i szczerze polecam do przeglądnięcia, wszelkie dalsze rozważania opierają się na informacjach z tego własnie podręcznika.
Aby nowa zabawka nam zadziałała musimy skonfigurować sobie sieć, wyszło mi na to, że w domowym routerze najlepiej ustawić stałą dzierżawę IP na podstawie przypisania do adresu MAC, a w /etc/hosts Linuksa nazwać oscyloskop jakoś po swojemu - u mnie jest więc 'rigol' wymiennie z 'cukierek', ponieważ swoją dżenderuśną stylistyką oscyloskop przypomina paczkę kolorowych żelków.



Tak ogólnie to Rigol komunikuje się po porcie 5555 krótkimi pakietami tekstowymi, większe ilości danych mogą ewentualnie do nas przylecieć na okazję robienia zrzutek ekranu. Tak z poziomu konsoli, jak to się mawia - z palca najprościej wykorzystać polecenia echo lub nc (netcat), załatwiają całość zagadnienia całkiem sprawnie. Można oczywiście nabazgrać coś z okienkiem, ja na przykład zrzucarkę ekraników zrobiłam w formie skryptu powłoki dostępnego na PATH, ale jak komu wygodniej. Polecenia można pisać z dużych liter, można z małych, tak czy inaczej lepiej konsekwentnie, a jak czegoś Rigol nie ogarnie - na chwilkę wyświetli okienko z napisem 'Invalid Input'. Dalej poćwiczymy sobie cukierkowego koleżkę, przecież sport to zdrowie.

Przydatne polecenia SCPI

Oczywiście dla wprawy i zapoznania sie z komendami SCPI - identyfikacja urządzenia, czyli:

 echo '*idn?' | netcat -w 20 cukierek 5555

Aby dalej nie robic wioski tym echo/netcat wywołanie ubrałam w maleńki skrypcik, ktorym można wydawać elementarne polecenia:

 rigolCommand.sh
 #!/bin/bash
 echo "$1" | netcat -w 20 cukierek 5555

Jako że DSO Rigola dopiero rozpoznaję, ważne dla mnie jest czy da się zresetować na miękko maszynkę w przypadku zaklikanie się w kącie z ustawieniami, ale tak aby nie robić jej on-off. No to da się: przestawienie oscyloskopu w stan domyślny, choć nie zawsze dobry realizuje polecenie:

 rigolCommand '*rst'

Chwilkę to trwa, ale urządzenie budzi się w stanie mniej więcej takim jak po włączeniu zasilania.

Zatrzymanie akwizycji danych - odpowiednik guzika RUN / STOP

 rigolCommand ':stop'

Uruchomienie skanowania w trybie ciągłym - RUN / STOP

 rigolCommand ':run'

Złapanie jednego przebiegu przez trigger

 rigolCommand ':single'

Wyczyszczenie 'starych przebiegów' z ekranu

  rigolCommand ':clear'

Wyświetlenie dostępnych parametrów widocznego przebiegu, cała fura tego, na pół ekranu

 rigolCommand ':measure:adisplay on'



schowanie owej uroczej winietki

 rigolCommand ':measure:adisplay off'

Zmiana dzielnika dla sond na x1 lub na x10

 rigolCommand ':channel1:probe 10'
 rigolCommand ':channel1:probe 1'

Deko wkurzające to jest, ale mój egzemplarz oscyloskopu uparcie startuje z sondą na ustawioną na x10 i ciągle mu to poprawiam...

Tryby pracy AC,DC i ziemia jak trzeba przebiegi poukładać na ekranie

 rigolCommand ':channel1:coupling ac'
 rigolCommand ':channel1:coupling dc'
 rigolCommand ':channel1:coupling gnd'

zmiana podstawy czasu

 rigolCommand ':timebase:scale 0.001'

i tak dalej i tak dalej, zgodnie ze spisem poleceń, całe mnóstwo tego dali, super!

Tak ogólnie to jak chemy dowiedzieć się jaka jest aktualna wartość danego parametru czy ustawienia to dokładamy na końcu polecenia pytajnik, o tak:

rigolCommand ':trigger:mode?'

Dostaniemy w zamian literał np. `EDGE` będący obowiązująca wartością parametru

Kopia zawartości ekranu

W sumie to pierwsza sprawa, od której zaczęłam rozpoznawać SCPI w Rigolu - jak zrobić obrazek z tego co jest aktualnie na ekranie. Fotografowanie aparatem oscyloskopu może i jest jakimś rozwiązaniem ale nie zawsze pasuje, na Fejsik może tak, no ale w poważniejszą pisaninę? Magazynowanie obrazków na pendrive - to przekładać trzeba w kółko gwizdek, szkoda złącza. Zostało się na koniec zdalne sterowanie, sporo o tym napisano w sieci, to przykład na którym bazowałam: rigol-ds1054z-screen-capture-linux
I tak ogólnie to byłoby fajnie, gdyby nie to, że tam robią się pliki *.bmp o wadze 1.1MB, a ja tak nie chce. Ale wystarczy doczytać dokładnie co potrafi polecenie `display:data` i wyjdzie nam, że możemy zamienić format obrazka ( i dla *.png czy *.jpg mamy parędziesiąt kB danych), możemy od razu nakazać w skali szarości a nie w kolorze no i możemy zrobić inwersję grafiki.

podstawowy zrzut ekraniku, kolorowy (czarne tło), ładny do www

rigolCommand ':display:data? on,off,png' | tail -c +12 > `date '+%Y%m%d_%H%M%S'`_candy.png

zrzutka kolorowa, ale w rewersie, niezła do www i może do wydruków

rigolCommand ':display:data? on,on,png' | tail -c +12 > `date '+%Y%m%d_%H%M%S'`_candy.png

zrzutka monochromatyczna w rewersie, dobra do druku

rigolCommand ':display:data? off,on,png' | tail -c +12 > `date '+%Y%m%d_%H%M%S'`_candy.png



Fatalna kombinacja ustawień

To jeden z popularniejszych żartów - 'przygotowanie oscyloskopu do pracy inaczej', czyli takie, że ni cholery nie wiadomo jak plamkę wydobyć na ekran, już o całej linii nie wspominając. Niestety eksperymentując z ustawieniami urządzenia łatwo sobie zrobić takie kuku, i chyba dobrze mieć możliwość automatycznego doprowadzenia oscyloskopu do znanego sobie i jakoś uniwersalnego stanu. I na tę okazję naszkicowałam skrypcik takowy:

 ogranijsie.sh
#!/bin/bash
declare -a scpiCommands=(
    ":channel1:probe 1"      # sonda x1
    ":channel1:coupling AC"  # tryb AC
    ":channel1:scale 1"      # U = 1V/div
    ":trigger:mode edge"     # wyzwalanie zboczem
    ":trigger:edge:level 1"  # na 1V
    ":timebase:scale 0.0002" # T = 200 us/div
)
echo "reset...(5sek)"
rigolCommand.sh "*rst"
sleep 5
echo "...setup"
for cmd in "${scpiCommands[@]}"
  do
    echo "$cmd"
    rigolCommand.sh "$cmd"
    sleep 2
  done


Jak nazwa wskazuje w miarę ogarnia Rigola z pierwszym kanałem gotowym do pracy i dalszych zmian ustawień, oczywiście polecenia jakie tam wpiszemy to sprawa naszego stylu pracy, potrzeb etc/itd.

☘☘
Odczyt pamięci w trybie NORMAL i prezentacja danych

Ekraniki zgrywane z Rigola-Cukierka przez SCPI choć wyglądają estetycznie i naukowo to jednak posiadają kilka wad. Nie da się ich wstawić w rubryczki Excela, nie da się na ich podstawie wygenerować przebiegu w Analog Discovery 2, no i kolorowy obrazek cokolwiek trudno przeliczyć w Scilab czy Matlab. Zatem zrzutki ekranu to jedno, ale myślę, że warto umieć podebrać z urządzenia surowe, numeryczne dane. Gdy mamy je dostępne w formie płaskiego pliku na dysku lub choćby w buforze w pamięci komputera - otwierają się zupełnie nowe, ciekawe możliwości, a przykłady takich przedstawiam poniżej.

Wszelkie szczegóły komend opisano bardzo przystępnie w sekcji `:WAVeformCommands` dokumentu Programming Guide, od strony 2-216, polecam lekturę w wolnej chwili, a tu garść zupełnie podstawowych detali. Do odczytu danych z urządzenia służy polecenie :waveform:data?. Oczywiście przed jego wydaniem należy wskazać kanał źródłowy (np. :waveform:source chan1), wybrać tryb pobierania danych (np. :waveform:mode normal) oraz ich format (:waveform:form ascii). Dwa słowa o trybie pobierania - teraz skupiamy się na NORMAL, co oznacza, że urządzenie odda nam zawartość bufora pamięci, z którego rysowany jest aktualny przebieg na wyświetlaczu. Czyli dostaniemy to co aktualnie widać, tylko w numerycznej postaci. Próbek będzie 1200 co wynika z faktu, że podziałka osi czasu ma sumarycznie 12 celek (centymetrów?), po sześć w prawo i lewo względem zera, a oscyloskop zbiera 100 próbek na jednostkę skali czasu. Format ustawimy sobie na ASCII aby było łatwiej obrabiać strumień danych pakietem matematycznym, przyjdą do nas tekstowo liczby w notacji naukowej (xE±y), taki zapis bez problemów przetłumaczymy sobie na float/double. W osi Y dane też są przeliczone na podstawowe jednostki z zapisie naukowym, w sumie to nie musimy nic tu robić. Aby mieć pewność jaki jest kontekst nadesłanych przez Rigola danych dobrze jest pobrać sobie komplet aktualnych ustawień i współczynników - służy do tego jedna komenda: :waveform:preamble?, zwraca dane w postaci serii liczb, czyli dość wygodnie.Spróbujmy teraz wykorzystać te informacje i wydobyć dane z oscyloskopu. Na początek napiszemy sobie skrypcik, który zwróci nam rzeczone współczynniki przebiegu:

 waveformPreambleNormal.sh
#!/bin/bash
# on-screen data
rigolCommand.sh ':waveform:mode normal'
# returns wave full info
rigolCommand.sh ':waveform:preamble?' | tr "," "\n"

Efekt działania taki:



Naniosłam legendę-obrazek skubnięty z dokumentacji - widać wspomniane 1200 próbek/punktów oraz xincrement o wartości 2E-7. Zatem ile wynosi podstawa czasu? Ano 100*2E-7=20 us, co zaraz się okaże. Teraz napiszmy skrypt wyciągający serię tych tysiąc dwustu liczb z Cukierka:

 waveformDataNormal.sh
#!/bin/bash
# set channel
rigolCommand.sh ':waveform:source '$1
# on-screen data
rigolCommand.sh ':waveform:mode normal'
# gimme gimme ascii
rigolCommand.sh ':waveform:form ascii'
# get ascii stream, reject 12 bytes of TMC header, replace colon by eol
rigolCommand.sh ':waveform:data?' | tail -c +12 | tr "," "\n"

W międzyczasie z Analog Discovery 2 robimy sobie generator:



Dygresja niewielka - generator produkuje ładnego sinusa ale ze śmiećkiem, to zakłócenie będzie zaniedługo potrzebne do innych obserwacji, śmieciek powstaje skryptem dla AD2:

 sin-intrusion.txt
if ( X > 0.5 && X < 0.52) {
    sin(2*PI*X*50)/5;
}
else {
    sin(2*PI*X*10);
}


Tak prezentują się przebiegi z AD2 na ekranie oscyloskopu:



A tak fragment strumienia liczb (przycięty dla prezentacji tail-em) zwracany przez Rigola:



Mamy zatem w garści informacje o ustawieniach przebiegu oraz sam przebieg, więc czas na Scilab, o którym już swego czasu wspominałam, taki darmowy jakby Matlab. Pośród dosłownie pierdyliarda różnych-różnistych funkcji są też takie, które potrafią wykonać zewnętrzne polecenie systemu operacyjnego i zebrać jego standardowe wyjście (stdout) do dalszego przetwarzania, w formie wektora. W wersji linuksowej to funkcja o nazwie unix_g(). Mając wektor napisów jednym ruchem konwertujemy je na wartości zmiennoprzecinkowe - strtod(), ta funkcja operuje i na skalarach i na wektorach. A mając tabelę tysiąca dwustu liczb oraz mniejszą, ze współczynnikami - nic tylko rysować sobie wykresiki przebiegów, o proszę:



Powyżej wystawka z kompletu okienek, pokazałam też zawartość zmiennej wave1, możliwy jest jak widać nie tylko podgląd ale i edycja (korekcja) wartości.

Oba przebiegi na jednym wykresie:



Okienko do rysowania przebiegów ma zoom, zatem można wnikać w czasem kłopotliwe detale tego co ekranik LCD Rigola już pokazać nie(umie|chce)



Oczywiście przebiegi można mieć i osobno, każdy dostanie swoją skale Y, przy zachowanej wspólnej skali czasu




Kompletny skrypcik dla Scilab wybierający świeże dane z Rigola i generujący owe wykresiki jest taki:

 rigol-1.sce
clear; // wyzerowanie srodowiska
// pobranie ustawien oscyloskopu
settings=strtod( unix_g ( 'waveformPreambleNormal' ) );
// pobranie danych dla CH1 i CH2
wave1=strtod( unix_g ( 'waveformDataNormal.sh chan1' ) );
wave2=strtod( unix_g ( 'waveformDataNormal.sh chan2' ) );
n=settings(3); // ilość probek
dt=settings(5); // jednostek czasu/probke
t=[0:dt:n*dt-dt]; //dziedzina czasu
t=1000000*t; // na mikrosekundy!
clf();
xtitle('dwa kanały jednocześnie');
xgrid(5,1,7); xlabel('t [us]'); ylabel('u(t)');
plot( t, [wave1,wave2] );
scf();
subplot(211);
xtitle('kanały osobno');
xgrid(5,1,7); xlabel('t [us]'); ylabel('u(t)');
plot( t, wave1 );
subplot(212);
xgrid(5,1,7); xlabel('t [us]'); ylabel('u(t)');
plot( t, wave2 );

Na koniec odrobina relaksu, czyli - kółko! Na AD2 ustawiamy dwa sinusy pod kątem prostym:



Na oscyloskopie nie wygląda to jakoś specjalnie atrakcyjnie, ot - kolorowe przebiegi.



Ale jak sobie pobierzemy te dane z urządzenia i namalujemy skrypcikiem jako wykres X-Y:

 rigol-2.sce
clear; // wyzerowanie srodowiska
// pobranie danych dla CH1 i CH2
wave1=strtod( unix_g ( 'waveformDataNormal.sh chan1' ) );
wave2=strtod( unix_g ( 'waveformDataNormal.sh chan2' ) );
plot( wave1, wave2 );


to dostaniemy mechate kółko, które w powiększeniu przypomina ślad mrówki wracającej nad ranem do domu z udanej imprezy:



☘☘☘
Automatyczna konfiguracja analizatora SPI

W forumowym temacie Chiński Moduł LED & Key pozwoliłam sobie na stwierdzenie, że ręczna konfiguracja ustawień analizatora SPI jest w tym oscyloskopie cokolwiek upierdliwa. Opinię ową podtrzymuje, ale aby nie poprzestać na pustej krytyce - poniżej mały przydaś, który wstępnie konfiguruje nam Rigola do tego zadania. Główne parametry to:

  • DATA = CHANNEL1
  • CLK = CHANNEL2, dane na narastającym zboczu
  • CS = CHANNEL3, aktywny stan niski
  • 8 bitów danych
  • format szesnastkowy
  • kolejność bitów: LSB,od najmłodszego

    Powyższe zostało ubrane w niewielki skrypt (na motywach wcześniejszego ogarnijsie.sh), który to po pierwsze konfiguruje do pracy trzy kanały oscyloskopu (DC, 5V/div, 1x, T:200us), a następnie woła sekwencje ustawiającą parametry parsera SPI, oto i on:

     rigspi.sh
    #!/bin/bash
    declare -a scpiCommands=(
        ":channel1:probe 1"
        ":channel1:scale 5"
        ":channel1:range 40"
        ":channel1:coupling DC"
        ":channel1:display 1"

        ":channel2:probe 1"
        ":channel2:scale 5"
        ":channel2:range 40"
        ":channel2:coupling DC"
        ":channel2:display 1"

        ":channel3:probe 1"
        ":channel3:scale 5"
        ":channel3:range 40"
        ":channel3:coupling DC"
        ":channel3:display 1"

        ":trigger:mode edge"
        ":trigger:edge:level 1"
        ":timebase:scale 0.0002" # T = 200 us/div

        ":decoder1:mode SPI"
        ":decoder1:spi:clk channel2"
        ":decoder1:spi:mosi channel1"
        ":decoder1:spi:cs channel3"
        ":decoder1:format hex"
        ":decoder1:spi:mode CS"
        ":decoder1:spi:endian LSB"
        ":decoder1:spi:width 8"
        ":decoder1:spi:edge RISE"
        ":decoder1:spi:polarity POS"
        ":decoder1:spi:select NCS"
        ":decoder1:format hex"
        ":decoder1:display 1"
    )
    echo "SPI setup"
    for cmd in "${scpiCommands[@]}"
        do
            echo "$cmd"
            rigolCommand.sh "$cmd"
            sleep 0.5
        done


    Oczywiście przed uruchomieniem tego skryptu warto Rigola zresetować komendą SCPI '*RST'.

    Dalsza prezentacja na układzie jak we wzmiankowanym wyżej temacie z forum, to real-life chińskiej kostki TM1638 a nie akademickie dywagacje, dodatkowo pokażę jak to samo zagadnienie obsługuje Analog Discovery 2. Do obserwacji mamy w sumie trzy przypadki:

    prosty transfer ośmiobitowy na przykład sterowanie jasnością wyświetlacza

     MC6809, SB-ASM
    .loop
        lda #$89
        jsr tm1638_command
        lda #$8A
        jsr tm1638_command
        lda #$8B
        jsr tm1638_command
        lda #$8C
        jsr tm1638_command
        jmp .loop

    AD2 - WaveForms:



    Rigol, gdy wszystko mu odpowiada w bitowych ramkach:



    Tu się koleżka deko pogubił w interpretacji, więc te pakiety stosowie oznacza:





    transfer szesnastobitowy np. zapis danej pod wskazany adres

     MC6809, SB-ASM
    .loop
        lda #DIG_0
        ldb #0
        jsr tm1638_writeat
        jmp .loop

    AD2 ma wizję następującą:



    Rigol, dla rozmiaru pakietu 8 bitów



    Tu widzimy, a raczej nie widzimy wprost, gdzie jest starszy, a gdzie młodszy bajt, trzeba zerkać na przebiegi aby złapać kontekst

    Rigol, dla rozmiaru pakietu 16 bitów



    Tu całe słowo jest sensownie poskładane.

    transfer mieszany 8/16 bit np. komenda sterująca, potem zapis do pamięci

     MC6809, SB-ASM
    .loop
        lda #$89
        jsr tm1638_command
        lda #DIG_0
        ldb #0
        jsr tm1638_writeat
        jmp .loop

    AD2 ma na wzmiankowany temat zdanie następujące:



    Rigol w trybie 16 bit:



    Wnioski moje, będące oczywiście subiektywną dość opinią są takie:
  • jeżeli chodzi o komfort pracy z analizatorem - Analog Discovery 2 (+WaveForms) robią z Rigola DS1054Z miazgę
  • odzwierciedlenie tego, co naprawdę pomyka przez SPI (a wiem, bo sama dziergałam ten kod) - jest porównywalne, ale do Rigolowej interpretacji trzeba się odrobinę przyzwyczaić, najlepiej testując analizator na znanych sobie sekwencjach i z różnymi ustawieniami.

    Pozostała na koniec sprawa triggera wzorcem, czyli rozpoczęcia analizy gdy wpadnie nam określony bajt rozpoczynający jakąś większą sekwencję. Tego nie udało mi się póki co przećwiczyć.

    #slowanawiatr, marzec-październik 2018


  • Natasza Biecek 2004-2018/~, e-mail