Добрый день!
Понадобилось в рабочий код, в котором есть обработка четырех инкрементальных энкодеров, добавить работу по ТСР.
Энкодеры подключены к DI3-DI10.
1.jpg
Вся программа расположена в PLC_PRG и без ТСР энкодеры обрабатываются без проблем.
Вот фрагмент опроса энкодеров
1:
Код:
CASE enc_nom OF
	1 :	enc_maska := 2#00001100; enc_sdvig := 2; enc_newState := ADR(g_enc2NewState); enc_prevState := ADR(g_enc2PrevState); enc_bitColor := BIT1; enc_tic := ADR(gr_Tik2);
	2 :	enc_maska := 2#00110000; enc_sdvig := 4; enc_newState := ADR(g_enc3NewState); enc_prevState := ADR(g_enc3PrevState); enc_bitColor := BIT2; enc_tic := ADR(gr_Tik3);
	3 :	enc_maska := 2#11000000; enc_sdvig := 6; enc_newState := ADR(g_enc4NewState); enc_prevState := ADR(g_enc4PrevState); enc_bitColor := BIT3; enc_tic := ADR(gr_Tik4);
ELSE
	enc_maska := 2#00000011; enc_sdvig := 0; enc_newState := ADR(g_enc1NewState); enc_prevState := ADR(g_enc1PrevState); enc_bitColor := BIT0; enc_tic := ADR(gr_Tik1); enc_nom := 0;
END_CASE

	enc_newState^ := in AND enc_maska; (* считали порт энкодера и выделили состояние энкодера *)
	IF enc_sdvig <> 0 THEN enc_newState^ := SHR( enc_newState^, enc_sdvig ); END_IF
	IF enc_newState^ <> enc_prevState^ THEN
		IF enc_newState^ = 0 THEN
			IF enc_prevState^ = 2 THEN  bChObor[enc_nom] := bChObor[enc_nom] + 1;	IF bChObor[enc_nom] * enc_tic^ > gr_maxZad THEN bChObor[enc_nom] := bChObor[enc_nom] - 1; END_IF
			ELSIF enc_prevState^ = 1 THEN
				bChObor[enc_nom] := bChObor[enc_nom] - 1;
				IF bChObor[enc_nom] < 0 THEN bChObor[enc_nom] := 0; END_IF
			END_IF
		END_IF
		enc_prevState^ := enc_newState^;
	END_IF
	enc_nom := enc_nom +1;

Как только добавляю обработку ТСР, то нужно очень медленно крутить энкодеры, чтоб они изменяли значение.
Пробовал разбить на части и перенести весь код в "Конфигурация задач" - вообще перестает обрабатывать энкодеры!
Удалил все, кроме обработки энкодеров в "Конфигурация задач" и пробовал разные варианты "тип": циклическая, свободная и т.д. - не работает!
По идее, если в "Конфигурация задач" есть единственная задача с "тип" "свободная", то это должно быть равнозначно выполнению в PLC_PRG?
Пробовал обработку поцепить на таймер в "Системные события" и поиграться с временем срабатывания таймера - безрезультатно!
В общем не пойму куда копать...