Szkoła PLC – przetwornika ADC – tryb ręczny

potencjometr-direction

Poprzednio czytałeś o przetworniku analogowo-cyfrowym, jak on działa w sterowniku oraz sposobach jego konfiguracji w S7-1200. Teraz wykorzystując te informacje wykonamy kolejny punkt z założeń projektowych do linii technologicznej.

Przetwornika ADC – tryb ręczny

W punkcie 20 należy wykorzystać z potencjometru, który znajduje się na linii transportowej. Treść tego punktu brzmi: „W trybie Manual kierunek ruchu transporterów jest wybierany za pomocą potencjometru Direction. Skrajna lewa pozycja potencjometru, to ruch transporterów w kierunku odbiornika palet R3 (kierunek Forward). Skrajna prawa pozycja potencjometru, to ruch transporterów w kierunku odbiornika palet R1 (kierunek Back). Ustawienie potencjometru w pozycji środkowej powoduje, że transportery zatrzymują się.

W Factory IO możemy sprawdzić, gdzie dokładnie został podłączony sygnał z potencjometru Direction. Wybierzmy File a następnie Driver Configuration. Sygnał Speed został podłączony pod adres IW100. Zatem w tym obszarze pamięci będzie lokowana wartość cyfrowa napięcia. Możemy jeszcze sprawdzić, w jakich zakresach zmienia się ta wartość.

W drzewie projektu znajduje się folder Watch and force table. W grupie FactoryIO tworzymy nową grupę o nazwie Analog, do której następnie dodajemy nową tablicę monitorującą AnalogInputFIO. Do tej tablicy dodajemy sygnał Direction. Teraz należy włączyć podgląd tej tablicy naciskając w pasku narzędzi ikonę okularów z zielonym trójkątem. Przekręcamy potencjometr w Factory IO i monitorujemy wartość dla tagu Direction. Widzisz, że zakres jest w przedziale od 0 do 27648.

Tworzenie kodu programu

Zgodnie z założeniem, gdy potencjometr zostanie przekręcony w jedną ze skrajnych pozycji, wówczas transportery powinny zostać uruchomione. To także decyduje o tym, w jakim kierunku mają zostać uruchomione transportery.

W PLC tags utworzymy nową tablice o nazwie CONST. Umieścimy tam na początek dwie stałe, więc należy przejść do zakładki User constant. Pierwsza stała będzie miała nazwę CONST_MANUAL_DIRECTION_LEFT typu Word o wartości 1000. Ta stała posłuży nam podczas porównywania wartości cyfrowej z przetwornika ADC. Jeżeli ta wartość będzie niższa od tej stałej, to transporter zostanie uruchomiony.

Analogicznie tworzymy drugą stałą o nazwie CONST_MANUAL_DIRECTION_Right typu Word o wartości 27000. W tym wypadku, jeżeli wartość z przetwornika będzie wyższa od tej stałej, to transporter zostanie także uruchomiony.

Funkcja LOG_ClassLogic() zawiera już miejsce, gdzie należy umieścić kod programu odpowiedzialny za obsługę pracy linii w trybie ręcznym. Za chwilę zrobimy tam wywołania funkcji, które teraz utworzymy.

W drzewie projektu do warstwy Logic dodamy jeszcze jedną grupę o nazwie Manual. Tą grupę należy umieścić w grupie Mode.

Do grupy Manual dodajemy funkcję typu FC o nazwie LOG_ManualControl. W sekcji interfejsu dodajemy parametr wejściowy (Input) o nazwie PotentiometrDirection typu Word. Za pomocą tego parametru zostanie przekazana do funkcji wartość cyfrowa napięcia z potencjometru. Dodajemy tez jeden parametr wyjściowy (Output) służący sterownia silnikiem. Nazwa parametru to MotorData typu stt_Motor. W ten sposób będzie możliwość ustawienia odpowiednich pól w strukturze. W sekcji kodu napiszemy następującą linię kodu

#MotorData.Run := (#PotentiometrDirection < "CONST_MANUAL_DIRECTION_LEFT") OR (#PotentiometrDirection > "CONST_MANUAL_DIRECTION_RIGHT");

Wykorzystujemy wartość z parametru wejściowego funkcji oraz wcześniej utworzone stałe do wykonania porównania (sprawdzenia, czy wartość z potencjometru mieści się w przedziale). Jeżeli warunek jest spełniony, to do pola Run zostaje przypisany stan wysoki.

Teraz napiszemy kod odpowiedzialny za wybór kierunku. W tablicy stałych o nazwie CONST tworzymy jeszcze dwie stałe, które zostaną wykorzystane podczas pisania kolejnej funkcji. Pierwsza z nich o nazwie CONST_MANUAL_RUN_LEFT typu Word o wartości 10000. Kolejna stała to o nazwie CONST_MANUAL_RUN_RIGHT typu Word o wartości 16000.

Do grupy Manual dodajemy kolejną funkcję typu FC o nazwie LOG_ManualDirection. Ponownie do sekcji interfejsu dodajemy te same parametry, jak w poprzedniej funkcji. Dodajemy parametr wejściowy (Input) o nazwie PotentiometrDirection typu Word. Za pomocą tego parametru zostanie przekazana do funkcji wartość cyfrowa napięcia z potencjometru. Dodajemy tez jeden parametr wyjściowy (Output) o nazwie MotorData typu stt_Motor. Kod funkcji został przedstawiony poniżej

IF (#PotentiometrDirection >= "CONST_MANUAL_RUN_LEFT") AND (#PotentiometrDirection <= "CONST_MANUAL_RUN_RIGHT") THEN
#MotorData.DirectionForward := FALSE;
#MotorData.DirectionBackward := FALSE;
ELSIF (#PotentiometrDirection < "CONST_MANUAL_RUN_LEFT") THEN  #MotorData.DirectionForward := TRUE;  #MotorData.DirectionBackward := FALSE;  ELSIF (#PotentiometrDirection > "CONST_MANUAL_RUN_RIGHT") THEN
#MotorData.DirectionForward := FALSE;
#MotorData.DirectionBackward := TRUE;
END_IF;

Pierwsza instrukcja warunkowa IF sprawdza, czy potencjometr jest ustawiony w położeniu środkowym. Jeżeli warunek jest spełniony, to pola DirectionForward oraz DirectionBackword jest przypisywana wartość False. Dzięki temu transportery nie uruchomią się. Kolejna instrukcja warunkowa sprawdza, czy wartość parametru wejściowego PotentiometrDirection jest mniejsza od stałej CONST_MANUAL_RUN_LEFT. Jeżeli ten warunek jest spełniony, to do pola DirectionForward jest przypisywana wartość True. Dzięki temu silnik będzie mógł być uruchomiony w tym kierunku. Do drugiego pola, czyli DirectionBackword jest przypisywana wartość False. W ten sposób silnik nie uruchomi się w tym samym czasie w dwóch kierunkach.

Analogicznie ostatnia instrukcja warunkowa , czy wartość parametru wejściowego PotentiometrDirection jest większa od stałej CONST_MANUAL_RUN_RIGHT. Jeżeli ten warunek jest spełniony, to do pół w strukturze są przypisywane odpowiednie wartości w celu uruchomienia silnika w odpowiednim kierunku.

Pozostało nam tylko wywołać utworzone funkcje. Przechodzimy do funkcji LOG_ClassLogic() i dodajemy w miejsce przewidziane dla trybu ręcznego. Teraz jest tam tylko komentarz

//TODO MODE manual

W to miejsce dodajemy następujący kod.

"LOG_ManualControl"(PotentiometrDirection := "Direction",
MotorData => "HD_MotorData".T1);
"LOG_ManualControl"(PotentiometrDirection:="Direction",
MotorData=>"HD_MotorData".T2);
"LOG_ManualControl"(PotentiometrDirection := "Direction",
MotorData => "HD_MotorData".T3);
"LOG_ManualDirection"(PotentiometrDirection:="Direction",
MotorData=>"HD_MotorData".T1);
"LOG_ManualDirection"(PotentiometrDirection := "Direction",
MotorData => "HD_MotorData".T2);
"LOG_ManualDirection"(PotentiometrDirection := "Direction",
MotorData => "HD_MotorData".T3);
"R3" := TRUE;
"R1" := TRUE;

Na początku wywołujemy funkcje LOG_ManualControl() dla każdego z transporterów. Mamy ich trzy, więc są trzy wywołania. Do parametru wejściowego zostaje przypisany sygnał z potencjometru czyli Direction. Do parametru wyjściowego została przypisana zmienna stanowiąca strukturę z informacjami o silniku.

Analogicznie została wywołana funkcja LOG_ManualDirection() dla każdego z transporterów.

Należy też uruchomić każdy z odbiorników, czyli R3 oraz R1. W funkcji LOG_ClassLogic() znajduje się miejsce dla kodu, gdy linia jest w trybie Stop. W tym miejscu należy dopisać kod do wyłączenia odbiorników R3 oraz R1.

Testowanie

Pozostało nam teraz wykonać kompilację software i jeżeli nie pojawiły się błędy, to należy wgrać projekt do sterownika S7-1200.

Przechodzimy do Factory IO, aby przetestować napisany kod. Na początku ustawmy potencjometr w położeniu środkowym.

Należy włączyć tryb ręczny, czyli naciskamy przycisk Manual a następnie naciskamy przycisk Start podłączony fizycznie do sterownika. W tym momencie na kolumnie zapali się lampa zielona oraz żółta zacznie pulsować.

Jeżeli teraz przekręcisz potencjometrem w lewo, to w Factory IO z lewej strony na liście sygnałów zauważysz, że sygnały T1_Forward, T2_Forward oraz T3_Forward są w stanie wysokim. Gdy przekręcisz potencjometr w prawą skrajną pozycje, to wówczas sygnały T1_Back, T2_ Back oraz T3_ Back są w stanie wysokim. Gdy zbliżysz się do transportera, to zauważysz obracające się rolki.

Możesz też uruchomić linię w trybie automatycznym. Gdy na linii pojawią się dwie palety, to naciśnij przycisk Finish. Ponownie ustawmy potencjometr w położeniu środkowym. Włącz teraz jeszcze raz tryb ręczny i jedną paletę przejedź do odbiornika R3, a drugą do odbiornika R1.

W takim razie kod programu został napisany poprawnie, ponieważ linia działa zgodnie z założeniem projektowym.

Wideo

Proces pisania kodu programu możesz zobaczyć też na wideo

Projekt TIA Portal

Aktualny projekt linii transportowej możesz pobrać tutaj.

//———-
Licencja FACTORY I/O wypożyczona dzięki uprzejmości firmy Encon-Koester Sp. z o. o. Sp. K.
Encon-Koester Sp. z o. o. Sp. k.
ul. Gagarina 4
54-620 Wrocław

ec

//————-

Kurs-wideo-CZPP

Więcej w kursie wideo: Chcę zostać programistą PLC

Nagrania są dostępne w wersji online jak również na płytach DVD. Napisz mailem, jaką wersje wybierasz.

Podziel się tym wpisem na:
  • Facebook
  • Google Bookmarks
  • Twitter
  • Wykop

Komentarzy

  1. Darek

    Siemka, ogólnie świetny tutorial, pokazujesz dużo ciekawych rzeczy i dobrze prowadzisz krok po kroku przez wszystkie etapy pisania kodu. Wprawdzie niektóre funkcje napisałbym inaczej bo twoje wydają się trochę skomplikowane ale jest ok.

    Jedna uwaga, piszesz że rozdzielczość wejść analogowych jest 10 bit i maksymalnie wynosi 27648 DEC. Programuje troche w arduino i od razu mi się zaświeciła lampka gdyż tam też jest 10 bitowe wejście ADC i wartość max wynosi 1023. Dla wartości 27648 potrzebujemy 15 bitów. To błąd w opisie czy ja czegoś nie rozumiem?

    Powtórz

Pozostaw komentarz

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>