Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Solved] ESP32 komunikacja z PLC Siemens - połączenie ethernetowe przy użyciu ENC28J60

madiz08 26 Nov 2019 09:42 2304 15
  • #1
    madiz08
    Level 14  
    Temat pewnie trochę nie do tego działu, ale prawdopodobnie w dziale Automatyka, nikt nie będzie w stanie mi pomóc w tym temacie.
    Jakiś czas temu ktoś napisał bibliotekę Settimino.h do komunikacji Arduino z PLC Siemens. Przy połaczeniu ethernetowym korzystam z UNO czy Mega wraz z modułem ethernetowym W5100, jeżeli korzystam z ESP32 to łączę się przez WiFi i wszystko gra.
    Chciałbym użyć połączenia przewodem LAN, ale przy użyciu ESP32, które w ogóle nie ma porównania z UNO czy MEGA, jeżeli chodzi o szybkość, wielofunkcyjność itp.
    https://www.elektroda.pl/rtvforum/topic3634381.html
    W powyższym linku już otrzymałem pomoc jak skonfigurować ze sobą ESP32 + moduł ethernetowy enc28j60. Zmontwałem do tego celu płytkę:
    ESP32 komunikacja z PLC Siemens - połączenie ethernetowe przy użyciu ENC28J60
    Wgrałem na początek poniższy program aby sprawdzić czy zostanie nawiązane połączenie z siecią a następnie z PLC
    Code: c
    Log in, to see the code


    Obserwując serial monitor zauważyłem, że mikrokontroler nawiązuje połączenie z siecią, łączy się z nadanym IP, ale w momencie próby nawiązania połączenia z PLC, niestety program sie resetuje i tak na okrągło.
    W bibliotece settimino jest ważna rzecz, a mianowicie plik platform.h
    Code: c
    Log in, to see the code


    W zależności od używanego mikrokontrolera należy tam wybrać odpowiedni sprzęt
    Code: c
    Log in, to see the code

    Co jak widać poniżej w bibliotece ma wpływ na wybór <Ethernet.h> i "EthernetClient.h" lub <WiFi.h> i "WiFiClient.h"
    Zmieniłem wybór ESP32 na:
    Code: c
    Log in, to see the code

    Błędy kompilacji
    Spróbowałem jeszcze inaczej:
    Code: c
    Log in, to see the code

    Otrzymałem te same błędy w kompilowaniu
    Code: c
    Log in, to see the code
    https://www.elektroda.pl/rtvforum/posting.php?mode=newtopic&f=428#
    Czy ktoś z kolegów mógłby poświęcić trochę czasu na przeanalizowanie tego problemu?
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
  • #2
    madiz08
    Level 14  
    error: 'EthernetClass Ethernet' redeclared as different kind of symbol extern EthernetClass Ethernet;

    Dodano po 7 [minuty]:

    Jeżeli zakomentuję dwie linijki:
    //#include "Settimino.h"
    //S7Client Client;//
    oraz pozbędę się funkcji connect(), to wszystko jest ok. Ten moduł ENC28J6 korzysta z <EtherCard.h>, a biblioteka settimino odnosi się do <Ethernet.h>. Dwie biblioteki użyte razem wywołują błędy i czy właśnie można by jakoś to ujednolicić
  • Helpful post
    #3
    khoam
    Level 41  
    Udało mi się skompilować program z następującą poprawką:
    Code: c
    Log in, to see the code
    Code: bash
    Log in, to see the code

    Dodatkowy problem polega na tym, że masz w menedżerze bibliotek Arduino IDE zainstalowaną bibliotekę Ethernet, która faktycznie koliduje z biblioteką EtherCard.

    Dodano po 48 [minuty]:

    Alternatywnym i chyba lepszym rozwiązaniem jest użycie biblioteki UIPEthernet zamiast EtherCard. UIPEthernet też obsługuje ENC28J60 oraz dodatkowo emuluje klasy "standardowej" biblioteki Ethernet, czyli np. Ethernet, EthernetClient. Niestety będziesz musiał wtedy dość mocno "przerobić" swój program. Niezależnie, której użyjesz musisz odinstalować bibliotekę Ethernet z Arduino IDE - UIPEthernet też z nią koliduje.
    https://github.com/UIPEthernet/UIPEthernet

    Niestety biblioteka SETTIMINO została w ten sposób napisana, że wymaga standardowych klasy i metod, jak w bibliotece Ethernet.
  • #4
    madiz08
    Level 14  
    ESP32 komunikacja z PLC Siemens - połączenie ethernetowe przy użyciu ENC28J60
    Faktycznie, udało mi sie skompilować po wprowadzeniu twoich poprawek, ale w momencie kiedy nadano IP i ESP32 zaczął nawiązywać połączenie z PLC przez Settimino.h, to wtedy mikrokontroler sie restartował jak na załączonym zdjęciu po wejściu w funkcję Connect().

    Dodano po 1 [minuty]:

    Po usunięciu Ethernet.h, przy kompilacji wyskakiwały informacje o braku Ethernet.h. Dziękuję za radę, spróbuję jeszcze z tą drugą biblioteką
  • Helpful post
    #5
    khoam
    Level 41  
    madiz08 wrote:
    spróbuję jeszcze z ta druga biblioteką

    To będzie chyba jedyne sensowne rozwiązanie. Alternatywą jest "poprawienie" biblioteki SETTIMINO :)
    W wypadku użycia UIPEthernet też trzeba pamiętać o zmianie nazw plików nagłówkowych w Platfform.h wg schematu:
    Ethernet.h => UIPEthernet.h
    EthernetClient.h => UIPClient.h
    Nie trzeba, a nawet nie wolno usuwać definicji S7WIRED w konfiguracji dla ESP32.
  • #6
    madiz08
    Level 14  
    Czyli może warto zostać przy obecnej bibliotece? i spróbować zmienic Settimino wraz z platform.h. Niestety kiepski jestem w tych bibliotekach, ale wydaje mi sie, że nawiązanie połaczenia z PLC odbywa się poprzez TCP client. W EtherCard nic takiego nie znalazłem.
    Pierwsze co w settimino to:
    void EthernetInit(uint8_t *mac, IPAddress ip);
    W settimino.cpp jest rozwiniecie tej funkcji:
    Code: c
    Log in, to see the code

    a poniżej odnośnik do klienta
    Code: c
    Log in, to see the code

    a plik Ethernet.Client to już dla mnie czarna magia
  • Helpful post
    #7
    khoam
    Level 41  
    madiz08 wrote:
    Czyli może warto zostać przy obecnej bibliotece? i spróbować zmienic Settimino wraz z platform.h.

    Biblioteka Settimino ma wiele funkcjonalności, której raczej sam nie będziesz pisał od zera.
    Wywołaniami typu Ethernet.init() nie przejmuj się, w bibliotece UIPEthernet jest emulacja klas Ethernet czy EtherneClient i są one "kompatybilne" ze standardową biblioteką Ethernet, więc powinno działać. Tak naprawdę musisz dokonać niewielkich zmian w Platform.h, o których wyżej napisałem, oraz trochę więcej zmian w swoim programie ;)
  • #8
    madiz08
    Level 14  
    Pobrałem bibliotekę i juz przy sprawdzeniu przykładów sa problemy z kompilacja dla ESP32. Na razie sprawdzam to laptopie w pracy. W domu pamiętam też były jakieś problemy z kompilowaniem połączeń ethernetowych dla ESP32, ale udało mi się jakoś rozwiązać ten problem, także jak wrócę po pracy to sprawdzę od razu.

    Dodano po 5 [godziny] 43 [minuty]:

    Ok, wszystko się kompiluje, najpierw spróbuje poszukać jakichś przykładów z użyciem enc28j60 i nawiązaniem połączenia z siecią, a jeżeli sie uda to spróbuję powprowadzać zmiany w settimino

    Dodano po 37 [minuty]:

    Podegrałem na początek przykład TCP_Server
    Code: c
    Log in, to see the code

    Na początku biblioteki jest informacja że jest to adaptacja dla Enc28J60, także podegrałem to bez jakichkolwiek zmian. W pierwszej kolejności spróbowałem to pingować po podłączeniu do sieci i niestety za każdym razem brak odpowiedzi, także nie ma połączenia z siecią lokalną.
    Zacząłem się zastanawiać czy podłączenie jest takie samo jak wcześniej. Biblioteka UIPEthernet w folderze hardware zawiera zdjęcia z podłączeniami dla poszczególnych płytek, ale nie ma tam ESP32. W przypadku ESP8266 podłączenie wygląda następująco:
    ESP32 komunikacja z PLC Siemens - połączenie ethernetowe przy użyciu ENC28J60
    Wygląda na to, że powinno być tak samo, ale nie działa. Podłaczenie na płytce jest na 100% ok, bo przy użyciu biblioteki EtherCard moge pingować, czyli urzadzenie jest widziane w sieci
  • #9
    khoam
    Level 41  
    Podłączenia do pinów w ESP32 powinny być:
    CS = 5
    MOSI = 23
    MISO = 19
    SCK = 18
    SS używany jest jako CS, o ile nie wywołasz funkcji Ethernet.init(CS_PIN) i wtedy wybierzesz inny pin, jako CS w ESP32.
  • #10
    madiz08
    Level 14  
    ESP32 komunikacja z PLC Siemens - połączenie ethernetowe przy użyciu ENC28J60
    Na poczatku też 0 oppowiedzi, ale jak dodałem SPI.h do przykładu TCPServer.ino, to juz jest ok, także na razie pozytywnie :) drugie i trzecie pingowanie prawidłowe
  • #11
    khoam
    Level 41  
    madiz08 wrote:
    ale jak dodałem SPI.h

    Bez obsługi SPI to ESP32 raczej się nie będzie komunikował z ENC28J60 :)
  • #12
    madiz08
    Level 14  
    A czy mógłbys mnie naprowadzić gdzie możnaby zmienic te piny SPI na 12, 13, 14, 15 jak w przypadku EtherCard? Jeżeli to nie wskazane, to oczywiście zostane przy tym. Chodzi mi tylko o to, że teraz, łączę drugie ESP32 przewodami z modułem ethernetowym, a jak miałbym te same piny co w EtherCard to mógłbym użyc swojej płytki, gdzie mam juz wyfrezowane ścieżki. Ale oczywiście jak to niewskazane to zostaje przy tym co jest. W SPI.cpp widze wytbór albo domyślny albo właśnie 12, 13, 14, 15, czyli chyba to nie tu

    Dodano po 1 [minuty]:

    Code: c
    Log in, to see the code

    To co powyzej jest właśnie w SPI.cpp
  • #13
    khoam
    Level 41  
    madiz08 wrote:
    A czy mógłbys mnie naprowadzić gdzie możnaby zmienic te piny SPI na 12, 13, 14, 15 jak w przypadku EtherCard? J

    Na początek spróbuj drobnej zmiany w pliku utility/Enc28J60Network.cpp w bibliotece UIPEthernet. Poniższy fragment kodu jest na początku tego pliku. Chodzi o modyfikację jednej linii.
    Code: c
    Log in, to see the code
  • #14
    madiz08
    Level 14  
    Niestety, nie pomogło. Przeskanowałem też cały komputer i nie mam pliku HardwareSPI.h
  • #15
    khoam
    Level 41  
    madiz08 wrote:
    Przeskanowałem też cały komputer i nie mam pliku HardwareSPI.h

    Faktycznie, masz rację. Przeoczyłem to. Wygląda na to, że trzeba "siłowo" zmienić przypisanie pinów dla SPI. Można to zrobić przez modyfikację pliku Enc28J60Network.h. Na samym jego końcu trzeba umieścić dodatkowe linijki kodu, jak poniżej:
    Code: c
    Log in, to see the code

    Poprzednia modyfikacja w pliku Enc28J60Network.cpp nie ma żadnego znaczenia przy pracy z ESP32, więc można przywrócić jej pierwotną postać.
  • #16
    madiz08
    Level 14  
    Przepraszam za ponad tygodniowy brak odpowiedzi, ale na prawdę dopiero teraz mogłem wrócić do tematu.
    Odnośnie próby modyfikacji biblioteki, ze względu na zmianę pinów SPI, to tutaj modyfikacja nie pomogła, ale to bez znaczenia. Zrobiłem drugą płytkę z wyprowadzeniami pod piny enc28j60, zgodnie z wzorcem jaki przedstawiłeś mi wcześniej czyli:
    CS = 5
    MOSI = 23
    MISO = 19
    SCK = 18
    Następnie w platform.h dla ESP32 ustawiłem S7WIRED oraz podmieniłem według wytycznych:
    Ethernet.h => UIPEthernet.h
    EthernetClient.h => UIPClient.h
    Wszystko działa tak jak powinno :) Co prawda najpewniej działa to na zasadzie połącz - prześlij - rozłącz, gdzie trzeba przeznaczyć na to 500ms, ale mimo wszystko mogę za pomocą ESP32 bezproblemowo wymieniać dane z PLC zarówno w jedna jak i druga stronę.
    Kolejny raz dziękuje bardzo za pomoc.