Перевести секунды, в часы и минуты

Стартовая страница Форумы Понять, как работает ПО Формулы Перевести секунды, в часы и минуты

Просмотр 15 сообщений - с 16 по 30 (из 83 всего)
  • Автор
    Сообщения
  • #34140
    Mikhail
    Модератор

    Распишите здесь конкретный пример значения регистра и получения часов, минут и секунд из него. Без использования программирования, только простейшие математические действия.

    #34146
    manjey73
    Участник

    @Alexandr пришлите значение в секундах из регистра наработки в цифровом виде пожалуйста.

    ну или вообще по всем пунктам

    #34194
    Alexandr
    Участник

    Всем добрый день!

    На основной работе была загрузка, пришлось любимое занятие временно отложить в сторону.


    @Mikhail
    , математически это не сложно, к примеру

    У меня на столе сейчас контроллер (ЗИП), с него получаю значение 15296
    На дисплее контроллера отображается это значение как 4ч 14 м

    Значит мне требуется
    15296/3600=4,25 — получили 4 часа, после точки все игнорим
    15296-4*3600=896 сек / 60 = 14,93 — 14 минут, что после точки также игнорим.
    В итоге и получаем 4 часа 14 минут как на дисплее.


    @Manjey73
    , значение приходит как я уже писал выше 15296.
    Или требуется его получить в каком то другом формате?

    • Ответ изменён 1 год, 10 месяцев назад пользователем Alexandr.
    #34197
    manjey73
    Участник

    TimeSpan 15296 4 (это дни) 14 (это минуты) 56 (это секунды)

    ваши 15296 надо умножить на 10000000 и все это должно быть в long
    в одной мс вроде 10000 тиков, ну и соответственно в секунде 1000 мс.
    Потом запихнуть в TimeSpan

    TimeSpan(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
    В общем вокруг этого можно поколдовать в Скриптах.

    #34198
    manjey73
    Участник

    TimeSpan.FromSeconds

    Ещё такой метод есть.

    #34199
    Alexandr
    Участник

    @Manjey73

    А где про это можно прочитать?
    Я если честно, совсем не понимаю что требуется выполнить.

    Чтобы значение запихнуть в TimeSpan требуется создать расчетный канал * 10000000.
    А для вывода значений, где их брать.

    Я просто далек от программирования.

    #34201
    manjey73
    Участник

    Вы точно скажите куда хотите выводить и как? Например числами в расчетных каналах отдельно дни, минуты.
    Или чтобы это было в виде строки или как-то ещё?

    #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

    з.ы. думаю это очень универсальный вариант, который подойдет всем.

    #34204
    manjey73
    Участник

    Буквочку d пропустил в имени функции 🙂
    TsFromSeconds

    #34211
    manjey73
    Участник

    Первоначальный вариант использовать значение а не номер канала была наверное правильнее. По идее формулу можно применить тогда сразу во входном канале изменив его Формат, Тип и длину (не проверял).

    SplitAscii(()=> TsFromSeconds(Cnl))

    сама формула в одну строку

    public string TsFromSeconds(double Sec)
    {
    return TimeSpan.FromSeconds(Sec).ToString();
    }
    • Ответ изменён 1 год, 10 месяцев назад пользователем manjey73.
    #34213
    JurasskPark
    Участник

    +1

    #34270
    Alexandr
    Участник

    Всем привет,


    @Manjey73
    спасибо!

    Первый вариант с добавлением расчетного канала работает, длину пробовал разную, а можно ее вообще не ставить.
    Если значение не большое то отображает часы-минуты-секунды,
    При увеличении значения начинает отображать как день-часы-минуты

    Второй вариант, использование формулы во входном канале не работает, пробовал разные варианты отображает как — пять кубиков и ??@.

    Задача решена, всем спасибо кто откликнулся.

    #34277
    manjey73
    Участник

    Нет, длину ставить надо, так как у вас переменная в виде строкового представления TimeSpan. То есть это штатная функция перевода TimeSpan.ToString() в языке.

    ToString() переводит структуру TimeSpan к виду

    Дни(Точка)Часы(Двоеточие)Минуты(Двоеточие)Секунды.

    Так как каждый символ это один байт, а канал в себе может хранить только 8 байт ASCII то получается что на 04:17:56 у вас и уходит 8 байт.
    Длина данных превращает набор каналов в массив и SplitAscii это штатный скрипт в Scada который по массиву раскладывает по 8 байт ASCII, а у вас там еще дни.
    Если дни будут ограничены 7-мью знаками плюс точка это уже длина = 2.
    Если дней будет больше, то потребуется длина = 3.

    Если не задать длину, то это один канал и все, что дальше 8-ми байт будет обрезано. По этому вы и видите день, часы и минуты, но может и минуты обрезать, если дней станет больше.

    з.ы. странно что не работает второй вариант, по идее должен бы, но может это связано с Input каналом и его привязкой к Коммуникатору???? Как-нибудь проверю.

    #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));
    }
    #34288
    Mikhail
    Модератор

    Если есть возможность отображать значение канала, используя формат, оптимальнее воздержаться от перевода значения в строку. Потому что для хранения строк требуется больше памяти в архивах и нельзя построить график.

Просмотр 15 сообщений - с 16 по 30 (из 83 всего)
  • Для ответа в этой теме необходимо авторизоваться.