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

S7 300, Siemens, zaprogramowanie windy przemysłowej

26 Lip 2011 08:51 4711 25
  • Poziom 10  
    Witam Wszystkich

    Temat wielokrotnie był poruszany chyba najbardziej obszernie w topic - u https://www.elektroda.pl/rtvforum/topic640130.html
    oraz wszystkich topic - ach dotyczących lekcji nr 5 kurs programowania sterowników, jednakże temat chciałbym odświeżyć , ponieważ chciałbym prosić o pomoc w rozwiązaniu przedstawionym przez moją osobę na sterowniku S7 - 300...

    Założenia projektu:
    1. Ilość pięter 5
    2. Na każdym piętrze jeden przycisk wezwania windy
    3. Panel w środku windy 5 przycisków odnoszących się do pięter,
    emergency_stop, otwórz, zamknij
    4. Dominujący ruch góra
    5. Przy braku aktywności tzn. braku wezwań winda po 20 sekundach
    zjeżdża na parter
    6. Na każdym piętrze czujnik położenia windy
    7. Nie możliwym jest załączenie(przywołanie) windy na piętrze na
    którym stoi.

    Moje pytanie może dla nie których bardzo oczywiste dla mnie niestety nie, dlatego uprzejmie proszę o pomoc i wyjaśnienie.

    1. Czy prezentowana droga jest słuszna...

    Pomyślałem sobie, że czujnik położenia będzie informował mnie o piętrze na którym znajduje się winda...jeśli Cz_0 = 0 parter , Cz_1 = 1 I piętro, wszystko zapisujemy w bloku db1.dbb0. Przywołania z kabiny i przycisków na piętrach zapisujemy w db2 i porównujemy z tym co aktualnie jest w db 1.
    Nie wiem jak wymusić sytuacje kiedy np winda znajduje się na 2 piętrze jednocześnie naciskamy przyciski z 1, 3 i 4 piętra...w tym miejscu wymuszenie ruchu w górę nie jest problemem, chodzi o kwestie jak zapamiętać żeby winda zatrzymała się na 3 piętrze wracając...Czy idea z blokami danych jest słuszna...?? Jeśli ktoś byłby tak dobry i wrzucił kilka linijek z objaśnieniem realizacji zagadnienia ze swojego punktu widzenia, będę wdzięczny. Oczywiście punkty zostaną ofiarowane z mojej strony...

    Z góry wszystkim dziękuje.
  • SterControlSterControl
  • Pomocny post
    Poziom 37  
    Witam,
    Ja zrobiłbym to tak:
    Parter jako pozycja bazowa windy. Następnie kolejne kroki trybu automatycznego:
    Krok 1 - jedź na pierwsze piętro;
    Krok 2 - sprawdź czy trzeba się zatrzymać na pierwszym piętrze;
    Krok 3 - jedź na drugie piętro;
    Krok 4 - sprawdź czy trzeba się zatrzymać na drugim piętrze;
    tak aż do samej góry i potem w dół. Kolejne kroki na zasadzie setowania kolejnych bitów i kasowania poprzednich. Sygnały z przycisków poprzez zbocza ustawiają kolejne bity w DB (set) - pamięć wciśnięcia przycisku. Nie musisz tworzyć dwóch DB, wystarczy jeden.
    To tak na szybko... :)
    Pozdrawiam.
  • Pomocny post
    Specjalista Automatyk
    Nie rozumiem tego problemu!
    Skoro winda z 2 jedzie w górę (wezwanie 3,4) to zatrzymuje się na 3 (bo może wzywający chce jechać do góry?) a potem na 4. Kiedy jedzie z 3 na 4, wzywający 3 znów naciska przycisk (bo jednak chciał jechać na dół); druga opcja: dosiadł się do góry i już zjeżdzając nie chce zatrzymywać się na 3!.
    Reasumując: pojawiające się wezwanie kasujesz po osiągnięciu pozycji...i koniec. ;)
  • Użytkownik usunął konto  
  • SterControlSterControl
  • Poziom 10  
    Witam ponownie

    Przeanalizowałem wszystkie wcześniej udzielone wskazówki za które wszystkim dziękuje...

    Swoje działania w realizacji programu zacząłem od OB100, w którym w bloku db1 przyporządkowałem odpowiednio cyfrom 0 - parter, 1 - pierwsze piętro itd...

    Fragment kodu dla parteru poniżej

    AN DB1.DBX 0.0
    AN DB1.DBX 0.1
    AN DB1.DBX 0.2
    AN DB1.DBX 0.3
    AN DB1.DBX 0.4
    AN DB1.DBX 0.5
    AN DB1.DBX 0.6
    AN DB1.DBX 0.7

    R "Ruch_OB_LEWE"
    R "Ruch_OB_PRAWE"
    R "MWinda_Zamknij"
    R "MWinda_Otwórz"
    R "MWinda_Emer_Stop"
    R "MDrzwi_on/off"
    R "MWinda_0"
    R "MWinda_1"
    R "MWinda_2"
    R "MWinda_3"
    S "MCz_0"
    R "MCz_1"
    R "MCz_2"
    R "MCz_3"

    Na końcu OB 100 zapisałem

    L db1.dbb 0 // załadowanie aktualnej wartości do ACCU1
    T db1.dbb 0 // zapisanie aktualnej wartości w ACCU1

    Jeśli winda będzie stała między piętrami to znaczy że uległa awarii, myślę ze zanegowanie dla parteru, 1 piętra itd powinna rozwiązać tą kwestię...sprawa drugorzędna jak narazie

    W tym miejscu moje pytanie do kolegi bthom... załóżmy, że po z czytaniu aktualnego stanu winda rzeczywiście stoi na parterze...

    Czy rozwiązanie które zaproponowałeś może wyglądać w ten sposób, czy to co przedstawiam poniżej miałeś na myśli.
    A "Cz_0" // Cz - czujniki położenia, winda stoi na parterze
    AN "Cz_1"
    AN "Cz_2"
    AN "Cz_3"
    AN "Cz_4"

    A(
    O "Winda_1" // winda została przywołana na pierwsze piętro
    O "Winda_1_przed_drzwiami"
    )

    S "Potw_0" // potwierdzenie winda znajduje się na pierwszym piętrze
    AN "Cz_0"
    A "Cz_1"
    AN "Cz_2"
    AN "Cz_3"
    AN "Cz_4"
    R "Potw_0"
    NOP 0

    Proszę o pomoc w rozwiązaniu powyższego problemu...

    Pozdrawiam
  • Poziom 37  
    Witam,
    W_Nedza napisał:

    Na końcu OB 100 zapisałem

    L db1.dbb 0 // załadowanie aktualnej wartości do ACCU1
    T db1.dbb 0 // zapisanie aktualnej wartości w ACCU1

    Nie wiem po co te dwie linijki (ładujesz to samo i potem wysyłasz)? Co do programu to wrzuć jakieś screeny z LAD-a, to będzie łatwiej analizować.
    Możesz zrobić tak, że po włączeniu zasilania, jeśli winda nie jest na dole, to zjeżdża i po osiągnięciu "parteru" zeruje znaczniki i jest gotowa do dalszej jazdy.

    Pozdrawiam.
  • Poziom 10  
    Witam

    Na dwa dni wstrzymałem się z tematem ponieważ doszedłem do wniosku, że moje wcześniejsze rozwiązanie nie jest w ogóle funkcjonalne i postanowiłem je poprawić.

    Oto co udało mi się do dnia dzisiejszego stworzyć:

    W bloku OB 1 pięciokrotnie wywoływany będzie blok FB1... oczywiście z odpowiednimi wejściami.
    Warunek wejścia do bloku przedstawiony w networku 1 bloku OB1 oznacza, że jeśli winda znajduje się na parterze wtedy wejdź do bloku.

    W bloku funkcyjnym FB1 logika zbudowana jest w następujący sposób:
    1. przypadek
    Winda na parterze(warunek wejścia do bloku, w celu przypomnienia) przywołanie tylko na 1 piętro ustaw St1, resetuj pozostałe stany
    2. przypadek
    Winda parter, przywołanie na 2 piętro ustaw St2, resetuj pozostałe stany itd
    15 przypadek winda parter brak przywołań
    16 przypadek winda parter przywołania na wszystkie piętra

    W tym miejscu moja prośba do Wszystkich Forumowiczów o pomoc w odpowiedzi na pytania:

    1. W jaki sposób realizowalibyście algorytm samego ruchu?

    Tzn: np. informacja winda jest na parterze, wchodzimy do bloku FB1, przywołanie windy na piętro 2 i 3, ustawia stan np st7.
    Oczywiście musi zajść jeszcze warunek, że nie prawda że ruch na dół, drzwi windy zamknięte i wtedy ruch gór aż do momentu osiągnięcia pozycji na piętrze 2 (spełniony warunek wejścia do bloku FB1 na piętrze drugim)

    2. Dlaczego kiedy w bloku OB 100(zaznaczam wyjście I0.0 ustawiłem na 1, przed rozruchem sterownika) do db10.dbb0 nie zapisuje mi się wartość zero?

    po bezwarunkowym otwarciu bloku danych, napisałem kilka linijek kodu

    Network1
    A I0.0 (cz_0) // jeśli winda stoi na pierwszym piętrze
    S M40.0 // ustaw bit M40.0 na 1
    Network2
    A M40.0 // jeśli M40.0jest w stanie wysokim to załaduj do db10.dbb0 wartość 0
    L 0 // załaduj 0 do ACCU1
    T db10.dbb0// zapisz 0 w ACCU1

    3. W jak najprostszy sposób skasować stan wysoki z wejścia...na obiekcie(czy też na modelu) jest to oczywiste, jak np dla windy czujnik położenia daje informacje, że winda znajduje się na danym piętrze...wtedy 1, nie ma windy 0 i algorytm hula...ale co zrobić jeśli nie mamy możliwości pracy na rzeczywistym obiekcie i program w danym momencie ma działać tylko w symulacji. Co myślicie o takim rozwiązaniu by poszczególnym Mbit - om przyporządkować odpowiednie wejścia.

    np. A M 50.0 // jeśli M50.0 w stanie wysokim
    = I 0.0
    Kompilator oczywiście przyjmuje takie rozwiązanie

    Dziękuje Wszystkim za zainteresowanie tematem

    Pozdrawiam
  • Pomocny post
    Poziom 37  
    W_Nedza napisał:

    A M 50.0 // jeśli M50.0 w stanie wysokim
    = I 0.0


    Lepiej nie stosuj takiego rozwiązania pomimo, że działa. Zamiast wejścia zastosuj wolny merker, a później przypisz wejście do merkera. Do testów będziesz mógł zmieniać wartość merkera poprzez podgląd zmiennych. Wejścia przepisuj na merkery w funkcji wywołanej jako pierwsza w OB1.
  • Poziom 10  
    Witam ponownie

    I w końcu się udało...:) oczywiście teraz najważniejsze czyli oprogramowanie błędów, zwolnienia obrotów silnika przy kiedy winda dojeżdża do danego piętra, oraz przycisków Otwórz Zamknij na panelu sterowania windy.
    Dziękuje wszystkim za zainteresowanie tematem, szczególnie kolegą "bhtom" oraz "pafciowaw" , dzięki Waszym wskazówką udało mi się uniknąć wielu błędów jak również testy przebiegały zdecydowanie sprawniej...
    Cytat:
    Lepiej nie stosuj takiego rozwiązania pomimo, że działa. Zamiast wejścia zastosuj wolny merker, a później przypisz wejście do merkera. Do testów będziesz mógł zmieniać wartość merkera poprzez podgląd zmiennych. Wejścia przepisuj na merkery w funkcji wywołanej jako pierwsza w OB1.


    Cytat:
    Nie rozumiem tego problemu!
    Skoro winda z 2 jedzie w górę (wezwanie 3,4) to zatrzymuje się na 3 (bo może wzywający chce jechać do góry?) a potem na 4. Kiedy jedzie z 3 na 4, wzywający 3 znów naciska przycisk (bo jednak chciał jechać na dół); druga opcja: dosiadł się do góry i już zjeżdzając nie chce zatrzymywać się na 3!.
    Reasumując: pojawiające się wezwanie kasujesz po osiągnięciu pozycji...i koniec.


    Kiedy będę miał więcej czasu wrzucę pdf ze stanami pracy(moje rozwiązanie) i opiszę w skrócie algorytm działania.

    Temat uważam za zamknięty
  • Poziom 10  
    Witam

    Jak obiecałem w załączniku umieszczam, plik FB1 najważniejszy w całym programie...

    Po kolei od network - a pierwszego do network - a 16 zapisane są poszczególne stany

    Opiszę w skrócie stany np. kiedy winda znajduje się na "Parterze". Blok FB1 można użyć dla każdego z pięter, oczywiście należy pamiętać o przypisaniu odpowiednich wejść do przycisków bloku funkcyjnego.

    I tak network pierwszy...np. Winda znajduje się na parterze, naciśnięty został któryś przycisk przywołania na pierwsze piętro, ustaw stan 1.
    Jeśli winda znajduje się na parterze i naciśnięty został przycisk przywołania na drugim piętrze ustaw stan2 itd... Aż do network - a 16 (włącznie). Negacja poprzednich stanów (Brak przywołań windy) - jeśli winda na parterze to zostanie na parterze, jeśli winda na jakimś piętrze i brak przywołań to po 20 sekundach zjedź na parter

    Następnie od 17 network -a podzieliłem stany 1 - 16 na grupy... tzn

    Pamiętamy jesteśmy cały czas na parterze...:) Przywołanie na 1 stan 1, przywołanie na 1 i 2 stan 5 i tak połączyłem stany w grupy przywołań na poszczególne piętra...

    Dzięki temu ułatwiłem Sobie sprawę z ruchem windy...dlaczego ano dlatego, że
    operuje już tylko 5 stanami...Kiedy dojeżdżam na piętro kasuje przywołanie, z czujnika położenia z czytuje odpowiednią pozycję windy i wchodzę do odpowiedniego network - a w bloku OB1 (oczywiście przywołania z poprzedniego stanu są zapamiętane)...:)
    Ruch windy, realizowałem w bloku FB3 którego tutaj nie zamieściłem. Oczywiście jak pisałem wcześniej program posiada jeszcze wiele mankamentów, muszę oprogramować poszczególne błędy, uwzględnić czujnik dzięki którym sterownik dostaje informację o dojeżdżaniu windy do danego piętra(winda musi zwolnić) itd..

    Jak napisałem wcześniej mam świadomość, że algorytm NIE jest optymalny i ilu głów tyle osób mogło by go poprawić i ulepszyć ale mnie osobiście się podoba...:)

    Mam nadzieje, że inni skorzystają z niego projektując swoje aplikacje chociażby na uczelniach, logikę przywołań na poszczególne piętra będą mieli już z głowy...;P

    Pozdrawiam i Wszystkim którzy pomogli i jeszcze raz dziękuje

    Życzę Wszystkim udanego weekendu
  • Użytkownik usunął konto  
  • Poziom 10  
    czesc,
    chcialbym zapytać o to w jaki sposob rozpoznasz ze winda dojeżdża do miejsca gdzie trzeba zwolnic przed zatrzymaniem?
  • Użytkownik usunął konto  
  • Poziom 10  
    Powiem szczerze nie ma się czym chwalić...jak kiedyś napiszę coś bardziej emocjonującego to wrzucę...:) jeśli masz jakieś pytania postaram się pomóc na tyle ile będę umiał i na ile czas pozwoli...

    Pozdrawiam
  • Poziom 13  
    A takie pytanie, to jest zadanie z kursu programowania sterowników Siemens?
    Zakładam, że w tym źródle jest więcej problemów do rozwiązania więc prosiłbym o jego podanie.
    Dzięki i pozdrawiam
  • Poziom 10  
    Zadanie nie jest z kursu programowania siemensa...Projekt wykonany w ramach uczelnianych...

    Pozdrawiam...

    P.S Sam osobiście poszukuje materiałów z kursów dotyczących S7 - 300
  • Poziom 14  
    A do jakiego sterownika był ten kurs ?? wnioskuje to z twojego 1 postu , i czy mógłbyś go udostępnić ??
  • Poziom 10  
    Oczywiście, że mogę udostępnić...Poszukam w wolnej chwili i wrzucę...na forum

    Dodam, że kurs ten już wielokrotnie był udostępniany na forum...

    W wyszukiwarce wpisz - lekcje plc czy coś w tym stylu i na pewno uda Ci się go znaleźć...

    Pozdrawiam

    Nazwa programu "Program dydaktyczny do nauki programowania sterowników PLC"
  • Poziom 10  
    wracajac do tematu windy. Stworzylem schemat instalacji takiej windy z wykorzystaniem sterownika S7 -300
    Chcialbym abyscie wypowiedzieli sie na ten temat. W zalaczniku sa 2 pdf: sterowanie i zasilanie
  • Specjalista Automatyk
    Uwagi:
    Czujnik przeciążenia na wyjściach sterownika?
    Krańcówki góra/dół powinny być typu NC (większe bezpieczeństwo ze względu na przerwany przewód lub "niekontakt").
    Brak zabezpieczenia w drzwiach na wypadek blokowania (chyba że ta opcja jest integralną częścią mechanizmu zamykającego drzwi)? oraz... brak otwierania/zamykania drzwi?
    Brak jakichkolwiek opcji w trybie "serwis"
    Pozdrawiam
  • Poziom 10  
    dzieki za zaintresowanie,
    1. czujnik przeciazenia na wyjciu to oczywiscie przeoczenie,
    2. krancówki bezpieczenstwa zmienilem na NC,
    3. w obwodach silowych transformator sterowania i cewke wyłacznika samoczynnego zasililem z roznych faz
    aby uniemozliwic uruchomienie w razie zaniku jednej fazy.
    4. drzwi z nepedem recznym. Ryglowane na kazdym pietrze a w windzie krancowka.
    5. przycisk jazdy kontrolnej przelaczajacy w ten tryb + 2 przyciski: gora i dol.
    Zamieszczan do wgladu poprawione schematy.
    Jesli ktos ma jakiej uwagi to chetnie poslucham.
  • Specjalista Automatyk
    W obwody_siłowe.pdf cewka stycznika bezpieczeństwa jest stale zasilona (po włączniku głównym) - brak działania zabezpieczenia.
    Nie rozumiem położenia "stycznik jazdy kontrolnej"/jego styk? - nie może wpływać na włączenie/wyłączenia transformatora 400/230 i nie może być przez to nadrzędnym nad działaniem "przycisk bezpieczeństwa stop" (ten ostatni musi być zawsze nadrzędnym).
    Zasilanie i kolejność faz - poprawność można sprawdzać np. czujnikiem kolejności i zaniku faz (CKF)... Zwróć uwagę na to, że jeżeli będzie brak "z elektrowni" fazy L1 lub L3 a inne urządzenie elektryczne np. silnik dużej mocy (mała rezystancja) będzie zasilony L1-L3 to na L1 i L3 będzie faza równoimienna - Twoje urządzenia (trafo, stycznik) będą działać! (pomijając oczywiście zadziałanie bezpieczników, wyłącznika silnikowego).
    Przy falowniku umieściłeś rezystor "ograniczający napięcie" - co najwyżej może ograniczać przepływający prąd. Jeżeli w tym miejscu sterujesz wejściem analogowym (napięciowo) to musi on być częścią dzielnika napięcia?!
    Pozdrawiam
  • Poziom 10  
    dziekuje za uwagi. Otoz wydaje mi się że poprawiłem schemat. Zamiast wejscia analogowego napieciowego uzylem pradowego. Zamieszczam wariant poprawiony.
  • Specjalista Automatyk
    Nieźle...masz "podstawę elektryczną" do pisania programu.
    Nie znam wszystkich wytycznych do UDT wind, pewnie koledzy bardziej doświadczeni dodaliby pewnie jeszcze jakieś inne uwarunkowania...ot chociażby oświetlenie szybu windy na napięcie bezpieczne...;)
    Pozdrawiam