
Celem projektu było stworzenie amatorskiego programowalnego sterownika logicznego.
Motywacją do stworzenia tego sterownika była potrzeba posiadania uniwersalnego urządzenia 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.
Innymi słowy, sterownik ma być rozwiązaniem pośrednim pomiędzy komercyjnym sterownikiem PLC a dedykowanym układem sterującym, eliminującym pewne ograniczenia obydwu, np.:
1. Małą częstotliwość przetwarzania w przypadku sterowników PLC,
2. Brak możliwości szybkiej rekonfiguracji lub rozbudowy sterownika dedykowanego.
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
Podstawą pierwszej wersji sterownika było zastosowanie płyty głównej komputera PC jako modułu sterującego oraz podłączonego do niej za pomocą portu równoległego LPT modułu we/wy.

Takie rozwiązanie pozwala na:
1. Wykorzystanie dużej mocy obliczeniowej procesora x86
2. Wykorzystanie wbudowanych interfejsów, w szczególności portów szeregowych, USB, VGA oraz Ethernet. Dzięki temu można zbudować system wyposażony w rozbudowany interfejs użytkownika, w tym graficzny, oraz łatwo integrować się z innymi systemami przy pomocy protokołów RS232 lub ModBus over TCP/IP.
Ze względu na to, że sterownik musi pracować jako system czasu rzeczywistego (dające się przewidzieć czasy przetwarzania i reakcji), został uruchomiony pod kontrolą systemu DOS (FreeDOS). Wynikają z tego pewne implikację, m.in.:
1. pełna kontrola wykonywania programu, w szczególności wykorzystanie przerwań sprzętowych i timerów,
2. szybki dostęp do portu równoległego
3. Możliwe jest wykorzystanie usług systemu operacyjnego, np. obsługa systemu plików FAT.
Płyta PC
Aby zapewnić możliwe kompaktowe rozmiary całego sterownika na płytę główną została wybrana płyta z terminala HP T5000. Główne cechy tej płyty to:
1. Małe rozmiary (17cmx17cmx5cm),
2. Energooszczędny procesor taktowany z częstotliwością 500MHz,
3. Brak konieczności używania wentylatorów,
4. Zasilanie z pojedynczego źródła 12V,
5. Złącza ATA 44-pin pozwalające na podłączenie modułu DOM lub karty Compact-Flash jako podstawowego dysku z systemem operacyjnym,
6. Wbudowane porty USB, VGA, RS-232, LPT, Ethernet.
System powinien być jak najbardziej odporny na wstrząsy, dlatego system operacyjny został zainstalowany na karcie Compact-Flash. Możliwe jest też uruchomienie systemu z pamięci USB.
Obudowa
Płyta główna wraz z modułem we/wy została umieszczona w uniwersalnej obudowie plastikowej Z26 o wymiarach 22x22x6cm.
Płyta PC znajduje się nad płytą we/wy i jest do niej przytwierdzony za pomocą gwintowanych tulei dystansowych. Rozkład otworów montażowych w płycie PC narzucił taki sam rozkład otworów w płycie we/wy.
Całość zasilana jest zewnętrznym zasilaczem 12V.
Moduł We/Wy
Podstawowe wymagania na płytę wejścia/wyjścia to:
1. Podłączenie do płyty głównej za pomocą portu LPT,
2. Zasilenie z pojedynczego źródła 5V, np. z portu USB płyty głównej,
3. Co najmniej 16 wejść cyfrowych akceptujących sygnał napięciowy o wartości 5-24V i dowolnej polaryzacji
4. Co najmniej 16 wyjść cyfrowych o obciążalności do 2A,
5. Możliwie jak najszybsze wykonywanie cykli odczytu wejść i zapisu wyjść.
6. Wymienne moduły wyjściowe typu otwarty kolektor lub push-pull.
Magistrala danych
Biorąc pod uwagę, iż system musi umożliwiać wykorzystanie do 16 wyjść typu push-pull, a każde z nich może być w jednym z trzech stanów (wysoki, niski lub wysokiej impedancji) ilość wewnętrznych sygnałów wyjściowych musi wynosić nawet 32 (po dwie linie sterujące na wyjście). Dodatkowo system musi obsłużyć 16 linii wejściowych. W sumie daje to 48 linii sygnałowych.
Ze względu na to, że port LPT posiada tylko 8 dwukierunkowych linii komunikacyjnych (D0-D7), sygnały wejściowe i wyjściowe muszą być multipleksowane i de multipleksowane z magistrali. Przy wykorzystaniu linii D0-D7 jako magistrali wspólnej dla adresów i danych teoretycznie można zaadresować 65536 linii wejścia/wyjścia.
Mając na uwadze powyższe, na płycie we/wy został więc zastosowany zestaw dwóch ośmiobitowych buforów wejściowych, czterech ośmiobitowych zatrzasków wyjściowych oraz dekoder adresowy.
Odczyt stanu wejść przebiega następująco:
1. Przestawienie magistrali w tryb wyjścia
2. Wystawienie na magistrali adresu jednego z dwóch buforów wejściowych
3. Zatrzaśnięcie adresu w zatrzasku adresowym
4. Przestawienie magistrali w tryb wejścia
5. Aktywacja bufora
6. Odczyt wartości z magistrali
7. Zwolnienie magistrali
8. Powtórzenie powyższych kroków dla drugiego bufora wejściowego
Zapis stanu wyjść przebiega następująco:
1. Przestawienie magistrali w tryb wyjścia
2. Wystawienie na magistrali adresu jednego z czterech zatrzasków wyjściowych
3. Zatrzaśnięcie adresu w zatrzasku adresowym
4. Wystawienie na magistrali danych wyjściowych
5. Zatrzaśnięcie danych w odpowiednim zatrzasku
6. Powtórzenie powyższych kroków dla pozostałych trzech buforów wyjściowego
Wejścia
Wszystkie wejścia cyfrowe są galwanicznie odizolowane od reszty układu. Dzięki zastosowaniu układu TLP620-4, który składa się z czterech transoptorów posiadających po dwie diody świecące spolaryzowane przeciwnie, wejście cyfrowe może być aktywowane dowolną polaryzacją. Ponadto układ ten może być zastąpiony dwoma układami TLP620-2 lub czterema układami TLP620-1.
Wyjścia transoptorów podłączone są do magistrali poprzez bufory 74245. Ze względu na to, że bufory te posiadają wejścia bez wewnętrznych rezystorów podciągających a podłączone są od strony wejścia do układu typu otwarty kolektor konieczne jest dodanie zewnętrznej drabinki rezystorów. Fakt ten nie został wychwycony w fazie projektowania płytki, dlatego drabinki rezystorowe zostały dodane później.
Początkowo moduł we/wy miał zawierać ośmiokanałowy przetwornik analogowo-cyfrowy, jednak docelowo nie został on zamontowany i w kolejnych wersjach systemu zostanie pominięty.
Wyjścia
Moduły wyjściowe zostały zaprojektowane w formie wymiennych płytek z zaciskami. Umożliwia to dopasowanie sterownika do różnego typu elementów wykonawczych, bez konieczności stosowania dodatkowych układów pośredniczących. Płytki te połączone są do kontrolera za pomocą taśmy ze stykami.
W chwili obecnej są zaprojektowane dwie wersje modułów wyjściowych: typu otwarty kolektor oraz push-pull. Każdy z typu modułu obsługuje 8 wyjść cyfrowych, dzięki czemu możliwe jest zamontowanie ich w trzech konfiguracjach:
1. 16 wyjść otwarty kolektor
2. 8 wyjść otwarty kolektor i 8 wyjść push-pull
3. 16 wyjść push-pull
Moduł wyjściowy typu otwarty kolektor został oparta na dwóch układach MP4102 (wymontowane z drukarki igłowej, gdzie sterowały głowicą) i wymaga ośmiu linii sterujących.
Moduł typu push-pull zawiera dwa popularne układy L298. Każdy z nich składa się z dwóch kompletnych mostków H. Dzięki swojej konstrukcji może zostać użyty jako sterownik czterech niezależnych linii z zastrzeżeniem, iż sygnały sterujące EnableA i EnableB są wspólne dla dwóch linii. W związki z tym, że pożądane jest aby wykorzystać możliwość przestawienia wyjścia w stan wysokiej impedancji, cały moduł wymaga dwunastu linii sterujących.
Uwaga. Moduł push-pull nie zawiera diod zabezpieczających wyjścia układów L298, co jest niezgodne ze sztuką i może doprowadzić do uszkodzenia układu.
Aby zapewnić odpowiednią ilość sygnałów sterujących dla obu typów modułów wraz z zasilaniem 5V minimalna ilość linii wynosi 14. Z tego powodu użyto taśm i konektorów 16-pinowych.
Komunikacja LPT
W pierwotnej wersji płyty we/wy komunikacja przez port LPT odbywała się w trybie SPP, co oznacza, że linie sterujące zatrzaskami i buforami musiały być obsłużone programowo. W efekcie tego cykl odczytu wejść wymagał 12 operacji na porcie LPT a cykl zapisu wyjść 24 operacji. W sumie odczyt i zapis stanu wejść i wyjść wymagał 36 operacji na porcie LPT.
W związku z ograniczoną prędkością magistrali ISA, do której podłączony jest port LPT, częstotliwość przetwarzania sygnałów wyniosła około 10 kHz, przy czym faza obliczeniowa miała znikomy wpływ na częstotliwość przetwarzania.
Aby zwiększyć częstotliwość przetwarzania system został przekonfigurowany na komunikację przy sprzętowym wsparciu trybu EPP. Wymagało to drobnych zmian w części dekodera adresowego (inne podłączenie linii sterujących) oraz sprzętowego generowania sygnału /WAIT, np. jako prostej funkcji logicznej:
/WAIT = /(ADDRESS_STROBE * DATA_STROBE)
Funkcję tę można zrealizować na jednej bramce NAND lub jej równoważniku, np. bramkach NOT z wyjściami typu otwarty kolektor (tzw. ?iloczyn na drucie?).
Dzięki komunikacji EPP ilość wszystkich operacji na porcie LPT zmniejszyła się trzykrotnie, co spowodowało wzrost częstotliwości przetwarzania do około 40 kHz.
Początkowo częstotliwość przetwarzania miała być synchronizowana generatorem opartym na układzie NE555 wysyłającym do portu LPT sygnał przerwania. Nie został on jednak zainstalowany i został zastąpiony timerem na płycie PC.
Oprogramowanie - opis
Bloki
Podstawowa funkcja oprogramowania to realizacja algorytmu sterowania, który zapisany jest jako struktura bloków realizujących różne algorytmy obliczeniowe, połączonych między sobą wirtualnymi przewodami. Aby zapisać taką strukturę w postaci programu komputerowego naturalne jest wykorzystanie programowania obiektowego.
W związku z powyższym każdy blok jest obiektem klasy dzierżawiącej po wspólnej klasie BLOCK. Klasa ta zakłada, że każdy blok będzie posiadał:
1. do pięciu wejść typu zmiennoprzecinkowego,
2. jedno wyjście typu zmiennoprzecinkowego,
3. zdefiniowaną funkcję CALC służącą do obliczenia wartości wyjścia bloku.
Połączenia pomiędzy blokami są realizowane za pomocą wskaźników na obiekty klasy BLOCK, tzn. każde wejście bloku jest wskaźnikiem na inny blok. W ten sposób budowana jest struktura przepływu sygnałów od wejść sterownika, poprzez bloki funkcyjne, do wyjść sterownika.
Aby ujednolicić strukturę programu, wejścia kontrolera również odwzorowane są jako bloki.
Każde wyjście kontrolera odwzorowane jest jako wskaźnik na blok.
Dzięki temu, że wejścia i wyjścia bloków są typu zmiennoprzecinkowego, sterownik może wewnętrznie przetwarzać wartości analogowe, jak na przykład: czas, częstotliwość, wypełnienie sygnału okresowego, itp. Ponadto sterownik może przetwarzać sygnały analogowe z zewnątrz o ile zostaną przetworzone na postać cyfrową, np. za pomocą konwertera NAPIĘCIE-->PWM.
Wartości binarne są przetwarzane w ten sposób, że wartość sygnału 0 odpowiada logicznemu fałszowi, a inna wartość odpowiada logicznej prawdzie.
Przykładowe typy bloków to:
1. pojedyncze bramki logiczne,
2. złożone układy logiczne (np.: przerzutniki, liczniki, kodery)
3. operatory i funkcje arytmetyczne
4. operacje porównania
5. wartości stałe
Oprogramowanie jest bardzo elastyczne i pozwala na tworzenie własnych bloków realizujących właściwie dowolne funkcje. Głównym ograniczeniem bloku jest tylko jedno wyjście, co wynika z architektury oprogramowania.
Algorytm przetwarzania
Główny pętla programu wykonuje następujące czynności:
1. Odczytania stanu wejść
2. Obliczenie stanu wyjść
3. Zapisanie stanu wyjść
Ze względu na to, że maksymalna możliwa prędkość przetwarzania tej pętli wynosi około 40 kHz, główna pętla została zaprogramowana tak, aby wykonywała się około 30 tysięcy razy na sekundę. Osiągnięto to poprzez wstawienie głównej pętli w procedurę obsługi przerwania sprzętowego timera na płycie głównej. Timer ten dostaje sygnał wejściowy o częstotliwości 1193182Hz, który poprzez programowalny dzielnik częstotliwości może być źródłem przerwania. Po zaprogramowaniu dzielnika na wartość 40 uzyskujemy częstotliwość wywołania przerwania wynoszącą 29830Hz. Przy założeniu, że jest to wartość dostatecznie zbliżona do 30000 Hz, osiągnięto dwa cele:
1. pętla główna może zostać w prosty sposób wykorzystana do zliczania czasu z dokładnością około 33us i błędem około 0,5%.
2. Procesor posiada zapas mocy obliczeniowej na poziomie około 25%, co może zostać wykorzystane do zaprogramowania dodatkowych funkcjonalności.
Ze względu na sposób zapisania programu w postaci łańcucha połączonych bloków (każdy blok ?wie? o bloku poprzednim), obliczenie wartości dowolnego wyjścia sterownika wymaga wywołania jednej funkcji liczącej wartość bloku podłączonego do tego wyjścia. Wartości wszystkich pozostałych bloków są rekurencyjnie obliczane ?wstecz?, aż do sygnałów wejściowych.
Należy zauważyć, że wyjście dowolnego bloku może być podłączone do wejść wielu bloków. Aby w takim przypadku nie liczyć ponownie wartości takich bloków oraz zapobiegać ewentualnym pętlom, każdy blok posiada flagę informującą, że dany blok został już przetworzony w bieżącej iteracji. Flagi te są czyszczone przed rozpoczęciem kolejnej iteracji.
W obecnej wersji oprogramowania kontrolera w wersji PC nie ma możliwości zewnętrznego programowania. Program może być zmieniony poprzez uruchomienie go z wymiennej pamięci USB lub edycję i rekompilację bezpośrednio na kontrolerze.
Oprogramowanie - Kody źródłowe
Główne pliki programu to:
Plc.cpp ? program główny. Inicjuje sterownik, zawiera definicję algorytmu sterowania, uruchamia główną pętle przetwarzania.
Plceng.cpp ? główna klasa programu. Zawiera funkcje inicjujące, odczytujące wartość wejść, obliczające i zapisującej wartość wyjść.
Block.h ? definicja klasy BLOCK.
Definicje bloków funkcyjnych znajdują się plikach z nazwami zaczynającymi się od ?GATE?. Są to obecnie bramki logiczne (GATE_AND, OR GATE_, GATE_NOT), blok zwracający dowolną wartość stałą (GATE_CON), bloki zwracające wartość 1 lub 0; (GATE_ZER, GATE_ONE), generator PWM (GATE_PWM). Na bazie tych klas można budować dowolne własne pamiętając, żeby umieścić ich deklaracje w pliku plceng.h
załączone schematy i rysunki
Płyta we/wy:
1. Schemat (pierwsza wersja, SPP)
2. Rysunek płytki (pierwsza wersja, SPP)
3. Schemat (druga wersja, EPP) ? bez przetwornika ADC, bez generatora częstotliwości, z dodanymi rezystorami podciągającymi przy buforach wejściowych
Moduły we/wy:
1. Schemat modułów we/wy
2. Rysunek płytki
Zdjęcia

Płyta we/wy ? widok z góry. W prawym górnym rogu, w miejscu planowanego generatora częstotliwości zamontowany układ 7405 odpowiadający za generowanie sygnału /WAIT. W lewym dolnym rogu niewypełnione miejsca na pierwotnie planowany przetwornik A/C.

Płyta we/wy ? widok od spodu. Widoczne późniejsze modyfikacje płytki (dodatkowe przewody) zapewniające prawidłową transmisję EPP.

Płyta we/wy z modułami wyjściowymi zamontowana w obudowie. W jednym z modułów wyjściowych brak jest rezystorów oraz jednego układu MP4102.

Kompletny sterownik z płytą PC. W górnej części widać taśmę łączącą obie płyty, doprowadzenie zasilania z zewnętrznego zasilacza oraz wyprowadzenie portu VGA na zewnątrz obudowy. W lewym dolnym rogu karta CF podłączona do portu ATA za pomoca przejściówki.

Co dalej?
Projekt w obecnej formie został zawieszony i nie będzie rozwijany. Tym nie mniej poniżej znajdują się propozycje poprawek i dalszego rozwoju projektu:
Poprawienie moduł wyjściowy push-pull z uwzględnieniem diod zabezpieczających,
Wyprowadzenie portów USB na zewnątrz obudowy
Dodanie diod świecących sygnalizujących stan wejść i wyjść,
Oznaczenie portów na obudowie,
Wykorzystanie porty IDE do podłączenia modułu we/wy. Wymagałoby to przeprojektowania moduły we/wy ale umożliwiłoby zwiększenie częstotliwości przetwarzania około czterokrotnie (zmierzona częstotliwość taktowania portu IDE w trybie PIO0 to około 1MHz, przy założeniu sześciu operacji we/wy w każdym cyklu otrzymujemy częstotliwość przetwarzania około 160 kHz).
Dodanie możliwości wygodnego programowania sterownika, np. przez port szeregowy,
Rozbudowanie oprogramowania o obsługę bloków w wieloma wyjściami.
Ostatnie dwa punkty zostały zrealizowane w wersji opartej na module Arduino Nano.
Uwagi:
Czym sterownik jest:
1. dowodem na wykonalność pewnych koncepcji (Proof of Concept)
2. układem służącym do nauki i zabawy. Projekt pokazuje między innymi, jak można:
a. wykorzystać płytę komputera PC do sterowania urządzeniami zewnętrznymi przy pomocy protokołu EPP
b. wykorzystać programowanie obiektowe do zamodelowania procesu sterowania, również w przypadku procesorów AVR
c. wykorzystać przerwania sprzętowe i timer wbudowany na płycie PC
d. obsłużyć magistralę danych z dekoderem adresowym
e. wykorzystać pewne funkcje programu Cadsoft Eagle do tworzenia własnych typów schematów
f. oskryptować niektóre fazy tworzenia oprogramowania
3. podstawą do rozbudowy lub tworzenia nowych konstrukcji
Czym sterownik nie jest:
1. Gotowym, kompletnym sterownikiem do zastosowań przemysłowych
Tym samym mam świadomość pewnych niedociągnięć w projekcie, w szczególności w warstwie sprzętowej. Tym nie mniej układ działa i mam nadzieję, że komuś to opracowanie będzie pomocne w nauce lub w budowie własnego układu.
Miałem jakieś problemy z załączeniem schematów i plików brd, dlatego odsyłam do mojej strony pod adresem http://wniedziel.mooo.com/plc