Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 16

Тема: ФБ даты и время на ST

  1. #1

    По умолчанию ФБ даты и время на ST

    Здравствуйте
    Поступило задание написать программу управления тепловым узлом с вкл./выкл. по времени и дню недели. Знаю, что в менеджере компонентов есть CLOCK_WEEK (Недельный таймер с двумя режимами работы на FBD) но я изучаю и практикуюсь в программирование на ST.
    Почитав форум нашел куски разрозненного кода и решил написать два ФБ переводящие время в сек. от 2000 г. (используется в Owen Logic) в формат год, месяц, день недели, день месяца, час, минуты, секунды и наоборот год, месяц, день, час, минуты, секунды в сек. от 2000 г.
    Проверил все работает на 21 век.
    Так как форум не дает загружать файлы с расширением fbst упаковал в TIME.ZIP кому нужно пользуйтесь.
    Изображения Изображения
    Вложения Вложения
    • Тип файла: zip TIME.zip (9.6 Кб, Просмотров: 9)
    Я не волшебник, я только учусь...

  2. #2
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,570

    По умолчанию

    а почему не использовать готовые ПОУ из оскат библиотеки, зачем свое создавать?
    АИ-ассистент говорит что есть ошибки
    Код:
    IF udiMonth = 2 AND xLeapYear THEN
        IF xLeapYear THEN
            arrDays[0]:=29;
        ELSE
            arrDays[0]:=28;
        END_IF
    Это избыточно и некорректно: вы уже проверили xLeapYear, но затем снова проверяете его. Более того, вы перезаписываете arrDays[0] вместо изменения arrDays[2].

    Код:
    udiDayOfWeek := ((udiTime + 6) MOD 7);
    где udiTime — количество дней с 1.01.2000, но 1 января 2000 года — суббота, а не понедельник! Согласно стандарту IEC 61131-3 и большинству ПЛК, DT начинается с понедельника = 1, воскресенье = 7.
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  3. #3

    По умолчанию

    Всё уже выложено давно и с 1970 и с 2000 года, туда и обратно https://owen.ru/forum/showthread.php...l=1#post444236
    Кроме того ПР200 это далеко не ПР205 (103, 225), где все по другому.

    И ещё, тут много всего Астротаймеры, Таймеры и примеры https://owen.ru/forum/showthread.php...l=1#post426133
    Последний раз редактировалось kondor3000; 30.10.2025 в 15:49.

  4. #4

    По умолчанию

    Цитата Сообщение от AllXXX Посмотреть сообщение
    Здравствуйте
    Поступило задание написать программу управления тепловым узлом с вкл./выкл. по времени и дню недели. Знаю, что в менеджере компонентов есть CLOCK_WEEK (Недельный таймер с двумя режимами работы на FBD) но я изучаю и практикуюсь в программирование на ST.
    Почитав форум нашел куски разрозненного кода и решил написать два ФБ переводящие время в сек. от 2000 г. (используется в Owen Logic) в формат год, месяц, день недели, день месяца, час, минуты, секунды и наоборот год, месяц, день, час, минуты, секунды в сек. от 2000 г.
    Проверил все работает на 21 век.
    Так как форум не дает загружать файлы с расширением fbst упаковал в TIME.ZIP кому нужно пользуйтесь.
    У вас ошибки с месяцами и годами, при установке 0:0:1 01/01/26 года показывает 13 месяц 25 года 1 Время 1.jpg
    Тоже самое при 2000 годе (0) показывает 13 месяц 4294967295 года 1 Время 2.jpg
    В авто режиме, при 0 на входе, такая же беда.

    Прямо как на Миллениум 0:0:0 01/01/2000 года , компы сойдут с ума)
    Последний раз редактировалось kondor3000; 30.10.2025 в 14:10.

  5. #5

    По умолчанию

    Я не гуру в ST всего лишь киповец самоучка.
    Цитата Сообщение от capzap Посмотреть сообщение
    а почему не использовать готовые ПОУ из оскат библиотеки, зачем свое создавать?
    Писал выше без практики мало чему научишься.

    Цитата Сообщение от capzap Посмотреть сообщение
    АИ-ассистент говорит что есть ошибки
    Это что еще за зверь?

    Цитата Сообщение от capzap Посмотреть сообщение
    Это избыточно и некорректно: вы уже проверили xLeapYear, но затем снова проверяете его.
    Здесь согласен в первом условии AND xLeapYear нужно убрать.

    Цитата Сообщение от capzap Посмотреть сообщение
    Более того, вы перезаписываете arrDays[0] вместо изменения arrDays[2]
    А здесь нет. в arrDays[0] записывается кол-во дней в месяце текущего цикла FOR.

    Цитата Сообщение от capzap Посмотреть сообщение
    где udiTime — количество дней с 1.01.2000, но 1 января 2000 года — суббота, а не понедельник! Согласно стандарту IEC 61131-3 и большинству ПЛК, DT начинается с понедельника = 1, воскресенье = 7.
    А вот здесь не понимаю, о чем вы?
    Код:
    udiDayOfWeek: UDINT;  // — день недели, 1..7 (1 - понедельник, ..., 7 - воскресенье);
    Цитата Сообщение от kondor3000 Посмотреть сообщение
    Всё уже выложено давно и с 1970 и с 2000 года, туда и обратно https://owen.ru/forum/showthread.php...l=1#post444236
    Кроме того ПР200 это далеко не ПР205 (103, 225), где все по другому.
    Да именно про эти примеры я писал выше.

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    И ещё много всего Астротаймеры, Таймеры и примеры https://owen.ru/forum/showthread.php...l=1#post426133
    Вот за это спасибо, яндекс ссылок на эту ветвь форума не давал ну или я задавал не правильные вопросы.
    Я не волшебник, я только учусь...

  6. #6

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    У вас ошибки с месяцами и годами, при установке 0:0:1 01/01/26 года показывает 13 месяц 25 года 1 Время 1.jpg
    Тоже самое при 2000 годе (0) показывает 13 месяц 4294967295 года 1 Время 2.jpg
    В авто режиме, при 0 на входе, такая же беда.

    Прямо как на Миллениум 0:0:0 01/01/2000 года , компы сойдут с ума)
    Как говориться первый блин комом.
    Хорошо на следующей смене поищу баг
    Я не волшебник, я только учусь...

  7. #7
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    1,897

    По умолчанию

    Цитата Сообщение от AllXXX Посмотреть сообщение
    Как говориться первый блин комом.
    Хорошо на следующей смене поищу баг
    Ну и почитайте, чтобы велосипеды не изобретать https://disk.yandex.ru/i/1hbOEDI9wboWGQ

  8. #8

    По умолчанию

    Идея хорошая, написать блок, без использования дополнительных функций и ФБ одним блоком. 1 Блоки времени.jpg
    Для переноса на любую платформу, достаточно текста одного ФБ.
    Кроме того, ФБ работает сам по себе при 0 на входе (время внутри), а при подаче UnixTime как конвертер.
    Уже переписал свои ФБ и нашёл 3 ошибки у ТС, теперь всё работает.
    Последний раз редактировалось kondor3000; 05.11.2025 в 18:11.

  9. #9
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    1,897

    По умолчанию

    Тоже решил побаловаться
    Код:
    /// <Description>Извлечение даты и времени из формата UnixTime от 01.01.2000</Description>
    /// <GroupName>Дата и время</GroupName>
    
    function_block UDT_to_DT // от 01.01.2000
    
        var_input
           UDT: udint  := 0; //дата и время в формате Unix от 01.01.2000 в секундах
        end_var
    
        var_output
           day: udint;
           month: udint;
           year: udint;
           hour: udint;
           min: udint;
           sec: udint;
           week: udint;
        end_var
    
        var
           day_in_month: array [1..12] of udint := [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];
           uiDay: udint;
           days_to_year, days_to_month: udint;
           is_leap_year : bool;
        end_var
        
        if UDT = 0 then UDT := dt_to_udint(get_date_time()); end_if
        // Определяем год
        year := UDT / 31556926 + 2000;
        //Количество дней с 01.01.2000 до начала текущего года
        days_to_year := (year - 2000) * 365 + (year - 1997)/4 - (year - 1901)/100 + (year - 1601)/400;
        //Количество дней с начала года 
        uiDay := UDT / 86400 - days_to_year + 1;
        //Месяц
        month := uiDay * 86400 / 2629743 + 1;
        //Проверяем год на високосность
        is_leap_year := (year mod 400 = 0) or ((year mod 4 = 0) and (year mod 100 <> 0));
        //Количество дней до начала месяца
        days_to_month := day_in_month[month] + bool_to_udint(is_leap_year and month > 2);
        //День
        day := uiDay - days_to_month;
        
        //Время
        hour := (UDT / 3600) mod 24;
        min := (UDT / 60) mod 60;
        sec := UDT mod 60;
        
        //День недели
        week := ((UDT / 86400 + 6) mod  7);
        if week = 0 then week := 7; end_if
        
    end_function_block

  10. #10

    По умолчанию

    Цитата Сообщение от Dimensy Посмотреть сообщение
    Тоже решил побаловаться
    Функция SYS.is_leap_year(); уже встроена в ОЛ. Можно ещё сократить )))
    И время после 07:08:00 утра, 31 декабря 2025 года показывает 0 день января 2026 года.
    Последний раз редактировалось kondor3000; 07.11.2025 в 19:57.

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. BCD преобразования даты-времени
    от -=Vovka=- в разделе Панели оператора (HMI)
    Ответов: 10
    Последнее сообщение: 11.12.2018, 14:29
  2. Установка даты - времени в СП 270
    от spec_yug в разделе Панели оператора (HMI)
    Ответов: 4
    Последнее сообщение: 10.07.2014, 08:50
  3. к петрову и. (про время и даты ...)
    от Валенок в разделе ПЛК1хх
    Ответов: 27
    Последнее сообщение: 17.11.2011, 13:52
  4. Разбор даты
    от VanoKing в разделе Master SCADA 3
    Ответов: 7
    Последнее сообщение: 06.09.2011, 10:08
  5. установка времени и даты на плк
    от michaeladm в разделе ПЛК1хх
    Ответов: 2
    Последнее сообщение: 27.05.2010, 10:30

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •