{"id":23817,"date":"2025-08-11T14:31:35","date_gmt":"2025-08-11T12:31:35","guid":{"rendered":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/?p=23817"},"modified":"2025-09-04T10:39:18","modified_gmt":"2025-09-04T08:39:18","slug":"jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino","status":"publish","type":"post","link":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/","title":{"rendered":"Jak wykorzysta\u0107 bibliotek\u0119 C# do programowania robota Astorino"},"content":{"rendered":"\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"dowiesz-sie\">\n<h3>Z tego artyku\u0142u dowiesz si\u0119:<\/h3>\n<ul class=\"bulleted\">\n<li>jak stworzy\u0107 projekt z wykorzystaniem j\u0119zyka C# i frameworka .NET,<\/li>\n<li>jak stworzy\u0107 w\u0142asn\u0105 aplikacj\u0119 do sterowania robotem Astorino.<\/li>\n<\/ul>\n<\/div>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Robot edukacyjny Astorino posiada dedykowan\u0105 bibliotek\u0119 do programowania w j\u0119zyku C#. Umo\u017cliwia ona na stworzenie aplikacji desktopowej, kt\u00f3ra pozwala na poruszanie robotem (zar\u00f3wno jego przegubami, jak i w uk\u0142adzie kartezja\u0144skim), obs\u0142ug\u0119 sygna\u0142\u00f3w wej\u015b\u0107 i wyj\u015b\u0107 oraz uczenie robota punkt\u00f3w i ruch do nich.<\/p>\n\n\n\n<p>To nie wszystko, biblioteka oferuje wi\u0119cej mo\u017cliwo\u015bci, takich jak np. monitorowanie pr\u0119dko\u015bci TCP, komunikacja Modbus i wiele innych. Po szczeg\u00f3\u0142y odsy\u0142am do dokumentacji.<\/p>\n\n\n\n<p>Artyku\u0142 ten zosta\u0142 napisany z my\u015bl\u0105 o osobach, kt\u00f3re znaj\u0105 podstawy programowania strukturalnego i obiektowego. Ca\u0142y projekt jest dost\u0119pny do pobrania.<\/p>\n\n\n\n<div class=\"link-box d-flex align-items-center\">\r\n\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/themes\/poradnik\/public\/images\/icons\/icon-link.svg\" alt=\"arrow\" class=\"ml-3\">\r\n\t\t\t\t\t\t\t<\/a>\r\n\t\t\t\t\t\t\t<div><p><a href=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/Astorino_app.zip\">\u015aci\u0105gnij plik z gotowym projektem Visual Studio<\/a>.<\/p>\n<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Kilka s\u0142\u00f3w o C# i .NET<\/h2>\n\n\n\n<p>J\u0119zyk C# to powszechnie stosowany j\u0119zyk programowania, stawiaj\u0105cy du\u017cy nacisk na programowanie obiektowe. Wywodzi si\u0119 bezpo\u015brednio z rodziny j\u0119zyk\u00f3w C oraz C++. J\u0119zyk ten jest wydajny, czytelny i cz\u0119sto stosowany przy tworzeniu aplikacji.<\/p>\n\n\n\n<p>Blisko z nim zwi\u0105zany jest .NET: stworzony przez Microsoft framework umo\u017cliwiaj\u0105cy tworzenie aplikacji desktopowych. Przyjazny u\u017cytkownikowi interfejs pozwala na proste dodawanie kontrolek, takich jak przyciski czy pola tekstowe.<\/p>\n\n\n\n<p>Niniejszy artyku\u0142 zosta\u0142 opracowany z wykorzystaniem \u015brodowiska Visual Studio 2022.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Astorino API<\/h2>\n\n\n\n<p>Astorino API to biblioteka s\u0142u\u017c\u0105ca do komunikacji z robotem Astorino. Komunikacja mo\u017ce odbywa\u0107 si\u0119 za po\u015brednictwem portu szeregowego (USB) lub Ethernet TCP\/IP. API aktualnie dzia\u0142a na wersji .NET 6.0 oraz umo\u017cliwia ruch robotem tylko wtedy, kiedy ten jest w trybie REPEAT MODE.<\/p>\n\n\n\n<p>W bibliotece znajduj\u0105 si\u0119 nast\u0119puj\u0105ce pliki:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>astorino_lib.dll<\/strong> \u2013 wszystkie funkcje komunikacyjne,<\/li>\n\n\n\n<li><strong>System.IO.Ports.dll<\/strong> \u2013 biblioteka COM,<\/li>\n\n\n\n<li><strong>System.Managment.dll<\/strong> \u2013 biblioteka COM, umo\u017cliwia lokalizacje Astorino w li\u015bcie port\u00f3w COM,<\/li>\n\n\n\n<li><strong>ZeroConf.dll<\/strong> \u2013 biblioteka mDNS (komunikacja sieciowa),<\/li>\n\n\n\n<li><strong>System.Reactive.dll<\/strong> \u2013 biblioteka wymagana przez ZeroConf,<\/li>\n\n\n\n<li><strong>System.CodeDom.dll<\/strong> \u2013 biblioteka wymagana przez ZeroConf,<\/li>\n\n\n\n<li><strong>Astorino.cs<\/strong> \u2013 kod \u017ar\u00f3d\u0142owy biblioteki.<\/li>\n<\/ul>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Tworzenie nowego projektu<\/h2>\n\n\n\n<p>Aby stworzy\u0107 nowy projekt z wykorzystaniem Astorino API, nale\u017cy wykona\u0107 nast\u0119puj\u0105ce kroki:<\/p>\n\n\n\n<p>1. Tworzymy nowy projekt z szablonu .NET 6.0 (alternatywnie mo\u017cna stworzy\u0107 program w konsoli, ten przypadek nie b\u0119dzie omawiany w artykule).<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"704\" height=\"463\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image2.png\" alt=\"\" class=\"wp-image-23824\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>2. Nast\u0119pnie nale\u017cy doda\u0107 odwo\u0142anie\/reference (klikni\u0119cie prawym przyciskiem na <strong>Zale\u017cno\u015bci\/Dependencies<\/strong>).<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"309\" height=\"247\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image3.png\" alt=\"\" class=\"wp-image-23825\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"423\" height=\"292\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image4.png\" alt=\"\" class=\"wp-image-23826\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>3. Za pomoc\u0105 <strong>Przegl\u0105daj&#8230;\/Browse&#8230;<\/strong> znale\u017a\u0107 lokalizacj\u0119 API i wybra\u0107 stamt\u0105d:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>astorino_lib.dll<\/li>\n\n\n\n<li>System.IO.Ports.dll<\/li>\n\n\n\n<li>System.Managment.dll<\/li>\n<\/ul>\n\n\n\n<p>4. Po za\u0142adowaniu okno projektu powinno wygl\u0105da\u0107 tak:<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"321\" height=\"183\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image5.png\" alt=\"\" class=\"wp-image-23828\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>W dokumentacji Astorino API znajduje si\u0119 przyk\u0142ad zar\u00f3wno aplikacji konsolowej, jak i w .NET. Polecam najpierw zapozna\u0107 si\u0119 z tamtym kodem, jest on prosty i nie posiada zbyt wielu funkcjonalno\u015bci, dlatego \u015bwietnie pos\u0142u\u017cy za wprowadzenie dla os\u00f3b, kt\u00f3re nie mia\u0142y wcze\u015bniej styczno\u015bci z .NET.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Za\u0142o\u017cenia projektu<\/h2>\n\n\n\n<p>Dobr\u0105 praktyk\u0105 jest, aby na pocz\u0105tku okre\u015bli\u0107, jakie funkcjonalno\u015bci powinien spe\u0142nia\u0107 projekt. U\u0142atwi to zaplanowanie pracy i p\u00f3\u017aniejsze wdra\u017canie nowych funkcji.<\/p>\n\n\n\n<p>Najwa\u017cniejsze cechy naszego projektu:<\/p>\n\n\n\n<p>1. G\u0142\u00f3wne okno aplikacji umo\u017cliwia:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>po\u0142\u0105czenie si\u0119 z robotem za pomoc\u0105 portu COM, oraz roz\u0142\u0105czenie si\u0119,<\/li>\n\n\n\n<li>w\u0142\u0105czenie i wy\u0142\u0105czenie silnik\u00f3w oraz podgl\u0105d ich stanu,<\/li>\n\n\n\n<li>rozpocz\u0119cie zerowania oraz podgl\u0105d jego stanu,<\/li>\n\n\n\n<li>ruch do pozycji domowej po naci\u015bni\u0119ciu przycisku,<\/li>\n\n\n\n<li>zawiera przycisk Jogging otwieraj\u0105cy nowe okno oraz pola tekstowe zapewniaj\u0105ce podgl\u0105d warto\u015bci wszystkich przegub\u00f3w.<\/li>\n<\/ul>\n\n\n\n<p>2. Dodatkowe okno posiadaj\u0105ce trzy zak\u0142adki:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pierwsza zak\u0142adka \u2013 <strong>Jogging<\/strong> \u2013 umo\u017cliwia ruch przegubami oraz w uk\u0142adzie kartezja\u0144skim, odczyt aktualnej pozycji robota oraz zadanie mu pr\u0119dko\u015bci i kroku, z jakim ma wykonywa\u0107 ruchy.<\/li>\n\n\n\n<li>Zak\u0142adka <strong>Teaching<\/strong> posiada tabel\u0119 podgl\u0105du wsp\u00f3\u0142rz\u0119dnych wszystkich punkt\u00f3wm z rozr\u00f3\u017cnieniem na punkty z\u0142\u0105czowe i kartezja\u0144skie. Opr\u00f3cz tego przycisk <strong>Teach<\/strong> umo\u017cliwia nauczenie robota aktualnej pozycji do wybranego punktu. Przycisk <strong>Execute<\/strong> pozwala na wykonanie ruchu do wybranego punktu z uwzgl\u0119dnieniem zadanego przez u\u017cytkownika punktu (JMOVE, LMOVE, LAPPRO). Ponadto podczas wykonywania automatycznego ruchu pojawia si\u0119 blokuj\u0105ce okienko z mo\u017cliwo\u015bci\u0105 wci\u015bni\u0119cia przycisku <strong>Emergency stop<\/strong>, kt\u00f3ry natychmiast zatrzyma robota.<\/li>\n\n\n\n<li>Ostatni\u0105 zak\u0142adk\u0105 jest <strong>I\/O signals<\/strong>, pozwalaj\u0105ca na odczyt stan\u00f3w sygna\u0142\u00f3w wej\u015b\u0107 i wyj\u015b\u0107, jak r\u00f3wnie\u017c sterowanie wyj\u015bciami.<\/li>\n<\/ul>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Okno g\u0142\u00f3wne \u2013 wygl\u0105d<\/h2>\n\n\n\n<p>Okno g\u0142\u00f3wne zosta\u0142o zaprojektowane tak, jak na grafice poni\u017cej.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"473\" height=\"315\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image6.png\" alt=\"\" class=\"wp-image-23829\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Znajduje si\u0119 w nim:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Sze\u015b\u0107 przycisk\u00f3w: <strong>Go home<\/strong>, <strong>Jogging<\/strong>, <strong>Connect<\/strong>, <strong>Disconnect<\/strong>, <strong>Motors Off<\/strong>, <strong>Zeroing<\/strong>. S\u0105 to obiekty typu <strong>Button<\/strong>.<\/li>\n\n\n\n<li>Sze\u015b\u0107 obiekt\u00f3w typu <strong>TextBox<\/strong>, s\u0142u\u017c\u0105cych do wy\u015bwietlania aktualnych warto\u015bci pozycji przegub\u00f3w.<\/li>\n\n\n\n<li>Sze\u015b\u0107 etykiet z numerami przegub\u00f3w. S\u0105 to obiekty typu <strong>Label<\/strong>.<\/li>\n<\/ul>\n\n\n\n<p>Nale\u017cy zwr\u00f3ci\u0107 uwag\u0119 na kilka szczeg\u00f3\u0142\u00f3w:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>W przypadku wszystkich kontrolek warto ustawia\u0107 nazwy obiektu na takie, kt\u00f3e umo\u017cliwi\u0105 potem zrozumia\u0142e odwo\u0142ywanie si\u0119 w kodzie, np. <strong>Go_home_button<\/strong> zamiast <strong>button1<\/strong>.<\/li>\n\n\n\n<li>Je\u015bli chcemy wybra\u0107 tekst wy\u015bwietlany na kontrolce, nale\u017cy zmieni\u0107 parametr <strong>Text<\/strong>.<\/li>\n\n\n\n<li>Je\u015bli chcemy zmieni\u0107 kolor kontrolki, mo\u017cna to zrobi\u0107 za pomoc\u0105 parametru <strong>BackColor<\/strong>.<\/li>\n\n\n\n<li>Na grafikach poni\u017cej przedstawiono pola, w kt\u00f3rych mo\u017cna zmieni\u0107 te i inne parametry.<\/li>\n<\/ul>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"282\" height=\"285\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image7.png\" alt=\"\" class=\"wp-image-23831\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"239\" height=\"222\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image8.png\" alt=\"\" class=\"wp-image-23832\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Okno g\u0142\u00f3wne \u2013 program<\/h2>\n\n\n\n<p>Framework .NET niezwykle u\u0142atwia tworzenie aplikacji, poniewa\u017c kiedy dodajemy now\u0105 kontrolk\u0119 w oknie edycji wygl\u0105du naszej aplikacji, automatycznie odpowiednie deklaracje powstaj\u0105 w kodzie. Naszym zadaniem jest zaprogramowa\u0107 zdarzenia. Zdarzenie to najpro\u015bciej m\u00f3wi\u0105c kod opisuj\u0105cy, co si\u0119 stanie w reakcji na dzia\u0142ania u\u017cytkownika. Przyk\u0142adowo przycisk mo\u017ce mie\u0107 zdarzenie <strong>OnClick<\/strong>, kt\u00f3re wykonuje si\u0119 wtedy, kiedy u\u017cytkownik wci\u015bnie przycisk.<\/p>\n\n\n\n<p>Na pocz\u0105tku jednak zajmijmy si\u0119 zmiennymi, kt\u00f3re b\u0119d\u0105 potrzebne w naszym oknie. Aby w og\u00f3le m\u00f3c korzysta\u0107 z Astorino API na pocz\u0105tku programu nale\u017cy zawrze\u0107 lini\u0119:<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"18\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image9.png\" alt=\"\" class=\"wp-image-23833\"\/><\/figure>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Zapewni to dost\u0119p do wszystkich funkcji i obiekt\u00f3w potrzebnych od komunikacji z Astorino. Wewn\u0105trz klasy naszego okna tworzymy nast\u0119puj\u0105ce zmienne:<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"451\" height=\"147\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image9a.png\" alt=\"\" class=\"wp-image-23835\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>S\u0105 to odpowiednio:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>astorino<\/strong> <em>(typ zmiennej)<\/em> <strong>r<\/strong> <em>(nazwa zmiennej)<\/em> \u2013 stworzenie nowego obiektu b\u0119d\u0105cego reprezentacj\u0105 naszego robota. Wi\u0119kszo\u015b\u0107 metod zawartych w Astorino API odnosi si\u0119 do tego obiektu i umo\u017cliwia np. pobranie danych o jego pozycji.<\/li>\n\n\n\n<li><strong>astorino.retVal<\/strong> to typ zmiennej z Astorino API. Wiele funkcji zwraca w\u0142a\u015bnie taki obiekt, kt\u00f3ry mo\u017ce w sobie zwiera\u0107 sk\u0142adowe takie, jak warto\u015bci czy RetunCode, informuj\u0105cy o stanie robota.<\/li>\n<\/ul>\n\n\n\n<p>Zmienne te pos\u0142u\u017c\u0105 do przechowywania informacji np. o stanie silnik\u00f3w, warto\u015bciach z\u0142\u0105czy robota itd.<\/p>\n\n\n\n<p>Aby zapewni\u0107 czytelno\u015b\u0107 kodu, utworzone zosta\u0142y r\u00f3\u017cne funkcje, kt\u00f3re zajmuj\u0105 si\u0119 wykonywaniem pewnych powtarzalnych czynno\u015bci. W przypadku tego okna jest to funkcja <strong>update_position()<\/strong>.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"415\" height=\"389\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image9b.png\" alt=\"\" class=\"wp-image-23836\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Metoda <strong>JT()<\/strong> s\u0142u\u017cy do pozyskania informacji o aktualnych warto\u015bciach z\u0142\u0105czy robota. Zwracany typ to <strong>astorino.retVal<\/strong>. Zapisujemy to do naszej zmiennej <strong>joint_pos<\/strong>. Odwo\u0142uj\u0105c si\u0119 pola <strong>Values<\/strong> (kt\u00f3re jest tablic\u0105 typu <strong>Double<\/strong>) stosujemy metod\u0119 <strong>ToString()<\/strong>, kt\u00f3ra konwertuje to na \u0142a\u0144cuch znak\u00f3w. Przypisujemy je kolejno do p\u00f3l <strong>Text<\/strong> utworzonych TextBox\u00f3w, maj\u0105cych pokazywa\u0107 pozycj\u0119 z\u0142\u0105czow\u0105 robota.<\/p>\n\n\n\n<p>Zaimplementowano r\u00f3wnie\u017c obs\u0142ug\u0119 wyj\u0105tku, np. gdy robot zostanie przypadkowo roz\u0142\u0105czony i nie b\u0119dzie m\u00f3g\u0142 odczyta\u0107 warto\u015bci zmiennych. Warto r\u00f3wnie\u017c ustawi\u0107 parametr <strong>ReadOnly<\/strong> tych kontrolek na <strong>True<\/strong>, tak aby u\u017cytkownik nie m\u00f3g\u0142 ich sam uzupe\u0142ni\u0107.<\/p>\n\n\n\n<p><strong>Przycisk Connect<\/strong><\/p>\n\n\n\n<p>Pierwszym zaprogramowanym zdarzeniem b\u0119dzie wci\u015bni\u0119cie przycisku <strong>Connect<\/strong>. Aby doda\u0107 wydarzenie typu <strong>Click<\/strong>, wystarczy, \u017ce w ekranie edycji okna dwukrotnie wci\u015bniemy nasz\u0105 kontrolk\u0119. Og\u00f3lna struktura kodu jest nast\u0119puj\u0105ca:<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"512\" height=\"600\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image9c.png\" alt=\"\" class=\"wp-image-23837\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Wi\u0119kszo\u015b\u0107 funkcji b\u0119dzie korzysta\u0142a z instrukcji <strong>try&#8230;catch<\/strong>, co umo\u017cliwia prost\u0105 obs\u0142ug\u0119 wyj\u0105tk\u00f3w.<\/p>\n\n\n\n<p>Na pocz\u0105tku wykonana zosta\u0142a metoda <strong>findUSB()<\/strong> na obiekcie robota <strong>r<\/strong><em>. <\/em>Je\u017celi po jej wykonaniu nie znaleziono dost\u0119pnych robot\u00f3w, zwraca ona wyj\u0105tek. W przypadku gdy istnieje dost\u0119pny robot, funkcja \u0142\u0105czy si\u0119 z nim i pokazuje okienko <strong>MessageBox <\/strong>z informacj\u0105 o pozytywnym po\u0142\u0105czeniu si\u0119.<\/p>\n\n\n\n<p>Nast\u0119pnie metoda <strong>isMotorOn()<\/strong> wywo\u0142ana na obiekcie robota zwraca stan silnik\u00f3w, gdzie 1 oznacza w\u0142\u0105czone, a -1 wy\u0142\u0105czone. W zale\u017cno\u015bci od tego zmieniony zostaje kolor przycisku oraz jego tekst. W przypadku, gdyby warto\u015b\u0107 ta nie zosta\u0142a odczytana, zwracany jest wyj\u0105tek.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"383\" height=\"196\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image9d.png\" alt=\"\" class=\"wp-image-23838\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Analogicznie dzia\u0142a fragment kodu sprawdzaj\u0105cy zerowanie robota.<\/p>\n\n\n\n<p>Na sam koniec funkcja <strong>update_position()<\/strong> wpisuje aktualne warto\u015bci z\u0142\u0105czy do kontrolek <strong>TextBox<\/strong>.<\/p>\n\n\n\n<p>Obs\u0142uga wyj\u0105tk\u00f3w w ka\u017cdym miejscu programu wygl\u0105da niemal\u017ce identycznie \u2013 r\u00f3\u017cni\u0105 si\u0119 tylko komunikaty b\u0142\u0119d\u00f3w. Jest to utworzenie nowego okna z komunikatem oraz wy\u015bwietlenie go.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"490\" height=\"389\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image9e.png\" alt=\"\" class=\"wp-image-23839\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><strong>Przycisk Disconnect<\/strong><\/p>\n\n\n\n<p>Przycisk <strong>Disconnect<\/strong> b\u0119dzie s\u0142u\u017cy\u0142 do zako\u0144czenia po\u0142\u0105czenia z robotem. Wykorzystuje metod\u0119 <strong>Disconnect()<\/strong>.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"522\" height=\"354\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image9f.png\" alt=\"\" class=\"wp-image-23840\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><strong>Przycisk Motor Off\/On<\/strong><\/p>\n\n\n\n<p>Przycisk ten ma za zadanie odczyta\u0107 i zmieni\u0107 aktualny stan silnik\u00f3w. Realizowane jest to za pomoc\u0105 metody <strong>isMotorOn()<\/strong> i w sytuacji, gdy silniki s\u0105 wy\u0142\u0105czone, wykonywana jest metoda <strong>setMotorOn()<\/strong>, zmieniany wygl\u0105d przycisku oraz nadpisywana zmienna <strong>motor_status<\/strong>.<\/p>\n\n\n\n<p>Analogicznie dzieje si\u0119 w sytuacji odwrotnej, a je\u015bli stan silnik\u00f3w nie zosta\u0142 odczytany, zwracany jest wyj\u0105tek. Warunek <strong>status == 0<\/strong> sprawdza stan po\u0142\u0105czenia z robotem.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"490\" height=\"579\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image10-1.png\" alt=\"\" class=\"wp-image-23841\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><strong>Przycisk Zeroing<\/strong><\/p>\n\n\n\n<p>S\u0142u\u017cy do wy\u015bwietlenia stanu zerowania, jak r\u00f3wnie\u017c przeprowadzeniu go. Zdarzenie to jest asynchroniczne, a wi\u0119c nieblokuj\u0105ce, co umo\u017cliwia wy\u015bwietlenia dodatkowego okna z opcj\u0105 <strong>Emergency stop<\/strong>. Opis samego okna jest przedstawiony w dalszej cz\u0119\u015bci artyku\u0142u. Sama funkcja jest bardzo podobna do tej steruj\u0105cej silnikami.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"677\" height=\"578\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image11-1.png\" alt=\"\" class=\"wp-image-23842\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><strong>Przycisk Go Home<\/strong><\/p>\n\n\n\n<p>S\u0142u\u017cy do przemieszczenia robota do pozycji domowej. Jest to r\u00f3wnie\u017c dzia\u0142anie asynchroniczne. Do samego ruchu robotem u\u017cyta zosta\u0142a metoda <strong>HOMEAsync(90, 90, 90)<\/strong>,kt\u00f3rej parametrami s\u0105 pr\u0119dko\u015b\u0107, przyspieszenie i op\u00f3\u017anienie.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"622\" height=\"516\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image12-1.png\" alt=\"\" class=\"wp-image-23843\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><strong>Przycisk Jogging<\/strong><\/p>\n\n\n\n<p>Przycisk ten s\u0142u\u017cy do otworzenia nowego okna z panelem sterowania robotem, obs\u0142ug\u0105 sygna\u0142\u00f3w oraz mo\u017cliwo\u015bci\u0105 uczenia i odczytywania punkt\u00f3w. Najwa\u017cniejsze jest to, aby przy tworzeniu okna <strong>Jogging<\/strong> przekaza\u0107 jako argument obiekt naszego robota, dzi\u0119ki temu wszystkie funkcje w nowym oknie b\u0119d\u0105 dotyczy\u0142y tego samego robota.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"520\" height=\"306\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image13-1.png\" alt=\"\" class=\"wp-image-23844\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Od\u015bwie\u017canie pozycji<\/h2>\n\n\n\n<p>Aby w na bie\u017c\u0105co odczytywa\u0107 pozycj\u0119 robota, potrzebna jest funkcja, kt\u00f3ra b\u0119dzie w niesko\u0144czono\u015b\u0107 wywo\u0142ywa\u0142a <strong>update_position()<\/strong><em>.<\/em> Wykorzystamy tu zdarzenie <strong>Load<\/strong>, wywo\u0142ywane po za\u0142adowaniu si\u0119 okna.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"447\" height=\"137\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image14-1.png\" alt=\"\" class=\"wp-image-23845\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Okno Jogging panel \u2013 wygl\u0105d zak\u0142adki Jogging<\/h2>\n\n\n\n<p>Do stworzenia tego okna zosta\u0142a wykorzystana kontrolka <strong>TabControl<\/strong>, kt\u00f3ra pozwala w ramach jednego okna na utworzenie kilku zak\u0142adek, w tym przypadku odpowiednio: <strong>Jogging<\/strong>, <strong>Teaching<\/strong> oraz <strong>I\/O signals<\/strong>.<\/p>\n\n\n\n<p>Pierwsza z nich posiada dwana\u015bcie przycisk\u00f3w pozwalaj\u0105cych na ruch na plusie lub minusie danej osi. Domy\u015blnie przyciski s\u0105 podpisane od numer\u00f3w przegub\u00f3w, jednak wchodz\u0105c w tryb kartezja\u0144ski zmieniaj\u0105 si\u0119 na X+, Y+ itd. Opr\u00f3cz tego dwana\u015bcie <strong>TextBox\u00f3w<\/strong> s\u0142u\u017cy do wy\u015bwietlania aktualnej pozycji robota. Obok ka\u017cdego z nich znajduje si\u0119 adekwatny <strong>Label<\/strong>.<\/p>\n\n\n\n<p>Dwa <strong>RadioButtony<\/strong> odpowiadaj\u0105 za prze\u0142\u0105czanie trybu ruchu. <strong>RadioButtony<\/strong> idealnie si\u0119 do tego nadaj\u0105, poniewa\u017c jednocze\u015bnie mo\u017ce by\u0107 zaznaczony tylko jeden z nich. Na samym dole znajduj\u0105 si\u0119 dwa suwaki (<strong>TrackBar<\/strong>), s\u0142u\u017c\u0105ce do zadawania pr\u0119dko\u015bci ruchu robota oraz kroku, z jakim ma si\u0119 poruszy\u0107 po pojedynczym wci\u015bni\u0119ciu przycisku.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"471\" height=\"405\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image15-1.png\" alt=\"\" class=\"wp-image-23846\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Okno Jogging panel \u2013 kod dla zak\u0142adki Jogging<\/h2>\n\n\n\n<p><strong>Inicjalizacja<\/strong><\/p>\n\n\n\n<p>Wa\u017cn\u0105 rzecz\u0105 jest to, aby nowe okno przyjmowa\u0142o jako argument robota, na kt\u00f3rym b\u0119dzie wykonywa\u0142o r\u00f3\u017cne akcje. Nale\u017cy r\u00f3wnie\u017c doda\u0107 na pocz\u0105tku programu <strong>using astorino_lib;<\/strong>jak poprzednio.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"286\" height=\"88\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image16-1.png\" alt=\"\" class=\"wp-image-23847\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Nast\u0119pnie nale\u017cy stworzy\u0107 szereg zmiennych, pos\u0142u\u017c\u0105 one g\u0142\u00f3wnie od odczytywania pozycji robota, punkt\u00f3w z jego pami\u0119ci oraz wykonywania ruch\u00f3w.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"591\" height=\"408\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image17-1.png\" alt=\"\" class=\"wp-image-23848\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Opr\u00f3cz tego stworzone zosta\u0142y dwie klasy <strong>TransPoint<\/strong> i <strong>JointPoint<\/strong>, kt\u00f3re s\u0142u\u017c\u0105 do zapisywania wsp\u00f3\u0142rz\u0119dnych konkretnych punkt\u00f3w.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"291\" height=\"553\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image18-1.png\" alt=\"\" class=\"wp-image-23849\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><strong>Funkcje pomocnicze<\/strong><\/p>\n\n\n\n<p>W celu zmniejszenia ilo\u015bci powtarzalnego kodu powsta\u0142y nast\u0119puj\u0105ce funkcje:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>check_robot()<\/strong><\/li>\n\n\n\n<li><strong>perform_joint_move(int axis, bool inc)<\/strong><\/li>\n\n\n\n<li><strong>perform_lin_move(int axis, bool inc)<\/strong><\/li>\n\n\n\n<li><strong>update_positions()<\/strong><\/li>\n\n\n\n<li><strong>perform_rotation(int axis, bool inc)<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Funkcja <strong>check_robot()<\/strong> s\u0142u\u017cy do sprawdzenia kolejnych warunk\u00f3w takich jak: czy silniki s\u0105 w\u0142\u0105czone, czy robot jest w trybie REPEAT itp. Za ka\u017cdym razem zwraca ona u\u017cytkownikowi stosowny komunikat, je\u015bli kt\u00f3ry\u015b z warunk\u00f3w jest niespe\u0142niony.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"720\" height=\"558\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image19-1.png\" alt=\"\" class=\"wp-image-23850\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Funkcja <strong>perform_joint_move(int axis, bool inc)<\/strong> s\u0142u\u017cy do wykonania ruchu z\u0142\u0105czowego. Funkcja na pocz\u0105tku pobiera aktualn\u0105 pozycj\u0119 robota i zapisuje jej warto\u015bci jako <strong>target<\/strong>. <strong>target<\/strong> jest sze\u015bcioelementow\u0105 tablic\u0105 zmiennych <strong>double<\/strong>. W zale\u017cno\u015bci od tego, czy zmienna <strong>inc<\/strong> jest ustawiona na <strong>true<\/strong> czy <strong>false<\/strong>, ruch mo\u017ce by\u0107 wykonywany w dodatni\u0105 lub ujemn\u0105 stron\u0119 obrotu przegubu.<\/p>\n\n\n\n<p>W zale\u017cno\u015bci od wybranego przegubu (zmienna <strong><u>axis<\/u><\/strong>) aktualna pozycja zostaje nadpisana o warto\u015b\u0107 <strong>step<\/strong> tylko wzgl\u0119dem wybranego przegubu. Na koniec robot wykonuje ruch z\u0142\u0105czowy do nowo wyliczonego punktu.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"394\" height=\"203\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image1a.png\" alt=\"\" class=\"wp-image-23851\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Funkcja <strong>perform_lin_move(int axis, bool inc)<\/strong> realizuje t\u0119 sam\u0105 funkcjonalno\u015b\u0107, ale z wykonaniem ruchu liniowego, odczytuj\u0105c i nadpisuj\u0105c wsp\u00f3\u0142rz\u0119dne kartezja\u0144skie robota.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"405\" height=\"202\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image1b.png\" alt=\"\" class=\"wp-image-23852\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Funkcja <strong>update_positions()<\/strong> aktualizuje warto\u015bci w <strong>TextBoxach<\/strong> do aktualnych warto\u015bci pozycji robota. Domy\u015blnie <strong>Pose()<\/strong> zwraca orientacj\u0119 w k\u0105tach Eulera, natomiast metoda <strong>toRPY()<\/strong>pozwala na przeliczenie ich do k\u0105t\u00f3w <em>roll<\/em>, <em>pitch<\/em>, <em>yaw<\/em>.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"633\" height=\"547\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image1c.png\" alt=\"\" class=\"wp-image-23853\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Funkcja <strong>perform_rotation(int axis, bool inc)<\/strong> pozwala na wykonanie obrotu wok\u00f3\u0142 wybranej osi w k\u0105tach RPY, a nie domy\u015blnych OAT (k\u0105tach Eulera). Istotna jest \u015bwiadomo\u015b\u0107, \u017ce zmiana warto\u015bci jednego z k\u0105t\u00f3w RPY wp\u0142ywa na wszystkie k\u0105ty OAT, st\u0105d potrzeba napisania wszystkich trzech.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"475\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image1d.png\" alt=\"\" class=\"wp-image-23854\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><strong>Zdarzenia na przyciskach<\/strong><\/p>\n\n\n\n<p>G\u0142\u00f3wnym celem zak\u0142adki <strong>Jogging<\/strong> jest uzyskanie mo\u017cliwo\u015bci \u0142atwego poruszania robotem. Do tego celu wykorzystane zosta\u0142y przyciski od <strong>J1+<\/strong> i <strong>J1-<\/strong> do <strong>J6+<\/strong> i <strong>J6-<\/strong>. Ich podstawowym dzia\u0142aniem jest wykonanie ruchu danym przegubem lub wykonanie ruchu w przestrzeni kartezja\u0144skiej, je\u015bli u\u017cytkownik wybierze takowy tryb. Do zmiany tryb\u00f3w pos\u0142u\u017c\u0105 <strong>RadioButtony<\/strong>. Wykorzystuj\u0105 one tylko dwa proste zdarzenia zmieniaj\u0105ce tekst na przyciskach:<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"558\" height=\"338\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image1e.png\" alt=\"\" class=\"wp-image-23855\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>W przypadku ka\u017cdego z przycisk\u00f3w wykonuj\u0105cych ruch przyj\u0119to nast\u0119puj\u0105cy kod:<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"441\" height=\"287\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image1f.png\" alt=\"\" class=\"wp-image-23856\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Doskonale wida\u0107, czemu powtarzalny kod warto umieszcza\u0107 w funkcjach, znacznie zmniejsza to obj\u0119to\u015b\u0107 kodu oraz u\u0142atwia jego analiz\u0119. Wcze\u015bniej zdefiniowana funkcja <strong>check_robot()<\/strong> sprawdza stan robota i je\u015bli ten jest gotowy do pracy, zwraca warto\u015b\u0107 <strong>true<\/strong>.<\/p>\n\n\n\n<p>Nast\u0119pnie, w zale\u017cno\u015bci od wybranego <strong>RadioButtona<\/strong>, wykonujemy ruch, a jako argument <strong>axis<\/strong> podany zostaje numer osi robota (numeruj\u0105c od 0 do 5) oraz <strong>true<\/strong>, je\u015bli ruch jest wykonywany w dodatnim kierunku, a <strong>false<\/strong>, je\u015bli w ujemnym. Na koniec <strong>update_positions()<\/strong> aktualizuje warto\u015bci w TextBoxach.<\/p>\n\n\n\n<p>Ostatnimi zdarzeniami w zak\u0142adce <strong>Jogging<\/strong> s\u0105 te zwi\u0105zane z aktualizacj\u0105 <strong>ScrollBar\u00f3w<\/strong>:<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"449\" height=\"192\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image20-1.png\" alt=\"\" class=\"wp-image-23857\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Okno Jogging panel \u2013 wygl\u0105d zak\u0142adki Teaching<\/h2>\n\n\n\n<p>Aby doda\u0107 kolejn\u0105 zak\u0142adk\u0119, nale\u017cy zmieni\u0107 parametr <strong>Collection<\/strong> kontrolki <strong>TabControl<\/strong>. W ten spos\u00f3b mo\u017cna doda\u0107 dodatkowe zak\u0142adki oraz spersonalizowa\u0107 ich wygl\u0105d.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"571\" height=\"414\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image21-1.png\" alt=\"\" class=\"wp-image-23858\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>W zak\u0142adce <strong>Teaching<\/strong> wykorzystane zostan\u0105 nast\u0119puj\u0105ce kontrolki:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>DataGridView<\/strong> &#8211; pos\u0142u\u017cy do wy\u015bwietlania tabeli punkt\u00f3w,<\/li>\n\n\n\n<li>Dwa <strong>Buttony<\/strong> \u2013 &nbsp;<strong>Teach<\/strong> i <strong>Exectute<\/strong>, s\u0142u\u017c\u0105ce do uczenia punkt\u00f3w i wykonywania polece\u0144 ruchowych.<\/li>\n\n\n\n<li>Trzy <strong>ComboBoxy<\/strong> \u2013 s\u0142u\u017c\u0105ce do wyboru typu ruchu, rodzaju punktu oraz numeru punktu.<\/li>\n\n\n\n<li><strong>TextBox<\/strong> \u2013 do podania warto\u015bci odsuni\u0119cia dla polecenia LAPPRO.<\/li>\n\n\n\n<li><strong>Label<\/strong> \u2013 do oznaczenia TextBoxa od LAPPRO.<\/li>\n<\/ul>\n\n\n\n<p>Okno powinno mie\u0107 nast\u0119puj\u0105cy wygl\u0105d:<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"472\" height=\"400\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image22-1.png\" alt=\"\" class=\"wp-image-23859\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Dobrym pomys\u0142em jest wpisanie domy\u015blnych warto\u015bci do ComboBox\u00f3w. Spowoduje to, \u017ce domy\u015blnie po uruchomieniu okna od razu za\u0142aduje si\u0119 tabela punkt\u00f3w, b\u0119dzie to wygodniejsze dla u\u017cytkownika.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Okno Jogging panel \u2013 kod dla zak\u0142adki Teaching<\/h2>\n\n\n\n<p><strong>Funkcje pomocnicze<\/strong><\/p>\n\n\n\n<p>Do obs\u0142ugi funkcjonalno\u015bci w tej cz\u0119\u015bci programu stworzono nast\u0119puj\u0105ce funkcje pomocnicze:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>update_point_list()<\/strong><\/li>\n\n\n\n<li><strong>get_point_index()<\/strong><\/li>\n<\/ul>\n\n\n\n<p>W tym miejscu potrzebne b\u0119d\u0105 wcze\u015bniej stworzone klasy <strong>TransPoint<\/strong>&nbsp;oraz <strong>JointPoint<\/strong>. Funkcja <strong>update_point_list()<\/strong> zosta\u0142a napisana w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"590\" height=\"516\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image23-1.png\" alt=\"\" class=\"wp-image-23860\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Na pocz\u0105tku funkcja sprawdza, jaki rodzaj punkt\u00f3w zosta\u0142 wybrany w <strong>ComboBoxie<\/strong>. W zale\u017cno\u015bci od tego czyta ten rodzaj punkt\u00f3w z pami\u0119ci robota i zapisuje go. Lista punkt\u00f3w w pami\u0119ci programu zostaje wyczyszczona.<\/p>\n\n\n\n<p>Nast\u0119pnie funkcja w p\u0119tli <strong>for<\/strong> przypisuje warto\u015bci tych punkt\u00f3w do kolejnych p\u00f3l listy. Na koniec dane w tabeli <strong>DataGridView<\/strong> zostaj\u0105 zaktualizowane poprzez przypisanie im nowego \u017ar\u00f3d\u0142a danych.<\/p>\n\n\n\n<p>Wn\u0119trze p\u0119tli <strong>for<\/strong> wygl\u0105da w spos\u00f3b nast\u0119puj\u0105cy:<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"456\" height=\"228\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image24-1.png\" alt=\"\" class=\"wp-image-23861\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Analogicznie dla wsp\u00f3\u0142rz\u0119dnych z\u0142\u0105czowych.<\/p>\n\n\n\n<p>Funkcja <strong>get_point_index()<\/strong> s\u0142u\u017cy do odczytania numeru punktu z <strong>ComboBoxa<\/strong>. Jako \u017ce tekst w <strong>ComboBoxie<\/strong> jest typu <strong>String<\/strong>, nale\u017cy go przekonwertowa\u0107 na typ <strong>int<\/strong>. Funkcja zwraca warto\u015b\u0107 indeksu danego punktu.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"431\" height=\"345\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image25-1.png\" alt=\"\" class=\"wp-image-23862\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><strong>Zdarzenia na przyciskach<\/strong><\/p>\n\n\n\n<p>W tej zak\u0142adce g\u0142\u00f3wn\u0105 rol\u0119 odgrywaj\u0105 przyciski <strong>Teach<\/strong> i <strong>Execute<\/strong>. Przycisk <strong>Teach<\/strong> ma zapisa\u0107 punkt w pami\u0119ci robota oraz od\u015bwie\u017cy\u0107 dane w tabeli, tak aby u\u017cytkownik m\u00f3g\u0142 zobaczy\u0107, \u017ce punkt si\u0119 zapisa\u0142.<\/p>\n\n\n\n<p>Zasada dzia\u0142ania zdarzenia na wci\u015bni\u0119cie <strong>Teach<\/strong> jest bardzo prosta, w zale\u017cno\u015bci od wybranego typu punkt\u00f3w aktualna pozycja jest zapisywana z takim numerem, jaki jest wybrany w <strong>ComboBoxie<\/strong> dzi\u0119ki funkcji <strong>get_point_index()<\/strong>.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"736\" height=\"293\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image26-2.png\" alt=\"\" class=\"wp-image-23864\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Zdarzenie odpowiedzialne za wykonanie ruchu jest nieco d\u0142u\u017csze. Wynika to z faktu, \u017ce ka\u017cdy ruch mo\u017ce by\u0107 wykonany przy pomocy trzech komend: <strong>JMOVE<\/strong>, <strong>LMOVE<\/strong>, <strong>LAPPRO<\/strong>, a ka\u017cdy z nich mo\u017ce mie\u0107 punkt docelowy typu <strong>TRANS<\/strong> lub <strong>JOINT<\/strong>.<\/p>\n\n\n\n<p>W zale\u017cno\u015bci od wybranych <strong>ComboBox\u00f3w<\/strong> instrukcje warunkowe wybieraj\u0105 odpowiedni ruch. W przypadku wyboru LAPPRO jest potrzeba konwersji <strong>Stringa<\/strong><em> <\/em>na <strong>int<\/strong><em>. <\/em>Wykonywanie ruch\u00f3w otwiera okno z przyciskiem do awaryjnego zatrzymania.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"525\" height=\"576\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image27-1.png\" alt=\"\" class=\"wp-image-23865\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Ka\u017cdy ruch zosta\u0142 zrealizowany w podobny spos\u00f3b, tak jak w kodzie poni\u017cej.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"544\" height=\"244\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image28-1.png\" alt=\"\" class=\"wp-image-23866\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Warto doda\u0107, \u017ce pole tekstowe na dystans LAPPRO powinno przyjmowa\u0107 tylko warto\u015bci liczbowe. Nadal b\u0119dzie to <strong>String<\/strong><em> <\/em>ale wa\u017cne, \u017ceby nie by\u0142o tam liter, to uniemo\u017cliwi\u0142oby konwersj\u0119. Realizuje to nast\u0119puj\u0105ca funkcja.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"597\" height=\"119\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image29-1.png\" alt=\"\" class=\"wp-image-23867\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Okno Jogging panel \u2013 wygl\u0105d zak\u0142adki I\/O signals<\/h2>\n\n\n\n<p>Kolejn\u0105 zak\u0142adk\u0119 tworzy si\u0119 w taki sam spos\u00f3b, jak poprzedni\u0105. Potrzebne jest w niej dwadzie\u015bcia przycisk\u00f3w, po jednym dla ka\u017cdego sygna\u0142u, jednak tylko te od sygna\u0142\u00f3w wyj\u015bciowych b\u0119d\u0105 mia\u0142y zdarzenia po wci\u015bni\u0119ciu. Opr\u00f3cz tego dwa <strong>Labele<\/strong> do oznaczenia przycisk\u00f3w.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"473\" height=\"402\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image2a.png\" alt=\"\" class=\"wp-image-23868\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Okno Jogging panel \u2013 kod dla zak\u0142adki I\/O signals<\/h2>\n\n\n\n<p><strong>Funkcje pomocnicze<\/strong><\/p>\n\n\n\n<p>Do obs\u0142ugi funkcjonalno\u015bci w tej cz\u0119\u015bci programu stworzono nast\u0119puj\u0105ce funkcje pomocnicze:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>update_signals()<\/strong><\/li>\n\n\n\n<li><strong>change_output()<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Funkcja <strong>update_signals()<\/strong> s\u0142u\u017cy do od\u015bwie\u017cenia warto\u015bci sygna\u0142\u00f3w, a nast\u0119pnie zaktualizowania kolor\u00f3w przycisk\u00f3w. Na pocz\u0105tku listy sygna\u0142\u00f3w zostaj\u0105 wyczyszczone, p\u00f3\u017aniej w dw\u00f3ch podobnych p\u0119tlach wczytywane s\u0105 wszystkie sygna\u0142y wyj\u015bcia i wej\u015bcia. Nast\u0119pnie obszerny i do\u015b\u0107 powtarzalny fragment kodu sprawdza stany sygna\u0142\u00f3w i zmienia kolory konkretnych przycisk\u00f3w tak, aby zasygnalizowa\u0107 ich stan.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"397\" height=\"497\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image2b.png\" alt=\"\" class=\"wp-image-23869\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Na koniec funkcja <strong>change_output(int signal_index)<\/strong> umo\u017cliwia zmian\u0119 stanu wyj\u015b\u0107. P\u00f3\u017aniej aktualizuje stan list.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"256\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image2c.png\" alt=\"\" class=\"wp-image-23870\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><strong>Zdarzenia na przyciskach<\/strong><\/p>\n\n\n\n<p>W tej zak\u0142adce jedyne zdarzenia to przyciski zwi\u0105zane z sygna\u0142ami wyj\u015bciowymi, ka\u017cdy z nich wywo\u0142uje funkcj\u0119 <strong>change_output() <\/strong>dla swojego numeru.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"386\" height=\"77\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image2d.png\" alt=\"\" class=\"wp-image-23871\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Okno Movement_win \u2013 wygl\u0105d<\/h2>\n\n\n\n<p>To okno s\u0142u\u017c\u0105ce do blokowania aplikacji, kiedy robot wykonuje ruch. Jedyny interaktywny przycisk na nim to <strong>Emergency stop<\/strong>.<\/p>\n\n\n\n<p>Okno posiada jeden <strong>Label<\/strong> oraz przycisk <strong>Button<\/strong> do wykonania awaryjnego zatrzymania.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"254\" height=\"161\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image2e.png\" alt=\"\" class=\"wp-image-23872\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Okno Movement_win \u2013 kod<\/h2>\n\n\n\n<p>Okno to przy tworzeniu przyjmuje obiekt robota jako argument oraz wykorzystuje zmienne do \u015bledzenia, czy robot jest w ruchu.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"289\" height=\"187\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image2f.png\" alt=\"\" class=\"wp-image-23873\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Funkcja <strong>windo_status()<\/strong> s\u0142u\u017cy do monitorowania ruchu robota i wy\u0142\u0105czeniu okna, je\u015bli ten si\u0119 nie rusza.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"550\" height=\"410\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image30-1.png\" alt=\"\" class=\"wp-image-23874\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Jedyne zdarzenie w tym oknie to wykonanie zatrzymania awaryjnego i zamkni\u0119cie okna.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"427\" height=\"96\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/image31-1.png\" alt=\"\" class=\"wp-image-23875\"\/><\/figure>\n<\/div>\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Podsumowanie<\/h2>\n\n\n\n<p>Astorino API umo\u017cliwia tworzenie bardzo kreatywnych aplikacji, pozwalaj\u0105cych na sterowanie robotem. Dzi\u0119ki wykorzystaniu frameworka .NET tworzenie interfejsu jest bardzo wygodne. Aplikacje mo\u017cna rozbudowa\u0107 o wi\u0119cej funkcjonalno\u015bci, takich jak obs\u0142uga sygna\u0142\u00f3w wewn\u0119trznych, komunikacja Modbus TCP, \u0142\u0105czenie si\u0119 z robotem za pomoc\u0105 Ethernetu, liczenie kinematyki prostej i odwrotnej czy monitorowanie pr\u0119dko\u015bci robota.<\/p>\n\n\n\n<div class=\"link-box d-flex align-items-center\">\r\n\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/themes\/poradnik\/public\/images\/icons\/icon-link.svg\" alt=\"arrow\" class=\"ml-3\">\r\n\t\t\t\t\t\t\t<\/a>\r\n\t\t\t\t\t\t\t<div><p><a href=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/Astorino_app.zip\">\u015aci\u0105gnij plik z gotowym projektem Visual Studio<\/a>.<\/p>\n<\/div>\r\n\t\t\t\t\t<\/div>\r\n\t\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"wp-block-media-text alignwide is-stacked-on-mobile has-background has-very-light-gray-background-color\" style=\"grid-template-columns:21% auto\"><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"581\" src=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/09\/franciszek-rzesny.jpg\" alt=\"\" class=\"wp-image-24589 size-full\"\/><\/figure><div class=\"wp-block-media-text__content\">\n<p><\/p>\n\n\n\n<p>Autor artyku\u0142u:<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Franciszek Rze\u015bny<\/strong><\/h2>\n\n\n\n<p>Praktykant ASTOR<\/p>\n\n\n\n<p>Student III roku kierunku Automatyka i robotyka na Politechnice Pozna\u0144skiej<\/p>\n<\/div><\/div>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n            <div id=\"mailerlite-form_9\" data-temp-id=\"69db9a527430a\">\n                <div class=\"mailerlite-form\">\n                    <form action=\"\" method=\"post\" novalidate>\n                                                    <div class=\"mailerlite-form-title\"><h3>Newsletter Poradnika Automatyka<\/h3><\/div>\n                                                <div class=\"mailerlite-form-description\"><p>Czytaj trendy i inspiracje, podstawy automatyki, automatyk\u0119 w praktyce<\/p>\n<\/div>\n                        <div class=\"mailerlite-form-inputs\">\n                                                                                            <div class=\"mailerlite-form-field\">\n                                    <label for=\"mailerlite-9-field-email\">Email<\/label>\n                                    <input id=\"mailerlite-9-field-email\"\n                                           type=\"email\" required=\"required\"                                            name=\"form_fields[email]\"\n                                           placeholder=\"Email\"\/>\n                                <\/div>\n                                                        <div class=\"mailerlite-form-loader\">Please wait...<\/div>\n                            <div class=\"mailerlite-subscribe-button-container\">\n                                <button class=\"mailerlite-subscribe-submit\" type=\"submit\">\n                                    Zapisz si\u0119                                <\/button>\n                            <\/div>\n                            <input type=\"hidden\" name=\"form_id\" value=\"9\"\/>\n                            <input type=\"hidden\" name=\"action\" value=\"mailerlite_subscribe_form\"\/>\n                            <input type=\"hidden\" name=\"ml_nonce\" value=\"4186c5bdbf\"\/>\n                        <\/div>\n                        <div class=\"mailerlite-form-response\">\n                                                            <h4><p>Dzi\u0119kujemy za zapis do newslettera!<\/p>\n<\/h4>\n                                                    <\/div>\n                    <\/form>\n                <\/div>\n            <\/div>\n        <script type=\"text\/javascript\" src='https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/plugins\/official-mailerlite-sign-up-forms\/assets\/js\/localization\/validation-messages.js'><\/script>\n         <script type=\"text\/javascript\"> var selectedLanguage = \"pl\"; var validationMessages = messages[\"en\"]; if(selectedLanguage) { validationMessages = messages[selectedLanguage]; } window.addEventListener(\"load\", function () { var form_container = document.querySelector(`#mailerlite-form_9[data-temp-id=\"69db9a527430a\"] form`); let submitButton = form_container.querySelector('.mailerlite-subscribe-submit'); submitButton.disabled = true; fetch('https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-admin\/admin-ajax.php', { method: 'POST', headers:{ 'Content-Type': 'application\/x-www-form-urlencoded', }, body: new URLSearchParams({ \"action\" : \"ml_create_nonce\", \"ml_nonce\" : form_container.querySelector(\"input[name='ml_nonce']\").value }) }) .then((response) => response.json()) .then((json) => { if(json.success) { form_container.querySelector(\"input[name='ml_nonce']\").value = json.data.ml_nonce; submitButton.disabled = false; } }) .catch((error) => { console.error('Error:', error); }); form_container.addEventListener('submit', (e) => { e.preventDefault(); let data = new URLSearchParams(new FormData(form_container)).toString(); let validationError = false; document.querySelectorAll('.mailerlite-form-error').forEach(el => el.remove()); Array.from(form_container.elements).forEach((input) => { if(input.type !== 'hidden') { if(input.required) { if(input.value == '') { validationError = true; let error = document.createElement(\"span\"); error.className = 'mailerlite-form-error'; error.textContent = validationMessages.required; input.after(error); return false; } } if((input.type == \"email\") && (!validateEmail(input.value))) { validationError = true; let error = document.createElement(\"span\"); error.className = 'mailerlite-form-error'; error.textContent = validationMessages.email; input.after(error); return false; } } }); if(validationError) { return false; } fade.out(form_container.querySelector('.mailerlite-subscribe-button-container'), () => { fade.in(form_container.querySelector('.mailerlite-form-loader')); }); fetch('https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-admin\/admin-ajax.php', { method: 'POST', headers:{ 'Content-Type': 'application\/x-www-form-urlencoded', }, body: data }) .then((response) => { fade.out(form_container.querySelector('.mailerlite-form-inputs'), () => { fade.in(form_container.querySelector('.mailerlite-form-response')); }); }) .catch((error) => { console.error('Error:', error); }); }); }, false); var fade = { out: function(el, fn = false) { var fadeOutEffect = setInterval(function () { if (!el.style.opacity) { el.style.opacity = 1; } if (el.style.opacity > 0) { el.style.opacity -= 0.1; } else { el.style.display = 'none'; clearInterval(fadeOutEffect); } }, 50); if( typeof (fn) == 'function') { fn(); } }, in: function(el) { var fadeInEffect = setInterval(function () { if (!el.style.opacity) { el.style.opacity = 0; } if (el.style.opacity < 1) { el.style.opacity = Number(el.style.opacity) + 0.1; } else { el.style.display = 'block'; clearInterval(fadeInEffect); } }, 50); } }; function validateEmail(email){ if(email.match( \/^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$\/ )) { return true; } return false; } <\/script> \n","protected":false},"excerpt":{"rendered":"<p>Robot edukacyjny Astorino posiada dedykowan\u0105 bibliotek\u0119 do programowania w j\u0119zyku C#. Umo\u017cliwia ona na stworzenie aplikacji desktopowej, kt\u00f3ra pozwala na poruszanie robotem (zar\u00f3wno jego przegubami, jak i w uk\u0142adzie kartezja\u0144skim), obs\u0142ug\u0119 sygna\u0142\u00f3w wej\u015b\u0107 i wyj\u015b\u0107 oraz uczenie robota punkt\u00f3w i ruch do nich.<\/p>\n","protected":false},"author":83,"featured_media":23822,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[234,233],"tags":[237],"class_list":["post-23817","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-automatyka-w-praktyce","category-dla-uzytkownikow-produktow-astor","tag-astorino"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\r\n<title>Jak wykorzysta\u0107 bibliotek\u0119 C# do programowania robota Astorino | Poradnik Automatyka<\/title>\r\n<meta name=\"description\" content=\"Dowiedz si\u0119, jak stworzy\u0107 w\u0142asn\u0105 aplikacj\u0119 do sterowania robotem Astorino w j\u0119zyku C# z wykorzystaniem .NET.\" \/>\r\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\r\n<link rel=\"canonical\" href=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/\" \/>\r\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\r\n<meta property=\"og:type\" content=\"article\" \/>\r\n<meta property=\"og:title\" content=\"Jak wykorzysta\u0107 bibliotek\u0119 C# do programowania robota Astorino | Poradnik Automatyka\" \/>\r\n<meta property=\"og:description\" content=\"Dowiedz si\u0119, jak stworzy\u0107 w\u0142asn\u0105 aplikacj\u0119 do sterowania robotem Astorino w j\u0119zyku C# z wykorzystaniem .NET.\" \/>\r\n<meta property=\"og:url\" content=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/\" \/>\r\n<meta property=\"og:site_name\" content=\"Poradnik Automatyka\" \/>\r\n<meta property=\"article:published_time\" content=\"2025-08-11T12:31:35+00:00\" \/>\r\n<meta property=\"article:modified_time\" content=\"2025-09-04T08:39:18+00:00\" \/>\r\n<meta property=\"og:image\" content=\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/astorino-cs-head.jpg\" \/>\r\n\t<meta property=\"og:image:width\" content=\"960\" \/>\r\n\t<meta property=\"og:image:height\" content=\"282\" \/>\r\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\r\n<meta name=\"author\" content=\"Kamila Piechocka\" \/>\r\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\r\n<meta name=\"twitter:label1\" content=\"Napisane przez\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kamila Piechocka\" \/>\n\t<meta name=\"twitter:label2\" content=\"Szacowany czas czytania\" \/>\n\t<meta name=\"twitter:data2\" content=\"27 minut\" \/>\r\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/\"},\"author\":{\"name\":\"Kamila Piechocka\",\"@id\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/#\/schema\/person\/bb85922f1cba91e4049649720381de0c\"},\"headline\":\"Jak wykorzysta\u0107 bibliotek\u0119 C# do programowania robota Astorino\",\"datePublished\":\"2025-08-11T12:31:35+00:00\",\"dateModified\":\"2025-09-04T08:39:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/\"},\"wordCount\":3401,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/astorino-cs-head.jpg\",\"keywords\":[\"Astorino\"],\"articleSection\":[\"Automatyka w praktyce\",\"Produkty ASTOR\"],\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/\",\"url\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/\",\"name\":\"Jak wykorzysta\u0107 bibliotek\u0119 C# do programowania robota Astorino | Poradnik Automatyka\",\"isPartOf\":{\"@id\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/astorino-cs-head.jpg\",\"datePublished\":\"2025-08-11T12:31:35+00:00\",\"dateModified\":\"2025-09-04T08:39:18+00:00\",\"description\":\"Dowiedz si\u0119, jak stworzy\u0107 w\u0142asn\u0105 aplikacj\u0119 do sterowania robotem Astorino w j\u0119zyku C# z wykorzystaniem .NET.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/#primaryimage\",\"url\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/astorino-cs-head.jpg\",\"contentUrl\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/astorino-cs-head.jpg\",\"width\":960,\"height\":282},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Automatyka w praktyce\",\"item\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/category\/automatyka-w-praktyce\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Jak wykorzysta\u0107 bibliotek\u0119 C# do programowania robota Astorino\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/#website\",\"url\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/\",\"name\":\"Poradnik Automatyka\",\"description\":\"Poradnik Automatyka to przydatne kursy, u\u017cyteczne artyku\u0142y i merytoryczne webinary dla ka\u017cdego automatyka i elektryka.\",\"publisher\":{\"@id\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/#organization\",\"name\":\"ASTOR\",\"url\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2018\/08\/ASTOR_zwykly_sam_logotyp.png\",\"contentUrl\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2018\/08\/ASTOR_zwykly_sam_logotyp.png\",\"width\":3322,\"height\":1078,\"caption\":\"ASTOR\"},\"image\":{\"@id\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/#\/schema\/person\/bb85922f1cba91e4049649720381de0c\",\"name\":\"Kamila Piechocka\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/07\/kamila-jaworowska-n-301x301.png\",\"contentUrl\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/07\/kamila-jaworowska-n-301x301.png\",\"caption\":\"Kamila Piechocka\"},\"description\":\"In\u017cynier ds. system\u00f3w zrobotyzowanych w firmie ASTOR.\",\"url\":\"https:\/\/www.astor.com.pl\/poradnikautomatyka\/autor\/kamilaj\/\"}]}<\/script>\r\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Jak wykorzysta\u0107 bibliotek\u0119 C# do programowania robota Astorino | Poradnik Automatyka","description":"Dowiedz si\u0119, jak stworzy\u0107 w\u0142asn\u0105 aplikacj\u0119 do sterowania robotem Astorino w j\u0119zyku C# z wykorzystaniem .NET.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/","og_locale":"pl_PL","og_type":"article","og_title":"Jak wykorzysta\u0107 bibliotek\u0119 C# do programowania robota Astorino | Poradnik Automatyka","og_description":"Dowiedz si\u0119, jak stworzy\u0107 w\u0142asn\u0105 aplikacj\u0119 do sterowania robotem Astorino w j\u0119zyku C# z wykorzystaniem .NET.","og_url":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/","og_site_name":"Poradnik Automatyka","article_published_time":"2025-08-11T12:31:35+00:00","article_modified_time":"2025-09-04T08:39:18+00:00","og_image":[{"width":960,"height":282,"url":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/astorino-cs-head.jpg","type":"image\/jpeg"}],"author":"Kamila Piechocka","twitter_card":"summary_large_image","twitter_misc":{"Napisane przez":"Kamila Piechocka","Szacowany czas czytania":"27 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/#article","isPartOf":{"@id":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/"},"author":{"name":"Kamila Piechocka","@id":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/#\/schema\/person\/bb85922f1cba91e4049649720381de0c"},"headline":"Jak wykorzysta\u0107 bibliotek\u0119 C# do programowania robota Astorino","datePublished":"2025-08-11T12:31:35+00:00","dateModified":"2025-09-04T08:39:18+00:00","mainEntityOfPage":{"@id":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/"},"wordCount":3401,"commentCount":0,"publisher":{"@id":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/#organization"},"image":{"@id":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/#primaryimage"},"thumbnailUrl":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/astorino-cs-head.jpg","keywords":["Astorino"],"articleSection":["Automatyka w praktyce","Produkty ASTOR"],"inLanguage":"pl-PL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/","url":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/","name":"Jak wykorzysta\u0107 bibliotek\u0119 C# do programowania robota Astorino | Poradnik Automatyka","isPartOf":{"@id":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/#primaryimage"},"image":{"@id":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/#primaryimage"},"thumbnailUrl":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/astorino-cs-head.jpg","datePublished":"2025-08-11T12:31:35+00:00","dateModified":"2025-09-04T08:39:18+00:00","description":"Dowiedz si\u0119, jak stworzy\u0107 w\u0142asn\u0105 aplikacj\u0119 do sterowania robotem Astorino w j\u0119zyku C# z wykorzystaniem .NET.","breadcrumb":{"@id":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/#primaryimage","url":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/astorino-cs-head.jpg","contentUrl":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/08\/astorino-cs-head.jpg","width":960,"height":282},{"@type":"BreadcrumbList","@id":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/jak-wykorzystac-biblioteke-c-do-programowania-robota-astorino\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Automatyka w praktyce","item":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/category\/automatyka-w-praktyce\/"},{"@type":"ListItem","position":2,"name":"Jak wykorzysta\u0107 bibliotek\u0119 C# do programowania robota Astorino"}]},{"@type":"WebSite","@id":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/#website","url":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/","name":"Poradnik Automatyka","description":"Poradnik Automatyka to przydatne kursy, u\u017cyteczne artyku\u0142y i merytoryczne webinary dla ka\u017cdego automatyka i elektryka.","publisher":{"@id":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/#organization","name":"ASTOR","url":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/#\/schema\/logo\/image\/","url":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2018\/08\/ASTOR_zwykly_sam_logotyp.png","contentUrl":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2018\/08\/ASTOR_zwykly_sam_logotyp.png","width":3322,"height":1078,"caption":"ASTOR"},"image":{"@id":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/#\/schema\/person\/bb85922f1cba91e4049649720381de0c","name":"Kamila Piechocka","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/#\/schema\/person\/image\/","url":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/07\/kamila-jaworowska-n-301x301.png","contentUrl":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-content\/uploads\/2025\/07\/kamila-jaworowska-n-301x301.png","caption":"Kamila Piechocka"},"description":"In\u017cynier ds. system\u00f3w zrobotyzowanych w firmie ASTOR.","url":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/autor\/kamilaj\/"}]}},"_links":{"self":[{"href":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-json\/wp\/v2\/posts\/23817","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-json\/wp\/v2\/users\/83"}],"replies":[{"embeddable":true,"href":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-json\/wp\/v2\/comments?post=23817"}],"version-history":[{"count":3,"href":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-json\/wp\/v2\/posts\/23817\/revisions"}],"predecessor-version":[{"id":24596,"href":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-json\/wp\/v2\/posts\/23817\/revisions\/24596"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-json\/wp\/v2\/media\/23822"}],"wp:attachment":[{"href":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-json\/wp\/v2\/media?parent=23817"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-json\/wp\/v2\/categories?post=23817"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.astor.com.pl\/poradnikautomatyka\/wp-json\/wp\/v2\/tags?post=23817"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}