начать хотя бы с того, что операция приравнивания выходной переменной, коей является дискретный выход Q
например
А I0.0
= Q0.0
должна использоваться ТОЛЬКО ОДИН РАЗ вов сем тексте программы!!!
Почему? спросите Вы...
Для того, чтобы правильно строить логику вычислений ЦПУ надо научиться "думать" как ЦПУ, а это не так просто, как кажется.
ЦПУ выполняет все операции ПОСЛЕДОВАТЕЛЬНО до конца текста программы, НО...
ЦПУ не выполняет наши команды последовательно, как мы их прописали и не выдаёт нам выходные сигналы так же последовательно по мере их исполнения...
После старта в начале цикла в течении нескольких микросекунд ЦПУ производит сканирование сразу всех входных сигналов и записывает их во входную область памяти. Затем последовательно делает вычисления всех логических и арифметических операций с обновленными входными данными в течении нескольких миллисекунд или микросекунд (в зависимости от быстродействия и сложности программы) от начала до конца и записывает результаты вычислений в выходную область памяти. Происходит обновление выходных сигналов опять ДО МОМЕНТА получения новых значений входов и новых результатов вычислений и выхода опять переписываются.
Это первый момент!
Теперь второе: рассмотрим пример
A I0.0
=Q0.0
A I0.1
= Q0.0
Как происходит исполнение этой программы? Рассмотрим пару циклов. Пока не будем принимать во внимание то, что выдача выходных сигналов происходит сначала цикла работы, чтобы не путаться...
Цикл 1
1. Происходит сканирование входов. Пусть на момент сканирования I0.0 истина, а I0.1 ложь.
2. Программа сначала приравнивает значение входа I0.0 выходу Q0.0 и после второй строчки Q0.0 так же становится истина
, а потом приравнивает ему же значение входа I0.1 и на 4 строчке Q0.0 становится ложь
.
3. Выдаёт на выход получившееся значение. Q0.0 в нуле (ложь)
Цикл 2.
1. Происходит сканирование входов. I0.0 ложь, а I0.1 истина.
2. Программа сначала приравнивает значение входа I0.0 выходу Q0.0 и после второй строчки Q0.0 теперь становится ложь, а на 4 строчке Q0.0 становится истина.
3. Выдаёт на выхода получившееся значение. Q0.0 в единице (истина)
Видим, что первые 2 строчки нам ничего не дают... Все равно приравнивание ПЕРЕПИСЫВАЕТ нашу переменную последним значением.
С этой точки зрения Ваш алгоритм с приравниванием 2 раза одного и того же ВЫХОДНОГО бита Q0.2 фактически двум различным логическим цепочкам бессмысленен.
На выход в конце концов пропишется результат только второго таймера.
Не исключено, что в вашей программе между указанными отрывками есть некие промежуточные логические цепочки, которые меняют к необходимым вам точкам программы нужные вам переменные на непонятные значения.
Просмотрите информацию об использовании проблемного тэга в тексте программы.
Просмотрите весь Ваш код и для начала исправьте с описанной точки зрения. Это не придираясь вообще к остальному тексту...