Страница 349 из 1044 ПерваяПервая ... 249299339347348349350351359399449849 ... ПоследняяПоследняя
Показано с 3,481 по 3,490 из 10436

Тема: ВОПРОС-ОТВЕТ (отвечаем на простые вопросы от новичков)

  1. #3481

    По умолчанию

    Здравствуйте, подскажите пожалуйста, пишу программу для водоотлива(Мой первый опыт. Пишу на ST) откачка по уровню. Хочу спросить как можно реализовать проверку реле протока в течении 60 сек. Т.е в течении 60 сек смотреть пришел ли сигнал или нет, если пришел то все хорошо, а если нет то авария.

  2. #3482
    Пользователь Аватар для Василий Кашуба
    Регистрация
    20.11.2011
    Адрес
    Ставрополь
    Сообщений
    2,492

    По умолчанию

    Цитата Сообщение от Insmzk Посмотреть сообщение
    Здравствуйте, подскажите пожалуйста, пишу программу для водоотлива(Мой первый опыт. Пишу на ST) откачка по уровню. Хочу спросить как можно реализовать проверку реле протока в течении 60 сек. Т.е в течении 60 сек смотреть пришел ли сигнал или нет, если пришел то все хорошо, а если нет то авария.
    С ST не дружу, а в CFC как то так. Вложение 16573

  3. #3483
    Пользователь
    Регистрация
    21.01.2015
    Адрес
    Санкт-Петербург
    Сообщений
    7

    По умолчанию

    Подскажите, пожалуйста, как сделать что бы некоторые биты сбрасывались в случае отключения питания. У меня сейчас получается что некоторые устройства начинают работать сразу после включения питания, если питание было включено при их работе.

  4. #3484
    Пользователь
    Регистрация
    19.11.2011
    Адрес
    г. Белгород
    Сообщений
    357

    По умолчанию

    Postoronniy, Вы так вопрос задали, что невозможно понять что Вы хотите. Сформулируйте так, чтобы всем было понятно.
    1. Включили питание. Должны включиться такие-то выходы. Не должны включаться такие-то.
    2. Выключили питание. Должны отключиться такие-то выходы и т.д.

  5. #3485
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    700

    По умолчанию POSIX time из SysLibTime

    Никак не могу понять, как получить из структуры SystemTimeDate (библиотека SysLibTime.lib) время в формате POSIX (это которое в секундах от 1970-01-01-00:00:00).

    У меня работает ФБ CurTimeEx из этой библиотеки. В нем мирно сосуществуют 64-битное системное время (с разрешающей способностью 1 мкс) и структура ГОД-МЕСЯЦ- и т.д.
    Эту структуру я инициализирую, она отсчитывает правильное время и дату, когда нужно - я подрихтовую. Все окей. Имею дату и время.
    А 64-битное системное время живет своей жизнью, сбрасываясь в ноль по ресету и не изменяясь при моих манипуляциях со структурой ГОД-МЕСЯЦ- и т.д.
    Значит использовать 64-битную структуру для получения POSIX-времени я не могу. А должен как-то из нескольких UINT переменных ГОД, МЕСЯЦ и т.д. посчитать, сколько же секунд отделяет данный временной штамп от 1 января 1970 года.
    Неужто действительно считать придется? Не верю... Должна быть какая-то функция преобразования.

    myPOSIXtime: DWORD;
    mySTD: SystemTimeDate;
    ...
    myPOSIXtime := ФУНКЦИЯ(mySTD);

    Или?

    Дополнено: поигрался с RTC из Standard.Lib. там кагбэ должно было легко получиться

    myPOSIXtime := DT_TO_DWORD( myRTC.CDT);

    Однако сам ФБ RTC заставить работать у меня не получилось. Инициализируется, на входе EN даю TRUE, а время застыло...

  6. #3486
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,841

    По умолчанию

    Цитата Сообщение от drvlas Посмотреть сообщение
    Никак не могу понять, как получить из структуры SystemTimeDate (библиотека SysLibTime.lib) время в формате POSIX (это которое в секундах от 1970-01-01-00:00:00).

    У меня работает ФБ CurTimeEx из этой библиотеки. В нем мирно сосуществуют 64-битное системное время (с разрешающей способностью 1 мкс) и структура ГОД-МЕСЯЦ- и т.д.
    Эту структуру я инициализирую, она отсчитывает правильное время и дату, когда нужно - я подрихтовую. Все окей. Имею дату и время.
    А 64-битное системное время живет своей жизнью, сбрасываясь в ноль по ресету и не изменяясь при моих манипуляциях со структурой ГОД-МЕСЯЦ- и т.д.
    Значит использовать 64-битную структуру для получения POSIX-времени я не могу. А должен как-то из нескольких UINT переменных ГОД, МЕСЯЦ и т.д. посчитать, сколько же секунд отделяет данный временной штамп от 1 января 1970 года.
    Неужто действительно считать придется? Не верю... Должна быть какая-то функция преобразования.

    myPOSIXtime: DWORD;
    mySTD: SystemTimeDate;
    ...
    myPOSIXtime := ФУНКЦИЯ(mySTD);

    Или?

    Дополнено: поигрался с RTC из Standard.Lib. там кагбэ должно было легко получиться

    myPOSIXtime := DT_TO_DWORD( myRTC.CDT);

    Однако сам ФБ RTC заставить работать у меня не получилось. Инициализируется, на входе EN даю TRUE, а время застыло...
    Есть хорошая статья Игоря Петрова «Программируем временные сложности»
    Если функциональный блок RTC не реализован в вашей системе программирования, его не сложно построить самостоятельно
    Код:
    FUNCTION_BLOCK fbRTC
    VAR_INPUT
        EN:BOOL;
        PDT:DT;
    END_VAR
    VAR_OUTPUT
        Q:BOOL;
        CDT:DT;
        POSIX:DWORD; (*добавил в оригинальный ФБ*)
    END_VAR
    VAR
        DiffTime:TON:=(PT:=t#20h);
        ResDT:DT;
        RunTrig:R_TRIG;
    END_VAR
    
    RunTrig(CLK:=EN);
    IF EN THEN
     IF RunTrig.Q THEN    (*рестарт часов*)
      ResDT:=PDT;        (*начало отсчета*)
      DiffTime(IN:=FALSE);(*рестарт таймера*)
      DiffTime(IN:=TRUE);
     ELSE    (*норм.режим CDT=DT рестарт+таймер*)
      DiffTime;
      CDT:=DWORD_TO_DT(DT_TO_DWORD(ResDT)
          +TIME_TO_DWORD(DiffTime.ET)/1000);
      IF DiffTime.ET>t#1h THEN
      (*рестарт таймера каждый час для предотвращения его переполнения*)
       ResDT:=CDT;    (*начало отсчета*)
       DiffTime(IN:=FALSE);(*рестарт таймера*)
       DiffTime(IN:=TRUE);
      END_IF
     END_IF
    END_IF
    Q:=EN;
    
    POSIX:=DT_TO_DWORD(CDT);(*добавил в оригинальный ФБ*)
    Добавил нужный Вам дополнительный выход.
    Это RTC работает и в эмуляции.

    К стати И. Петров
    В живых ПЛК могут быть /могут не быть/ аппаратные часы реального времени. Читаются они обычно через би-бку SysLibTime или подобную. См. мануал на ПЛК. Часто сама операция чтения аппаратных часов довольно медленная. Поэтому рекомендуется считать их 1 раз. Полученным значением проинициализировать RTC и далее с ним работать.
    В любом случае RTC нужно инициализировать при включении ПЛК, по этому, я думаю, что в первом цикле ПЛК нужно только один раз вызывать SystemTimeDate и там же, полученными значениями, инициализировать RTC.

    ЗЫ. Я думаю, что Вам понадобится функция для преобразования текущей даты и времени из структуры SystemTimeDate в формат DT. На этот случай функция из OSCAT
    Код:
    FUNCTION SET_DT : DT
    VAR_INPUT
        year : INT;
        month : INT;
        day : INT;
        hour : INT;
        minute : INT;
        second : INT;
    END_VAR
    
    SET_DT := DWORD_TO_DT(DATE_TO_DWORD(SET_DATE(YEAR, MONTH, day))
                  + INT_TO_DWORD(SECOND) + INT_TO_DWORD(MINUTE) * 60
                  + INT_TO_DWORD(HOUR) * 3600);
    И используемая здесь SET_DATE()
    Код:
    FUNCTION SET_DATE : DATE
    VAR_INPUT
        YEAR : INT;
        MONTH : INT;
        DAY : INT;
    END_VAR
    VAR
        count : INT;
    END_VAR
    
    
    IF month > 2 THEN
        count := (month - 1) * 30;
        IF month > 7 THEN count := count + SHR(month - 3,1);
    ELSE count := count + SHR(month - 4,1); END_IF;
        (* chech for leap year and add one day if true *)
        IF SHL(year,14) = 0 THEN count := count + 1; END_IF;
    ELSE
        count := (month - 1) * 31;
    END_IF;
    
    
    SET_DATE := DWORD_TO_DATE((INT_TO_DWORD(count + day - 1)
                   + SHR(INT_TO_DWORD(year) * 1461 - 2878169, 2)) * 86400);
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  7. #3487

    По умолчанию

    Цитата Сообщение от Василий Кашуба Посмотреть сообщение
    С ST не дружу, а в CFC как то так. Вложение 16573
    Спасибо, попробую.

  8. #3488
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    700

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    Есть хорошая статья Игоря Петрова
    Кто ж не знает Петрова
    Статью читал. Но думал - раз есть штатная функция RTC в стандартной либе, то чего уж тут выдумывать (я и так склонен изобретать лисапед). Вопрос был лишь в том, что почему-то у меня в этом ФБ не течет время...
    Ну, попробую самописный ФБ. Не вижу причины ему не работать. Хотя остается вопрос: что же я не так делаю со штатным...

    Цитата Сообщение от petera Посмотреть сообщение
    В любом случае RTC нужно инициализировать при включении ПЛК, по этому, я думаю, что в первом цикле ПЛК нужно только один раз вызывать SystemTimeDate и там же, полученными значениями, инициализировать RTC.
    Ну да, так и думалось, если реально текущее время в SystemTimeDate не получится прямо преобразовывать во время POSIX.
    А вот это:
    Цитата Сообщение от petera Посмотреть сообщение
    Я думаю, что Вам понадобится функция для преобразования текущей даты и времени из структуры SystemTimeDate в формат DT
    ...как раз те вычисления, которых я хотел избежать. За пример спасибо, я бы сделал иначе (думал создать таблицу месяцев с нарастающим итогом дней от начала года), но... блин... неужто никому из создателей и пользователей КДС не было нужно получить POSIX time? Я что, первоснегопроходимец?

  9. #3489
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,841

    По умолчанию

    Цитата Сообщение от drvlas Посмотреть сообщение
    Кто ж не знает Петрова
    Статью читал. Но думал - раз есть штатная функция RTC в стандартной либе, то чего уж тут выдумывать (я и так склонен изобретать лисапед). Вопрос был лишь в том, что почему-то у меня в этом ФБ не течет время...
    Ну, попробую самописный ФБ. Не вижу причины ему не работать. Хотя остается вопрос: что же я не так делаю со штатным...
    Глядя на это
    Вложение 16596
    Могу предположить, что поддержка этой функции должна быть реализована в прошивке ПЛК, т.к. в место кода есть только интерфейс функции. Значит в ПЛК ОВЕН такой функции нет.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  10. #3490
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    700

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    Значит в ПЛК ОВЕН такой функции нет.
    Не понимаю, но верю.
    По сути, Вы дали мне 2 варианта. Первый - организовать свой ФБ RTC, второй - вытащить таки из системных часиков (а они таки есть и хорошо себя чувствуют) POSIX-время из года, месяца и проч.
    По варианту 1. Я не знаю, какими аппаратными средствами обеспечивается точность хода генераторов импульсов ФБ TON. Поэтому не очень хочу лепить свой RTC.
    Поэтому попробую сначала вариант 2 - пересчет.
    Спасибо!

Страница 349 из 1044 ПерваяПервая ... 249299339347348349350351359399449849 ... ПоследняяПоследняя

Метки этой темы

Ваши права

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