logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Komunikacja 1 master i setka slave na małej odległości z mała szybkością

Hypno 12 Mar 2019 09:21 789 21
  • #1 17836313
    Hypno
    Poziom 10  
    Witam,

    Mam prośbę o podpowiedź a może jakiś pomysł jak zrealizować następujący problem:

    Jest układ w którym są małe proste i głupiutkie moduły wykonawcze. Modułów tych w układzie może być kilkadziesiąt max sto kilkadziesiąt.
    Moduły wymagają z masterem prostej komunikacji typu wysłanie/odbiór kilkunastu/kilkudziesięciu bajtów na sekundę. Odległość do komunikacji to max 2m. Im mniej połączeń wymaganych do komunikacji tym lepiej. Idealnie to 2 linie do zasilania i jedna lub dwie do komunikacji. Albo komunikacja po linii zasilającej.

    Problem niby znany i RS485 na pierwszy rzut oka wydaje się być odpowiedni. Jednak trudność tutaj jest następująca.
    Moduły wykonawcze są instalowane w urządzeniu wg. potrzeb. To znaczy na półce mam dużo modułów a w danym momencie do maszyny podłączam te potrzebne. I oczywiście najważniejsze , chcę w tym momencie uniknąć konieczności żmudnego sprawdzania jakichś adresów i ustawiania ich w jakikolwiek sposób przy konfiguracji maszyny. Chcę do maszyny podłączyć potrzebne moduły a maszyna rozpozna co zostało podłączone po jakimś unikalnym ID i zrobi co należy.
  • #2 17836348
    MaX.J
    Poziom 12  
    Na RS-485 maszyna wysyła zapytanie na kanale rozgłoszeniowym o podanie ID, każde urządzenie odpowiada z losowym opóźnieniem. Jeżeli maszyna odbierze któreś ID poprawnie wysyła do niego rozkaz nie odpowiadania na zapytanie ogólne i powtarza procedurę aż nie uzyska żadnej odpowiedzi. W ten sposób maszyna może zebrać ID każdego z urządzeń bez konieczności ingerencji w cały system operatora. Jedynie należy zadbać o unikalne ID dla poszczególnych urządzeń, ale to i tak musisz zrobić.
  • #3 17836372
    Hypno
    Poziom 10  
    I właśnie o to chodzi RS485 może gadać max z 32 układami. Czyli podłączając kolejny moduł do magistrali muszę zadbać aby miał on unikalny adres. A właśnie tego chcę uniknąć. Dobrze by było aby układ wykonawczy miał swój unikalny ID np. 32 bitowy i mam w nosie ustawianie adresów.
    1Wire pod tym względem jest lepszy ale niestety jego prędkość przy podłączeniu wielu układów zaczyna być koszmarna.
  • #4 17836408
    Sareph
    Poziom 24  
    Hypno napisał:
    I właśnie o to chodzi RS485 może gadać max z 32 układami.
    No niby tak, a jednak nie do końca bo zależy jakiego transcivera użyjesz. Na przykład ST3485 pozwala na 64, MAX487/MAX1487 ma limit 128. Ale nawet jakbyś miał limit 32, to zawsze możesz podzielić magistralę na 4 segmenty po 32 urządzenia spięte repeaterem i też by się dało.

    Hypno napisał:
    Dobrze by było aby układ wykonawczy miał swój unikalny ID np. 32 bitowy i mam w nosie ustawianie adresów.
    Da się, zrobiłem coś takiego na rs485/32bit adresy generowane z UID CPU.

    O, a zastosowanie MAX1482 pozwala nawet na 256 urządzeń.
  • #5 17836581
    tmf
    VIP Zasłużony dla elektroda
    Hypno napisał:
    I właśnie o to chodzi RS485 może gadać max z 32 układami. Czyli podłączając kolejny moduł do magistrali muszę zadbać aby miał on unikalny adres. A właśnie tego chcę uniknąć. Dobrze by było aby układ wykonawczy miał swój unikalny ID np. 32 bitowy i mam w nosie ustawianie adresów.
    1Wire pod tym względem jest lepszy ale niestety jego prędkość przy podłączeniu wielu układów zaczyna być koszmarna.


    Jak już wspomniano są transceivery RS485 o ułamkowym obciążeniu, nawet można w takiej sytuacji do 256 urządzeń podłączyć na raz. Więc to nie problem. Kolejna sprawa - w RS485 urządzenie też może mieć np 32-64 bitowe ID, co daje jakąś szansę na unikalność. Wiele współczesnych procków posiada unikalne ID, więc to też można wykorzystać. Oczywiście w takiej sytuacji, odpytywanie każdego nie ma sensu, ale można to rozwiązać tak jak w 1-wire - czyli odpytujesz magistralę tak:
    1.czy ktoś ma ma ID zawierające na bicie 0 warość 1?
    2. czy ktoś ma ma ID zawierające na bicie 0 warość 0?
    3. niech teraz odpowiadają tylko urządzenia, które mają bit 0 ID równy 0.
    4. czy ktoś ma ma ID zawierające na bicie1 warość 1?
    itd.
    Czyli skan magistrali można zrobić krótko. Można też zrobić takie "niby CAN", czyli RS485 ze stanem recesywnym. Wtedy obsługa może być identyczna jak w 1-wire.
    Rozwiązania typu bezpośrednie łączenie mastera ze 100 slave'ami bez pośrednictwa transceivera uznałbym za bardzo ryzykowne i najpewniej nie będzie to działać stabilnie.
  • #6 17836638
    LChucki
    Poziom 31  
    tmf napisał:
    Wiele współczesnych procków posiada unikalne ID, więc to też można wykorzystać. Oczywiście w takiej sytuacji, odpytywanie każdego nie ma sensu, ale można to rozwiązać tak jak w 1-wire - czyli odpytujesz magistralę tak:
    1.czy ktoś ma ma ID zawierające na bicie 0 warość 1?
    2. czy ktoś ma ma ID zawierające na bicie 0 warość 0?

    Nie prościej, jak każde urządzenie wyśle swoje ID, po resecie i np na żądanie? Trzeba rozwiązać problem kolizji ale i na to sa sposoby i za chwile dochodzimy do np Ethernetu.

    Hypno napisał:
    Jest układ w którym są małe proste i głupiutkie moduły wykonawcze.

    Napisz konkretnie, co to za urządzenia, co mają robić, itd.


    PS
    Na Elektrodzie jest tak mania, pisania ogólnikami, tak aby nikt nie wiedział o co chodzi, aby przykładowo szef się nie dowiedział, że pracownik czegoś nie potrafi czego się podjął albo co mu kazano zrobić.
  • #7 17836708
    tmf
    VIP Zasłużony dla elektroda
    LChucki napisał:
    tmf napisał:
    Wiele współczesnych procków posiada unikalne ID, więc to też można wykorzystać. Oczywiście w takiej sytuacji, odpytywanie każdego nie ma sensu, ale można to rozwiązać tak jak w 1-wire - czyli odpytujesz magistralę tak:
    1.czy ktoś ma ma ID zawierające na bicie 0 warość 1?
    2. czy ktoś ma ma ID zawierające na bicie 0 warość 0?


    Nie prościej, jak każde urządzenie wyśle swoje ID, po resecie i np na żądanie? Trzeba rozwiązać problem kolizji ale i na to sa sposoby i za chwile dochodzimy do np Ethernetu.


    Nie prościej. Jak sobie to wyobrażasz? Na raz wszystkie urządzenia próbują wysłać info, a wszystko synchronizuje się do resetu, co pogarsza sprawę. Trzeba więc obsłużyć retransmisje, kolizje, trzeba też wiedzieć, czy master otrzymał dane. W efekcie trzeba zrobić multimaster na RS485, co nie jest jakimś kosmicznym wyzwaniem, ale jakąś komplikacją. Skoro mamy prostą transmisję master-slave, to po co to komplikować robiąc de faco multimaster?
    Enumeracja urządzeń jaką zaproponowałem jest prosta w realizacji i szybka.
  • #8 17836730
    LChucki
    Poziom 31  
    tmf napisał:
    Enumeracja urządzeń jaką zaproponowałem jest prosta w realizacji i szybka.

    Ja nie martwiłbym się enumeracją itp tylko tym, jak znaleźć uszkodzenie gdy 128 czy 256 urządzeń wpiętych jest pod jedną magistralę.
  • #9 17836746
    tmf
    VIP Zasłużony dla elektroda
    LChucki napisał:
    tmf napisał:
    Enumeracja urządzeń jaką zaproponowałem jest prosta w realizacji i szybka.


    Ja nie martwiłbym się enumeracją itp tylko tym, jak znaleźć uszkodzenie gdy 128 czy 256 urządzeń wpiętych jest pod jedną magistralę.

    To istotnie jest ważniejszy problem. Jednak w przypadku magistrali chyba nie ma dobrych rozwiązań - jedno uszkodzone urządzenie może w pewnych warunkach zablokować całą transmisję i nic chyba na to nie można poradzić.
  • #10 17836748
    Hypno
    Poziom 10  
    Moim zdaniem to trochę niegrzecznie napisane z tym pracownikiem szefem i że się nie wie co i jak a szef czeka.... I na 100% prowokacyjnie.
    Ale ad rem. Ponieważ szef nie czeka na nic i bać się nie muszę proszę bardzo o to detale:

    Projekt dotyczy maszyny P&P do układania elektroniki powierzchniowej. Wiem wiem, pewnie sobie pomyślisz "następny co odkrywa koło na nowo zdaje mu się ..." itd...
    Ale maszyna jest, działa.
    Te głupiutkie elementy wykonawcze to podajniki automatyczne z elementami SMD na taśmach. Sprawa zatem jasna, montuję taką płytkę to zakładam taki zestaw podajników, montuję inną to zakładam inny.
    Wszystkie znane mi projekty są zrobione w ten sposób, że każdy podajnik ma określone miejsca (sloty) w które może zostać zainstalowany. Każdy slot ma swoje gniazdo elektryczne do sterowania podajnikiem. I tu jest właśnie różnica. Takie podejście mówi, że podajniki 8mm mogę włożyć tylko w sloty 8mm a 16mm tylko w 16mm.
    Kwestię mechaniki do podajników mam już opracowaną, kupa silniczków z Aliexpress parę kilo filamentu przepuszczonego przez drukarkę 3D, ogołoconych kilka sklepów z nietypowych mini pasków zębatych o szerokości 3mm i maaaasa czasu i już jest ;-)
    Teraz męczy mnie sterowanie tego.
    Moja idea jest taka:
    1. Maszyna na bokach ma zainstalowane po 3-4 pręty metalowe (prowadnice liniowe jak w drukarkach 3D czy innych maszynach CNC), pręty te są jednocześnie i elementami precyzyjnie mocującymi podajniki i przewodnikami do zasilania i sterowania podajników. Każdy bok może być oddzielnym segmentem magistrali.
    2. Podajnik mogę założyć w DOWOLNYM miejscu, byle by tylko było miejsce na prętach. Nie ma żadnych slotów i żadnych ustalonych jedynych dozwolonych pozycji.
    3. Po założeniu podajnika zgłasza się on do systemu "Heloł, jestem, moje ID to ...."
    4. System sprawdza czy ma takie ID w swoim katalogu, jak ma to wiadomo, że to podajnik na przykład 8mm z założonymi oporami 1k 0,1% 0603. I jedyne co potrzeba to określić koordynaty podajnika w przestrzeni maszyny. Jak nie ma w bazie to odpytuje nas o wszystko co trzeba, to jest praca jednorazowa. Przy definicji nowego podajnika lub po założeniu nowej szpulki z innymi elementami do podajnika.
    5. Maszyna, jak to maszyna P&P ma 2 kamery, jedną stacjonarną "look up" i jedną w głowicy "look down". Zatem trzeba ją wykorzystać. Podajnik przy okienku do pobierania elementów ma QR kod ze swoim ID (tym samym którym się zgłasza w systemie). Głowica z kamerą zatem objeżdża obrzeże pola pracy maszyny i sczytuje kody QR. Jak odczyta znany, to na podstawie koordynaty kodu wie gdzie jest okienko do pobrania elementu czyli zna jego współrzędne X, Y, Z. Jak znalazła nowy kod to prosi o ręczne wskazanie okienka (przesuwając głowicę przez użytkownika) i już. Następnym razem po rozpoznaniu tego QR kodu będzie wiedziała że okienko podzespołu znajduje się np. 12,75mm w prawo w osi X, -4,55mm w Y i -1,2mm w Z względem QR kodu. Osiągnąłem zatem sytuację, że dowolny podajnik mogę włożyć w dowolne miejsce maszyny i skonfigurować ją szybko do pracy.

    Podajnik taki powinien zatem po włączeniu (i na żądanie) ogłosić, że jest z takim ID. I na żądanie powinien przekazać ewentualne dodatkowe informacje które przechowuje jego sterownik. Ano własnie np. te koordynaty X, Y, Z względem kodu, swoją nazwę "dla ludzi" czy rodzaj elementów jakie ma na sobie założone. Oczywiście maszyna może nakazać zmianę tych parametrów, które zostaną zapisane w pamięci EEPROM sterownika podajnika.
    W trakcie pracy maszyna wysyła komunikat: podajnik o ID = x wysuń następny element, albo cofnij. A podajnik odpowiada "ID X melduje że zrobione" albo pluje "ID x melduje błąd Y". Jak widać ilość danych jest prawie żadna. Podajnik normalnie dostaje max powiedzmy 1 rozkaz na sekundę i raz na sekundę odpowiada i to nie każdy tylko ten jeden użyty! Komunikacja liczona jest dosłownie w bajtach na sekundę.

    Zatem najważniejsze w tym pomyśle to:
    1. Komunikacja po max 2 przewodach na odległość ok 2m z prędkościami jak marny RS....
    2. Brak konieczności ustawiania każdorazowo adresów dla podajników.
    3. Profesjonalne podajniki kosztują min 120$ na Ali więc ma być taniej..... znacznie taniej
  • #12 17836951
    LChucki
    Poziom 31  
    tmf napisał:
    No to rozwiązanie już masz. RS485 z odpwiednimi transceiverami rozwiązuje problem.

    A unikalne ID, najłatwiej Di 1-Wire.
    Można też próbować całość oprzeć o 1-Wire. Licencje na slave? Jak nie będziesz tym handlował to nie ma problemu.
  • #13 17837447
    krzysiek_krm
    Poziom 40  
    Moim zdaniem dobrym rozwiązaniem będzie użycie magistrali CAN, lwia część problemów rozwiąże się samoistnie.
  • #14 17837919
    michalko12
    Specjalista - Mikrokontrolery
    Może połączenie łańcuchowe jak w WS2812B. uC podaje sygnał startu/końca na pierwszy podajnik ten zaczyna przekazywać swoje dane do następnego podajnika (reszta w tym czasie jest przeźroczysta, ale nie przekazuje sygnału startu/końca) i na końcu daje swój sygnał startu/końca. Następny podajnik odbierając sygnał startu/końca zaczyna przesyłać swoje dane itd., sygnał z ostatniego podajnika trafia do uC. Można też zrobić wspólną szynę danych, ale łańcuchowo przykazywać sygnały startu/końca. Łatwa jest lokalizacja uszkodzonego podajnika - każdy który odbierze sygnał star/koniec może zasygnalizować to LEDem.

    W przypadku dwukierunkowej komunikacji szyna danych musiałaby być wspólna tylko strobowanie kolejnych podajników łańcuchowe.
  • #15 17838054
    Konto nie istnieje
    Poziom 1  
  • #16 17838156
    krisRaba
    Poziom 31  
    W sumie prosi się CAN, z tym że zwykle jest na pokładzie bardziej rozbudowanych procków, a tutaj MCU będzie się raczej nudził i spokojnie może to być jakaś mała "pchełka". Chyba że do jakiegoś maleństwa doklejać moduł CAN po SPI...

    Ale RS485 też to obskoczy przy dobrych transceiverach, a plus jest taki, że praktycznie każdy MCU, nawet z rodzaju "byle co", posiada UART. Kiedyś zrobiłem system, w którym urządzenia losowały sobie czas odpowiedzi na zapytanie typu broadcast i podczas odpowiedzi jednocześnie nasłuchiwały poprawność transmisji. Jeśli było jakieś przekłamanie, to losowały ponownie i dokonywały retransmisji swojego ID. U mnie działało to dobrze, choć pamiętam, że ktoś kiedyś na forum twierdził, że przy RS485 kolizji na wykryjesz, bo lokalnie i tak transceiver wymusi swój stan.
    Gdy master zmapował sobie już dostępne urządzenia, to komunikował się 1 do 1 używając odpowiednich UID.

    Kiedyś się zastanawiałem nad "bieda-CANem" ;), żeby do UART podłączyć transceiver CAN i mieć stan recessive i dominant, a tym samym wykrywać lepiej kolizje, ale póki co nie dobrnąłem do takiego eksperymentu, bo mój system działał dobrze na RS485 ;)
  • #17 17838295
    Hypno
    Poziom 10  
    Też mi coraz bardziej CAN zaczyna pasować. Teraz wczytuję się jeszcze w opis PJON. Tak jak kolega napisał sterownik wykonawczy będzie się nudził w 99% czasu. Myślę o naprawdę jakimś małym AVRku i CAN podłączanym po RS. Sterownik ma obsługiwać jeden silniczek krokowy jeden czujnik optyczny trzy klawisze i diodę LED.
    Łańcuchowe jakiekolwiek połączenie zaprzecza tezom podstawowym pomysłu. Przez moment determinacji myślałem nawet o jakimś optycznym połączeniu ale ten pomysł jednak zarzuciłem.
  • #18 17838329
    LChucki
    Poziom 31  
    Jest jeszcze LIN. Można zrobić UART z OD. Lepsze do tego są STM, gdzie sprzętowo można skonfigurować UART do half-duplex po jednym drucie, wyjścia OD, podciąganie. W AVR trzeba wspomagać się bramkami OC, np 74LS07.
  • #19 17838520
    tmf
    VIP Zasłużony dla elektroda
    krisRaba napisał:
    U mnie działało to dobrze, choć pamiętam, że ktoś kiedyś na forum twierdził, że przy RS485 kolizji na wykryjesz, bo lokalnie i tak transceiver wymusi swój stan.

    No właśnie, z w/w powodów niekoniecznie to musi działać. Ogólnie przyjmuje się, że na RS485 nie da się wykryć kolizji na "drucie", trzeba to oprogramować w wyższych warstwach OSI.
    krisRaba napisał:
    Kiedyś się zastanawiałem nad "bieda-CANem" ;), żeby do UART podłączyć transceiver CAN i mieć stan recessive i dominant, a tym samym wykrywać lepiej kolizje, ale póki co nie dobrnąłem do takiego eksperymentu, bo mój system działał dobrze na RS485 ;)

    Nie potrzeba transceivera CAN, żeby to zrobić. Pomysł z pseudo CAN zaproponowałem w pierwszym swoim poście. Wystarczy wymusić na TxD transceivera stan niski, a wyjście TxD MCU podłączyć pod pin RE/DE. Działa to ok. Wada - jest wolniejsze niż normalny RS485, zaleta - można wykryć kolizje.
    IMHO CAN w czystej postaci jest w tym rozwiązaniu strzelaniem z armaty do muchy. Drogie, dodatkowe scalaki (albo MCU z wbudowanym CAN), mimo wszystko rozbudowany sterownik, bo to też nie jest tak, że kontroler CAN wszystko załatwia. RS485 lub modyfikacje zaproponowane przez Marka - mały MCU, z paroma pinami, nawet chiński, jaki ostatnio zaproponaował piotr_go w DIY za 6 centów za sztukę.
    LChucki napisał:
    Jest jeszcze LIN. Można zrobić UART z OD. Lepsze do tego są STM, gdzie sprzętowo można skonfigurować UART do half-duplex po jednym drucie, wyjścia OD, podciąganie. W AVR trzeba wspomagać się bramkami OC, np 74LS07.

    Standardowo w LIN jest tylko max 15 odbiorników i jest wolny, a autor sygnalizował, że jakaś szybkość jest mu potrzebna. Co do reszty - wiele AVR ma sprzętową implementację LIN i nie potrzebują dodatkowych elementów. Z drugiej strony LIN wymaga w stanie wysokim 12V, czyli aby być w zgodzie ze standardem i tak potrzeba elementów zewnętrznych.
  • #20 17838552
    Hypno
    Poziom 10  
    tmf napisał:
    autor sygnalizował, że jakaś szybkość jest mu potrzebna


    Dokładnie odwrotnie :-) nawet prędkość rzędu 10kB/s wystarczy. Ograniczenie w LIN do 15 hostów jest jednak dyskwalifikujące. CAN póki co wygrywa. A co myślicie o PJON?
  • #21 17838636
    tmf
    VIP Zasłużony dla elektroda
    Hypno napisał:
    co myślicie o PJON?

    Na razie mówimy o warstwie fizycznej protokołu. Ja w środowisku, gdzie są liczne silniki i diabli wiedzą co, jednak wykorzystał bym coś co się stosuje przemysłowo, a nie wynalazki pomysłowych Dobromiłów.
  • #22 17838666
    krzysiek_krm
    Poziom 40  
    tmf napisał:
    Hypno napisał:
    co myślicie o PJON?

    Na razie mówimy o warstwie fizycznej protokołu. Ja w środowisku, gdzie są liczne silniki i diabli wiedzą co, jednak wykorzystał bym coś co się stosuje przemysłowo, a nie wynalazki pomysłowych Dobromiłów.

    Czyli właśnie CAN, który natywnie jest dla automotive gdzie zakłócenia bywają dość spore.
    tmf napisał:
    bo to też nie jest tak, że kontroler CAN wszystko załatwia

    Oczywiście że nie ale załatwia bardzo dużo (sprzętowo).
    Hypno napisał:
    jakimś małym AVRku i CAN podłączanym

    W ogólnym przypadku to nie jest dobry pomysł - przy dużym ruchu na magistrali trzeba się dość mocno "nakombinować" z oprogramowaniem.
REKLAMA