This is topic Есть ли стандартный ЭУ для решения проблемы in forum TRACE MODE 6 бесплатная Базовая версия / TRACE MODE 6 free Base version at Форум TRACE MODE: техническая поддержка.
Есть емкость с нефтью и расходомер на выходе. Нужно вести архив с записью значений расходомера каждую секунду. Нужны данные всех расходов по 5 последним дням (нужна табличка, в столбцах которой даты за 5 последних дней, а в строке "Расход нефти за день" будут отображаться общий расход нефти за день). То есть нужно делать что-то типа выборки всех показаний из архива за определенный день, суммировать их и выдать результат в таблицу. Вопрос: есть ли стандартные средства для этого (может какой-нибудь ActiveX)? Если нет такого компонента, то подскажите каким архивом лучше воспользоваться и как сделать из него выборку всех показателей за определенный день и суммировать их. Также не очень понятно как можно вывести не текущую дату, а скажем вчерашнюю. Есть "Календарь", но он может отображать только текущую дату. Можно его привязать например к каналу типа "Time", но как тогда записать в него вчерашнюю дату? Была идея написать маленькую FBD-программку, в которой использовать блок DATE из раздела генераторов, но он подает на выход отдельно число, номер месяца и год. Как из этого потому получить дату "на день раньше" также не понятно.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
1) Для этого есть штатные механизмы архивации данных в СПАД, выборка статистики из архива, отображение данных на экранах операторской станции или документирование в отчеты. Смотрите электронную документацию по вышеуказанным функциям, а также описание функциональности продуктов ТМ6 у нас на сайте.
2) В канале этого класса время и дату можно задавать напрямую через специальные его атрибуты: Год, Месяц, День, Час, Минуты, Секунды.
Posted by DreamWeaver (Участник № / Member № 1485) on :
С первым пунктом вроде разобрался, спасибо. Со вторым еше маленький вопрос: В FBD программе создал один единственный блок - DATE, соответственно у программы будет три выхода: число, месяц, год. Я привязал эти параметры к соответствующим атрибудам канала TIME. И получил дату, например 25.07.2005, но как получить дату, например 24.07.2005? Поддерживается ли в языке Техно ST арифметическая операция - для объекта DATE? То есть, если например из текущей даты вычесть 1, то получу ли я вчерашнюю дату, или это делается как-то по-другому?
Posted by DreamWeaver (Участник № / Member № 1485) on :
А можете прояснить один момент по первому пункту. Я прочитал в документации: "Канал, чьи архивные значения должны быть обработаны, задается с помощью его привязки к нулевому аргументу канала CALL или собственно к каналу CALL.". Канал, архивные данные которого нужно обработать называется "Расход нефти". Он уже привязан к источнику данных, для получения данных от расходомера. И как теперь его привязать к каналу типа CALL (ведь он уже привязан к источнику)?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
1) Над типом данных Date можно производить арифметические операции как и над другими типами данных, только нужно правильно задавать константы в формате МЭК - смотрите описание числовых констант в разделе "Программирование алгоритмов"-"Описание языка Техно ST"-"Переменные и константы"-"Числовые константы Техно ST".
2) Не путайте привязку канала к источнику данных и привязку его к Аргументу! Смотрите описание канала CALL в справочной системе - там есть примеры использования этого класса каналов с его аргументами.
Posted by DreamWeaver (Участник № / Member № 1485) on :
2) Вроде получилось. Я только не использовал дополнительные каналы для связи с аргументами канала типа CALL. Привязку динамического текста производил к соответсвующему аргументу канала типа CALL (ARG_005). Но тут возникла проблема с обновлением информации (эта же проблема остается при связывании аргумента канала типа CALL (ARG_005) с другим каналом). Для канала класса CALL я задал тип INPUT, тип вызова LocalStatistic, глубина выборки - текуший день. Первый аргумент (IN) этого канала класса CALL связан с реальным значением канала, который принимает данные от расходомера. Насколько я понял при каждом пересчете базы каналов должно формироваться обновленное значение для аргумента канала типа CALL (ARG_005). Этот аргумент содержит сумму всех значений. Но постоянного обновления не происходит. Динамическое текстовое поле, отображаюшее значение ARG_005 канала класса CALL, обновляется только если в профайлере войти в режим "Просмотр компонентов" и послать каналу типа CALL какое-нибудь значение. Но автоматически обновление не происходит. В чем может быть причина? И еще есть маленький вопрос по дискретизации данных, записанный в архив СПАД. В ARG_005 содержится сумма всех значений (показаний расходомера), записанных в архив за сутки. Расходомер показывает текущий расход в "метрах кубических в час". Данные в архив записываются при изменении параметра. Но мне нужно, чтобы суммирование велось с учетом времени. То есть, если в архив было записано, что в 22:22:22 расходомер показывал 5 метров кубических, затем в 22:22:32 - 4 метра кубических, то в общую сумма должно записать значение (5/3600) * 10 секунд. Как это можно реализовать? Может помогут аргументы с 34 по 65, но в документации как-то плохо описано что в них заносится.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
1) Сам канал Call у Вас Input или Output? 2) Из статистики как сумму значений расхода Вам лучше использовать Arg_009 – интеграл.
Posted by DreamWeaver (Участник № / Member № 1485) on :
Пробовал и Input, и Output. Но особой разницы не заметил. Какой из них лучше использовать в моем случае? ARG_009 немного не подходит, так как на промежуток времени умножается не абсолютное значение параметра, а его прирост по сравнению с предыдущим состоянием. Например, в 12:00 расход нефти был 5 кубометров в час, в 13:00 расход составил 10 кубометров в час. То есть за 2 часа расход 15 кубометров. Если посчитать по этой формуле, то получается (после небольшого масштабирования), чтоза первый час посчитается правильное значение (5-0), но вот за второй час выдастся значение (10-5=5). Итого в сумме получится 10 кубометров, а это неправильно. Так как же быть? Наверное, ARG_009 можно использовать, но нужен еще какой-нибудь аргумент. В конечном итоге формула должна быть такой же как для ARG_009, за исключением вычета значения предыдущего параметра в числителе. Можно ли как-то описать нужную мне формулу и просто сделать запрос к СПАД-у? Еще один маленький вопрос: в формуле для ARG_009 присутствует разница времени (t(i)-t(i-1)). В каких единицах считается эта разница: в секундах? Или может в милисекундах?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
В Вашем случае это должен быть Input. Автоматически данные не должны обновляться. Достаточно разовых выборок управляемых посылкой значения в канал Call. Если необходимо постоянно обновлять данные по статистике, то посылка реализуется через программу, например на ST или FBD. Тогда придется брать значение ARG_005 и в программе приводить его к диапазону по времени. Время вычисляется в секундах.
Posted by DreamWeaver (Участник № / Member № 1485) on :
Вот как раз таки и не понятно как можно привести ARG_005 или ARG_009 к тому что мне нужно. В ARG_005 заносится сумма всех значений, что мне не подходит, так как не учитываеся время (сколько работал расходомер при определенном значении расхода. Соответственно невозможно точно определить сколько реально ушло нефти). ARG_009 похож на то что мне нужно, но не совсем (описывал выше). Так можно ли средствами TM решить эту задачу? Есть какой-нибудь способ создания запросов к СПАД-у для выборки значений?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Сейчас посмотрели внимательнее - в справочной системе у нас ошибка в описании формулы для Arg_009: на самом деле там нет деления на 2. МРВ работает правильно - без деления на 2, это просто ошибка в документации.
В Вашем случае при выборке статистики из СПАД Вам надо использовать значение именно 9-го аргумента. Однако результат необходимо еще привести к единицам времени секунды, потому как значения у Вас сохраняется в размерности м3/час, а в расчете метки времени в секундах, поэтому корректный результат будет = Arg_009/3600.
Posted by DreamWeaver (Участник № / Member № 1485) on :
Вот конкретная ситуация: данные по расходу (так полагаю, что в СПАД будут записаны только ниже перечисленные данные, так как в СПАД данны попадают по изменении данных): 12:00:00 - 5 м3/час 13:00:00 - 7 м3/час Смотрим состояние общего расхода на 14:00:00. Должно получиться 12 м/3. По Вашей формуле для ARG_009 получается: ((5-0)*3600)/3600 + ((7-5)*3600)/3600 = 7 м3/час. А должно получиться 12. Все дело в том, что по формуле для ARG_9 расчитывается сумма приращений, а не общая сумма. В моем случае формула должна быть такой: Расход за период = Сумма (VAL(i-1)*(t(i)-t(i-1)). Вот я и пытаюсь двумя топиками выяснить как можно считать эти данные из архива. Может можно как-то на Техно ST проходить по всем записям в СПАД-е, определять промежуток времени, перемножать и накапливать все это дело в глобальной переменной?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Неправильно, в таком случае Вам надо уже будет не интегрировать, а просто суммировать, потому как период совпадает с единицами измерения. Насчет деления на 2 - я был не прав, перепроверили еще раз - ошибка в знаке, то есть формула - это сумма полусумм текущего и предыдущего значений умноженная на интервал времени.
I=E((VALi+VALi-1)/2)*(Ti-Ti-1) Posted by DreamWeaver (Участник № / Member № 1485) on :
Но ведь в СПАД заносятся значения только по изменении данных. Если бы данные заносились в архив каждую секунду, например, (вне зависимости от того, изменилось ли значение расхода или нет), тосогласен, можно было бы просто суммировать, но так как данные заносятся в СПАД только по их изменении, то нужно учитывать время, в течении которого расходмер показывал определенное значение. Например, а СПАД будет записано: 12:00:00 - 5 м3/час 12:01:00 - 7 м3/час 13:59:59 - 6 м3/час
И что получится, если я сложу 5+7+6? По-моему что угодно, но не реальный расход за 2 часа. Нужную мне формулу а написал в прошлом посте. Или может, можно как-то заствить записывать данные в СПАД через определенные промежутки времени (например каждую секунду)?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Вы же сами привели целые времена:
12:00:00 - 5 м3/час 13:00:00 - 7 м3/час
В этом случае, если дискретность именно 1 час, то суммировать. А если так:
То интегрировать! Сделайте пробный проект - сразу будет понятно.
Posted by DreamWeaver (Участник № / Member № 1485) on :
Да, но как я могу заставить расходмер изменять значения только каждый час? Возможно расход и будет меняться только каждый час, но скорее всего нет . Я так и не могу до конца понять: можно ли в СПАД записывать значения каждую секунду (вне зависимости от того, изменен ли был параметр, или нет)? Возьмем старый пример: 12:00:00 - 5 м3/час 12:01:00 - 7 м3/час 14:00:00 - (в данном контексте не важно) м3/час Думаю, понятно, что должно получиться (по состоянию на 14:00): 5*60/3600+7*3540/3600 = 0.08333+6.88333 = 6.96666 Теперь если считать по Вашей формуле: (5-0)*60/3600 + (7-5)*3540/3600 = 0.08333+1.96666 = 2.04999. Чувствуете разницу? Так как мне быть? На самом деле варианта 2: 1) Если в СПАД можно как-то записывать значения каждую секунду (вне зависимости от того, изменился параметр или нет), то можно просто суммировать лействительные значения и масштабировать результат. 2) Если в СПАД значения записываются только по изменении параметра, то нужна формула типа той, что для интеграла, но толь БЕЗ ВЫЧИТАНИЯ предыдущего значения параметра.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
1. Выше было указано, что в документации содержится ошибка - вместо полуразности следует читать полусумму. Это классика (метод трапеций). Если по этой формуле проверить Ваш последний пример, то получится ((7+5)/2)*60/3600 + ((7+7)/2)*60/3600 = 0.1 + 6.88333 = 6.98333. Погрешность относительно невелика и связана с очень малым количество отсчетов.
2. В СПАД записываются значения только по изменениям значения параметра. Если Вы не примете специальных мер, то у Вас всегда будет некоторая девиация процесса, которая даст в СПАДе достаточно данных для интегрирования без существенной ошибки. Если же Вы будете принимать специальные меры по существенному разреживанию записей параметра в архив, то будьте добры осуществлять интегрирование самостоятельно, в реальном времени, учитывая формируемые Вами метки времени. Возможно, для этого может подойти канал CALL с типом вызова (17) RT_Statistics.
Posted by DreamWeaver (Участник № / Member № 1485) on :
Большое спасибо за подробное разяъснение, теперь понятно.