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

Тема: ПЛК304. ComService. Приём данных по RS232.

  1. #1

    По умолчанию ПЛК304. ComService. Приём данных по RS232.

    Всем привет!
    Пытаюсь принять данные в порт по RS232. Данные шлю с ПК средствами терминала. Лампочка порта моргает. Пробовал разные настройки и варианты кода, но хоть бы байт в буфере
    Передача работает чётко.
    Буду благодарен если поделитесь опытом.
    Вот код одной попытки.

    Код:
    IF port_opened=0 THEN
    	Settings.sPort:=3; (* номер COM-порта 2 – Порт1, 3 - Порт2, 4 - Порт3, 5 - Порт4 *)
    	Settings.ulBaudrate:=9600;
    	Settings.byParity:=0; 
    	Settings.ulTimeout:=0;
    	Settings.byStopBits:=0;
    	Settings.ulBufferSize:=256;
    END_IF
    (*Открываем COM-порт*)
    COM_SERVICE1(Enable:=(port_opened=0), Settings:=Settings ,
    Task:=OPEN_TSK );
    (*Если COM-порт открыт, то переходим к приему и передаче
    данных *)
    IF COM_SERVICE1.ready THEN
    	port_opened:=2;
    //------------------Приём--------------------------------
     	readByte:=ComSerice.SysComRead(COM_SERVICE1.handle,ADR(readBuffer[0]),8,250,0);
     	IF readByte>0 THEN
    		i:=0;
    		WHILE readByte>0 DO
    			receivedData[i]:=readBuffer[i];
    			readByte:=readByte-1;
    			i:=i+1;
    		END_WHILE
    	END_IF
    //--------------Отправка----------------------------------
     	IF b_SendCommand=TRUE THEN 	 	
    		sendBuffer[0]:=48;
    		sendBuffer[1]:=49;
    		sendBuffer[2]:=50;
    		sendBuffer[3]:=51;
    		sendBuffer[4]:=52;
    		sendBuffer[5]:=53;
    		sendBuffer[6]:=54;
    		sendBuffer[7]:=55;
    		sendByte:=ComSerice.SysComWrite(COM_SERVICE1.handle,ADR(sendBuffer[0]),8,50,0);
    //-------------------------------------------------------	 
    	 	b_SendCommand:=FALSE;
    	END_IF 
    END_IF
    //------------------таймер 1с на отправку----------------
    SendPeriod(IN:=b_timerIN , PT:=T#1S , Q=>b_timerOUT , ET=>estTime );
    IF b_timerIN=FALSE THEN
    	b_timerIN:=TRUE;
    END_IF
    IF b_timerOUT=TRUE THEN
    	b_timerIN:=FALSE;
    	b_SendCommand:=TRUE;
    END_IF
    Последний раз редактировалось arsenius; 25.01.2016 в 11:03.

  2. #2

    По умолчанию

    Актуально!

  3. #3

    По умолчанию

    Победил.
    Если кто столкнётся:
    Код:
    PROGRAM POU
    VAR
    	sendBuffer: ARRAY[0..8] OF BYTE;
    	port_opened: INT;
    	Settings: ComSerice.COM_Settings;
    	SendPeriod: TON;
    	b_timerIN: BOOL;
    	b_timerOUT: BOOL;
    	estTime: TIME;
    	b_SendCommand: BOOL;
    	sendByte: UDINT;
    	readByte: UDINT;
    	receivedData: ARRAY[0..99] OF BYTE;
    	readBuffer: ARRAY[0..99] OF BYTE;
    	i: INT;
    	COM_SERVICE1: COM_SERVICE;
    	SettingsEx: ComSerice.COM_SettingsEx;
    END_VAR
    VAR RETAIN
    	readTimeout: INT;
    	readByteNumber: INT;
    END_VAR
    
    IF port_opened=0 THEN
    	Settings.sPort:=3; (* номер COM-порта 2 – Порт1, 3 - Порт2, 4 - Порт3, 5 - Порт4 *) //у нас в ПЛК304, порт Р2
    	Settings.ulBaudrate:=9600;
    	Settings.byParity:=0; 
    	Settings.ulTimeout:=0;
    	Settings.byStopBits:=1;
    	Settings.ulBufferSize:=0;
    	SettingsEx.byByteSize:=8;//вроде как без этого не работал приём данных - размер байта в битах
    END_IF
    (*Открываем COM-порт*)
    COM_SERVICE1(Enable:=(port_opened=0), Settings:=Settings , sets_ex:=Setting****
    Task:=OPEN_TSK);
    (*Если COM-порт открыт, то переходим к приему и передаче
    данных *)
    IF COM_SERVICE1.ready THEN
    	port_opened:=2;
    //------------------Приём--------------------------------
     	readByte:=ComSerice.SysComRead(COM_SERVICE1.handle,ADR(readBuffer[0]),readByteNumber,readTimeout,0);
     	//readByteNumber - число байт ожидаемых функцией. 
    	//readTimeout - время ожидания данных, по истечении которого, не дождавшись readByteNumber байт,
    	//функция возвратит в readBuffer всё, что получила
     	IF readByte>0 THEN																					 
    		i:=0;
    		WHILE readByte>0 DO
    			receivedData[i]:=readBuffer[i];
    			readByte:=readByte-1;
    			i:=i+1;
    		END_WHILE
    	END_IF
    //--------------Отправка----------------------------------
     	IF b_SendCommand=TRUE THEN 	 	
    		sendBuffer[0]:=48;
    		sendBuffer[1]:=49;
    		sendBuffer[2]:=50;
    		sendBuffer[3]:=51;
    		sendBuffer[4]:=52;
    		sendBuffer[5]:=53;
    		sendBuffer[6]:=54;
    		sendBuffer[7]:=55;
    		sendByte:=ComSerice.SysComWrite(COM_SERVICE1.handle,ADR(sendBuffer[0]),8,50,0);
    //-------------------------------------------------------	 
    	 	b_SendCommand:=FALSE;
    	END_IF 
    END_IF
    //------------------таймер 1с на отправку----------------
    SendPeriod(IN:=b_timerIN , PT:=T#1S , Q=>b_timerOUT , ET=>estTime );
    IF b_timerIN=FALSE THEN
    	b_timerIN:=TRUE;
    END_IF
    IF b_timerOUT=TRUE THEN
    	b_timerIN:=FALSE;
    	b_SendCommand:=TRUE;
    END_IF

  4. #4

    По умолчанию

    Реально заработало после указания длинны кадра в дополнительных параметрах. s e t s _ e x : = S e t t i n g s E x ,
    Последний раз редактировалось Evgenich93; 19.03.2020 в 11:10.

Похожие темы

  1. Вопрос по биб-ке ComService
    от Boris_K в разделе ПЛК1хх
    Ответов: 51
    Последнее сообщение: 04.01.2020, 21:27
  2. ПЛК304 + RS232
    от Константинов Сергей в разделе ПЛК3хх
    Ответов: 6
    Последнее сообщение: 31.05.2013, 12:53
  3. Непонятный глюк при работе rs232 ПЛК304
    от nestor в разделе ПЛК3хх
    Ответов: 16
    Последнее сообщение: 09.09.2012, 19:42
  4. ПЛК100 + RS232 = Передача данных
    от DrKillJoy в разделе Помощь Разработчикам
    Ответов: 1
    Последнее сообщение: 10.03.2011, 20:51

Ваши права

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