Камрады, мне требуется помощь и пинок в нужном направлении в плане логики.
Я на CodeSys v3 изобретаю диммер под один из своих щитов. И я запутался в логике алгортимов! Но не диммера (эта часть работает у меня нормально), а отслеживания нажатий на аппаратную кнопку.
Даю вводные:
а) Кнопка - это вход модуля IO. Модуль опрашивается по Modbus RTU, задержка опроса около 100 мсек.
б) Логика диммера у меня написана на уровне "If bSinglePress Then..." и "ElsIf bLongPress Then" - тут вопросов нет, и тут всё работает.
в) До этого у меня были наработки FBшки, которая умела отличать одинарное, двойное и длинные нажатия на кнопку, но делала это на все нажатия подряд, без взаимоисключения: одинарное нажатие всегда выдавалось при нажатии на кнопку.
Эта логика работала через:
* Краткие нажатия - через изменение счётчика импульсов модуля. Я сранивал предыдущее считанное значение счётчика импульсов и текущее и решал, сколько нажатий было.
* Длинное - тупо по TON с заданной выдержкой.

Ща мне нужна другая логика: чтобы FB умел отличать отдельно короткое нажатие и отдельно длинное.
Я пошёл по тупому пути:
а) по TRUE на входе кнопки запускаю TP (интервал времени - на 100 мсек больше, чем у TON из пункта ниже) и в конце интервала TP смотрю на то, нажата ли кнопка. Если всё её нажата - то блокирую короткое нажатие, считая что идёт длинное.
б) Длинное отслеживаю так же, как и делал - по TON.
Всё это то работает нормально, а то косячит - иногда после длинного нажатия ловится короткое, а иногда после короткого ситема решает что у неё ещё и длинное пошло.

Скорее всего путь этот неверный, но я ща оказался пленником этой идеи и мозг не видит альтернатив.
Короче, как в "истории одного байта" - уже третий день хожу из комнаты в комнату (или даже когда в магазин за едой) и бормочу что-то себе под нос и туплю.

Может ли кто мне посоветовать другой алгоритм? Я наплодил всяких F_TRIG/R_TRIG, и ещё больше запутался нахрен.
Может какие-то другие таймеры попробовать?