Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 13

Тема: Связь по ModBus Tcp/ip между двумя ПЛК 100 подключенными в сеть.

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию Связь по ModBus Tcp/ip между двумя ПЛК 100 подключенными в сеть.

    Добрый день.
    Нужно связать несколько ПЛК 100 (пока их два) через Ethernet используя ModBus Tcp/ip. Использую сокеты "клиент" - "сервер".

    Сервер:

    SST_INIT:
    IF m_dnServerSocket = SOCKET_INVALID THEN
    m_dnServerSocket := SysSockCreate( SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_TCP );
    END_IF;
    IF m_dnServerSocket <> SOCKET_INVALID THEN
    o_eCondition := SST_SETUP;
    END_IF;

    SST_SETUP:
    IF SysSockSetOption( m_dnServerSocket, SOCKET_SOL, SOCKET_SO_REUSEADDR, ADR( m_dnTrue ), SIZEOF( m_dnTrue ) ) THEN (*m_dnTrue=1*)
    m_ServerSAddres.sin_family := SOCKET_AF_INET;
    m_ServerSAddres.sin_addr := SOCKET_INADDR_ANY;
    m_ServerSAddres.sin_port := SysSockHtons( 502 );
    IF NOT SysSockBind( m_dnServerSocket, ADR( m_ServerSAddres ), SIZEOF( m_ServerSAddres ) ) THEN
    o_eCondition := SST_CLOSE;
    ELSIF SysSockIoctl( m_dnServerSocket, SOCKET_FIONBIO, ADR( m_dnTrue ) ) <> 0 THEN
    o_eCondition := SST_CLOSE;
    ELSE
    o_eCondition := SST_LISTEN;
    END_IF;
    END_IF;

    SST_LISTEN:
    IF SysSockListen( m_dnServerSocket, 1 ) THEN
    o_eCondition := SST_ACCEPT;
    ELSE
    m_dnError := 0;
    m_dwSize := SIZEOF( m_dnError );
    m_bRes := SysSockGetOption( m_dnSocket, SOCKET_SOL, SOCKET_SO_ERROR, ADR( m_dnError ), ADR( m_dwSize ) );
    IF NOT m_bRes OR m_dnError <> 0 THEN
    o_eCondition := CST_CLOSE;
    END_IF
    END_IF;

    дальше "прослушки" дело не идет. m_dnError = 0.


    Клиент:

    CST_INIT:
    IF m_dnSocket = SOCKET_INVALID THEN
    m_dnSocket := SysSockCreate( SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_TCP );
    END_IF;
    IF m_dnSocket <> SOCKET_INVALID THEN
    o_eCondition := CST_SETUP;
    END_IF;

    CST_SETUP:
    IF SysSockIoctl( m_dnSocket, SOCKET_FIONBIO, ADR( m_dnTrue ) ) = 0 THEN
    m_SAddress.sin_family := SOCKET_AF_INET;
    m_SAddress.sin_addr := 16#0A000008; (* IP "сервера" 10.0.0.8 *)
    m_SAddress.sin_port := SysSockHtons ( 502 );
    o_eCondition := CST_CONNECT;
    END_IF;

    CST_CONNECT:
    IF m_tonExpect.Q OR NOT m_tonExpect.IN THEN
    IF SysSockConnect( m_dnSocket, ADR( m_SAddress ), SIZEOF( m_SAddress ) ) THEN
    o_eCondition := CST_EXPECT;
    ELSE
    m_dnError := 0;
    m_dwSize := SIZEOF( m_dnError );
    m_bRes := SysSockGetOption( m_dnSocket, SOCKET_SOL, SOCKET_SO_ERROR, ADR( m_dnError ), ADR( m_dwSize ) );
    IF NOT m_bRes OR m_dnError <> 0 THEN
    o_eCondition := CST_CLOSE;
    END_IF
    END_IF;
    m_tonExpect( IN := FALSE );
    END_IF;
    m_tonExpect( IN := TRUE, PT := T#1s );


    SysSockConnect TRUE не возвращает. m_dnError = 0.
    манипуляторы сокетов почему то с двух сторон равны единице. SysSockCreate на "сервере" и на "клиенте" возвращает "1". может это и правильно, но связи нет. что я делаю не так? )
    Последний раз редактировалось lazy; 24.05.2012 в 12:42.

  2. #2

    По умолчанию

    Вообще на ПЛК 100.K-M можно создать 15 сокетов и SysSockCreate последовательно будет возвращать числа (манипуляторы или дескрипторы) от 1 до 15. Предполагаю, что при удачном завершении SysSockListen, "на сервере" SysSockAccept должен возвратить сокет с манипулятором отличным от сокета созданного SysSockCreate для прослушки, а в структуре SOCKADDRESS должен оказаться ip адрес и порт клиента. Так? Какие причины могут не позволять закончится SysSockListen и SysSockConnect с TRUE?
    ПЛК соединены между собой через "хаб".
    Последний раз редактировалось lazy; 25.05.2012 в 10:47.

  3. #3

    По умолчанию

    Не совсем понятно зачем городить то что можно задать в конфигурации кликами мышки.
    На форуме есть примеры.
    Для слушающего сокета WEB сервер.
    Для отправляющего тоже есть пример.
    Все вполне работают.
    Часто задаваемые вопросы по кодесис
    1) Почему программа не работает - Следует выполнить "Онлайн ->Старт"
    2) Где скачать CoDeSys, таргеты, прошивки, библиотеки - http://www.owen.ru/catalog/codesys_v3/opisanie

  4. #4

    По умолчанию

    Конфигуратор не подходит. Много переменных, количество клиентов может быть разное итд... Плюс был горький опыт работы с конфигуратором для ModBus по RS485. Связь заработала как надо только после использования библиотеки ModBus.lib. примеры которые есть на форуме читал. Например, в w3_test.pro есть такой кусок:

    tcp_adr.sin_family:=SOCKET_AF_INET;
    tcp_adr.sin_port:=80;
    tcp_adr.sin_addr:=SOCKET_INADDR_ANY;
    paddr:=ADR(tcp_adr);
    res:=SysSockBind(sock,paddr,SIZEOF(tcp_adr));
    res:=SysSockListen(sock,1); (*одно подключение*)
    paddr:=ADR(accept_adr);
    sock_acc:=sock;
    param_ctrl:=1;
    rcv_bytes_cnt:=0;
    SysSockIoctl(sock_acc,SOCKET_FIONBIO,ADR(param_ctr l));
    web_stat:=W3S_RCV;

    Здесь SysSockAccept вообще не используется, хотя видно, что ее использовать пытались. И что возвращает SysSockListen тоже не важно. И данные передаются в "слушающий" сокет. Так у меня связь тоже иногда "работала". )
    Последний раз редактировалось lazy; 25.05.2012 в 11:52.

  5. #5

    По умолчанию

    TCP IP, так и не удалось поднять. Но работает UDP. Теперь вопрос, достаточно на "сервере" одного сокета, для приема сообщений скажем шести-восьми клиентов, или, все таки, лучше на создавать сокетов по числу клиентов? )

  6. #6

    По умолчанию

    Еще раз повторяю. Если не пользоваться SysSockAccept и передавать данные в "слушающий" сокет, то ТСР "работает". При этом "заявленные" TRUE от SysSockListen и SysSockConnect на ПЛК 100, дождаться не получается... ) Насколько я понимаю, это требует несколько иной организации связи при наличии нескольких клиентов (отличной от "классической").
    ЗЫ: Сдается мне, что в функции TcpServerOpenSocket есть ошибки. Что будет если SysSockBind или SysSockListen завершаться с "-1"? )))

  7. #7

    По умолчанию

    To capzap: Если SysSockBind или SysSockListen в TcpServerOpenSocket завершаться с "-1", то функция возвращает SOCKET_INVALID, не закрыв созданный сокет. Копипасты, они всегда такие копипасты...
    ЗЫ: Не работает TCP IP так как хотелось бы. хочется уже услышать мнение техподдержки. Тех кто видел SysLibSocket "изнутри". В какую сторону копать? ))
    Последний раз редактировалось lazy; 29.05.2012 в 10:36.

  8. #8

    По умолчанию

    Хорошо SysSockAccept присутствует. Но, что она возвращает? Мне интересен манипулятор сокета и адрес клиента возвращенный в структуре SOCKADDRESS.)

  9. #9

    По умолчанию

    В том то и дело, что SysSockAccept нужен для того чтобы создать новый сокет привязанный к адресу клиента который в свою очередь конектицо к "слушающему" сокету. Это сделано от того что клиентов может быть несколько. И они должны знать только адрес слушающего сокета. И уже созданый SysSockAccept сокет будет использоваться для связи с клиентом. Что будет в вашем проекте если клиентов больше чем один? Как вы узнаете кто приконектилсо и с кем вы ведете "беседу"? На ПЛК 100 SysSockAccept возвращает манипулятор "слушающего" сокета и нули в структуре SOCKADDRESS (кроме sin_family ). Где гарантии, что она, а так же SysSockListen и SysSockConect вообще выполняются? Где гарантии что вы проверяете их корректное исполнение сравнивая возвращенные значения с "-1"? Такой хоккей нам не нужен ))

  10. #10

    По умолчанию

    Если на все пять компов отправлялась одинаковая информация, то ничего удивительного в том что ваш проект работал нет. Если нет (т.е. разная) мне хотелось бы узнать (хотя бы на словах) как вы решали какому компу и по какому сокету что отправлять. ))
    ЗЫ: в библиотеке oscat "не самоучки" проверяют корректность исполнения "тех самых" функций на TRUE. )
    Последний раз редактировалось lazy; 29.05.2012 в 11:47.

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. Датчики с двумя ЧЭ
    от energohran в разделе Эксплуатация
    Ответов: 1
    Последнее сообщение: 07.04.2012, 13:46
  2. Подключение приборов Owen в сеть ModBus
    от alex_sinjawin в разделе Сетевые технологии
    Ответов: 10
    Последнее сообщение: 01.04.2010, 10:02
  3. Ответов: 9
    Последнее сообщение: 05.11.2009, 09:40
  4. Сеть ModBus верхнего и нижнего уровня
    от dani1978 в разделе ПЛК1хх
    Ответов: 1
    Последнее сообщение: 09.02.2009, 07:10

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •