Страница 529 из 1044 ПерваяПервая ... 294294795195275285295305315395796291029 ... ПоследняяПоследняя
Показано с 5,281 по 5,290 из 10436

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

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

    По умолчанию

    Цитата Сообщение от energvk Посмотреть сообщение
    Так не умещается в dword это число
    В секундах умещается. Естественно, не от сотворения мира, а с 0 часов 1 января 1970г.
    Код:
    FUNCTION toDT : DT
    VAR_INPUT
    	year: INT;
    	month: INT;
    	day: INT;
    	hour: INT;
    	minute: INT;
    	second: INT;
    END_VAR
    VAR
    	count: INT;
    	SET_DATE: DWORD;
    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;
        (* проверить на високосный год и добавить один день если год високосный *)
        IF SHL(year,14) = 0 THEN count := count + 1; END_IF;
    ELSE
        count := (month - 1) * 31;
    END_IF;
    SET_DATE := (INT_TO_DWORD(count + day - 1)
                   + SHR(INT_TO_DWORD(year) * 1461 - 2878169, 2)) * 86400;
    (*------------------------------------------------------------------------*)
    toDT := DWORD_TO_DT(SET_DATE
                  + INT_TO_DWORD(SECOND) + INT_TO_DWORD(MINUTE) * 60
                  + INT_TO_DWORD(HOUR) * 3600);
    На входе отдельно год, месяц,...сек.
    На выходе упакованные в формат DATE_AND_TIME
    Или сразу в DWORD
    Код:
    FUNCTION UCT_TO_DWORD : DWORD
    VAR_INPUT
    	year: INT;
    	month: INT;
    	day: INT;
    	hour: INT;
    	minute: INT;
    	second: INT;
    END_VAR
    VAR
    	count: INT;
    	SET_DATE: DWORD;
    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;
        (* проверить на високосный год и добавить один день если год високосный *)
        IF SHL(year,14) = 0 THEN count := count + 1; END_IF;
    ELSE
        count := (month - 1) * 31;
    END_IF;
    SET_DATE := (INT_TO_DWORD(count + day - 1)
                   + SHR(INT_TO_DWORD(year) * 1461 - 2878169, 2)) * 86400;
    (*------------------------------------------------------------------------*)
    UCT_TO_DWORD := SET_DATE
                  + INT_TO_DWORD(SECOND) + INT_TO_DWORD(MINUTE) * 60
                  + INT_TO_DWORD(HOUR) * 3600;
    Вложение 26247

    ЗЫ.
    Сегодня
    Вложение 26246
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

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

    По умолчанию

    Для полноты картины аналогичные функции для текущих даты и времени в ПЛК. Функции выше были для произвольных значений.
    Код:
    FUNCTION curDT : DT (* Текущие дата и время в формате POSIX как число секунд с 0 часов 1 января 1970г*)
    VAR_INPUT
    END_VAR
    VAR
        CurTimeExInst: CurTimeEx;
        CurSystemTimeDate: SystemTimeDate;
        CurSysTime64: SysTime64;
        year: INT;
        second: INT;
        day: INT;
        hour: INT;
        minute: INT;
        month: INT;
        count: INT;
        SET_DATE: DWORD;
    END_VAR
    CurTimeExInst(TimeDate := CurSystemTimeDate, SystemTime := CurSysTime64);
        year :=CurSystemTimeDate.Year;
        month :=CurSystemTimeDate.Month;
        day :=CurSystemTimeDate.Day;
        hour :=CurSystemTimeDate.Hour;
        minute :=CurSystemTimeDate.Minute;
        second :=CurSystemTimeDate.Second;
    (*------------------------------------------------------------------------*)
    (*Вычислить дату с учетом високосных лет*)
    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;
        (* проверить на високосный год и добавить один день если год високосный *)
        IF SHL(year,14) = 0 THEN count := count + 1; END_IF;
    ELSE
        count := (month - 1) * 31;
    END_IF;
    SET_DATE := (INT_TO_DWORD(count + day - 1)
                   + SHR(INT_TO_DWORD(year) * 1461 - 2878169, 2)) * 86400;
    (*------------------------------------------------------------------------*)
    curDT := DWORD_TO_DT(SET_DATE
                  + INT_TO_DWORD(SECOND) + INT_TO_DWORD(MINUTE) * 60
                  + INT_TO_DWORD(HOUR) * 3600);
    Здесь никаких входных переменных нет, функция просто возвращает текущие дату и время в формате DT.
    Или такая функция - возвращает текущие дату и время сразу в формате DWORD
    Код:
    FUNCTION curDT_DWORD : DWORD (* Текущие дата и время в формате POSIX как число секунд с 0 часов 1 января 1970г*)
    VAR_INPUT
    END_VAR
    VAR
        CurTimeExInst: CurTimeEx;
        CurSystemTimeDate: SystemTimeDate;
        CurSysTime64: SysTime64;
        year: INT;
        second: INT;
        day: INT;
        hour: INT;
        minute: INT;
        month: INT;
        count: INT;
        SET_DATE: DWORD;
    END_VAR
    CurTimeExInst(TimeDate := CurSystemTimeDate, SystemTime := CurSysTime64);
        year :=CurSystemTimeDate.Year;
        month :=CurSystemTimeDate.Month;
        day :=CurSystemTimeDate.Day;
        hour :=CurSystemTimeDate.Hour;
        minute :=CurSystemTimeDate.Minute;
        second :=CurSystemTimeDate.Second;
    (*------------------------------------------------------------------------*)
    (*Вычислить дату с учетом високосных лет*)
    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;
        (* проверить на високосный год и добавить один день если год високосный *)
        IF SHL(year,14) = 0 THEN count := count + 1; END_IF;
    ELSE
        count := (month - 1) * 31;
    END_IF;
    SET_DATE := (INT_TO_DWORD(count + day - 1)
                   + SHR(INT_TO_DWORD(year) * 1461 - 2878169, 2)) * 86400;
    (*------------------------------------------------------------------------*)
    curDT_DWORD := SET_DATE
                  + INT_TO_DWORD(SECOND) + INT_TO_DWORD(MINUTE) * 60
                  + INT_TO_DWORD(HOUR) * 3600;
    Используется библиотека SysLibTime.lib
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  3. #5283

    По умолчанию

    Всем привет. Простой вопрос простого новичка. Как можно управлять ПЛК 100 с ПК окромя codesys. Чтоб у "оператора-пользователя" не было возможности поломать что либо в коде.

  4. #5284
    Пользователь Аватар для _Mikhail
    Регистрация
    25.07.2013
    Адрес
    Ярославль
    Сообщений
    510

    По умолчанию

    Поставь на ПК Скаду

  5. #5285

    По умолчанию

    А теперь более подробно (я параллельно гуглю конечно, но что подсказывает то так быстрей)

  6. #5286

    По умолчанию

    Господа подскажите пожалуйста как записать такое выражение. начало 1 процесса : проверять значение давления в течении 15 минут если все хорошо то перейти на процесс 2 , а если в какой то момент значение меньше допусти 25 то вкл авария.

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

    По умолчанию

    Цитата Сообщение от Grampus Посмотреть сообщение
    Господа подскажите пожалуйста как записать такое выражение. начало 1 процесса : проверять значение давления в течении 15 минут если все хорошо то перейти на процесс 2 , а если в какой то момент значение меньше допусти 25 то вкл авария.
    А что это http://www.owen.ru/forum/showthread....l=1#post219513 не помогло?
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  8. #5288

    По умолчанию

    Наконец то добрался до компьютера... Petera, я видел Вашу тему http://www.owen.ru/forum/showthread.php?t=24999. Супер решение, которое легко реализуемо на ПЛК. И которое можно преобразовать на СКАДА или СПК, Вы так и на СП чтение организовали. Наткнувшись на эту тему, я то и задумал перейти наконец-то от 12 используемых регистров (чтение/запись) в 2. Но я также применяю и ПР200, где хотелось бы сделать что-то похожее. Но, что пугает это обратное преобразование в ПР полученного значения. Поэтому поискав по форуму наткнулся на макрос rovki http://www.owen.ru/forum/showthread....l=1#post205123. Показалось классным решением до 2099 года. Решил посмотреть как это будет выглядеть в ПЛК на ST, из чего начали появляться мои посты . По сути хотелось бы с ПР/ПЛК отправлять на верхний уровень одну переменную в dword(ну или на крайний случай float, так как у ПР200 сетевые целочисленные переменные 16-битные, а на стороне ПР разбивать 32 бита на 2 по 16 и склеивать потом не очень хотелось заморачиваться), и, соответственно на ПР/ПЛК принимать одну переменную для записи. В Скада съэкономиться 10 тэгов сразу . Как то так, в общем. Не знаю, получилось ли объяснить свою задумку или нет, но я честно старался

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

    По умолчанию

    Цитата Сообщение от energvk Посмотреть сообщение
    Наконец то добрался до компьютера... Petera, я видел Вашу тему http://www.owen.ru/forum/showthread.php?t=24999. Супер решение, которое легко реализуемо на ПЛК. И которое можно преобразовать на СКАДА или СПК, Вы так и на СП чтение организовали. Наткнувшись на эту тему, я то и задумал перейти наконец-то от 12 используемых регистров (чтение/запись) в 2. Но я также применяю и ПР200, где хотелось бы сделать что-то похожее. Но, что пугает это обратное преобразование в ПР полученного значения. Поэтому поискав по форуму наткнулся на макрос rovki http://www.owen.ru/forum/showthread....l=1#post205123. Показалось классным решением до 2099 года. Решил посмотреть как это будет выглядеть в ПЛК на ST, из чего начали появляться мои посты . По сути хотелось бы с ПР/ПЛК отправлять на верхний уровень одну переменную в dword(ну или на крайний случай float, так как у ПР200 сетевые целочисленные переменные 16-битные, а на стороне ПР разбивать 32 бита на 2 по 16 и склеивать потом не очень хотелось заморачиваться), и, соответственно на ПР/ПЛК принимать одну переменную для записи. В Скада съэкономиться 10 тэгов сразу . Как то так, в общем. Не знаю, получилось ли объяснить свою задумку или нет, но я честно старался
    Я думаю, что не надо изобретать велосипед в виде собственного представления упакованного времени, а взять то, что уже придумано до нас и широко используется. А именно создать для ПР макрос, аналогичный тем, что выше. Т.е. и в ПР использовать время в формате POSIX. Будет преемственность и со скадой и с ПЛК.
    Думаю, что DWORD раскидать по соседним сетевым переменным можно прямо на выходе макроса.
    Вложение 26263

    Дополнительные преимущества формата DT для ПР в том, что с упакованными дата_время переменными можно выполнять арифметические операции +/-, т.е. легко определять/задавать интервалы для событий реального времени, например для вкл/выкл по расписанию.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

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

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    Я думаю, что не надо изобретать велосипед в виде собственного представления упакованного времени, а взять то, что уже придумано до нас и широко используется. А именно создать для ПР макрос, аналогичный тем, что выше. Т.е. и в ПР использовать время в формате POSIX. Будет преемственность и со скадой и с ПЛК.
    Думаю, что DWORD раскидать по соседним сетевым переменным можно прямо на выходе макроса.
    Вложение 26263

    Дополнительные преимущества формата DT для ПР в том, что с упакованными дата_время переменными можно выполнять арифметические операции +/-, т.е. легко определять/задавать интервалы для событий реального времени, например для вкл/выкл по расписанию.
    Дословный перевод FUNCTION UCT_TO_DWORD для ПР
    Вложение 26269
    Как проверить? Онлайн конвертер http://www.cy-pr.com/tools/time/
    Вложение 26270

    ЗЫ.
    Сам макрос здесь http://www.owen.ru/forum/showthread....l=1#post219896
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

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

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

Ваши права

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