Показано с 1 по 10 из 51

Тема: PLC 110-30 v2 & сокеты

Древовидный режим

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

    По умолчанию

    Цитата Сообщение от Serhioromano Посмотреть сообщение
    Блин, счастье длилось не долго. Это функция работает в проекте с тестовой программой. Если сохраняю ее как библиотеку .lib тоже работает если залить на ПЛК, а если подключаю ее к другому проекту, то там ни фига не работает. Хотя код вызова ФБ одинаковый. Что может быть?
    Сокеты у Овена своеобразные, но вроде работают
    1. создать сокет ( SysSockCreate )
    2. настроить неблокирующий режим ( SysSockSetOption )
    3. попытка соединения с сервером ( SysSockConnect )
    4. немного подождать
    5. отправка сообщения серверу ( SysSockSend ), если отправка удалась, то переходим (6) иначе (3)
    6. можно совсем немного подождать
    7. прием ответа ( SysSockRecv )

    Замечания:
    1. ( bStep = 10 ), чтобы нечаянно не потерять сокет, я бы сделать так
    Код:
    IF ( handle = SOCKET_INVALID ) THEN
    	answer := SysSockCreate( SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_TCP );
    	if ( answer = SOCKET_INVALID ) then
    		....
    	else
    		handle := answer;
    		....
    	end_if
    else
    	SysSockShutdown( handle, 2 );
    	SysSockClose( handle );
    	handle := SOCKET_INVALID;
    end_if
    2. ( bStep = 20 ) – не нужно анализировать возврат SysSockConnect, можно сразу переходить к отправке, можно немного подождать, и потом переходить к отправке
    3. ( bStep = 20 ) – вызов SysSockSetOption, наверно, лучше перенести в ( bStep = 10 )
    4. ( bStep = 30 ) – я не уверен, что нужно использовать флаги в SysSockSend, попробуйте 0
    5. ( bStep = 30 ) – я не уверен, что SysSockSend может вернуть отрицательное значение
    6. ( bStep = 30 ) – в Modbus Tcp «маленькие» пакеты, не нужно пытаться отправлять запрос по частям, т.е
    Код:
    answer := SysSockSend( handle, adr( data ), sizesof( data ), 0 );
    if ( answer = sizeof( data ) ) then
    	переход на прием
    else
    	...
    end_if
    7. ( bStep = 40 ) – я не уверен, что нужно использовать флаги в SysSockRecv, попробуйте 0
    8. ( bStep = 40 ) – я не уверен, что SysSockRecv может вернуть отрицательное значение
    9. ( bStep = 40 ) – нужно проверять ответ, а не просто
    Код:
    IF diResult > 0 THEN
    10. ( bStep = 40 ) - размер буфера для чтения, наверно, должен быть больше 25 байт
    Код:
    arbBuffer: ARRAY[0..24] OF BYTE;
    наверно для FC = 3 или FC = 4 размер должен быть не меньше 259 ( 9 + REG_NUM * 2, если читать до 125 регистров ), или 263 ( 9 + REG_NUM * 2, если читать до 127 регистров )

    11. ( bStep = 40 ) - вашему FB очень не хватает таймера (watchdog)
    Последний раз редактировалось monteg; 05.11.2018 в 23:13.

Похожие темы

  1. ПЛК100 2.17 не работают сокеты
    от murdemon в разделе ПЛК1хх
    Ответов: 6
    Последнее сообщение: 02.07.2018, 21:15
  2. ПЛК100 + Сокеты
    от ribamuka в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 30.08.2017, 11:55
  3. Возможно ли в режиме эмуляции Codesys тестировать работу через сокеты TCP
    от Денис Бердяев в разделе Сетевые технологии
    Ответов: 2
    Последнее сообщение: 09.10.2014, 07:23

Ваши права

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