PDA

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



BodDen
11.06.2025, 07:54
Здравствуйте

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

84277

код:




(* Пример выдает в интерфейс 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);



Если делаю без задачи в в основной программе, все работает, а в задаче не вызывается

84278

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

Спасибо.

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

В примере уже есть таймер на 1 секунду, можно просто изменить на 200 мс.

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

1. ИЛИ конфигурация задач (и всё переводить на них) ИЛИ PLC_PRG.
2. Чтобы делать что-то с заданными интервалом, тебе надо не новые задачи создавать, а использовать таймеры.
В контексте передачи данных в порт это даже ещё правильнее: один раз открыли и настроили порт, а потом по таймеру шлём данные в него.

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

В примере уже есть таймер на 1 секунду, можно просто изменить на 200 мс.

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