Просмотр полной версии : Программы - сброс счетчика в МВ110 по времени
Задача - сбрасывать счетчик в МВ110 два раза в сутки. Написал пробную программу со сбросом в фиксированное время. Компилируется, но не работает. Буду рад совету.
// Внимание!!! Не изменяйте сигнатуру функции!!!
var
hh_sys, min_sys, ss_sys, ms_sys : word;
work: boolean;
procedure Init; cdecl; export;
begin
// Функция инициализации глобальных переменных пользователем
end;
// Внимание!!! Не изменяйте сигнатуру функции!!!
procedure UserFunction; cdecl; export;
begin
DecodeTime(Time, hh_sys, min_sys, ss_sys, ms_sys);
work := ((hh_sys = 13) and (min_sys=01) and (ss_sys =0) and (ms_sys =0));
if (work) then
begin
dp400cd:=0;
dp400cp:=0;
end;
end;
№ Имя Формат Тип Прибор Параметр Описание
1 dp400cd UINT Выход DoyPack-450KL 400g MB110 DoyPack 400g счетчик доз | r.Cou.6
2 dp400cp UINT Выход DoyPack-450KL 400g MB110 DoyPack 400g счетчик пакетов | r.Cou.8
ну не знаю... сравнивать секунды и миллисекунды на равно? (зы, не знаю, почему один знак равенства при сравнении?, не силен в ST)
Ну и если получаем данные времени из ПЛК, то в эмуляции наверное и работать не будет.
Мне кажется, что при неустойчивой связи через интернет и периодом опроса от 10 секунд и выше - решение сбрасывать счётчик из облака - ошибочно.
Нужно сбрасывать контроллером по месту, а из облака лишь следить за уставкой времени сброса и за соответствием системного времени контроллера и местным временем с учётом пояса, может быть выполнять подстройку (с осознанием характера соединения с облаком и соответствующей точностью установки до 1 минуты).
Не доводилось пользоваться, только знаю о существовании малогабаритных модулей серверов точного времени NTP на динрейку или на стенку шкафа, которые как-то позволяют настроить системное время достаточно точно. Ценники у них довольно разные - от 10 тыс.руб. до бесконечности.
ПЛК должен поддерживать клиента NTP.
Хотя, можно и из облака. Но сравнивать время немного не так.
Введём переменные
dwTime:dword - текущее время одним числом
bResetToday:boolean - сегодня сброс уже был
dwTime := hh_sys * 3600 + min_sys * 60 + ss_sys;
if not bResetToday and (dwTime >= 13 * 3600 + 01 * 60 + 00) then
begin
//сформировать сигнал сброса
...
//проверить, что сброс выполнился
bResetToday := тест выполнения сброса
end
else
bResetToday := (dwTime < 13 * 3600 + 01 * 60 + 00); // сбросить состояние произошедшего сброса после смены даты
end;
Может быть я немного ошибся в коде, но смысл должен быть понятен.
И ещё мне лень искать справку, может быть вычислять dwTime и не нужно - сразу работать с Time. Не помню, что в Time за время - в мс или с, учитывает часовой пояс или нет - это уже детали.
Для информации. Даже в изначальном представленном мной виде, программа сработала, но с задержкой в 3,5 часа. Вот такие особенности OwenCloud. Буду пробовать вариант предложенный FPavel
№ Дата и время Имя переменной Параметр Прибор Записываемое значение Статус команды
1 2026-08-26 16:30:02 dp400cp DoyPack 400g счетчик пакетов | r.Cou.8 DoyPack-450KL 400g MB110 0 Успешно
2 2026-08-26 16:30:00 dp400cd DoyPack 400g счетчик доз | r.Cou.6 DoyPack-450KL 400g MB110 0 Успешно
хм, вот спустя 3 часа было бы понятнее, чисто возможно из-за разницы времени между UTC и Москвой. А вот 3,5 часа как-то странно - возможно связи с объектом не было это время?
Для информации. Даже в изначальном представленном мной виде, программа сработала, но с задержкой в 3,5 часа. Вот такие особенности OwenCloud
Возможно, 3.5 часа как-то связаны со сдвигом времени в часовых поясах.
Почитайте, что там за время получается из программы - может "по Гринвичу". Тогда нужно будет вычесть или добавлять поправку на часовой пояс.
Помню, что время обновления переменной точно отсчитывается от GMT+0:00, а не по Московскому или другому часовому поясу. Поэтому вводил коррекцию на свой часовой пояс. Все сведения брал из руководства на OwenCloud, поэтому всё что касалось времени заработало сразу.
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot