
Witam!
Przedstawiam Wam wynik mojej kilkumiesięcznej pracy nad projektem inżynierskim pt. "Rozproszony system sterowania o architekturze producent-dystrybutor-konsument", którego celem było stworzenie systemu, w którym "inteligencja" układu automatyki jest rozproszona pomiędzy poszczególne moduły, co jest podejściem znacznie różniącym projektowany system od stosowanych obecnie w przemyśle, w których algorytm wykonywany jest w jednostkach centralnych.
Dodatkowym celem projektu było stworzenie systemu w oparciu o darmowe oprogramowanie udostępniane na licencjach wolnego oprogramowania, które umożliwi jego wykorzystanie w zastosowaniach amatorskich.
Trochę teorii
Architektura producent-dystrybutor-konsument:

Najważniejszym urządzeniem komunikacyjnym jest dystrybutor, który odpytuje w ściśle zdefiniowanej kolejności moduły realizujące funkcję producenta, a następnie przesyła zgromadzone dane odpowiednim konsumentom. Pełni on nie tylko zadanie koncentratora danych, ale również ustala kolejność wykonywania działań w systemie rozproszonym. Wyznaczone cele realizowane są poprzez odpowiednio zmodyfikowaną warstwę aplikacji stosu komunikacyjnego, która powinna cechować się determinizmem czasowym realizowanych zadań wymiany danych. Tak postawione wytyczne oraz brak innych funkcjonalności umożliwia implementację tego węzła w układzie mikroprocesorowym wyposażonym jedynie w niewielki zasób peryferiów i dużą ilość pamięci o szybkim dostępie, która przechowuje dane procesowe.
Z punktu widzenia producentów i konsumentów jednoczesny dostęp do magistrali uniemożliwia zastosowanie architektury master/slave, w której dystrybutor jest jednostką nadrzędną. Atutem takiego rozwiązania jest oparcie komunikacji na otwartym i stosunkowo prostym protokole ModbusRTU.
Moduł:


Podstawowym węzłem w stworzonym systemie rozproszonym jest moduł, który realizuje postawione przed nim zadanie. Pomysł przyświecający przy definiowaniu założeń projektowych, polega na rozdziale zadań sterowania na poszczególne elementy. Oznacza to, że w układzie mogą jednocześnie pracować moduły wejściowe fitrujące dane procesowe, obliczeniowe, wyliczające wartości sterowania, oraz wyjściowe różnego rodzaju. Przebieg sygnału przez wszystkie bloki można przyrównać do działania programów napisanych w takich pakietach jak LabView lub Simulink, szczególnie gdy ich praca jest wyzwalana zdarzeniowo. W kompletnym rozwiązaniu każdy węzeł sieci powinien posiadać możliwość jego zdalnej inicjalizacji, konfiguracji, zatrzymania i wznowienia pracy, dlatego też zrealizowanymi w ramach projektu modułami można zarządzać z poziomu dystrybutora. Implementacja takiego rozwiązania bazuje na maszynie stanów modułów podrzędnych ptotokołu CANopen.

Zarządzanie systemem:
W trakcie działania Systemu można dołączać do niego nowe moduły, jak również zmieniać konfigurację węzłów już działających. Służą do tego specjalne komendy warstwy aplikacji dystrybutora oraz niewielki wycinek czasu cyklu modułu głównego, w którym uruchamiane są funkcje odpowiedzialne za wprowadzenie zmian istniejącego już harmonogramu. Dodana została również możliwość zmiany ścieżek przepływu danych pomiędzy elementami systemu. Możliwość pełnego zarządzania systemem rozproszonym jest ściśle związana z architekturą modułów podrzędnych, co nie wyklucza stosowania w sieci modułów, które nie mają rozwiniętej warstwy zarządzania z poziomu komunikacji sieciowej, natomiast ich obsługa z poziomu węzła nadrzędnego jest znacznie uproszczona.
Wykonane moduły!













Udało mi się wykonać pięć modułów: trzy moduły rozproszone (wejścia analogowe, moduł sterownika, wyjścia PWM), zasilacz 24/5V DC z noty katalogowej układu oraz, bazujący na platformie Beaglebone Black, moduł zarządcy-dystrybutora wraz z webserwerem służącym do konfiguracji systemu. Szczegóły działania poszczególnych modułów są umieszczone w załączonej pracy inżynierskiej, natomiast chciałbym zwrócić uwagę na kilka ciekawych rozwiązań programistycznych:
- system wielozadaniowy uruchamiający zadania cyklicznie lub zdarzeniowo,
- główną maszynę stanu modułu bazującą na podejściu tablicowym wraz z przejściami pomiędzy stanami uruchamiającymi odpowiednie procedury,
- wyzwalanie z poziomu rejestrów komunikacyjnych funkcji w module,
- obsłudze ADC w module wejść analogowych (cztery kanały walczą o dostęp do jednego przetwornika -> szeregowanie za pomocą kolejki),
- realizacja dowolnej ilości kanałów PWM poprzez ich rejestrację w funkcji zarządzającej generowaniem sygnału,
- statyczna alokacja pamięci zbliżona do tej znanej z systemu operacyjnego czasu rzeczywistego uC/OS-II.
Dodatkowo wszystkie moduły są kompatybilne z obudową zbiorczą wykonaną w standardzie Rack 19'.

Co wymaga poprawy!
Moduł zarządcy-dystrybutora nie został dokładnie przemyślany i pojawiła się konieczność łatania niektórych braków, dlatego kod nie jest zbyt czysty.
Stos komunikacyjny w module zarządcy-dystrybutora został napisany naprędce (w jeden dzień) ponieważ biblioteka libmodbus miała problem z obsługą bufora portu szeregowego, dlatego też działa, gdy nie pojawiają się jakieś dziwne błędy...
Projekty płytek drukowanych, a szczególnie ich części analogowych (prowadzenie masy, tor analogowy pomiaru napięcia, itd.).
Bardzo chętnie usłyszę od Was słowa konstruktywnej krytyki, ponieważ zdaję sobie sprawę, że moja praca nie jest wolna od błędów, czasami nawet podstawowych. Chciałbym też posłuchać Waszej opinii nt. moich rozwiązań programistycznych, szczególnie tych na zaimplementowanych na atmegach.
P.S. Tak dla uściślenia, studiuję automatykę w Wieży Magów na Politechnice Śląskiej.

Cool? Ranking DIY