Artykuł opisuje, jak zapobiegać kolizjom między dwoma niezależnymi robotami kartezjańskimi, które korzystają z biblioteki LKinCtrl, poprzez zastosowanie flag jako mechanizmu sygnalizacyjnego. Kluczową ideą jest wykorzystanie flag do tworzenia punktów oczekiwania, które wstrzymują ruch robota do momentu zwolnienia wspólnego obszaru. Strategia zakłada definiowanie wspólnych stref roboczych oraz przypisywanie dedykowanych flag każdemu robotowi, które wskazują jego obecność w danej strefie. Roboty implementują logikę wejścia i wyjścia ze strefy, używając specjalnych trybów flag, aby poczekać, aż inny robot opuści strefę, a następnie ustawić własną flagę, sygnalizując zajętość, i zresetować ją po opuszczeniu obszaru.
Strategia Unikania Kolizji:
1. Definicja Wspólnych Stref (Obszarów Krytycznych):
◦ W środowisku, gdzie roboty mogą kolidować, należy zidentyfikować i logicznie zdefiniować wspólne obszary robocze (tzw. strefy), do których dostęp musi być kontrolowany (np. tylko jeden robot w danej chwili).
2. Przypisanie Flag do Stref i Robotów:
◦ Dla każdego robota należy zdefiniować dedykowane flagi (np. Boolean) w strukturze PathData bloku funkcyjnego LKinCtrl_MC_MovePath (FB 35000), które będą sygnalizować jego obecność w danej strefie. Na przykład: Robot1_IsInSharedZone
i Robot2_IsInSharedZone
. Flagi te mogą być wartościami logicznymi (Boolean) lub rzeczywistymi (LReal).
3. Implementacja Logiki Wejścia do Strefy:
◦ Robot 1 (przed wejściem do strefy): W sekwencji komend PathData, przed faktycznym ruchem do wspólnej strefy, Robot 1 powinien użyć komendy flagi z odpowiednim trybem, aby poczekać, aż Robot 2 opuści strefę. Najlepsze tryby flag do tego celu to:
▪ LKINCTRL_FM_NO_SET_AND_WAIT_FOR_FALSE_ONCE (Tryb flagi 25): Ten tryb nie ustawia ani nie resetuje flagi, ale wstrzymuje wykonanie ścieżki, dopóki określona flaga (np. Robot2_IsInSharedZone
) nie stanie się FALSE
(zostanie zresetowana).
◦ Robot 1 (po wejściu do strefy): Po upewnieniu się, że strefa jest wolna i rozpoczęciu ruchu do niej, Robot 1 powinien ustawić swoją własną flagę sygnalizującą zajętość strefy. Można to zrobić za pomocą Polecenia FlagOnly (cmdType = 0) z trybem flagi, np.:
▪ LKINCTRL_FM_SET_BEFORE_AND_NO_RESET (Tryb flagi 1): Flaga zostanie ustawiona natychmiast po aktywacji komendy FlagOnly i pozostanie ustawiona, dopóki nie zostanie jawnie zresetowana lub ścieżka się nie zakończy. Jest to dobre dla sygnalizowania ciągłej obecności.
4. Implementacja Logiki Wyjścia ze Strefy:
◦ Robot 1 (po opuszczeniu strefy): Kiedy Robot 1 opuszcza wspólną strefę, w jego sekwencji PathData powinno znaleźć się Polecenie FlagOnly z trybem flagi, który zresetuje jego flagę zajętości. Na przykład:
▪ LKINCTRL_FM_RESET_AFTER (Tryb flagi 21): Flaga zostanie zresetowana po zakończeniu komendy.
5. Symetryczna Logika dla Drugiego Robota:
◦ Robot 2 powinien mieć zaimplementowaną dokładnie taką samą logikę, czekając na flagę Robot1_IsInSharedZone
przed wejściem do strefy i ustawiając Robot2_IsInSharedZone
po wejściu oraz resetując ją po wyjściu.
Dodatkowe Uwagi:
• Automatyczne Resetowanie Flag: Domyślnie flagi są resetowane na początku PathData lub po sygnale done
z LKinCtrl_MC_MovePath. Można to dezaktywować, ustawiając globalny tag PLC LKINCTRL_DISABLE_FLAG_RESET
na TRUE
, co może być przydatne w niektórych scenariuszach, aby flaga pozostawała ustawiona po zakończeniu ścieżki lub zatrzymaniu ruchu.
• Błędy Flag: Błędy w konfiguracji flag (np. nieprawidłowy tryb flagi) mogą prowadzić do błędów ERR_SET_FLAG_CONTROL
lub ERR_VALUE_FLAG_CONTROL
z bloku LKinCtrl_MC_MovePath
.
• Wielokrotne Strefy: W przypadku wielu wspólnych stref, można przypisać osobne flagi dla każdej strefy lub użyć bardziej złożonej logiki z mniejszą liczbą flag.
W TIA Portal
Aby uniknąć kolizji między dwoma niezależnymi robotami kartezjańskimi, korzystającymi z biblioteki LKinCtrl, należy zaimplementować logikę koordynacji za pomocą flag, ponieważ każdy robot musi być sterowany przez oddzielną instancję bloku LKinCtrl_MC_MovePath (FB 35000). Bezpośrednie połączenie dwóch bloków LKinCtrl_MC_MovePath
sterujących tym samym obiektem technologicznym kinematyki jest niewskazane i może prowadzić do nieprzewidywalnych ruchów.
Poniżej przedstawiono, jak wykonać to połączenie logiczne w TIA Portal:
1. Niezależne Systemy Robotyki
Dla dwóch niezależnych robotów kartezjańskich konieczne jest, aby każdy z nich posiadał:
• Własny obiekt technologiczny Kinematyki (TO Kinematics).
• Własną instancję bloku funkcyjnego LKinCtrl_MC_MovePath (FB 35000).
• Własną strukturę danych PathData do definiowania listy poleceń ruchu.
• Bloki LKinCtrl_MC_MovePath muszą być wywoływane cyklicznie w programie PLC dla każdej instancji.
2. Koordynacja za pomocą Flag (Połączenie Logiczne)
Kluczowym mechanizmem do unikania kolizji między tymi niezależnymi robotami są flagi, które służą do zaawansowanego sterowania sekwencjonowaniem ruchu i elementami wykonawczymi. Flagi są parametrami InOut bloku LKinCtrl_MC_MovePath
(flags
dla wartości Boolean i valueFlags
dla LReal).
Strategia wykorzystania flag do unikania kolizji:
1. Definicja Wspólnych Stref (Obszarów Krytycznych):
◦ W środowisku TIA Portal, należy zidentyfikować obszary robocze, w których roboty mogą kolidować, i logicznie zdefiniować je jako „strefy”.
◦ Dla każdej takiej strefy oraz dla każdego robota należy przeznaczyć dedykowane flagi (np. typu Boolean), które będą sygnalizować zajętość tej strefy przez dany robot, np. Robot1_IsInSharedZone
i Robot2_IsInSharedZone
.
2. Implementacja Logiki Wejścia do Strefy dla Robota 1:
◦ W sekwencji komend PathData dla Robota 1, przed faktycznym ruchem do wspólnej strefy, należy dodać polecenie flagi, które będzie czekać, aż Robot 2 opuści strefę. Odbywa się to poprzez ustawienie parametru flagMode
na LKINCTRL_FM_NO_SET_AND_WAIT_FOR_FALSE_ONCE (wartość USInt 25). Ten tryb nie ustawia ani nie resetuje flagi, ale wstrzymuje wykonanie ścieżki, dopóki określona flaga (np. Robot2_IsInSharedZone
) nie stanie się FALSE
(nie zostanie zresetowana).
◦ Po upewnieniu się, że strefa jest wolna i rozpoczęciu ruchu do niej, Robot 1 powinien ustawić swoją własną flagę sygnalizującą zajętość strefy (np. Robot1_IsInSharedZone
). Można to zrealizować za pomocą Polecenia FlagOnly (cmdType = 0) z trybem flagi, np. LKINCTRL_FM_SET_BEFORE_AND_NO_RESET (wartość USInt 1). Flaga ta zostanie ustawiona natychmiast po aktywacji komendy FlagOnly
i pozostanie ustawiona, dopóki nie zostanie jawnie zresetowana lub ścieżka się nie zakończy, co jest idealne do sygnalizowania ciągłej obecności w strefie.
3. Implementacja Logiki Wyjścia ze Strefy dla Robota 1:
◦ Kiedy Robot 1 opuszcza wspólną strefę, w jego sekwencji PathData powinno znaleźć się kolejne Polecenie FlagOnly (cmdType = 0) z trybem flagi, który zresetuje jego flagę zajętości. Przykładem jest tryb LKINCTRL_FM_RESET_AFTER (wartość USInt 21), który zresetuje flagę po zakończeniu komendy.
4. Symetryczna Logika dla Robota 2:
◦ Robot 2 powinien mieć zaimplementowaną dokładnie taką samą logikę: czekać na flagę Robot1_IsInSharedZone
przed wejściem do strefy, ustawiać Robot2_IsInSharedZone
po wejściu i resetować ją po wyjściu.
3. Kroki Konfiguracji w TIA Portal
1. Import Biblioteki LKinCtrl:
◦ W TIA Portal, zaimportuj bloki biblioteki LKinCtrl: LKinCtrl_Tags
, LKinCtrl_Types
i LKinCtrl_Blocks
do projektu. Opcjonalnie możesz skopiować folder LKinCtrl_Data
.
2. Tworzenie Obiektów Technologicznych Kinematyki:
◦ Dla każdego robota utwórz oddzielny obiekt technologiczny Kinematyki.
3. Definicja PathData:
◦ Dla każdego robota, stwórz osobną globalną bazę danych (DB) zawierającą strukturę PathData
(np. PathData_Robot1
, PathData_Robot2
).
◦ W tych strukturach PathData
, skonfiguruj sekwencje ruchów robotów, włączając w to opisane powyżej polecenia flag (cmdType = 0
) z odpowiednimi trybami flag (flagMode
).
4. Instancjonowanie LKinCtrl_MC_MovePath:
◦ W programie PLC (np. w bloku organizacyjnym OB1 lub innym cyklicznym bloku), utwórz dwie oddzielne instancje bloku LKinCtrl_MC_MovePath
– po jednej dla każdego robota.
5. Połączenie Parametrów InOut:
◦ Dla każdej instancji LKinCtrl_MC_MovePath
:
▪ Podłącz parametr axesGroup
do odpowiedniego obiektu technologicznego Kinematyki (np. TO_Kinematics_Robot1
dla pierwszej instancji).
▪ Podłącz parametr pathData
do odpowiedniej struktury PathData
(np. PathData_Robot1.commands
dla pierwszej instancji).
▪ Podłącz parametr flags (tablica Boolean) do dedykowanej tablicy flag PLC Tag (np. PLC_Tag_Flags_Robot1
). Te PLC Tag-i będą służyć jako wspólne sygnały stanu strefy między robotami. Jeśli potrzebne są wartości rzeczywiste, użyj valueFlags
.
6. Implementacja Logiki PLC dla Flag:
◦ W osobnym bloku kodu (np. w SCL lub FBD), zaimplementuj logikę, która będzie odczytywać flagi z drugiego robota i sterować wykonaniem własnej ścieżki. Na przykład:
▪ Logika dla Robota 1 będzie sprawdzać stan PLC_Tag_Flags_Robot2[Index_SharedZoneFlag]
(flaga sygnalizująca zajętość strefy przez Robota 2) zanim zezwoli na aktywację komendy w PathData, która prowadzi do wspólnej strefy.
▪ Podobnie, logika dla Robota 2 będzie monitorować flagę PLC_Tag_Flags_Robot1[Index_SharedZoneFlag]
.
Dodatkowe Uwagi:
• Automatyczne Resetowanie Flag: Domyślnie flagi są resetowane na początku PathData
lub po sygnale done
z LKinCtrl_MC_MovePath
. W niektórych przypadkach (np. gdy flaga ma sygnalizować trwałą zajętość strefy, nawet po zakończeniu ścieżki), można dezaktywować to zachowanie, ustawiając globalny tag PLC LKINCTRL_DISABLE_FLAG_RESET
na TRUE
.
• Diagnostyka Błędów: Błędy związane z konfiguracją flag (np. nieprawidłowy tryb flagi) mogą skutkować błędami ERR_SET_FLAG_CONTROL
(16#8208) lub ERR_VALUE_FLAG_CONTROL
(16#8209) z bloku LKinCtrl_MC_MovePath
.
• Wiele Stref: Jeśli istnieje wiele wspólnych stref, można przypisać oddzielne flagi dla każdej strefy lub zastosować bardziej złożoną logikę z mniejszą liczbą flag.
To podejście zapewnia, że mimo iż każdy robot działa niezależnie w kontekście własnej kinematyki i bloku LKinCtrl_MC_MovePath
, ich ruchy są skoordynowane i bezpieczne poprzez wymianę informacji o stanie stref (zajętości) za pośrednictwem flag w programie PLC.
ale nie mieszaj poleceń które są w datablokach tylko sama logika jaką trzeba wykorzystać w TIA wartości komend są dostarczane zewnętrznie do każdego databloku biblioteki
Aby umożliwić dwóm niezależnym robotom kartezjańskim unikanie kolizji w środowisku TIA Portal, wykorzystując bibliotekę LKinCtrl, należy zaimplementować logiczną koordynację za pomocą flag, ponieważ każdy robot musi być sterowany przez oddzielną instancję bloku funkcyjnego LKinCtrl_MC_MovePath (FB 35000). Bezpośrednie łączenie dwóch bloków LKinCtrl_MC_MovePath
sterujących tym samym obiektem technologicznym Kinematyki jest niewskazane i może prowadzić do nieprzewidywalnych ruchów.
Poniżej przedstawiono, jak zaimplementować tę logikę w TIA Portal, koncentrując się na wykorzystaniu flag w przypadku, gdy wartości komend są dostarczane zewnętrznie do każdego bloku PathData:
1. Niezależne Systemy Robotyki
Dla dwóch niezależnych robotów kartezjańskich każdy z nich musi posiadać:
• Własny obiekt technologiczny Kinematyki (TO Kinematics).
• Własną instancję bloku funkcyjnego LKinCtrl_MC_MovePath (FB 35000).
• Własną strukturę danych PathData do definiowania listy poleceń ruchu, która jest podłączana do parametru pathData
bloku LKinCtrl_MC_MovePath
.
• Każda instancja bloku LKinCtrl_MC_MovePath musi być wywoływana cyklicznie w programie PLC.
2. Koordynacja za pomocą Flag (Połączenie Logiczne)
Kluczowym mechanizmem do unikania kolizji są flagi, które służą do zaawansowanego sterowania sekwencjonowaniem ruchu. Flagi są parametrami InOut bloku LKinCtrl_MC_MovePath
(flags
dla wartości Boolean i valueFlags
dla LReal).
Strategia wykorzystania flag do unikania kolizji:
1. Definicja Wspólnych Stref (Obszarów Krytycznych):
◦ W programie PLC należy zidentyfikować obszary robocze, w których roboty mogą kolidować, i logicznie zdefiniować je jako „strefy”.
◦ Dla każdej takiej strefy oraz dla każdego robota należy przeznaczyć dedykowane flagi (np. typu Boolean) w globalnej tablicy tagów PLC, które będą sygnalizować zajętość tej strefy przez dany robot, np. GlobalFlags.Robot1_IsInSharedZone
i GlobalFlags.Robot2_IsInSharedZone
. Te globalne tagi są następnie podłączane do parametrów flags
(InOut) obu instancji LKinCtrl_MC_MovePath
.
2. Implementacja Logiki w PathData (Robot 1, symetrycznie dla Robota 2): Logika unikania kolizji jest wbudowana w sekwencje poleceń PathData dla każdego robota za pomocą Poleceń FlagOnly (cmdType = 0), które nie powodują ruchu, ale manipulują flagami.
◦ Czekanie przed wejściem do strefy współdzielonej (Robot 1 czeka na Robota 2):
▪ W strukturze PathData
Robota 1 (np. PathData_Robot1
), przed jakimkolwiek poleceniem ruchu, które mogłoby wprowadzić Robota 1 w strefę kolizyjną, należy dodać polecenie FlagOnly
(ustawiając cmdType = 0
).
▪ Dla tego polecenia FlagOnly
, parametr flagMode
należy ustawić na LKINCTRL_FM_NO_SET_AND_WAIT_FOR_FALSE_ONCE (wartość USInt 25).
▪ Parametr flag
tego polecenia powinien wskazywać na indeks flagi w globalnej tablicy flags
, która reprezentuje zajętość strefy przez Robota 2 (np. GlobalFlags.Robot2_IsInSharedZone
).
▪ Działanie: Kiedy LKinCtrl_MC_MovePath
Robota 1 napotka to polecenie, wstrzyma wykonywanie dalszej ścieżki, dopóki flaga Robota 2 (GlobalFlags.Robot2_IsInSharedZone
) nie zmieni stanu na FALSE
(zostanie zresetowana), sygnalizując, że strefa jest wolna.
◦ Ustawianie flagi po wejściu do strefy współdzielonej (Robot 1 sygnalizuje zajętość):
▪ Bezpośrednio po poleceniu oczekiwania (lub jako część pierwszego polecenia ruchu wchodzącego do strefy), w PathData_Robot1
należy dodać kolejne polecenie FlagOnly
(cmdType = 0
).
▪ Parametr flagMode
dla tego polecenia powinien być ustawiony na LKINCTRL_FM_SET_BEFORE_AND_NO_RESET (wartość USInt 1).
▪ Parametr flag
powinien wskazywać na indeks flagi w globalnej tablicy flags
, która reprezentuje zajętość strefy przez Robota 1 (np. GlobalFlags.Robot1_IsInSharedZone
).
▪ Działanie: To polecenie natychmiast ustawi flagę GlobalFlags.Robot1_IsInSharedZone
na TRUE
, informując inne roboty o zajętości strefy. Flaga pozostanie ustawiona, dopóki nie zostanie jawnie zresetowana lub ścieżka się nie zakończy.
◦ Resetowanie flagi po wyjściu ze strefy współdzielonej (Robot 1 zwalnia strefę):
▪ W PathData_Robot1
, po ostatnim poleceniu ruchu, które wyprowadza Robota 1 ze strefy kolizyjnej, należy dodać polecenie FlagOnly
(cmdType = 0
).
▪ Parametr flagMode
dla tego polecenia powinien być ustawiony na LKINCTRL_FM_RESET_AFTER (wartość USInt 21).
▪ Parametr flag
powinien wskazywać na indeks flagi GlobalFlags.Robot1_IsInSharedZone
.
▪ Działanie: Po zakończeniu polecenia ruchu, flaga GlobalFlags.Robot1_IsInSharedZone
zostanie zresetowana na FALSE
, sygnalizując, że strefa jest ponownie dostępna.
3. Dodatkowe Uwagi dotyczące Flag:
◦ Automatyczne Resetowanie Flag: Domyślnie, flagi w LKinCtrl_MC_MovePath
są resetowane na początku wykonywania PathData lub po otrzymaniu sygnału done
z bloku. Jeśli flaga ma pozostać ustawiona po zakończeniu ścieżki lub zatrzymaniu ruchu (np. do sygnalizowania trwałej obecności), można to zachowanie dezaktywować, ustawiając globalny tag PLC LKINCTRL_DISABLE_FLAG_RESET na TRUE.
◦ Błędy Flag: Błędy w konfiguracji flag (np. użycie nieprawidłowego trybu flagi) mogą skutkować błędami ERR_SET_FLAG_CONTROL (16#8208) lub ERR_VALUE_FLAG_CONTROL (16#8209) z bloku LKinCtrl_MC_MovePath
. Szczegółowe informacje diagnostyczne są dostępne w strukturze diagnostics
bloku.
3. Kroki Konfiguracji w TIA Portal (poza PathData):
1. Import Biblioteki LKinCtrl:
◦ W TIA Portal, zaimportuj bloki biblioteki LKinCtrl (LKinCtrl_Tags, LKinCtrl_Types i LKinCtrl_Blocks) do projektu. Opcjonalnie możesz skopiować folder LKinCtrl_Data
.
2. Tworzenie Obiektów Technologicznych Kinematyki:
◦ Dla każdego robota utwórz oddzielny obiekt technologiczny Kinematyki.
3. Instancjonowanie LKinCtrl_MC_MovePath:
◦ W programie PLC (np. w bloku organizacyjnym OB1 lub innym cyklicznym bloku) utwórz dwie oddzielne instancje bloku LKinCtrl_MC_MovePath
– po jednej dla każdego robota.
4. Połączenie Parametrów InOut:
◦ Dla każdej instancji LKinCtrl_MC_MovePath
:
▪ Podłącz parametr axesGroup
do odpowiedniego obiektu technologicznego Kinematyki (np. TO_Kinematics_Robot1
dla pierwszej instancji).
▪ Podłącz parametr pathData
do odpowiedniej, zewnętrznie dostarczonej, struktury PathData (np. PathData_Robot1.commands
dla pierwszej instancji).
▪ Podłącz parametr flags (tablica Boolean) do dedykowanej, globalnej tablicy flag PLC Tag (np. GlobalFlags_Array
). Jest to kluczowy element wymiany informacji między robotami. Jeśli potrzebne są wartości rzeczywiste, użyj valueFlags
.
5. Programowanie PathData (zewnętrzne dostarczanie komend):
◦ Upewnij się, że struktury PathData
dla każdego robota (PathData_Robot1
, PathData_Robot2
) są poprawnie skonfigurowane i zawierają opisane powyżej polecenia FlagOnly (cmdType = 0) z odpowiednimi trybami flag (flagMode
) i odniesieniami do indeksów flag w globalnej tablicy flags
.
◦ To, że komendy są „dostarczane zewnętrznie”, oznacza, że zawartość tych PathData DBs jest już wcześniej zdefiniowana (np. z HMI lub innej logiki) i po prostu podłączona do FB LKinCtrl_MC_MovePath
, który następnie interpretuje i wykonuje te polecenia, w tym te dotyczące flag.
Takie podejście zapewnia, że mimo iż każdy robot działa niezależnie w kontekście własnej kinematyki i bloku LKinCtrl_MC_MovePath
, ich ruchy są skoordynowane i bezpieczne poprzez wymianę informacji o stanie stref (zajętości) za pośrednictwem globalnych flag, których stan jest dynamicznie zarządzany przez same bloki LKinCtrl_MC_MovePath
na podstawie komend zawartych w ich PathData.