TCP/IP klient/serwer

2016-07-30 10:21
0

Potrzebuję skomunikować ze sobą sterownik PLC i kontroler robota poprzez ethernet.

Aby sprawdzić, czy program napisany na sterownik działa poprawnie, zdecydowałem się pobrać program http://www.darmoweprogramy.org/569/Hercules-SETUP i użyć go do testów.

Zacząłem od napisaniu programu dla sterownika jako servera i próby połączenia się z nim za pomocą w/w programu.
Program jest pisany w środowisku CoDeSys, w języku ST, i wygląda tak:

PROGRAM PLC_PROGRAM
VAR
    sa     : SOCKADDRESS;
    saSize : DINT;
    port   : WORD := 999;
    hSocket, hClientSocket : UDINT;
    maxConnections : DINT := 10;
    result : UDINT;
    str    : STRING := 'HelloClient!';
    str2   : STRING(255);

END_VAR

hSocket := SysSockCreate(SOCKET_AF_INET, SOCKET_STREAM, 

SOCKET_IPPROTO_TCP, ADR(result));

sa.sin_family    := SOCKET_AF_INET;
sa.sin_addr.ulAddr := SOCKET_INADDR_ANY;
sa.sin_port        := SysSockHtons(port);

result := SysSockBind(hSocket, ADR(sa), SIZEOF(sa));
result := SysSockListen(hSocket, maxConnections);

hClientSocket := SysSockAccept(hSocket, ADR(sa), ADR(saSize), ADR(result));

SysSocketSend(hClientSocket, ADR(str), len(str) + 1, 0, ADR(result));

SysSockClose(hClientSocket);
SysSockClose(hSocket); 

user image

W polu port wpisuję tą samą wartość, którą podałem w programie
W polu IP próbowałem wpisywać wartość IP sterownika PLC, i adres z tej samej podsieci sterownika PLC.

Jak można się domyślić, program nie działa.

  1. Czy dostrzegacie może jakieś błędy w programie ? (przypuszczam, że w innych językach programowania, użyte tutaj funkcje wyglądają podobnie)
  2. Czy fakt, że program na sterowniku PLC wykonuje się cyklicznie może mieć jakiś wpływ na nie-działanie programu?
  3. Czy wystarczy podpiąć kabel ethernet do sterownika i komputera, czy trzeba to jeszcze jakoś dodatkowo konfigurować (pracuję na maszynie wirtualnej), (przez ten sam kabel programuję sterownik ).
  4. Inne powodu, czemu nie działa ?
edytowany 1x, ostatnio: JeloneK, 2016-07-30 10:22

Pozostało 580 znaków

2016-07-30 10:30
0

program nie działa.

Taka informacja nic nie mówi. Co nie działa? Komunikacja serwer-klient? W ogóle pingi nie dochodzą? Gdzie dokładnie jest problem?

Plus: nie sprawdzasz czy socket/bind/listen się powiodły czy nie - może tutaj być problem. Masz jakąś możliwość debugowania tego kodu PLC? Sprawdź czy aplikacja dochodzi do momentu accept. Wrzuć też logi z wiresharka. Tam może być podpowiedź co się mogło skisić. Sam kod serwera wydaje się być dobrze napisany.

I ten Herkules to w sumie za ciężki jest. Napisz sobie banalny klient w C z connect. Będziesz miał większą kontrolę nad tym co się dzieje i gdzie może być problem.

edytowany 1x, ostatnio: mlyszczek, 2016-07-30 10:32

Pozostało 580 znaków

2016-07-30 10:40
0

Pingi w ogóle nie dochodzą.

Teraz nie mam dostępu do sterownika (najszybciej w poniedziałek).
Wtedy potestuję, ale dużo łatwiej byłoby gdybym wiedział, gdzie może tkwić błąd, bo przesiedziałem na tym cały piątek - bez pozytywnego skutku.

Pozostało 580 znaków

2016-07-30 10:51
1

To jak nie działają nawet pingi, to zostaw na razie ten serwer. Najpierw rozwiąż sprawę z pingami, bo bez tego to serwer też nie będzie działać.

Pozostało 580 znaków

2016-07-30 10:58
0

Nie jestem pewien, czy dobrze Cię zrozumiałem.

Jeśli uruchomiam konsolę i wpisuję ping sterownika - to pingi dochodzą - w końcu jakoś ten sterownik muszę programować.

Z kolei, jeśli w tym programie, herkules wpisuję IP sterownika (choć nie wiem, czy to ma sens, by podawać tam ip sterownika), to z tego co pamiętam otrzymywałem błąd 16005, czy 16001, w każdym razie, informowało to o tym, że połączenie jest "odrzucane" (refused).
I komunikat taki pojawiał się nawet jeśli kabel ethernet nie był podłączony.

Pozostało 580 znaków

2016-07-30 11:31
0

To rozumiem, że PLC programujesz poprzez TCP/IP tak? To jak pingi dochodzą to spoko, bo napisałeś, że nie dochodzą w poprzednim poście.

Tutaj będą potrzebne logi z wiresharka, bo bez tego to bieganie po omacku. Tego herkulesa to ja już bym wypieprzył, jak zwraca connection refused, gdy kabel sieciowy jest odłączony. Jak nie chcesz pisać swojego klienta, to ściągnij sobie nmap i nim możesz przeskanować metodą connect czy cokolwiek nasłuchuje na porcie 999.

Pozostało 580 znaków

2016-07-30 11:33
0

Możesz sprawdzić czy/który port jest otwarty na przychodzące połączenia przez skanowanie portów serwera na przykład nmapem

Pozostało 580 znaków

2016-07-30 11:40
0

Tak, przez tcp/ip programuję.

Dziękuję za rady.
Tak też zrobię, ale dopiero w poniedziałek, bo jak już pisałem ,teraz nie mam dostępu do sprzętu.

Pozostało 580 znaków

2016-08-02 15:36
0

Jeżeli mam na plc program - client, to jakie IP muszę mu wskazać, jeśli łączę się przez ethernet z maszyną wirtualną ?
tzn. IP czego ? maszyny wirtualnej (karta ethernet Połączenie lokalne)?

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0