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

Robot ABB z systemem S4Cplus

eltorro 22 Sie 2010 09:52 2237 7
  • #1 22 Sie 2010 09:52
    eltorro

    Poziom 12  

    Witam. Chciałem zaprogramować robota z systemem S4C plus. Mam przetłumaczoną instrukcję na jęz. polski, ale nie ma tam rysunków, są tylko odnośniki do oryginału, którego nie posiadam. Potrzebuję opis panelu (FlexPendant). Wcześniej programowałem IRC5, sposób programowania ten sam, język (RAPID) też, tylko panele znacznie się różnią.
    Jeżeli ktoś z kolegów mógłby mi udostępnić skan lub zdjęcia z opisem funkcji klawiszy na tym panelu byłbym wdzięczny.

    0 7
  • #2 23 Sie 2010 15:10
    CervantesJ.
    Poziom 17  

    Witam, posiadam odpowiedniego Manuala w języku angielskim i mam jeszcze sporo wiedzy w tej materii bo piasłem 3 lata programy na S3, S4, S4C+, IRC5. Odezwij się na GG 10922346 lub cervantesj(malpa)op.pl to podeślę manuala.
    Mogę równiez podjąć się napisania programu lub udzielić szkolenia stanowiskowego po wcześniejszej rekonwalescencji bo już parę lat minęło jak nie grzebałem w ABB.

    0
  • #3 18 Wrz 2010 19:29
    eltorro

    Poziom 12  

    Witam. Trochę poczytałem, trochę się pobawiłem i robot działa. Pozostaje jeszcze jeden problem. Ma on współpracować z 18-stanowiskową wtryskarką. Do jej obsługi jest ze 100 programów. Jak przypisać ( i wybierać) określony program dla danego stanowiska? Numer stanowiska czyta mi z czujników (kod BCD). Będę wdzięczny za pomoc w tym temacie.

    0
  • #4 19 Wrz 2010 12:18
    CervantesJ.
    Poziom 17  

    Aby zrobić to w elegancki sposób należy sie posłużyć instrukcją "TEST" a jak do tego się zabrać?
    W pierwszej kolejności należy podać sygnały z czujników na wejścia cyfrowe robota ale jest kłopot - piszesz że jest to kod BCD co sprawia drobny kłopot bo robot preferuje system dziesiętny i należy BCD w nadrzędnym PLC przeliczyć na Dziesiętny np.
    Program 18 w BCD ma postać: 0001 1000 a w dziesiętnym 0001 0010
    lub przeliczyć to "na piechotę" w programie robota traktują BCD jako Dziesiętny i wtedy liczba 18 w BCD będzie odpowiadała liczbie 24 dziesiętnie.

    Skoro masz 18 praogramów to wystarczy 5 bitów do zapisania tej liczby - czyli podajesz 5 sygnałów na wejścia cyfrowe robota np od DI1 do DI5 które należy zgrupować (nie pamiętam jak to się robiło - muszę doczytać) do rejestru np: reg1
    Dzięki temu te 5 wejść cyfrowych będzie traktowane jako liczba dziesiętna zapisywana do wspomnianego rejestru.
    Podsumowując liczba zapisana w postaci sygnałów binarnych (BCD) podana na wejścia cyfrowe będzie zapisywana do rejestry reg1 jako liczba dziesiętna.
    Należy pamiętać o przeliczaniu z BCD na Dziesiętny wg poniższej tabelki
    BCD > Dec.
    1 = 1
    2 = 2
    .
    .
    .
    9 = 9
    10 = 16
    11 = 17
    12 = 18
    13 = 19
    14 = 20
    15 = 21
    16 = 22
    17 = 23
    18 = 24
    Takie wartości będą się pojawiały w reg1 w kodzie dziesiętnym podając 5 sygnałów binarnych na wejścia cyfrowe gdzie będzie zawarty numer programu w kodzie BCD - to był pierwszy etap roboty a teraz jak tego użyć w programie głównym MAIN?
    Należy posłużyć się instrukcją TEST a będzie wyglądało to tak:

    TEST reg1:
    CASE 1:
    routine1; "robot wykonujeczynności związane z obsługo programu numer 1"
    CASE 2:
    routine2; "robot wykonujeczynności związane z obsługo programu numer 2"
    CASE 3:
    routine3;
    CASE 4:
    routine4;
    CASE 5:
    routine5;
    CASE 6:
    routine6;
    CASE 7:
    routine7;
    CASE 8:
    routine8;
    CASE 9:
    routine9;
    CASE 10,11,12,13,14,15:
    TPWrite ''Nie wlasciwy program' "instrukcja ta wyświetli na panelu tekst w cudzysłowiu bo traktując kod BCD jako dziesiętny numery od 10do 15 nie powinny się pojawić"
    Stop;
    CASE 16:
    routine16;
    itd. aż do 24
    ENDTEST

    Jak już zauważyłeś zapis CASE 1 do CASE 24 to liczba znajdująca się w rejestrze reg1 i jeśli na wejściach cyfrowych z zakresu DI1-5 pojawi się liczba np. 18 w BCD (24 dziesiętnie) to zostanie wykonana instrukcja routine24 - która znajduje sie pod CASE 24.

    Tak wygląda to w teorii a ciekawej jak w praktyce Tobie wyjdzie. Ja kożystałem z instrukcji TEST ale miałem potrzebę użycia tylko 6 programów także kończyłem na CASE 6 i routine6.
    To by było na tyle - mam nadzieję że jasno to opisałem.

    Wracając do grupowania sygnałów
    ja posługuję się PDF-em o nazwie "guide_31.pdf" (Users Guide) znalezionym w necie i jest rozdział na stronie 12-14 3.4. Defining Signal Groups i tam jest opisane jak zgrupować wejścia cyfrowe do rejestru.

    0
  • #5 19 Wrz 2010 17:26
    eltorro

    Poziom 12  

    Dziękuję za pomoc. Nie jestem do końca pewien, czy jest to kod BCD (jutro sprawdzę), ale numery stanowisk odczytuje prawidłowo. Zrobiłem to właśnie w ten sposób, ze zrobiłem grupę 5 wejść. Wygląda to tak, że grupę nazwałem gi_BCD_code
    PROC code()
    nSLE_Code:=gi_BCD_code; Odczyt z wejść
    IF nSLE_Code<1 OR nSLE_Code>nSLE_Total GOTO lbWrongChoice; Etykieta gdy jest błąd odczytu
    nSLE_Code:=nSLE_Code-nRob_Pos+1; Offset, bo robot jest o kilka stanowisk oddalony od miejsca, w którym są czujniki
    IF nSLE_Code<=0 nSLE_Code:=nSLE_Code+18; To ogranicza odczyt do 18, bo pozycja robot jest przesunięta o 15 stanowisk, więc mógłby wyświetlać stanowisko np. 33 stanowisko.
    WaitDI diTableEndpos,1; Czeka na sygnał startu
    TPWrite string3\Num:=nSLE_Code; Tu wyświetla numer stanowiska
    MoveJ, * ,v500,z20,tRough1st;

    I dalej funkcja TEST
    I tutaj zaczyna się mój problem. Gdybym miał mniej (lub równo) 18 programów przypisałbym je dokładnie tak jak kolega mi podpowiedział. Ale tych programów jest w tej chwili ok 40, a na pewno pojawi się ich więcej. Operator robota musi mieć możliwość przypisywania programu do konkretnego stanowiska. Np. dla stanowiska 1 program 137, dla 2 program 223 itd. Może zaistnieć taka sytuacja, ze na wszystkich stanowiskach robot będzie wykonywał ten sam program, albo na każdym inny. Znalazłem taką funkcję jak CallbyVar, ale nie mam pojęcia jak jej użyć w tym przypadku. Programy zapisane są jako rutyny, i tutaj też mam pytanie. Czy po wykonaniu rutyny robot powróci do main, czy muszę mu dopisać polecenie?

    Pozdrawiam.
    Jacek

    Dodano po 15 [minuty]:

    Sorki, wracając do poprzedniej odpowiedzi. Nie programów jest 18, lecz stanowisk, a programów jest ok. 40 i pewnie dojdą następne. Gdyby robot pracował u nas w firmie skorzystałbym z funkcji ProcCall i w zależności od potrzeb wpisywałbym w programie np. IF stanowisko 5 THEN procCall 135, itd. Ale robot będzie za granicą, więc taki sposób odpada. Musi być możliwość programowania tego z panela.

    0
  • #6 19 Wrz 2010 23:25
    CervantesJ.
    Poziom 17  

    Co zrobić aby robot powracał MAIN?
    Zakładamy że rutyna wywołana z Main, na końcu rutyny wstawiamy tylko i wyłącznie instrukcję END i robot wraca do miejsca z którego wywołana została rutyna takze filozofii tu niema.

    Opiszę jak ja przypisywałem program do stanowiska:
    Generalnie musiałem zrobić komunikację operatora z robotem - operator musiał wybrać jakie detale miał spawać na dwóch stanowiskach (na każdym mial do wyboru kombinację 3 detali).
    Na początku programu MAIN robot zadawał kilka pytań i oczekiwał na odpowiedź.
    Wykorzystywałem funkcję TPReadFK (Teach Pendant Read Function Key) chodzi o 5 przycisków pod wyświetlaczem.
    Po wciśnięciu danego przycisku do wybranego rejestru wpisywana była liczba od 1 do 5 zależnie który klawisz został wciśnięty.
    Dalej w programie była instrukcja warunkowa - jak już była wybrana strona stolu do spawania to
    IF reg1 = 1 ten procCall rutine 1 itd.
    W Twoim przypadku lepsza będzie instrukcja TPReadNum (Reads a number from the teach pendant)
    Czyli wpisywanie do wskazanego rejestru liczby z klawiatury numerycznej.

    Czyli jak masz 18 stanowisk to wykorzystujesz tyle samo rejestrów w które na początku pracy operator wpisuje numery programów które chce wykonywać na danych stanowiskach.

    Na początku MAIN piszesz instrukcje:

    TPReadNum reg1 "Co robimy na stanowisku 1"
    TPReadNum reg2 "Co robimy na stanowisku 2"
    .
    .
    TPReadNum reg18 "Co robimy na stanowisku 18"

    Leable a:
    wszystko co związane z instrukcją TEST CASE
    Go To: Leable a
    END

    Z tym że pod danym CASE trzeba użyć również CallByVar i to w zasadzie tyle.
    Dzięki temu uzyskasz program który będzie poprawnie rozpoznawał stanowisko i skoczy do odpowiedniego CASE a tam wykorzysta dane wpisane do rejestrów przez operatora i skoczy do odpoiwedniej rutyny której nazwa będzie zgodna z numerem w rejestrze.

    Zauważ że w MAIN nie jest cały program ujęty między Leable a: oraz instrukcją Go To Leale a:
    Dzięki temu pytania "Co robimy na stanowisku xx" będą zadawane tylko na początku roboty - w sensie że operator zaczyna pracę za pomocą "PP to MAIN"
    potem przycisk START a robot pyta, operator odpowiada a potem robot wskakuje w pętlę i nie zada już pytań za każdym skanem programu bo wpadł w pętle "bez wyjścia" dopiero jak operator znów wykorzysta "PP to MAIN".

    Będzie z Ciebie dobry programista - jak zrobisz działający poprawnie program z wykorzystaniem tych podpowiedzi to chylę czoła - grunt to myślący ludzie.
    Miłej pracy.

    0
  • #7 21 Wrz 2010 18:54
    eltorro

    Poziom 12  

    Dziękuję za pomoc. Udało się przypisywać programy do poszczególnych stanowisk z użyciem funkcji TEST, a później Callbyvar. Dopisałem jeszcze jedną rutynę, w której panel komunikuje się z operatorem i wpisuje numery programów do rejestru za pomocą funkcji TEST. Wykorzystałem funkcje TPReadNum i teraz operator ma wpisać numer stanowiska i numer programu dla tego stanowiska. Jak wpisze niewłaściwy numer programu lub stanowiska to ma odpowiedni komunikat i może poprawić. A teraz pojawił się kolejny problem. Dla potrzeb przyszłych programów zarezerwowałem numery od 1 do 100. Numerom tym odpowiadają numery rutyn, które są wywoływane w zależności od tego co wpisał operator. Na chwilę obecną mam 5 programów (rutyny 1 -5, ale docelowo będzie ok. 40). I teraz jest tak, że jak wpiszę np. dla stanowiska 5 program 6 to RAPID wyskakuje mi do innego modułu (w moim przypadku BASEFUN2) i wyświetla komunikat o błędzie. Specjaliści z ABB poradzili mi abym skorzystał z funkcji error handlers. W moim podręczniku RADID Reference Manual jest opisane, żeby zastosować funkcję RETRY , TRYNEXT lub RETURN. Najbardziej odpowiednia byłaby funkcja TRYNEXT, ale jak wpiszę do rutyny z programem to pojawia mi się komunikat, że jest to funkcja zarezerwowana dla error handlers i każe usunąć. W module BASEFUN do którego wyskakuje mi program też nie mogę jej wpisać. Może ktoś wie jak wykorzystać to polecenie, albo jak wybrnąć z tej sytuacji? Muszę zostawić wolne miejsce na przyszłe programy, więc najlepiej, gdyby po wpisaniu numeru programu który (jeszcze) nie istnieje robot wyświetlił błąd, albo nic nie zrobił.

    0
  • #8 22 Wrz 2010 18:26
    eltorro

    Poziom 12  

    Witam.
    Znalazłem rozwiązanie. Wykorzystałem funkcję error handlers (obsługa błędów). Wpisałem ją do rutyny, i teraz zamiast wyskakiwać mi z programu wyświetla komunikat, ze nie ma takiego numeru programu i poucza operatora, żeby zmienił numer programu lub napisał nowy program o takim numerze. Po pojawieniu się tego komunikatu program wykonywany jest dalej. Jak dopisałem brakującą rutynę to wykonywał ją normalnie. Tak więc wszystko o.k., robot działa tak jak powinien.

    Pozdrawiam.
    Jacek

    Dodano po 9 [minuty]:

    P.S. Dziękuję wszystkim za pomoc, a w szczególności Panom z serwisu ABB za ich pomoc i cierpliwość.
    Temat zamykam..

    0