Modyfikacja oprogramowania ROMIKa dla Modbus
Transkrypt
Modyfikacja oprogramowania ROMIKa dla Modbus
Wrocław 2001 Projekt Modyfikacja oprogramowania ROMIKa dla Modbus Prowadzący: Dr inż. Marek Wnuk Wykonał: Ryszard Sarzyński Założenia projektowe. Zadaniem projektu było zmodyfikowanie istniejącego oprogramowania ROMIKa, w ten sposób aby sterowanie było realizowane przez protokół Modbus. W pierwotnym oprogramowaniu ROMIKa dopuszczalna było sterowanie robotem ręczne, lub automatyczne. Obsługa robota polegała na podawaniu wartości prędkości i pozycji do mikrokontrolera CPU32. Komunikacja realizowana była poprzez interfejs SPI, w którym przesyłanie odbywa się przy pomocy szeregowej transmisji synchronicznej. Teraz komunikacja realizowana jest poprzez protokół Modbus w trybie ASCII. Moim założeniem było połączenie oprogramowania ROMIKa z Modbus, stworzenie 20 rejestrów, których opis przedstawiam poniżej: Nr rejestru 1020 1001 ... 1006 1007 ... 1012 1013 1014 ... 1019 Opis Rejestr statusowy Rejestry prędkości Rejestry pozycjonowania Rejestr rozkazowy Rejestry odczytu pozycji Rejestr statusowy Najstarszy bit (15) jeżeli jest równy 1 tzn., że robot stracił synchronizacje. Bity od 0..5 odpowiadają poszczególnym elementom łańcucha kinematycznego. Wartość 1 oznacza, że przegub jest w ruchu. Warto jest wyprowadzić również bity dla wartości krańcowych. Dzięki temu rejestrowi mielibyśmy bieżące informacje na temat, czy dane ramię robota zakończyło już pewną operację, czy też nadal ją wykonuje. Wprowadzenie rejestru statusowego niesie ze sobą korzyść informacyjną w przypadku synchronizacji robota, tzn. zostałoby zakomunikowane kiedy synchronizacja została zakończona. Poprzez rejestry prędkości i pozycjonowania mamy możliwość zadawania pewnych wartości mikrokontrolerowi. Aby cały proces przebiegał poprawnie najpierw są ustawiane rejestry prędkości, a dopiero później rejestry pozycjonowania. Jest to logiczne, dlatego że jeżeli poprzez Modbus wysyłam pewną grupę rejestrów i są one podawane od najmniejszego do największego i jeżeli ustawiam wszystko naraz prędkość i pozycje, to po zapisie pozycji robot to wykonuje. ROMIK nie posiada funkcji ustawiania i dopiero później wysyłania. Po rejestrach pozycjonowania znajduje się rejestr rozkazowy. Poprzez niego wysyłamy mikrokontrolerowi dwie komendy: - synchronizacji - stopu silników. Rejestr ten może mieć trzy wartości: `0`, `1`, `2`. 0 – nic się nie dzieje, 1 – synchronizacja, 2 – stop silników. Po każdym jednorazowym wykonaniu operacji rejestr ustawia się na `0`. Rejestry 1014-1019 służą do odczytu wartości pozycji robota, także w trakcie ruchu. W programie głównym jest pętla która odświeża te wartości cyklicznie. Obsługa rejestrów jest oparta na przerwaniach. Aby program mógł działać konieczne jest odblokowanie przerwań. Robot ROMIK znajdujący się w pracowni robotyki Instytutu Cybernetyki Technicznej Politechniki Wrocławskiej sterowany jest mikrokontrolerem CPU32. Zadaje się 6 pozycji dla takich elementów jak: - Wieża Ramię Przedramię Nadgarstek (góra/dół) Nadgarstek (obrót) Chwytak Ze względu na to iż nie posiadam wystarczającej wiedzy na temat ilości Silników w manipulatorze Romik, a w poprzedniej wersji oprogramowania nie jest uwzględniona wartość prędkości dla obrotu nadgarstka przyjmuję, że taka prędkość może istnieć i dlatego umieściłem 6 rejestrów prędkości. Także w poprzedniej wersji oprogramowania ROMIKa prędkości dla ułatwienia podawane były poprzez wybór: 1 2 3 4 5 6 – – – – – – 300 150 75 37 18 9 kroków/sek kroków/sek kroków/sek kroków/sek kroków/sek kroków/sek W rejestrach teraz tą wartość można ustawiać płynnie. Układ sterujący ROMIKa stanowi mikrokontroler CPU32. Jest to 32-bitowy procesor o poborze mocy max. 0,6 [W], wykorzystujący do generacji zegara oscylator kwarcowy 32768 [Hz]. Mikroprocesor MC68332 zalicza się do rodziny mikrokontrolerów firmy Motorola. Wszystkie te procesory maja identyczną jednostkę centralną. W Polsce znane są głównie z mikrokomputerów: ATARI ST, Amiga, Macintosh. Protokół Modbus jest udostępniony w pracowni robotyki ICT Politechniki Wrocławskiej. Autorem Modbus’a jest dr Marek Wnuk. ****************************** Funkcja RunManual() jako argument bierze nr silnika i zadaną pozycję, a zwraca wartość liczbową: 0 ruch wykonany -1 stoi na krańcówce i ruch jest zapodany w kierunku krańcówki -2 ruch przekroczył maksymalne położenie ( rozsynchronizował się) Te informacje można wykorzystać w rejestrze statusowym. Ze względu na 12 bitów ( 6 silników) byłby wtedy potrzebny rejestr statusowy No2. Funkcja komendy() pobiera dwa argumenty, tj. pierwszy zapisywany rejestr Modbusa, oraz ilość zapisywanych rejestrów. Zapis do rejestru rozkazowego nie może być realizowany w tym samym czasie co zapisy do innych rejestrów, ponieważ ich funkcje są sprzeczne. Funkcja ta jest wywoływana na 5 poziomie przerwania. W pętli main() wykonywana jest inicjacja QSM, oraz procedury interfejsu Modbusa. W main w pętli while{...} przez cały czas odświeżane są rejestry 10141020, poza chwilą obsługi przerwania, kiedy obsługiwane są wartości nadesłane przez użytkownika poprzez Modbus.