Так покажите, получавшийся читабельный код
Вид для печати
Признаю, был не прав :rolleyes:
А если из OSCATовского кода удалить вход для сброса и удалить начальную инициализацию, то останется всего
Код:FUNCTION_BLOCK ONTIME
VAR_INPUT
IN : BOOL;
END_VAR
VAR_IN_OUT
SECONDS : UDINT;
CYCLES : UDINT;
END_VAR
VAR
tx: DWORD;
last : DWORD;
edge : BOOL;
ms: DWORD;
END_VAR
tx := TIME_TO_DWORD(TIME()); (* read system time *)
IF IN THEN
ms := (tx - last) + ms; (* add the current milliseconds *)
IF ms >= 1000 THEN
seconds := seconds + 1;
ms := ms - 1000;
END_IF
cycles := cycles + BOOL_TO_UINT(NOT edge);
END_IF
last := tx;
edge := in;
Что там разворачивать? Ну, плюс одна переменная, да.Цитата:
Так разверните в этом варианте еще код двух используемых ФБ R_TRIG
В OSCAT'овском варианте есть функция сброса и нет ошибки накопления. Теоретически, мой код в худшем случае показывает наработку в 1000 раз больше/меньше действительной — это когда устройство включается/выключается на 501 миллисекунде и выключается/включается на 502-й ежесекундно. То есть им можно пользоваться только если вас устраивает ошибка ±1 с на каждом цикле включения.Код:VAR in, _in, ticktock, _ticktock: BOOL;
END_VAR
VAR RETAIN
uptime, start_count: DWORD;
END_VAR
ticktock := TIME_TO_DWORD(TIME()) MOD 1000 > 500;
uptime := uptime + BOOL_TO_DWORD(in AND ticktock > _ticktock);
start_count := start_count + BOOL_TO_DWORD(in > _in);
_ticktock := ticktock;
_in := in;
Tek_schet (*Сигнал пуска*)
импульсы на вход поступают.
Подаю на Tek_schet (*Сигнал пуска*) "1" и ничего.
после компиляции и запуска эмуляции "старт" нажимаете?
код скиньте, я проверю и исправлю, если ошибка где.
Пример из рабочей программы выдернут.
Много лет работает.