PDA

Просмотр полной версии : ПЛК110-24.30.Р-М и 4 энкодера



-=Vovka=-
13.04.2022, 14:35
Добрый день!
Понадобилось в рабочий код, в котором есть обработка четырех инкрементальных энкодеров, добавить работу по ТСР.
Энкодеры подключены к DI3-DI10.
60315
Вся программа расположена в PLC_PRG и без ТСР энкодеры обрабатываются без проблем.
Вот фрагмент опроса энкодеров


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?
Пробовал обработку поцепить на таймер в "Системные события" и поиграться с временем срабатывания таймера - безрезультатно!
В общем не пойму куда копать... :(

IVM
13.04.2022, 15:47
Обмен по TCP сжирает процессорное время. Скорее всего нет из этого никакого выхода в твоем случае. Время цикла какое у тебя стоит ?

-=Vovka=-
13.04.2022, 16:03
Обмен по TCP сжирает процессорное время. Скорее всего нет из этого никакого выхода в твоем случае
А как же прерывание по таймеру? Неужели обработка ТСР его отрубает?

Время цикла какое у тебя стоит ?
Пробовал менять - не помогло. Сейчас стоит 1мс

IVM
13.04.2022, 16:09
Код для энкодеров у тебя какой-то мудреный. Попробуй его упростить и сократить.

-=Vovka=-
13.04.2022, 16:14
Мудреный т.к. кроме энкодера там куча всего...
Выбрасывал до минимума чтоб опрашивать один энкодер - все равно не работает!
А в PLC_PRG работает!
Ладно, напишу с нуля для одного энкодера и начну эксперименты заново...

keysansa
13.04.2022, 16:15
А как же прерывание по таймеру? Неужели обработка ТСР его отрубает?

Пробовал менять - не помогло. Сейчас стоит 1мс

Вам, при обработке энкодера надо прерывание не по таймеру, а по быстрому входу.

Зайдите в отладку, посмотрите, сколько времени каждая задача берет.

-=Vovka=-
13.04.2022, 16:29
Вам, при обработке энкодера надо прерывание не по таймеру, а по быстрому входу.
А как для четырех энкодеров задействовать два имеющихся быстрых входа?

keysansa
13.04.2022, 16:34
А как для четырех энкодеров задействовать два имеющихся быстрых входа?

Вот тут вы и ответили на свой же вопрос )

-=Vovka=-
13.04.2022, 16:51
Вот тут вы и ответили на свой же вопрос )
не понял...

keysansa
13.04.2022, 17:01
Если вам нужна быстрая реакция на энкодеры, вам нужны быстрые входы.

keysansa
13.04.2022, 17:05
Можете использовать переменные резисторы, точность пострадает, но возможно вам это и не нужно.