А я дал два варианта решения этой задачи. А я это ТЗ читал
Вид для печати
А кто сорвался то ,я всегда называл язык программистов "птичьим" ,потому что не понятным для электронщиков и просил перейти на один язык общения в данной теме (схема).Я просто не увидел решения проблемы "ложного" импульса при включении у ваших примеров .И обратной связи обычно не жду ,если бы ждал ,то не сделал бы столько примеров .
В эмуляции CDS вообще при PT=0 получаем генератор импульсов на выходе. Не среда разработки а просто "сказка" бл....
capzap TP в ОЛ - один импульс, TP в CDS - генератор импульсов - что из этих двух заложено в стандарт ? :)
вот блин, а я всю жизнь думал, что если время таймера 0 миллисекунд то и на выходе импульс должен быть 0 миллисекунд, то бишь нифига быть не должно. наверное у ОЛ и CDS свое понятие времени, ну да бог с ними....
когда таймеры внутри схемы и там нет таких неоднозначностей по ходу и времени оно как-то и не заметно, что их код с косяками.
А еще если соединить вход с выходом инвертора то будет генерация и длительность будет не ноль импульса
rovki а это тут при чем когда речь о таймерах ? в таймерах обязана быть проверка времени. По крайней мере те, кто занимается обычным программированием это понимают.
В генераторах тоже есть время .Генератор это таймер с обратной связью .Просто в инверторе обратная связь вроде как с нулевой задержкой .То есть задержка ноль ,но у самого инвертора есть задержка на такт ,поэтому получаем генератор с периодом 2цикла. Внешней задержки нет ,но есть внутренняя ...
Проблема паразитного импульса не в питании, а в ошибочном коде таймера TP.
Если на управляющий вход I подать 1 (можно константу 1, тогда импульс будет 1 раз при включении питания) при уставке времени T=0, будет паразитный выходной импульс длиной прибл 0,1 сек (на слух, по щелчку реле).
Его видно даже в симуляторе.
см на пунктир Вложение 35678
С какого перепуга взялись "новые" правила?
Режимы использования таймера каждый выбирает сам. Пока видна явная ошибка в реализации TP.
Пунктир, да ладно, Вы схеиы то читать умеете, это детектор переднего фронта.
По поводу новых правил о них я с самого первого поста Вам говорю и кстати шесть лет назад тоже советовал, это единственный вариант работы таймера без паразитных сигналов
А по третьему, ну не моя проблема, что люди создают себе трудности, чтоб из героически преодолевать
кто то хотел внутренности таймера ТР, чтоб подстроить под себя, вот от компании 3S Software исходник
Как раз в мою тему. Я из опасений таких "модернизаций" хочу иметь резервную копию софта и чтобы она могла установить в ПР ту же версию прошивки, которая использовалась на момент разработки и отладки проекта.
Иначе в случае претензий , заказчику ничего не докажешь.
http://www.owen.ru/forum/showthread.php?t=28230
А исправить ошибку можно созданием макроса TP_NEW :)
Чтение входов и старт здесь ни при чем. Ошибка именно ОЛ, то есть его библиотеки.
Реакция TP на импульсы от BLINK - повторение этих импульсов
Вложение 35683
Если ТР будет использоваться внутри схемы с неизменным выставленным временем никаких ошибок от нового ТР и не будет. Их и сейчас нет, если ТР используется с указанным временем больше нуля.
Вся загвоздка вызвана только тем, что кто-то хочет реализовать ТР со сбросом путем записи PT=0, которого в ОЛ просто нет.
Вы не учитываете, что у кого-то может использоваться TP с нулевой уставкой времени.
И у этого кого-то, на этой нулевой уставке может вся схема держаться.
Если поменять поведение, то схема может сломаться.
Поэтому подобные изменения TP и других блоков вредны. Они лишь дестабилизируют ОЛ в угоду маргиналам, которым лишь бы с PT=0 поразвлечься.
еще один аспект, как диагностировать. Например уставка формируется динамически, программист уверен что она не нулевая, а на самом деле из-за ошибок, на таймер подается ноль, сейчас что в ОЛ, что в КДС можно обнаружить импульс/ы, а предложение что то изменить приведдет к тому что если при нуле ничего не будет происходить где искать причину.
Код:/* ------------------- TP ------------------- */
TP::TP()
{
IN = false;
PT = 0;
_M = false;
_StartTime = 0;
Q = false;
ET = 0;
}
TP::TP(unsigned long PT)
{
IN = false;
TP::PT = PT;
_M = false;
_StartTime = 0;
Q = false;
ET = 0;
}
boolean TP::Run(boolean IN)
{
TP::IN = IN;
if (!_M) {
if (TP::IN) {
_M = true; // взводим флаг М
_StartTime = millis();
if (ET < PT)
Q = true;
}
} else {
if (Q) {
ET = millis() - _StartTime; // вычисляем время
if (ET >= PT)
Q = false;
} else {
if (!TP::IN) {
_M = false;
ET = 0;
}
}
}
return Q;
}
Код реализации ТР на ПК - паразитных импульсов при PT=0 НЕТ. что не так с программированием ?
Владимир Ситников если в программе кому-то необходим импульс, то человек просто будет использовать R_Trig без всяких TP с нулевой уставкой. Нет?, я ошибаюсь и применять будут именно ТР ?
capzap ну, наверное будут, зная фича-багу, что при 0 импульс есть. Соглашусь. Но лично меня подобные поведения всегда пугали и подобное никогда не использовал.
Что вы докапались до ТР , при нулевых уставках так же работает R ,F триггер ,а так же блинк при нулях будет выдавать период 2цикла и счетчик будет считать импульсы если вы его прицепите ко входу и будите дергать питание ,а на входе будет 1.А так же D триггер отработает фронт по входу С. Все ФБ которые работают по фронту отработают при включении питания ,если на входе ранее стояла 1....Это знают все электронщики .!
rovki речь о ТАЙМЕРЕ, а не о R,F триггерах и далее по тексту.
Я привел код с ПК для ТР, который адаптировал в C# для Scada системы (чтобы можно было использовать во входных каналах) и проверил его при запуске Scada, при уставке = 0 никаких паразитных импульсов.
И выше писал что при уставке =0 ТР в ОЛ дает один импульс а ТР в CodeSys начинает работать как генератор импульсов каждый цикл
Не видите разницу что в коде реализации каждого ТР получаются свои особенности ? в ОЛ и CDS тупо нет проверки времени, равной нулю и соответственно документация является НЕДЕЙСТВИТЕЛЬНОЙ и НЕДОСТОВЕРНОЙ.
При включении питания таймер должен запуститься, если уставка времени >0 - это справедливо для электроники. Но почему он должен стартовать, если время 0 ?
А то, что триггера запускаются тоже справедливо, так как контролировать в них время нет необходимости.
Тогда еще раз .Выделим два момента
1.Если на динамическом входе ФБ есть 1 ,то при включении питания (первый цикл) ФБ воспримет это как фронт (причину я обьяснял).
2.Формирование не нулевого импульса на выходе ФБ ,при уставке=0.
Каждый элемент ,ФБ имеет внутреннею задержку 1 цикл ПР ,это как у микросхемы -время распространения сигнала от входа до выхода .И есть внешняя задержка которую задает пользователь (это аналог R-C цепочки) .Если задавать время у ФБ более цикла ПР ,то внутренний таймер процессора обеспечит ее ,если время будет меньше Цикла или ноль ,то все равно сформируется импульс ,благодаря внутренней задержки (время цикла) ,аналогично что убрать внешнею RC цепочку в МС .В ОЛ это связано с последовательной обработкой сигнала от выхода до входа - сначала ловим фронт ,а потом время задержки или время импульса (в следующем цикле).Поэтому при уставке НОЛЬ ,формируется минимальный импульс (время цикла) и к этому все привыкли и используют в своих схемах ,как в реальной схемотехнике .
не мешало бы объяснить тогда, мы с Ситниковым тоже про это же говорим, приводим программный код где это видно, Вы на нас то чего задираетесь?
Мелкий, код таймера в ОЛ возможно писался с исходника КДС, чтоб сократить объем кода, можно удалить 7 и 8 строчку из приведенного мною скрина и вот она разница, почему в КДС генератор, а в ОЛ одиночный импульс. То что Вы приводите, писавший, так же как и Вы рассуждал что уставка не может быть нулевой и переписал по своему, проблемы то нет ни какой, кто как и на сколько далеко уходит от стандарта дело сугубо личное для каждого
rovki у меня простой вопрос, почему бы тогда всяким AND и прочим не пропускать на выход импульс, равный одному циклу а потом не обрубать его до нуля ?
А то вы уже за уши притягиваете.
capzap хорошо еще что в ОЛ он не начинает работать как генератор, а то песня была бы длиннее :)
Вы путаете ,обработка элементов идет в пределах одного цикла , и фронт на И обработается в следующем цикле и получите результат(если не стоит линия задержки) ,а если поставите ее ,то получите короткий импульс если использовать другой элемент XOR, а отчет времени ТР ведет аппаратный таймер (по прерыванию) ,поэтому в этом же программном цикле обработаться не может ,только как минимум в следующем цикле программы .
Да все таймер может, как заложено будет в программе (а выполняет программу процессор ПР) так оно работать и будет.
Просто наверное никто не думал, что можно нулевым временем сбрасывать таймер ни в ОЛ ни в CDS.
В пределах одного цикла можно сделать все, что угодно, так как логика любого Программируемого реле или ПЛК у всех производителей одинакова.
1. Чтение входов
2. выполнение программы ( и вот тут то если мы переменную в программе сперва сделаем "1" а потом перепишем в "0" то на выход пойдет именно "0"
3. Запись выходов - внимательно читаем пункт 2.
Или вы хотите сказать, что в ПР200 не так если мы многократно будем переписывать переменную в программе ? ой ли...
capzap не вижу никаких проблем в ОЛ для этого.
а вот тот код, который я для Scada адаптировал вход IN не затрагивает, там хоть пачка импульсов будет, при PT=0 на выходе будет 0 и никаких импульсов