Помощь в написании скрипта

Avatar
  • обновлен
Здравствуйте!
Задача:
вывод значения показания счетчика электроэнергии (кВт) за определенный промежуток времени (за сутки, например)

Теоретически я представляю это так , в определенное время (к примеру,в 00:00:01) запомнить значение тега "Показания счетчика" по истечении суток вычесть ранее запомненное значение из значения реального и результат записать

не могу разобраться со скриптом , работа со временем, делаю в Pascal

Буду очень рад помощи или наставлении на путь, спасибо1
Avatar
greymen123

Написал немного ерундятину..., как будто расход считаю...

{Pascal Script}
Var
cycles_now, cycles_now_temp: Double;
cycles_last, total_cycles: Double;
total_day_cycles, cycles_last_day: Double;
total_night_cycles, cycles_last_night: Double;
firstTime: Time;
currentTime: Time;

day: Boolean;
night: Boolean;

// Выполняется один раз при первом выполнении скрипта
procedure OnStartScript;
begin
// Ваш код

// ПОДУМАТЬ
// При запуске скады. Определяет день-ночь и правильно ли был выполнен переход.
// Нужно ли выполнить сброс накопленного за день-ночь.
if (Time > EncodeTime(6,0,0,0)) and (Time <= EncodeTime(18,0,0,0)) then
begin
if GetGlobalVar('ПроверкаДеньНочьЦиклы') = 1 then
begin
night := True;
WriteValue('СтатусДеньНочьKN', True);
end
else
begin
night := False;
WriteValue('СтатусДеньНочьKN', False);
end;
end
else
begin
if GetGlobalVar('ПроверкаДеньНочьЦиклы') = 0 then
begin
night := False;
WriteValue('СтатусДеньНочьKN', False);
end
else
begin
night := True;
WriteValue('СтатусДеньНочьKN', True);
end;
end

end;

// Выполняется при завершении работы монитора
procedure OnStopScript;
begin
// Ваш код
end;

Begin

total_cycles := GetGlobalVar('РассчётСуммаЦиклов');
total_day_cycles := GetGlobalVar('СуммаДеньЦиклов');
total_night_cycles := GetGlobalVar('СуммаНочьЦиклов');

// Сброс сетчиков
IF ReadValue('СбросСчётчикЦиклов') THEN
begin
total_cycles := 0;
total_day_cycles := 0;
total_night_cycles := 0;
end;

// Циклов в час
cycles_now_temp := ReadValue('KEKURA.3016.KN1.KN1_Cycles');

// Для теста
//currentTime := EncodeTime(ReadValue('ВремяУстановка'),0,0,0);


// Приводим к циклам в секунду...
cycles_now := cycles_now_temp / 3600; - тут врятли нужно в секунду...  

// Счетчик итоговый
total_cycles := total_cycles + (cycles_now_temp - cycles_last);
cycles_last := cycles_now; - Вот тут надо из общего кол-ва циклов, вычесть заранее записанное значение циклов на начало смены...?


if (Time > EncodeTime(6,0,0,0)) and (Time <= EncodeTime(18,0,0,0)) then
begin

if NOT(night) then
begin
WriteValue('АрхивДеньНочьKN', total_night_cycles);
SaveValueToDB('АрхивДеньНочьKN');
total_day_cycles := 0;
night := True;
SetGlobalVar('ПроверкаДеньНочьЦиклы', 1, TRUE);
end;
// Счетчик день
total_day_cycles := total_day_cycles + (cycles_last_day - cycles_now);
cycles_last_day := cycles_now;
WriteValue('СтатусДеньНочьKN', True);

end
else
begin

if night then
begin
WriteValue('АрхивДеньНочьKN', total_day_cycles);
SaveValueToDB('АрхивДеньНочьKN');
total_night_cycles := 0;
night := False;
SetGlobalVar('ПроверкаДеньНочьЦиклы', 0, TRUE);
end;
// Счетчик ночь
total_night_cycles := total_night_cycles + (cycles_last_night - cycles_now);
cycles_last_night := cycles_now;
WriteValue('СтатусДеньНочьKN', False);

end;



SetGlobalVar('РассчётСуммаЦиклов', total_cycles, TRUE);
SetGlobalVar('СуммаДеньЦиклов', total_day_cycles, TRUE);
SetGlobalVar('СуммаНочьЦиклов', total_night_cycles, TRUE);


WriteValue('РассчётСуммаЦиклов', total_cycles);
WriteValue('СуммаДеньЦиклов', total_day_cycles);
WriteValue('СуммаНочьЦиклов', total_night_cycles);



end.

Avatar
greymen123

Доброго времени суток!) У меня схожая ситуация с изначальным вопросом. Мне необходимо вывести количество циклов за смену (с 6:00 до 18:00). Общий счётчик циклов выведен на скаду с контроллера. Заранее благодарю за ответ.

Avatar
Ростислав
Форма исторических графиков логически связанных параметров будут отличаться если нет синхронности. Один график к примеру формируется по опросу в 1 секунду (непосредственно от первоисточника), а второй через перерасчёт (скрипт) в 60 секунд. Получается, что в 60 раз теряется достоверность канала.

Всё конечно зависит от технологии процесса.
Avatar
arser62
{
Double In1=ReadValue("pam");
Double In2=ReadValue("упаковка количество 1 линия");
Double Out1=In2-In1;
Double Out2= 60*Out1;
WriteValue("pam",In2);

WriteValue("упаковка скорость 1 линия",Out2);
}
Avatar
arser62
Рад что откликнулись в теме.Вообще думаю нужна отдельная тема с примерами скриптов– кто за !!( многим облегчит жизнь )
Скрипт уже написали давно и работает -только скорость т.е график который пишется с СИ8 и через скрипт немного разный-на фото видно.







11.jpg
22.jpg
33.jpg
Avatar
Ростислав
Доброго дня!

Если тема ещё актуальна, давайте её решим.
Отправьте схему функциональную. Нужно точно понимать объект. Отправьте полное наименование счётчиков. На схеме функциональной укажите как вы планируете произвести модернизацию. Какое количество полевых устройств опрашивает ОРС? Какая скорость шины и какой протокол?

Напишите с какой частотой вам нужно отображать и архивировать данные в SCADA системе.

Лично моё мнение. Оборудование лучше применять по назначению. Если у вас уже есть счётчики, то зачем производить расчёт через скрипт? Достаточно опрашивать счётчики через ОРС. Даже в случае отказа оборудования верхнего уровня у вас всегда будет возможность снять данные непосредственно с счётчиков. Резерв должен быть всегда.
Avatar
arser62


Начинаю раскладывать по полочкам :
1-На фото тот который справа считает продукцию ( даже кнопочку сброс сбоку приделали )
2-Слева настроен на режим расходомера ( показывает среднюю скорость в час ) и обновляет показания раз в минуту.
3-Реально ли это воплотить - т.е.расходомер в скрипте ?
4-Тот счётчик про который я писал СИ30 - чисто для проверки работы скрипта ( если скрипт работает правильно я должен был увидеть определенную скорость согласно выдаваемым импульсам с обновлением в 1 минуту). Не на рабочей же линии мерять и экспериментировать где скорость не всегда 2940 -бывает больше -бывает меньше.
777.jpg
Avatar
demitsury
Давно собрал имитатор линии .Подключил к счётчику вместо датчика мигающий светодиод ( 120 миганий в минуту ) только поставил СИ30 вместо работающих у нас СИ8 -для эксперимента без разницы. 120 в минуту умножаем на 60 минут -должна получиться скорость 7200 в час.На наших графиках видно что счётчик сосчитал кол-во в минуту умножил на 60 минут и затих с этими показаниями на минуту а скада пишет.скорость около 3000.(у нас примерно продукция 50

в минуту )Вот как это реализовать в скрипте? Писал на очень умный сайт программистов -так и не помогли .Если уж не получиться здесь -предлагают за отдельную плату …блин и здесь одни коммерсанты…

с Вами мы долго пытались решить задачу, высылали несколько вариантов, но они Вас не устроили, возможно мы не понимаем ВАшу задачу, возможно Вы не можете донести до нас что нужно.

ВАриантов развития не много:
1. Вы еще раз по полочкам раскладываете что нужно, чем конкретней тем лучше.
2. Размещаете этот вопрос у нас на форуме отдельной темой и на форуме ОВЕН (http://www.owen.ru/forum/showthread.php?t=421&page=18)

Мы как освободимся от выпуска версии, еще раз посомтрим как можно помочь, и возможно на овеновском форуме раньше дадут ответ.
Avatar
demitsury
Здравствуйте!
Задача:
вывод значения показания счетчика электроэнергии (кВт) за определенный промежуток времени (за сутки, например)

Теоретически я представляю это так , в определенное время (к примеру,в 00:00:01) запомнить значение тега "Показания счетчика" по истечении суток вычесть ранее запомненное значение из значения реального и результат записать

не могу разобраться со скриптом , работа со временем, делаю в Pascal

Буду очень рад помощи или наставлении на путь, спасибо1

решение отправлено Вам на почту
Avatar
arser62
Давно собрал имитатор линии .Подключил к счётчику вместо датчика мигающий светодиод ( 120 миганий в минуту ) только поставил СИ30 вместо работающих у нас СИ8 -для эксперимента без разницы. 120 в минуту умножаем на 60 минут -должна получиться скорость 7200 в час.На наших графиках видно что счётчик сосчитал кол-во в минуту умножил на 60 минут и затих с этими показаниями на минуту а скада пишет.скорость около 3000.(у нас примерно продукция 50

в минуту )Вот как это реализовать в скрипте? Писал на очень умный сайт программистов -так и не помогли .Если уж не получиться здесь -предлагают за отдельную плату …блин и здесь одни коммерсанты…
3000.png