Elektroda.pl
Elektroda.pl
X
Metal Work Pneumatic
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Programowalny sterownik jeszcze inaczej

wniedzie 19 Cze 2018 22:47 3423 13
  • Programowalny sterownik jeszcze inaczej
    wstęp

    Projekt jest nawiązaniem do projektu opublikowanego przeze mnie wcześniej: Link, dlatego gorąco zachęcam do zapoznania się z nim. Tym razem skupiłem się na części software’owej i zastąpiłem płytę PC modułem mikrokontrolera. Z poprzedniego projektu wykorzystałem algorytmy i struktury danych (programowanie obiektowe) oraz obudowę i układy wejścia/wyjścia (bo je akurat miałem i nie chciało mi się robić lepszych). Nie będę tu omawiał kwestii sprzętowych, bo nie o to tutaj chodzi.

    Podsumowując, celem projektu było stworzenie amatorskiego, uniwersalnego programowalnego sterownika, pozwalającego w warunkach laboratoryjnych na szybkie przetestowanie różnych algorytmów sterowania przy przebiegach szybkozmiennych. Zakładana częstotliwość przetwarzania musi wynosić co najmniej 10kHz, aby układ można było wykorzystać do sterowania np. silnikami bezszczotkowymi lub wtryskiem paliwa w silnikach spalinowych.

    Podstawowe założenia projektu to:
    1. Prosta i tania konstrukcja umożliwiająca wykonanie w warunkach amatorskich
    2. Programowanie za pomocą schematu blokowego w środowisku Microsoft Windows
    3. Obsługa modułu za pomocą jednej aplikacji – możliwość zapisania konfiguracji do modułu jako funkcja edytora programu
    4. Wykorzystanie darmowych rozwiązań software’owych
    5. Modułowa konstrukcja
    6. Uniwersalność
    7. Możliwość przetwarzania sygnałów analogowych (podstawowe funkcje DSP)
    8. Możliwość rozbudowy o nowe funkcjonalności
    9. Wysoka wydajność – jak najwyższa częstotliwość przetwarzania

    Ze względu na wykorzystanie popularnego mikrokontrolera 8-bitowego, w porównaniu z projektem oryginalnym mocno zostanie ograniczona moc obliczeniowa, szczególnie w przypadku sygnałów zmiennoprzecinkowych. Dlatego stopień skomplikowania programu będzie miał kluczowe znaczenie dla częstotliwości przetwarzania.

    Sprzęt

    Jako moduł sterujący wybrałem Arduino Nano. Aby podłączyć moduł mikrokontrolera do płyty we/wy został wykonany obwód drukowany umożliwiający osadzenie modułu Arduino w taki sposób, aby jego złącze USB było dostępne z zewnątrz obudowy.
    Płyta we/wy jest zasilona z wyjścia 5V modułu Arduino. Ten z kolei może być zasilony z portu USB lub z zewnętrznego źródła.
    Kompletny sterownik (moduł we/wy + moduł mikrokontrolera) Programowalny sterownik jeszcze inaczej





    Programowanie sterownika

    Jednym z najważniejszych założeń projektu było szybkie i proste programowanie sterownika. Dla mnie najbardziej naturalnym jest wykorzystanie do tego celu środowiska graficznego, w którym program rysowany byłby w postaci schematu pokazującego połączone funktory logiczne. Daje to większe możliwości i łatwość programowania w porównaniu z tradycyjnymi językami programowania sterowników.

    Wymagane funkcje edytora to:
    1. Możliwość wyeksportowania grafu do pliku w celu przetworzenia go i wysłania do sterownika,
    2. Możliwość definiowania własnych bloków grafu,
    3. Możliwość programowania sterownika bezpośrednio z interfejsu edytora.

    Biorąc powyższe pod uwagę, jako edytor graficzny wybrałem program Cadsoft Eagle w wersji 6.5, dostępny również w wersji shareware.
    Szczególnie przydatne cechy program Eagle to:
    1. schematy są zapisywane są w łatwo przetwarzalnej formie tekstowej XML (pliki SCH),
    2. istnieje możliwość zdefiniowania własnych przycisków w menu głównym i podpięcia do nich dowolnych poleceń/skryptów,
    3. symbole na schemacie mogą mieć przypisaną wartość, co umożliwi modyfikację parametrów funktorów.

    Programowanie sterownika będzie polegało więc na:
    1. wykorzystaniu specjalnie przygotowanej biblioteki programu Eagle (zawierającej symbole bloków logicznych) do narysowania schematu logicznego przepływy sygnału od wejść sterownika, poprzez bloki funkcyjne do wyjść sterownika,
    2. zaprogramowaniu sterownika poprzez wybranie w oknie edytora odpowiednio przygotowanego przycisku, co spowoduje uruchomienie skryptu, który wywoła kolejno czynności:
    - Przetworzenie pliku SCH na program w języku C++,
    - Skompilowanie programu
    - Zapisanie programu w pamięci kontrolera

    Oprogramowanie sterujące

    Architektura oprogramowania sterującego została zaczerpnięta z oprogramowania w wersji PC. Główne różnice to:
    1. Bloki funkcyjne mogą posiadać wiele wyjść.
    - klasy bloków mogą posiadać wiele metod zwracających wartości
    - Została wprowadzona koncepcja sieci, czyli połączenia dwóch lub wielu elementów
    - do każdej sieci może być podłączone tylko jedno wyjście jednego bloku oraz dowolna ilość wejść innych bloków
    - wartość sieci liczona jest jako wartość zwracana przez metodę bloku symbolizującą odpowiednie wyjście bloku
    - wejścia bloku to zestaw wskaźników na funkcje zwracającą wartość sieci
    2. Brak synchronizacji wykonania programu z zegarem sprzętowym. Tym samym prędkość przetwarzania uzależniona jest od skomplikowania algorytmu.
    3. Uproszczona struktura plików. Dla każdego bloku istnieje tylko jeden plik C z definicją klasy
    4. Wprowadzono dwa typy bloków: logiczny oraz zmiennoprzecinkowy
    5. Obiekty bloków oraz relacje między nimi tworzone są statycznie, a nie dynamicznie
    6. W każdej iteracji obliczane są wartości tylko wykorzystywanych wyjść sterownika
    7. Dla uproszczenia przyjęto, że blok posiada wszystkie wyjścia tego samego typu (binarne albo zmiennoprzecinkowe).
    8. Wartości binarne są zapisywane jako typ signed char (zero odpowiada logicznej prawdzie, pozostałe wartości to logiczny fałsz), a wartości zmiennoprzecinkowe jako double.

    Kod źródłowy oprogramowania sterującego składa się z trzech głównych części:
    1. plik END.C zawierający silnik programu, składający się z funkcji odczytania stanu wejść, funkcji zapisania stany wyjść sterownika oraz głównej pętli programu
    2. pliki zawierające definicje klas bloków
    3. głównego pliku programu, który zawiera: deklaracje bloków, definicje sieci, funkcję obliczającą wartość wyjść sterownika (funkcja evaluate_outputs) oraz funkcją main.

    Przykład programu wykorzystującego tą architekturę pokazuje plik t1.c
    Kompletne źródła programu wraz z opisem - plc_avr.zip


    Konwersja schematu do programu


    Biblioteka elementów
    Na potrzeby projektu powstała specjalna biblioteka programu Eagle. Plik PLC.LBR zawiera definicje elementów, których można użyć do zapisania algorytmu sterowania.
    W chwili obecnej biblioteka zawiera symbole wejść i wyjść sterownika, bramek logicznych (AND, NOT, OR), wartości stałych, licznika, generatora PWM, dekodera impulsatora oraz wzmacniacza (bloku mnożącego)


    Przykładowy schemat programu sterującego
    Poniższy przykład pokazuje, jak można wykorzystać sterownik do sterowania jasnością żarówki lub prędkością obracania silnika prądu stałego.
    Sterownik został podłączony do impulsatora obrotowego (wejścia nr 11 i 12) oraz małego silniczka modelarskiego na 12V (wyjścia nr 1 i 2).

    Plik T1.ZIP zawiera zastosowany graf sterowania. Graf w postaci graficznej Programowalny sterownik jeszcze inaczej.
    Graf ten składa się z czterech głównych bloków (kolejno od lewej): dekoder impulsatora, licznik, wzmacniacz oraz generator PWM. Dodatkowo na schemacie znajduje się 6 bloków symbolizujących wartości stałe.
    W efekcie zaprogramowania sterownika według tego schematu, prędkość obracania się silnika jest regulowana za pomocą impulsatora w zakresie od 2% do 100%.

    Skrypt konwertujący
    Skrypt konwertujący schemat programu Eagle (plik SCH) do postaci programu w języku C++ został napisany w języku PHP. Do poprawnej pracy tego skryptu wymagane jest więc zainstalowane środowisko PHP.
    Skrypt ten pobiera jako parametr nazwę pliku wejściowego i generuje plik o takiej samej nazwie i rozszerzeniu C.
    Dokładny opis działania skryptu znajduje się wewnątrz skryptu w postaci komentarzy.
    Jako efekt działania skryptu powstaje plik o strukturze przedstawionej na przykładzie pliku t1.c

    Kod źródłowy PHP - sch2c.php



    Skrypt programujący

    Skrypt programujący składa się de facto z dwóch skryptów:

    1. skryptu programu Eagle (język ULP), który pobiera nazwę bieżącego pliku SCH i przekazuje ją do skryptu BATCH
    2. skryptu BATCH, który wykonuje właściwe operacje
    skrypt programuj.ulp ma następująca postać:

    Code:
    schematic(S) {
    
        string com = "D:\\sch2c\\build.cmd " + S.name;
        system (com);
    }


    Aby go wywołać należy w oknie edytora schematów wpisać polecenie run programuj

    Plik build.cmd wywołuje skrypt konwertujący oraz przenosi wynikowy plik C do folderu D:\sch2c. Następnie plik wynikowy jest kompilowany (avr-c++), linkowany (avr-gcc) i na tej podstawie generowany jest plik HEX (avr-objcopy).
    Następnie plik HEX zapisywany jest w pamięci mikrokontrolera za pomocą programu AVRDUDE, przy czym założono, że moduł Arduino widoczny jest w systemie operacyjnym jako port COM10.
    Programy avr-c++, avr-gcc, avr-objcopy, avrdude oraz wszelkie niezbędne biblioteki są zawarte w darmowym pakiecie WinAVR, którego zainstalowanie jest niezbędne do poprawnej pracy skryptu.

    Przycisk programowania
    Aby ułatwić proces programowania uruchomienie skryptu programuj.ULP można przypisać do przycisku w oknie edytora schematów.
    Szczegółowy opis, jak ro zrobić na mojej stronie po adresem http://wniedziel.mooo.com/plc/avr.. Na tej stronie znajduje się pełny opis projektu, wraz opisem struktur danych zapisanych w plikach SCH.

    Co dalej?

    W zasadzie projekt można rozwijać w nieskończoność. Poniżej moje pomysły na dalsze modyfikacje.
    W kwestii sprzętowej:
    1. Poprawienie moduł wyjściowy push-pull z uwzględnieniem diod zabezpieczających,
    2. Dodanie diod świecących sygnalizujących stan wejść i wyjść,
    3. Zmniejszenie liczby wejść i wyjść, co pozwoli na zamknięcie sterownika w kompaktowej obudowie,
    4. sterowanie modułami we/wy bezpośrednio z portów mikrokontrolera (brak magistrali, dekoderów adresowych oraz zatrzasków) kosztem zmniejszenia liczby wejść i wyjść lub zastosowanie modułu mikrokontrolera z większą ilością portów, np. Arduino Mega,
    5. wykorzystanie modułu sterującego z mikrokontrolerem Cortex, co pozwoli na wielokrotne zwiększenie mocy obliczeniowej. Moduły Nucleo-32 i Nucleo-64 posiadają rozstaw pinów zgodny z modułami Arduino, co pozwoli na łatwą wymianę modułów,
    6. wykorzystanie układu FPGA jako modułu sterującego,
    7. Wykonanie sterownika w wersji do montażu na szynę DIN.
    Oprogramowanie:
    8. Przepisanie skryptu php na PowerShell lub na program wykonywalny exe, co ułatwi korzystanie z niego,
    9. Stworzenie programu instalatora, który automatycznie zainstaluje i skonfiguruje wszystkie elementy środowiska programistycznego.


    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz pendrive 32GB.
  • Metal Work Pneumatic
  • #2 20 Cze 2018 21:20
    tplewa
    Poziom 38  

    Projekt fajny ale mam pytanie. Dlaczego popadanie z skrajności (PC) w skrajność (leciwy AVR), jak pomiędzy PC i AVR jest spora liczba procesorów bardziej optymalnych do takich założeń... do tego mowa o procesorach w przystępnej cenie i łatwo dostępnych...

  • Metal Work Pneumatic
  • #4 20 Cze 2018 22:32
    tplewa
    Poziom 38  

    Chrusta napisał:
    A nie lepiej zamiast tworzyć takie kombinacje z Eaglem, to zainteresować się LabView?


    A od kiedy LabView jest darmowy (nie liczę studentów), jako hobbysta masz triala i na tym się kończy... Eagle mimo wersji komercyjnej udostępnia wersję okrojoną za free która do tego jak widać wystarcza...

  • #5 21 Cze 2018 12:27
    Janusz_kk
    Poziom 15  

    Tak jak już Tplewa zauważył popadasz z skrajności w skrajność, jak już AVR to użyłbym XMegi, możliwości dużo większe od zwykłego avr-a, można kupić moduły Xtronica z atxmegą A3 na pokładzie, sam zresztą podobny moduł już zleciłem do roboty bo orginalne już nie są produkowane.

    Ale za chęci masz plusa.

  • #6 21 Cze 2018 17:42
    tplewa
    Poziom 38  

    Osobiście to nie chciałem podawać jaki układ bo trzeba by to przemyśleć. Ale jak wspomniałem są różne procesory w tym XMega, DS PIC-e (mające ciekawą część sprzętową), różne ARM-y itd.

    Rozumiem że chodziło o część software, ale tutaj to tylko kwestia założeń i ograniczeń jakie sobie nałożymy (np. maksymalne użycie RAM itd. itp.).

  • #7 21 Cze 2018 21:10
    wniedzie
    Poziom 13  

    Jeśli chodzi o zastosowany mikrokontroler, to sedno projektu tkwi raczej w pomyśle na podejście do programowania i połączeniu paru prostych niepozornych elementów w coś nowego. Zastosowanie innego układu sterującego wymaga zmiany tylko pewnej części projektu i nie wpływa na sens całości. Czy to będzie Eagle, czy coś podobnego; czy to będą skrypty w PHP czy C# czy w PowerShell, to dla mnie też sprawa drugorzędna.

  • #8 21 Cze 2018 21:13
    tplewa
    Poziom 38  

    Wniedzie owszem ale to nie wymagało zmiany platformy z PC :) Można sobie i na PC postawić pewne ograniczenia i ich się trzymać - np. to co wspomniałem :) Generalnie można cały hardware pominąć by testować rozwiązania software :) Nie wiem czy jeszcze jest to rozwijane ale nawet był emulator AVR-ów na PC :) Natomiast jak już powstał hardware to dziwi mnie dlaczego tak, a nie inaczej. Bo nie widzę tutaj nic na korzyść AVR-a (nawet ceny mają wysokie).

  • #9 21 Cze 2018 22:13
    wniedzie
    Poziom 13  

    tplewa napisał:
    Można sobie i na PC postawić pewne ograniczenia i ich się trzymać

    odejście od PC wynikło z tego, że ciężko byłoby zrobić jakiś rozsądny bootloader. Jak wgrywać nowy soft? Po RS-232, USB, LAN? Nie miałem pomysłu na to. Inna sprawa, że przy wersji na PC zostałem nieźle zjechany za takie pomysły i dlaczego nie użyłem uC. Tu widzę, że muszę się bronić z drugiej strony :)

  • #10 21 Cze 2018 22:26
    tplewa
    Poziom 38  

    Powiedzmy sobie tak zależy co robimy. Bo jak wspomniałem jak ma to być do koncepcji testowania oprogramowania to można to robić na PC, jak ma to być sterownik to zarówno koncepcja z PC jak i AVR jest tak jak napisałem jakąś skrajnością (a raczej utrudnianiem sobie życia ze względu na to że są to dość leciwe kontrolery oferujące niewiele zasobów, natomiast lepsze wersje z USB itp. niezbyt atrakcyjne cenowo).

    Ja nie tyle atakuje co bardziej mnie ciekawi dlaczego AVR czy dlatego że kolega np. zna tylko te procki czy jakieś inne powody itd. Teoretycznie mógł bym pomyśleć że płytka arduino, ale nawet tutaj płytek zgodnych z pinami Arduino i ciekawszymi procesorami jest też sporo do wyboru - za równo markowych jak i chińskich...

    Przykładowo używając procesora z ciekawymi peryferiami można by dodać ich obsługę (jako kolejne bloczki) i nie robić wszystkiego w software (a widzę w niektórych seriach takie które trudno zrealizować w software, a przydały by się w sterowniu np. silników itp.)...

    Natomiast co do projektu to jest bardzo fajny i kibicuję autorowi :)

  • #11 21 Cze 2018 23:16
    wniedzie
    Poziom 13  

    tplewa napisał:
    dlaczego AVR

    W zasadzie ten projekt posłużył mi do nauczenia się czegokolwiek o programowaniu mikrokontrolerów, więc jak dla początkującego AVR wydał mi się rozsądny bo popularny. Projekt przeleżał trochę na półce, zanim go tu wrzuciłem, więc teraz być może zrobiłbym to inaczej. Nawet zakupiłem płytkę z STM32 celem podmiany "serca", ale jakoś nie mam czasu na wdrożenie (małe dzieci). Chyba że to już też wychodzi z mody, a ja nic o tym nie wiem :)

    tplewa napisał:
    używając procesora z ciekawymi peryferiami można by dodać ich obsługę (jako kolejne bloczki)

    Bardzo słuszna uwaga

  • #12 22 Cze 2018 00:06
    tplewa
    Poziom 38  

    No i o to chodziło :) Spoko jak to pierwsze procki to ok :) Ja nawet jestem zwolennikiem zaczynania od słabszych i mniej skomplikowanych procków, potem przesiadka jest dużo łatwiejsza i za zwyczaj wiele problemów jest w stanie człowiek szybciej rozwiązać. Sam to wiem po sobie że zaczynając w dawnych latach na Z80, 6502... potem używanie 8051 następnie AVR-ów itd. przychodziło bardzo łatwo i za zwyczaj opierało się na przeczytaniu dokumentacji i w tamtych czasach zapoznaniem jeszcze z nowymi instrukcjami assemblera :)

  • #13 22 Cze 2018 11:22
    wniedzie
    Poziom 13  

    Chrusta napisał:
    A nie lepiej zamiast tworzyć takie kombinacje z Eaglem, to zainteresować się LabView?


    Przyznam się, że nawet nie byłem świadomy istnienia takiego produktu, a na graficzny sposób programowania wpadłem sam. No coż - po raz kolejny wyważyłem otwarte drzwi :)

  • #14 22 Cze 2018 23:43
    tplewa
    Poziom 38  

    Pomysł w zasadzie nie jest nowy i spotkać go można od dawna. Poza LabView kiedyś tak można było programować procesory ST62, taka możliwość istnieje miedzy innymi w GNURadio i wielu innych rozwiązaniach.

    Problem jest natomiast jeden by coś takiego dobrze zrobić nie jest łatwo :)