Стартовая страница › Форумы › Понять, как работает ПО › Формулы › Перевести секунды, в часы и минуты
- В этой теме 82 ответа, 6 участников, последнее обновление 1 год, 9 месяцев назад сделано
manjey73.
-
АвторСообщения
-
20.08.2024 в 12:38 #34140
MikhailМодераторРаспишите здесь конкретный пример значения регистра и получения часов, минут и секунд из него. Без использования программирования, только простейшие математические действия.
21.08.2024 в 11:28 #34146
manjey73Участник@Alexandr пришлите значение в секундах из регистра наработки в цифровом виде пожалуйста.
ну или вообще по всем пунктам
23.08.2024 в 16:30 #34194Alexandr
УчастникВсем добрый день!
На основной работе была загрузка, пришлось любимое занятие временно отложить в сторону.
@Mikhail, математически это не сложно, к примеруУ меня на столе сейчас контроллер (ЗИП), с него получаю значение 15296
На дисплее контроллера отображается это значение как 4ч 14 мЗначит мне требуется
15296/3600=4,25 — получили 4 часа, после точки все игнорим
15296-4*3600=896 сек / 60 = 14,93 — 14 минут, что после точки также игнорим.
В итоге и получаем 4 часа 14 минут как на дисплее.
@Manjey73, значение приходит как я уже писал выше 15296.
Или требуется его получить в каком то другом формате?-
Ответ изменён 1 год, 10 месяцев назад пользователем
Alexandr.
23.08.2024 в 16:58 #34197
manjey73УчастникTimeSpan 15296 4 (это дни) 14 (это минуты) 56 (это секунды)
ваши 15296 надо умножить на 10000000 и все это должно быть в long
в одной мс вроде 10000 тиков, ну и соответственно в секунде 1000 мс.
Потом запихнуть в TimeSpanTimeSpan(Int64) Инициализирует новый экземпляр TimeSpan структуры до указанного числа тиков.
Ну или при помощи вычислений раздельно
TimeSpan(Int32, Int32, Int32) Инициализирует новый экземпляр структуры TimeSpan до указанного количества часов, минут и секунд.Тогда можно вытягивать из TimeSpan дни, минуты, секунды типа
TimeSpan ts = new TimeSpan((long)15296 * (long)10000000);
ts.Days
ts.Minuts
ts.Secondsз.ы. тип данных в базе Scada не мешало бы добавить TimeSpan и указывать его в формате как Date, DateTime, Time
В общем вокруг этого можно поколдовать в Скриптах.23.08.2024 в 17:16 #34198
manjey73УчастникTimeSpan.FromSeconds
Ещё такой метод есть.
23.08.2024 в 17:22 #34199Alexandr
УчастникА где про это можно прочитать?
Я если честно, совсем не понимаю что требуется выполнить.Чтобы значение запихнуть в TimeSpan требуется создать расчетный канал * 10000000.
А для вывода значений, где их брать.Я просто далек от программирования.
23.08.2024 в 18:01 #34201
manjey73УчастникВы точно скажите куда хотите выводить и как? Например числами в расчетных каналах отдельно дни, минуты.
Или чтобы это было в виде строки или как-то ещё?23.08.2024 в 22:59 #34203
manjey73УчастникПредлагаю штатный вариант отображения TimeSpan в виде строки.
Делаем Раз: в скрипты добавляем формулу
public string TsFromSecons(int CnlNumSec) { TimeSpan ts = TimeSpan.FromSeconds(Val(CnlNumSec)); string interval = ts.ToString(); return interval; }Делаем Два: делаем Расчетный канал, Длина 2 или 3, Формат — String, Тип Данных — ASCII string
Делаем Три: пишем в канале Входную формулу —SplitAscii(()=> TsFromSecons(117))
Где 117 это номер канала в котором секунды.Число 2535667 секунд будет отображаться как 29.08:21:07 до точки это дни, а потом время в часах, минутах, секундах
Ваше число 15296 отображается как 04:14:56з.ы. думаю это очень универсальный вариант, который подойдет всем.
23.08.2024 в 23:35 #34204
manjey73УчастникБуквочку d пропустил в имени функции 🙂
TsFromSeconds24.08.2024 в 09:56 #34211
manjey73УчастникПервоначальный вариант использовать значение а не номер канала была наверное правильнее. По идее формулу можно применить тогда сразу во входном канале изменив его Формат, Тип и длину (не проверял).
SplitAscii(()=> TsFromSeconds(Cnl))сама формула в одну строку
public string TsFromSeconds(double Sec) { return TimeSpan.FromSeconds(Sec).ToString(); }-
Ответ изменён 1 год, 10 месяцев назад пользователем
manjey73.
24.08.2024 в 10:23 #34213
JurasskParkУчастник+1
26.08.2024 в 08:58 #34270Alexandr
УчастникВсем привет,
@Manjey73 спасибо!Первый вариант с добавлением расчетного канала работает, длину пробовал разную, а можно ее вообще не ставить.
Если значение не большое то отображает часы-минуты-секунды,
При увеличении значения начинает отображать как день-часы-минутыВторой вариант, использование формулы во входном канале не работает, пробовал разные варианты отображает как — пять кубиков и ??@.
Задача решена, всем спасибо кто откликнулся.
26.08.2024 в 13:22 #34277
manjey73УчастникНет, длину ставить надо, так как у вас переменная в виде строкового представления TimeSpan. То есть это штатная функция перевода TimeSpan.ToString() в языке.
ToString() переводит структуру TimeSpan к виду
Дни(Точка)Часы(Двоеточие)Минуты(Двоеточие)Секунды.
Так как каждый символ это один байт, а канал в себе может хранить только 8 байт ASCII то получается что на 04:17:56 у вас и уходит 8 байт.
Длина данных превращает набор каналов в массив и SplitAscii это штатный скрипт в Scada который по массиву раскладывает по 8 байт ASCII, а у вас там еще дни.
Если дни будут ограничены 7-мью знаками плюс точка это уже длина = 2.
Если дней будет больше, то потребуется длина = 3.Если не задать длину, то это один канал и все, что дальше 8-ми байт будет обрезано. По этому вы и видите день, часы и минуты, но может и минуты обрезать, если дней станет больше.
з.ы. странно что не работает второй вариант, по идее должен бы, но может это связано с Input каналом и его привязкой к Коммуникатору???? Как-нибудь проверю.
26.08.2024 в 17:13 #34287
MikhailМодераторpublic double SecondsToTime(double val) { int x = (int)val; int hour = x / 3600; int min = (x - hour * 3600) / 60; int sec = 0; return EncodeDate(new DateTime(1, 1, 1, hour, min, sec)); }26.08.2024 в 17:14 #34288
MikhailМодераторЕсли есть возможность отображать значение канала, используя формат, оптимальнее воздержаться от перевода значения в строку. Потому что для хранения строк требуется больше памяти в архивах и нельзя построить график.
-
Ответ изменён 1 год, 10 месяцев назад пользователем
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.