PDA

Просмотр полной версии : Свой таймер



Спорягин Кирилл
25.08.2015, 18:24
Добрый вечер, форумчане.

Для тех кого по каким-либо причинам не устраивают стандартные таймеры TON, TOFF, TP, предлагаю рассмотреть работу с таймером Timer, который я сделал для себя.
Код таймера приведен в прикрепленном проекте. Здесь я дам короткие комментарии.

Основное преимущество работы с данным таймером, состоит в том, что все обращения к таймеру лингвистически понятны.
Так, например, для того чтобы запустить таймер мы пишем:
Timer.Start(),
для того чтобы остановить или очистить таймер, мы пишем:
Timer.Stop() или Timer.Clear().
Проверка запущен ли таймер или нет также понятна: if Timer.Started then...

Пример использования в пошаговом алгоритме:
PROGRAM PLC_PRG
VAR
Step : INT := 1;
StepTimer : Timer;
StepTime : TIME := T#10s;
CurTime : TIME;
END_VAR

CASE Step OF
1:
IF NOT StepTimer.Started THEN
StepTimer.Start();
END_IF;

IF GetTimer(StepTimer) > StepTime THEN
StepTimer.Stop();
Step := 2;
END_IF;
2:
Step := 1;
END_CASE;

Алгоритм читается без комментариев.

Спорягин Кирилл
25.08.2015, 18:39
Отредактирован метод Stop.

Важное замечание. Удобно использовать в языке ST. Для других языков не предназначен.

capzap
25.08.2015, 19:01
:( а чего паузы то нет, обратного отсчета, как из него сделать стандартные таймеры это я еще проект не смотрел

capzap
25.08.2015, 19:30
Для других языков не предназначен.

с чего это, если не умеете не значит что нельзя

Yegor
25.08.2015, 20:06
Эмм... оукей... Я тоже люблю говорящий код. Но я не люблю инородный код. Прелесть стандартных таймеров в том, что они хорошо работают в бесконечном цикле ПЛК. Пример из первого сообщения реализуется на обычном TON вот так:
VAR
ton1: TON := (PT := T#10s);
END_VAR

ton1(IN := NOT ton1.Q);Одна строка. А действия в ФБ тяготеют к десктопной однократности, и из-за них приходится ставить IF'ы. В результате растёт цикломатическая сложность программы. И хоть она становится в какой-то мере более читаемой, но читать-то приходится воду. Так что не очень мне по нраву такой подход.

У меня вот в одном проекте были свои таймеры с перемоткой, паузой и задним ходом на основе стандартных. Делалось подменой функции TIME на свою в таймерах из библиотеки Standard.lib (есть её открытая версия Standard-intern.lib). Презабавнейшая вещь была в плане отладки длительных процессов.

Sergey666
25.08.2015, 20:26
Часто требуется отсчитывать секунды,минуты , причем вести прямой и обратный независимый отсчет в разных местах программы .
Для этого я в начале проекта завожу таймер с самосбросом 1сек и получаю секундные тактовые импульсы длительностью в 1скан и уже где надо используя IF ... складываю, вычитаю , замораживаю , сбрасываю различные переменные таймов . Очень удобно , нет геморроя с форматом TIME , а если надо , то есть соотв ФБ в ОСКАТ.

spectrum48k
25.08.2015, 23:16
я так понимаю, поиск альтернативы стандартным мэковским таймерам появляется при необходимости продолжить отсчет времени при возврате сигнала на "счетном" (IN) входе таймера обратно в true с возможностью сброса отсчитанного времени. Это стандартная задача при реализации подсчета наработки оборудования. Кто реализовывал данные функцию счета наработки с сохранением времени при IN=false при помощи стандартных таймеров?

Sergey666
26.08.2015, 06:31
я так понимаю, поиск альтернативы стандартным мэковским таймерам появляется при необходимости продолжить отсчет времени при возврате сигнала на "счетном" (IN) входе таймера обратно в true с возможностью сброса отсчитанного времени. Это стандартная задача при реализации подсчета наработки оборудования. Кто реализовывал данные функцию счета наработки с сохранением времени при IN=false при помощи стандартных таймеров?

См.пост выше , это же элементарно , Ватсон !

Tmr_TON_1S(In:=(Not Tmr_TON_1S.Q)and Wrk_drv1(*Признак работы механизма*),Pt:=t#1s);
IF Tmr_TON_1S.Q THEN
Wrk_sec_drv1:=Wrk_sec_drv1+1;
if Wrk_sec_drv1>=60 then
Wrk_min_drv1:=Wrk_min_drv1+1;
Wrk_sec_drv1:=0;
END_IF
END_IF

Получаем переменные секунды и минуты , часы и делаем с ними все , что нужно , безо всякого хитроблудства .

spectrum48k
26.08.2015, 10:23
См.пост выше , это же элементарно , Ватсон !

Tmr_TON_1S(In:=(Not Tmr_TON_1S.Q)and Wrk_drv1(*Признак работы механизма*),Pt:=t#1s);
IF Tmr_TON_1S.Q THEN
Wrk_sec_drv1:=Wrk_sec_drv1+1;
if Wrk_sec_drv1>=60 then
Wrk_min_drv1:=Wrk_min_drv1+1;
Wrk_sec_drv1:=0;
END_IF
END_IF

Получаем переменные секунды и минуты , часы и делаем с ними все , что нужно , безо всякого хитроблудства .

спасибо, кэп! ) только вот в момент сброса таймера его ET которую вы бесстыдно игнорируете, может принимать значение от нуля до длины цикла. и чем больше время цикла тем еще выше погрешность... не так ли? очень, очень грубый подсчет. попробуйте еще раз)

Sergey666
26.08.2015, 11:31
спасибо, кэп! ) только вот в момент сброса таймера его ET которую вы бесстыдно игнорируете, может принимать значение от нуля до длины цикла. и чем больше время цикла тем еще выше погрешность... не так ли? очень, очень грубый подсчет. попробуйте еще раз)

Во первых при подсчете чего-то там где-то перемешать , чего-то подержать , тем более сколько там что-то работает погрешностью длины скана-цикла можно пренебречь .
Во вторых длительность цикла для ПЛК100-110 никогда не устанавливаю более 5мс , 5мс тем более можно пренебречь .
В третьих можно вместо таймера использовать функцию+ переменную TIME , то длительность цикла внесет ту-же погрешность .

В четвертых можно и с .ET заморочится , не вижу сложностей вообще , только ... надо-ли . Если в ПЛК с временем вообще что-то не то и 100мс это не 100мс , а где-то 120...150 . Гиви! Сколько граммов в килограмме ? -Сэмсот-Васэмсот , где-то так ...
Так что ... сало оно и в африке сало , чего его пробовать .

spectrum48k
26.08.2015, 12:28
В третьих можно вместо таймера использовать функцию+ переменную TIME , то длительность цикла внесет ту-же погрешность.

разница в том что в одном случае (TIME) погрешность равна максимум циклу, а при использовании метода в примере погрешность накапливается. Я хотел узнать есть ли такие энтузиасты, которые "замораживали" (перезаписывали) ET в таймере TON, например? Как себя ведет таймер при таких манипуляциях?

capzap
26.08.2015, 12:33
разница в том что в одном случае (TIME) погрешность равна максимум циклу, а при использовании метода в примере погрешность накапливается. Я хотел узнать есть ли такие энтузиасты, которые "замораживали" (перезаписывали) ET в таймере TON, например? Как себя ведет таймер при таких манипуляциях?

что за ересь, когда в очередном цикле плк происходит вызов таймера, он выдает текущее значение времени от RTC, дискретный сигнал меняет состояние при превышении уставки в текущем цикле, какое там может быть накапливание? Не нра секунды накапливайте значение в миллисекундах

spectrum48k
26.08.2015, 12:54
правильно. в миллисикундах давайте еще чаще суммировать погрешность. ) capzap, вы конечно здесь ветеран, и я Вас уважаю. но весь этот скепсис выглядит так как будто не хотите вникать. Таймер вызванный с установленным Q уже выполнил отсечку превышения уставки. Ее величина от нуля до времени цикла. поправьте меня, если я не прав. Если за ересь здесь принято сжигать перфекционистов, то пожалста) жгите

petera
26.08.2015, 12:57
что за ересь, когда в очередном цикле плк происходит вызов таймера, он выдает текущее значение времени от RTC, дискретный сигнал меняет состояние при превышении уставки в текущем цикле, какое там может быть накапливание? Не нра секунды накапливайте значение в миллисекундах
Накопление погрешности относится к способу подсчета времени наработки в посте #8, когда используется таймер для генерации секундных импульсов, из которых и подсчитывается суммарное время. На самом деле на выходе таймера будут импульсы не точно 1сек, а в диапазоне от 1сек до 1сек+время цикла. Вот эта погрешность и будет накапливаться в течение дней или месяцев.

ЗЫ.
...Во вторых длительность цикла для ПЛК100-110 никогда не устанавливаю более 5мс , 5мс тем более можно пренебречь .
погрешность при времени цикла 5мс даст погрешность подсчета времени до 18 сек/час или 432 сек/день.

capzap
26.08.2015, 13:00
в 14:50:32.500 поступила команда TRUE на вход IN, с уставкой 5 секунд, время цикла плк ~3мс, отсчитываем приблизительно 1667 циклов, подходим к вызову таймера, он берет время с реальных часов, на них должно быть 14:50:37.501, вычитает время когда таймер запустился, у него получается больше уставки на 1мс, следовательно он меняет состояние Q, о каком накоплении идет речь у Вас?

ЗЫ а кто сказал что при поступлении сигнала на выключение двигателя он сразу останавливается, так что мы еще теряем наработку
в течение дней или месяцев

capzap
26.08.2015, 13:24
Накопление погрешности относится к способу подсчета времени наработки в посте #8

перечитаем строчку из поста№8 and Wrk_drv1(*Признак работы механизма*) команда на выключение дана, лишняя секунда не досчитается, так что мы не накапливаем а уменьшаем время

petera
26.08.2015, 13:49
перечитаем строчку из поста№8 and Wrk_drv1(*Признак работы механизма*) команда на выключение дана, лишняя секунда не досчитается, так что мы не накапливаем а уменьшаем время
Накапливаем от 0 до времени цикла при каждом срабатывании секундного таймера здесь
IF Tmr_TON_1S.Q THEN
Wrk_sec_drv1:=Wrk_sec_drv1+1;

and Wrk_drv1(*Признак работы механизма*)
погрешность при времени цикла 5мс даст погрешность подсчета времени до 18 сек/на один час работы механизма:rolleyes: или 432 сек/день.

spectrum48k
26.08.2015, 13:49
в 14:50:32.500 поступила команда TRUE на вход IN, с уставкой 5 секунд, время цикла плк ~3мс, отсчитываем приблизительно 1667 циклов, подходим к вызову таймера, он берет время с реальных часов, на них должно быть 14:50:37.501, вычитает время когда таймер запустился, у него получается больше уставки на 1мс, следовательно он меняет состояние Q, о каком накоплении идет речь у Вас?

ЗЫ а кто сказал что при поступлении сигнала на выключение двигателя он сразу останавливается, так что мы еще теряем наработку




3600 / 5 * (3ms*~0.5=1.5ms) / 1000 = ~1,08 в час в сторону уменьшения. данный метод имеет право на жизнь с срабатыванием "трещетки" как можно реже (5-10с). что при частых пусках -остановках дает свой "бонус" ).





вот покуроченный METER из оскат:

FUNCTION_BLOCK METERMOD
VAR_INPUT
Count : BOOL;
Reset : BOOL;
END_VAR
VAR_IN_OUT
Hours : REAL;
END_VAR
VAR
Count2 : BOOL;
Scale : REAL := 1;
Scale2 : REAL;
(* Period seconds *)
D : REAL := 3600;
MR : REAL2;
Hours1, Hours2 : REAL; (* current consumption value on Scale and Scale2 *)
HoursAct: DWORD;
last: DWORD;
tc: REAL;
init: BOOL;
END_VAR



(* see OSCAT Library METER *)
HoursAct := T_PLC_MS();
IF NOT init THEN
init := TRUE;
last := HoursAct;
mr.RX := Hours;
mr.R1 := 0.0;
ELSIF HoursAct = last THEN
RETURN;
ELSE
tc := DWORD_TO_REAL(HoursAct - last) * 0.001;
END_IF;
last := HoursAct;

(* reset *)
IF Reset THEN
mr.R1 := 0.0;
mr.RX := 0.0;
Hours := mr.RX;
ELSE
(* current consumption measurement *)
IF Count THEN Hours1 := Scale; ELSE Hours1 := 0.0; END_IF;
IF Count2 THEN Hours2 := Scale2; ELSE Hours2 := 0.0; END_IF;
(* add up the current values in a double real *)
MR := R2_ADD(MR,(SEL(Count,0.0,Hours1) + SEL(Count2, 0.0, Hours2)) / D * TC);
(* set the current output value *)
Hours := mr.RX;
END_IF;



19667

petera
26.08.2015, 14:19
перечитаем строчку из поста№8 and Wrk_drv1(*Признак работы механизма*) команда на выключение дана, лишняя секунда не досчитается, так что мы не накапливаем а уменьшаем время


Накапливаем от 0 до времени цикла при каждом срабатывании секундного таймера здесь
IF Tmr_TON_1S.Q THEN
Wrk_sec_drv1:=Wrk_sec_drv1+1;

and Wrk_drv1(*Признак работы механизма*)
погрешность при времени цикла 5мс даст погрешность подсчета времени до 18 сек/на один час работы механизма:rolleyes: или 432 сек/день.
Немного изменим программу из поста #8

tim:=TIME();
(*Подсчет с использованием секундного таймера*)
Tmr_TON_1S(In:=(NOT Tmr_TON_1S.Q)AND Wrk_drv1 (*Признак работы механизма*),Pt:=t#1s);
IF Tmr_TON_1S.Q THEN
Wrk_sec_drv1:=Wrk_sec_drv1+1;
IF Wrk_sec_drv1>=60 THEN
Wrk_min_drv1:=Wrk_min_drv1+1;
Wrk_sec_drv1:=0;
END_IF
END_IF
(*Подсчет действительного времени наработки*)
IF NOT Wrk_drv1 THEN
t_Start:=tim;
ELSE
Wrk_tim:=tim-t_Start;
END_IF
В первой части подсчитываем секундные импульсы
Во второй измеряем интервал времени с помощью TIME()
В эмуляторе быстро видно нарастание погрешности, т.к. время цикла десятки мс.

https://www.youtube.com/watch?v=y4_eZVG38Pg
Хорошо видно, что старт таймера(.StartTime) происходит не ровно через 1с, а с добавленной погрешностью
Ну и итог тоже видно погрешность больше 3 сек при времени работы механизма ~30 сек.

Sergey666
26.08.2015, 15:01
Вот , зануды !
Да кому нах-н нужны эти секунды , для времени наработки эл-двигателя ?
Да ! Согласен так , как предлагал не точно , но я бы посмотрел что вы будете делать если в ПЛК нет "TIME" и если и есть FLOAT , то нету FLOAT_TO_DWORD(WORD) !
А еще можно взять эталон милисекундный и ПЛК100-110 завести TIME() и посмотреть что с погрешностью .
А еще музыку в формате MP3 можно брезгливо скидывать в бачок , типа -"фи... она не повторяет все гармоники оригинала" .
А зачем люди ставят время цикла в ПЛК более 10мс ???

spectrum48k
26.08.2015, 15:13
всего лишь подбиваю уйти от трещетки и работать с накоплением времени а не импульсов )

Sergey666
26.08.2015, 15:21
всего лишь подбиваю уйти от трещетки и работать с накоплением времени а не импульсов )

А надо????
Мы живем в окружении "трещотки" .
Второе вам надо передать секунды наработанные в панель (выложить в слэйв) в формате 2байт (Ворд , Инт) ,с точностью 1 сотка. Ну тка преобразуйте T#1s105MS , ничего не потеряете ?

spectrum48k
26.08.2015, 15:26
А надо????
Мы живем в окружении "трещотки" .
Второе вам надо передать секунды наработанные в панель (выложить в слэйв) в формате 2байт (Ворд , Инт) ,с точностью 1 сотка. Ну тка преобразуйте T#1s105MS , ничего не потеряете ?
не путаем. речь идет не об обострении перфекционизма и борьбой с каждой потерянной милисекундой, а именно с большой накопленной погрешностью. для кого некритично, вообще заморачиваться не стоит. хотелось бы прийти к истинно правильному методу с точки зрения математики и плк-шного квантования времени, так сказать к примеру №1 добавить пример №2 для ценителей)) (желательно простой и без посторонних бибок , как у меня)

Sergey666
26.08.2015, 15:33
не путаем. речь идет не об обострении перфекционизма и борьбой с каждой потерянной милисекундой, а именно с большой накопленной погрешностью. для кого некритично, вообще заморачиваться не стоит. хотелось бы прийти к истинно правильному методу с точки зрения математики и плк-шного квантования времени, так сказать к примеру №1 добавить пример №2 для ценителей)) (желательно простой и без посторонних бибок , как у меня)
Так вот товарищ Петера выше все сделал !
А можно еще изящнее - задействовать TASK_Manager и отдаться ему (Du hast mich:p) вызывая 1 раз в секунду программу Tik_1s с одной строчкой Tik:=true;


С точки зрения математической правильности конечно надо с TIME() работать .
Америкосы тоже калаш сначала модернизировать пытались , зазоры все убрали , подогнали все четко-идеально ... , а он не заработал ...

spectrum48k
26.08.2015, 20:15
вариации на тему)



FUNCTION_BLOCK TIMER
VAR_INPUT
iCntUp : BOOL;
iCntDn : BOOL;
iCntRes : BOOL;
iCntSP : TIME;
END_VAR
VAR_OUTPUT
OutTime : TIME;
OutAlm : BOOL;
END_VAR
VAR
TimeAct : TIME;
TimeOld : TIME;
TimeDelta : TIME;
DoCalc : UINT;
Init: BOOL;
CntUpOld :BOOL;
CntDnOld : BOOL;
END_VAR



IF iCntRes THEN Init := FALSE; END_IF


(*INIT*)
IF NOT Init THEN
Init := TRUE;
iCntUp := iCntDn := CntUpOld := CntDnOld := OutAlm := FALSE;
TimeAct := TimeOld := TimeDelta := OutTime := t#0ms;
DoCalc := 0;
RETURN;
END_IF


(*DOCALC*)
DoCalc := DoCalc +1;

IF (DoCalc MOD 10=0) OR (iCntUp <> CntUpOld) OR (iCntDn <> CntDnOld) THEN


TimeAct :=TIME();

IF TimeOld > t#0ms THEN
TimeDelta := TimeAct - TimeOld;

(*COUNT_UP*)
IF iCntUp OR (CntUpOld > iCntUp) THEN
IF iCntSP > OutTime THEN OutTime := OutTime + TimeDelta;
IF OutTime > iCntSP THEN OutTime := iCntSP; END_IF
END_IF;
END_IF

(*COUNT_DOWN*)
IF iCntDn OR (CntDnOld > iCntDn) THEN
IF OutTime > TimeDelta THEN OutTime := OutTime - TimeDelta;
ELSE OutTime := t#0ms;
END_IF;
END_IF

OutAlm := iCntSP > t#0ms AND OutTime = iCntSP;

END_IF

TimeOld := TimeAct;

END_IF

CntUpOld := iCntUp;
CntDnOld := iCntDn;

Sergey666
26.08.2015, 20:37
Круть!
Как там у Филоненко , -"Любую проблему можно решить увеличением числа параметров , кроме проблемы чрезмерного числа параметров".
Сброс Вар_Инпут тоже ... странный маневр.

spectrum48k
26.08.2015, 21:53
Круть!
Как там у Филоненко , -"Любую проблему можно решить увеличением числа параметров , кроме проблемы чрезмерного числа параметров".
Сброс Вар_Инпут тоже ... странный маневр.

я эту поговорку, кстати вспоминал)) вчера попадалась несколько раз на глаза при навигации по форуму) Ничего Вар_Инпут мне это простят

melky
27.08.2015, 12:30
(*Подсчет действительного времени наработки*)
IF NOT Wrk_drv1 THEN
t_Start:=tim;
ELSE
Wrk_tim:=tim-t_Start;
END_IF

petera какое поведение будет при переходе через ноль ? при смене суток.

petera
27.08.2015, 13:40
(*Подсчет действительного времени наработки*)
IF NOT Wrk_drv1 THEN
t_Start:=tim;
ELSE
Wrk_tim:=tim-t_Start;
END_IF

petera какое поведение будет при переходе через ноль ? при смене суток.
Функция TIME() возвращает время работы ПЛК в мс от момента его включения, и к времени суток (RTC) отношения не имеет.
По этому переполнение произойдет не при смене суток, а через 49d17h2m47s295ms (4294967295 ms) от момента включения ПЛК.

ЗЫ. Уточню. Переполнение TIME() произойдет не при смене суток, а через 49d17h2m47s295ms (4294967295 ms) от момента включения ПЛК.
Поэтому максимальное значение Wrk_tim при таком варианте подсчета равно 49d17h2m47s295ms.

spectrum48k
27.08.2015, 14:27
при большом желании при превышении интервала более суток можно плюсовать счетчик суток, а из дворда интервала времени вычитать t#1d

petera
27.08.2015, 14:33
при большом желании при превышении интервала более суток можно плюсовать счетчик суток, а из дворда интервала времени вычитать t#1d
Причем здесь сутки, месяцы нужно рассматривать

Переполнение TIME() произойдет не при смене суток, а через 49d17h2m47s295ms

spectrum48k
27.08.2015, 14:44
да хоть недели. почему акцент на "нужно" ? я привел пример сохранения расширения интервала наработки) а сутки, недели или месяцы - хоть все сразу в отдельных переменных... в соответствии с требованиями.

capzap
27.08.2015, 15:18
Причем здесь сутки, месяцы нужно рассматривать

есть еще фишечка накопленный результат хранить в реале, это увеличит продолжительность подсчета

spectrum48k
27.08.2015, 15:56
есть еще фишечка накопленный результат хранить в реале, это увеличит продолжительность подсчета

а на фишечку в #18 и не глянули)

Валенок
27.08.2015, 16:58
а на фишечку в #18 и не глянули)
А покурочил-ли то навставляв real'ов ? В смысле в исходном усе было на целых числах ?
Чего накурочили сами то поняли ?

Спорягин Кирилл
27.08.2015, 18:53
В теме уже 35 сообщений, хотя просмотров моего примера только 2. Забавно.
Сделал на основании своего таймера небольшой блок статистики.
ФБ TimeStatistic позволяет измерять последнее, среднее, минимальное и максимальное время между двумя точками программы.
Для того чтобы это сделать в первой точке нужно вызвать:
TimeStatistic.FirstPoint();
во второй вызвать
TimeStatistic.SecondPoint();
В прикрепленном примере измеряется время скана при этом следует обратить внимание, что сначала вызвается SecondPoint, а затем FirstPoint.

Преимущества данного блока перед блоком статистики, который встроен в конфигуратор ПЛК ОВЕН, в том что он измеряет не только время последнего скана, но также минимально, максимальное и среднее. К тому же в многозадачной системе можно измерять времена скана для каждой задачи.

Спорягин Кирилл
27.08.2015, 18:55
А действия в ФБ тяготеют к десктопной однократности, и из-за них приходится ставить IF'ы. В результате растёт цикломатическая сложность программы. И хоть она становится в какой-то мере более читаемой, но читать-то приходится воду. Так что не очень мне по нраву такой подход.

Егор, а что такое "десктопная однократность"?

petera
27.08.2015, 19:52
В теме уже 35 сообщений, хотя просмотров моего примера только 2. Забавно.
Сделал на основании своего таймера небольшой блок статистики.
ФБ TimeStatistic позволяет измерять последнее, среднее, минимальное и максимальное время между двумя точками программы.
Для того чтобы это сделать в первой точке нужно вызвать:
TimeStatistic.FirstPoint();
во второй вызвать
TimeStatistic.SecondPoint();
В прикрепленном примере измеряется время скана при этом следует обратить внимание, что сначала вызвается SecondPoint, а затем FirstPoint.

Преимущества данного блока перед блоком статистики, который встроен в конфигуратор ПЛК ОВЕН, в том что он измеряет не только время последнего скана, но также минимально, максимальное и среднее. К тому же в многозадачной системе можно измерять времена скана для каждой задачи.
Измерить время цикла можно и без навороченных таймеров

(*Время цикла*)
t1:=TIME();
tCycle:= t1 - tmp; (*Время цикла*)
tmp:= t1;
(*КОНЕЦ ВЫЧИСЛЕНИЯ ВРЕМЕНИ ЦИКЛА*)
(*
Здесь строки
прогграммы
*)
tProg:=TIME()-t1; (*Время выполнения программы*)Последняя строка вычисляет время выполнения программы.
Для вычисления ср, мин, макс. значения можно просто использовать ФБ "STATISTICS_INT" на вход ему подать "Cycle time in 100 mks" из модуля статистики.
И не будет "Преимущества данного блока перед блоком статистики, который встроен в конфигуратор ПЛК ОВЕН, в том что он измеряет не только время последнего скана, но также минимально, максимальное и среднее".

spectrum48k
27.08.2015, 22:14
А покурочил-ли то навставляв real'ов ? В смысле в исходном усе было на целых числах ?
Чего накурочили сами то поняли ?

Рилы и были. переделал интегратор электроэнергии/объема/или_чего_еще под счет ровно 1й единицы в час) если бы не поняли, то это бы не работало, а так - работает. Считает себе наработку насосов.

Yegor
28.08.2015, 09:34
Егор, а что такое "десктопная однократность"?https://ru.wikipedia.org/wiki/Событийно-ориентированное_программирование

Действия в 61131-3 не параметризуются (имеют пустую сигнатуру), а потому находясь в бесконечном цикле не могут напрямую включаться в выражения реакции и, следовательно, вызываться в безусловном режиме (вызывать можно, но в этом не будет практического смысла). Отсюда однократность — вам приходится выбирать момент, чтобы совершить действие один раз, и потом вновь ждать события. Можно, конечно, вызывать действие в течение длительного времени по какому-то условию, но само слово «действие» намекает, что в этом случае вы используете фичу не по назначению. Я считаю, что действия должны быть результатом обработки прерывания. А искусственные прерывания самому себе создавать лишний раз не стоит.

Спорягин Кирилл
28.08.2015, 11:17
Измерить время цикла можно и без навороченных таймеров

(*Время цикла*)
t1:=TIME();
tCycle:= t1 - tmp; (*Время цикла*)
tmp:= t1;
(*КОНЕЦ ВЫЧИСЛЕНИЯ ВРЕМЕНИ ЦИКЛА*)
(*
Здесь строки
прогграммы
*)
tProg:=TIME()-t1; (*Время выполнения программы*)Последняя строка вычисляет время выполнения программы.
Для вычисления ср, мин, макс. значения можно просто использовать ФБ "STATISTICS_INT" на вход ему подать "Cycle time in 100 mks" из модуля статистики.
И не будет "Преимущества данного блока перед блоком статистики, который встроен в конфигуратор ПЛК ОВЕН, в том что он измеряет не только время последнего скана, но также минимально, максимальное и среднее".

Petera, разумеется можно реализовать функции ФБ Timer и TimeStatistic, так как Вы предлагаете.
Я всего лишь оформил подобную логику в ФБ, который можно использовать.
Потому что если Вам нужно это сделать один раз, то подойдет и так как предлагаете Вы. Если же у Вас задача во многих местах набрать статистику, то Ваш способ становится уже неудобным.
Так, например, свой блок статистики я хочу использовать при написании опроса модулей через библиотеку Modbus.lib.
Каждый раз писать предложенный Вами код или просто вставитить 2 вызова TimeStatistic. Мне кажется, мой вариант проще.

Плюс еще. Для меня не ясно что будет показывать стандартный блок статистики в случае многозадачности. В случае использования блока TimeStatistic - все ясно.

Спорягин Кирилл
28.08.2015, 11:17
https://ru.wikipedia.org/wiki/Событийно-ориентированное_программирование

Действия в 61131-3 не параметризуются (имеют пустую сигнатуру), а потому находясь в бесконечном цикле не могут напрямую включаться в выражения реакции и, следовательно, вызываться в безусловном режиме (вызывать можно, но в этом не будет практического смысла). Отсюда однократность — вам приходится выбирать момент, чтобы совершить действие один раз, и потом вновь ждать события. Можно, конечно, вызывать действие в течение длительного времени по какому-то условию, но само слово «действие» намекает, что в этом случае вы используете фичу не по назначению. Я считаю, что действия должны быть результатом обработки прерывания. А искусственные прерывания самому себе создавать лишний раз не стоит.

Егор, спасибо. Доходчиво.