Показано с 1 по 8 из 8

Тема: tcp socket

  1. #1

    Question tcp socket

    Доброго времени суток. Нужна помощь в наладке сокетного приложения.
    При получении сообщения от клиента (plc) к серверу (pc) получаю это сообщение и часть прошлого сообщения

    Например, если отправляю "OK", а получаю "OKate,791212,1000,982"

    Также вот мой клиент
    Код:
    CASE eState OF
    
    
    	CLIENT_STATE_CREATE: 	
    		hClientSocket		:=	SysSockCreate(SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_TCP);
    		IF hClientSocket <> SOCKET_INVALID THEN
    			eState := CLIENT_STATE_CONNECT;
    		ELSE
    			eState	:=	CLIENT_STATE_CLOSE;
    		END_IF
    
    	CLIENT_STATE_CONNECT:
    
    		stClientSettings.sin_family	:=	SOCKET_AF_INET;		
    		stClientSettings.sin_port		:=	wPort; 						
    		dwIPaddr	:=	IP_DECODE(sIPv4);
    		stClientSettings.sin_addr		:=	dwIPaddr;					
    		SysSockConnect(hClientSocket, ADR(stClientSettings), SIZEOF(stClientSettings) );
    		eState	:=	CLIENT_STATE_SENDING;
    		
    
    	CLIENT_STATE_SENDING:		
    		IF SCREEN = 7  THEN
    			IF check = 200 OR check = 1 THEN
    				sSendToServer := CONCAT('insert,',DWORD_TO_STRING(number_filter));
    				OLD_FILTER := number_filter;
    				IF sReadFromServer = 'Ok / Insert' OR sReadFromServer = 'Ok / Update' THEN
    					sSendToServer := CONCAT('update,',DWORD_TO_STRING(number_filter));
    				END_IF
    				sSendToServer := CONCAT(sSendToServer, ',');
    				sSendToServer := CONCAT(sSendToServer, INT_TO_STRING(count_filter));
    				sSendToServer := CONCAT(sSendToServer, ',');
    				sSendToServer := CONCAT(sSendToServer, INT_TO_STRING(succses_filter));
    			END_IF
    		ELSE
    			sSendToServer := 'OK';
    		END_IF
    		diSendBytes	:=	SysSockSend(hClientSocket, ADR(sSendToServer), LEN(sSendToServer), c_diFlag);
    		IF diSendBytes <> SIZEOF(sSendToServer) THEN
    			eState	:=	CLIENT_STATE_READ;
    			fbTon(IN := FALSE);
    		ELSE
    			fbTon(IN := TRUE, PT := tSendServer);
    			IF fbTon.Q THEN
    				eState	:=	CLIENT_STATE_CLOSE;
    				fbTon(IN := FALSE);
    			END_IF
    		END_IF
    
    	CLIENT_STATE_READ: 		
    
    		diRecvBytes	:=	SysSockRecv(hClientSocket, ADR(sReadFromServer), SIZEOF(sReadFromServer), c_diFlag);
    		FIND('Close', sReadFromServer);
    		IF IS_CC(sReadFromServer, 'Close') THEN
    			%QW8.1.9.0 := 1;
    		ELSE
    			%QW8.1.9.0 := 0;
    		END_IF
    		IF diRecvBytes = SIZEOF(sReadFromServer) THEN	
    			eState	:=	CLIENT_STATE_CLOSE;
    			fbTon(IN := FALSE);
    		ELSE
    			fbTon(IN := TRUE, PT := tRecvServer);
    			IF fbTon.Q THEN
    				eState	:=	CLIENT_STATE_CLOSE;
    				fbTon(IN := FALSE);
    				
    			END_IF
    		END_IF
    
    	CLIENT_STATE_CLOSE: 		
    
    		SysSockShutdown(hClientSocket, c_diHow);		
    		fbTon(IN := TRUE, PT := tSockClose);				
    		IF fbTon.Q THEN
    			SysSockClose(hClientSocket);
    			eState	:=	CLIENT_STATE_CREATE;
    			fbTon(IN := FALSE);
    		END_IF
    
    END_CASE

  2. #2

  3. #3

    По умолчанию

    Ему присвоить пустое значение или возможно какой-то функцией очистить буфер?

  4. #4
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,059

    По умолчанию

    Цитата Сообщение от nekain Посмотреть сообщение
    Ему присвоить пустое значение или возможно какой-то функцией очистить буфер?
    Присвоение пустого значения не подойдет.
    Используйте функцию SysMemSet из библиотеки SysLibMem.

  5. #5
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,224

    По умолчанию

    Цитата Сообщение от nekain Посмотреть сообщение
    Ему присвоить пустое значение или возможно какой-то функцией очистить буфер?
    Код:
    VAR
        sReadFromServer : ARRAY[0..15] OF BYTE;
    END_VAR
    VAR CONSTANT
        clearReadServer : ARRAY[0..15] OF BYTE;
    END_VAR
    ...
    (* BEGIN *)
    (* какие то действия по принятому буферу и далее *)
    sReadFromServer := clearReadServer;
    ЗЫ если переменная это строка, то просто sReadFromServer := '';
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  6. #6

    По умолчанию

    Всем привет, подскажите, почему не получается принять строку от сервера.
    Отправляю на сервер строку и жду от него ответа. После этого подключение закрываю. Наблюдаю за обменом через программу WireShark.
    Эта программа показывает, что сервер ответил на мой запрос. И длина ответа 150 байт.
    foto001.png

    В CodeSys для тестирования использую Control Win V3. Вижу, что пришло 150 байт, но почему они не падают в строку?
    foto002.png

    В программе клиента есть переменная eState - это для создания очередности работы с сервером (create, connect, send, receive, close).
    А переменная tries - для ограничения максимальных попыток в каждом шаге. Т.е. если более 10 попыток, то переходим в режим close.
    Пробовал на реальном ПЛК - результат тот же.
    Что я делаю не так?

  7. #7

    По умолчанию

    Я не указывал это. Объявил просто string. И для отправки и для приема.

    UPD: Действительно - при указании длины строки прием идет нормально:

    foto003.png

    Хорошо. А тогда еще вопрос:
    В боевом режиме нужно будет отправить данные, размером около 8-10Кбайт за один обмен. Это нужно реализовывать тоже через строку? Или уже применять массив?
    Последний раз редактировалось ВладОвен; 16.05.2022 в 11:50.

  8. #8
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,224

    По умолчанию

    может поэтому 150 символов не помещается в объект размером 80 символов, проверите
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

Похожие темы

  1. Изменение данных, при вызове С функии socket
    от rostushka в разделе Другие SCADA системы
    Ответов: 0
    Последнее сообщение: 26.08.2021, 08:42
  2. Поддержка Socket в ПЛК110 М02
    от Андрей Шатохин в разделе ПЛК1хх
    Ответов: 8
    Последнее сообщение: 25.04.2016, 08:00
  3. Socket и ПЛК
    от o_nik в разделе ПЛК1хх
    Ответов: 5
    Последнее сообщение: 01.07.2011, 15:46
  4. ПЛК-150, Ethernet порт для работы с Socket
    от Elka в разделе Подбор Оборудования
    Ответов: 1
    Последнее сообщение: 25.01.2011, 13:55

Метки этой темы

Ваши права

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