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

Тема: Как вызвать задачу для цикличной передачи в RS232

  1. #1

    По умолчанию Как вызвать задачу для цикличной передачи в RS232

    Здравствуйте

    Я создал цикличную задачу с интервалом 200 мс для отправки в порт RS232
    Task_1.jpg

    Task_2.jpg

    код:

    Код:
    (* Пример выдает в интерфейс RS-485 каждую секунду строку "TEST1"
        Настройка порта 9600, 7бит, нет четности, один стоп бит                           *)
    PROGRAM PLC_PRG
    VAR
    	port_opened: BOOL := FALSE;
    	com_handle: DWORD;
    	com_num: PORTS:=COM1;
    	com_set: COMSETTINGS;
    	com_setEx:	COMSETTINGSEX;
    	res: BOOL;
    	tOn1:TON;
    	start_tmr:BOOL:=FALSE;
    	tr1:R_TRIG;
    	snd_str: STRING:='TEST1$N';
    	port_init: BOOL;
    	rcvbuf:ARRAY [0..1023] OF BYTE;
    	sz:DWORD;
    END_VAR
    
    
    
    
    
    
    (*Открываем порт*)
    IF NOT port_opened THEN
    	com_handle:=SysComOpen(com_num);
    	IF com_handle<>16#FFFFFFFF THEN
    		port_init:=TRUE;
    	ELSE
    		SysComClose(	com_num);
    		com_handle:=SysComOpen(	com_num);
    		port_init:=TRUE;
    
    	END_IF
    (*
    (*Настраиваем скорость*)
    	com_set.Port:=com_num;
    	com_set.dwBaudRate:=115200;
    	com_set.byParity:=0;
    	com_set.dwTimeout:=0;
    	com_set.byStopBits:=0; (* *)
    	com_set.dwBufferSize:=0;
    	com_set.dwScan:=0;
    	res:=SysComSetSettings(com_num,ADR(com_set));
    (*Успешно открыли*)
    	IF NOT res THEN
    		port_opened:=TRUE;
    	END_IF
    
    *)
    	com_setEx.Size:=SIZEOF(com_setEx);
    	com_setEx.Port:=com_num;
          com_setEx.dwBaudRate:=9600;
    
    	com_setEx.byStopBits:=0;
    (*
       byStopBits:BYTE; 	Кол-во стоповых бит 0 =один, 1=полтора , 2=два
    *)
    	com_setEx.byParity:=0;
    (*
       byParity:BYTE;	 	Режим проверки четности 0 = нет, 1 = нечет, 2 = чет
    *)
    
        com_setEx.dwTimeout:=0;(*
    DWORD; 	Не используется должно быть =0
    *)
      com_setEx.dwBufferSize:=0;
    (*DWORD; 	Не используется должно быть =0
    *)
      com_setEx.dwScan:=0;(*DWORD; 	Не используется должно быть =0
    *)
    
      com_setEx.cByteSize :=7;
    (* BYTE;         Длина символа в битах   5-8 бит.
    *)	
    (*
       fOutxCtsFlow :  BOOL;  Определяет состояние вывода CTS в PLC-100 не распаян
    
       fDtrControl : BYTE; 	Определяет состояние вывода DTR в PLC-100 не распаян
    
       fDsrSensitivity : BOOL; Определяет чувствительность к состоянию вывода DTR в PLC-
                                100 не распаян
       f RtsControl : BYTE;     Определяет состояние вывода RTS в PLC-100 не распаян
    
       fOutxDsrFlow : BOOL;  Определяет состояние вывода DSR в PLC-100 не распаян
    *)
    
    	res:=SysComSetSettingsEx(com_num,ADR(com_setEx));
    
    (*Успешно открыли*)
    	IF NOT res THEN
    		port_opened:=TRUE;
    	END_IF
    END_IF
    
    IF NOT port_opened THEN
    	RETURN;
    END_IF
    
    	ton1(In:=start_tmr,pt:=t#1s);
    	start_tmr:=TRUE;
    	tr1(clk:=ton1.Q);
    	IF tr1.Q THEN
    		SysComWrite(com_num,ADR(snd_str),LEN(snd_str),0);
    		start_tmr:=FALSE;
    	END_IF
    
    	sz:=SysComRead(com_num,ADR(rcvBUF),1024,0);
    Если делаю без задачи в в основной программе, все работает, а в задаче не вызывается

    NON_Data.jpg

    Помогите пожалуйста разобраться.

    Спасибо.

  2. #2

    По умолчанию

    Проект выложите, в расширенном режиме добавить файл.
    И вы писали что не работает программа, уже заработала?

    В примере уже есть таймер на 1 секунду, можно просто изменить на 200 мс.
    Последний раз редактировалось kondor3000; 11.06.2025 в 08:51.

  3. #3

    По умолчанию

    У тебя НЕ правильный подход в приципе.
    Что ты хочешь получить? Периодическую отправку в порт сообщений?

    1. ИЛИ конфигурация задач (и всё переводить на них) ИЛИ PLC_PRG.
    2. Чтобы делать что-то с заданными интервалом, тебе надо не новые задачи создавать, а использовать таймеры.
    В контексте передачи данных в порт это даже ещё правильнее: один раз открыли и настроили порт, а потом по таймеру шлём данные в него.
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net | Канал в ТГ @CsCsNetLab

  4. #4

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    Проект выложите, в расширенном режиме добавить файл.
    И вы писали что не работает программа, уже заработала?

    В примере уже есть таймер на 1 секунду, можно просто изменить на 200 мс.
    Да спасибо, так и сделал. Отказался от многозадачности, пока опыта не наберусь.

Похожие темы

  1. Ответов: 8
    Последнее сообщение: 30.05.2022, 15:54
  2. Как решить задачу?
    от ordmun в разделе Master SCADA 3
    Ответов: 19
    Последнее сообщение: 11.12.2017, 14:27
  3. ПЛК150 (TCP) - (RS232) NPort 5110 ( Ethernet) - (RS232) СП270
    от AvtCom в разделе Панели оператора (HMI)
    Ответов: 1
    Последнее сообщение: 02.12.2015, 17:43
  4. ПЛК150 (TCP) - (RS232) NPort 5110 ( Ethernet) - (RS232) СП270
    от AvtCom в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 29.11.2015, 17:52
  5. как вызвать callback?
    от Ушаков Николай в разделе ПЛК1хх
    Ответов: 16
    Последнее сообщение: 16.10.2007, 16:29

Ваши права

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