Страница 9 из 10 ПерваяПервая ... 78910 ПоследняяПоследняя
Показано с 81 по 90 из 96

Тема: Отображение данных с ПЛК210 на цифровом дисплее СП310-Р

  1. #81

    По умолчанию

    Цитата Сообщение от МихаилГл Посмотреть сообщение
    У вас dword в word влазит? Интересно интересно...

    PS А в чем проблема? Таймеры в миллисекундах и работают...
    Да, таймеры работают в миллисекундах, мне нужен вывод в секундах.

    Получается нужно сделать что-то типа WORD + WORD:= TO_WORD (DWORD)?

  2. #82

    По умолчанию

    Цитата Сообщение от Mikhail_NNT Посмотреть сообщение
    Да, таймеры работают в миллисекундах, мне нужен вывод в секундах.

    Получается нужно сделать что-то типа WORD + WORD:= TO_WORD (DWORD)?
    Вопрос не понятен... 509 это как раз секунды (8 минут 29 секунд). Что именно не правильно?

    PS WORD это максимум 65536 секунд...

  3. #83

    По умолчанию

    Цитата Сообщение от МихаилГл Посмотреть сообщение
    Вопрос не понятен... 509 это как раз секунды (8 минут 29 секунд). Что именно не правильно?
    В переменной wDownTimeS1Hx нужно записать секунды, как раз 509, а записываются миллисекунды.

    Из-за неправильного преобразования типов такая история?

  4. #84

    По умолчанию

    Цитата Сообщение от Mikhail_NNT Посмотреть сообщение
    Подскажите еще по системному времени. Программа считает простои сборочной линии: кнопка нажата таймер запустился, кнопка отжата таймер остановился и сохранилось значение таймера ЕТ.
    Все работает отлично, все считает заносит данные в таблицу в панели, но делает это в миллисекундах, никак не пойму почему?
    В выделенном фрагменте построчно:
    Системное время TIME перевожу в DWORD
    Перевожу миллисекунды в секунды разделив DWORD на 1000
    Перевожу DWORD в WORD
    Записываю значение в переменную- старое значение переменной + текущий WORD

    В таблице на HMI столбцы данных тип-WORD, всего знаков-4, формат-unsigned
    Для начала определитесь, какое максимальное время у вас будет?
    У вас на скрине уже 37098 +509 =37607, а WORD максимум 65 535 (это максимум 18 часов, если в секундах).
    Если больше, то конвертация DWORD_TO_ WORD уже не нужна. DWORD это максимум 49 дней (в мс), это тоже надо помнить.

    Потом зачем скрадывать конвертированное время WORD, если проще складывать само время TIME, а конвертировать только результат.
    У вас на 10 строках несколько раз конвертация туда и обратно. Не мудрено, что всё считает криво.

    Сначала надо составить алгоритм, прикинуть, хватает ли вам диапазона переменных и только потом писать программу.
    Последний раз редактировалось kondor3000; 24.01.2025 в 13:29.

  5. #85

    По умолчанию

    Цитата Сообщение от Mikhail_NNT Посмотреть сообщение
    В переменной wDownTimeS1Hx нужно записать секунды, как раз 509, а записываются миллисекунды.

    Из-за неправильного преобразования типов такая история?
    wDownTimeS1Hx это что за тип? Откуда вы решили что у вас неправильно? До каких пор вы будете скринить непойми что? Люди скоро вас материть начнут. Если что то не работает, скидывайте исходники...

  6. #86

    По умолчанию

    Простои считаются и сохраняются по одному часу, например с 6:30 до 7:30, далее сохраняются в другой час, и так далее в течении смены, так что WORD мне достаточно.
    Код ФБ:
    FUNCTION_BLOCK Downtime_Chassis_line
    VAR_INPUT
    xRedButton: BOOL; //Красная кнопка "Авария"
    END_VAR
    VAR_OUTPUT
    wDownTimeS1H1: WORD; //Простой в минутах I смены 1-ый час
    wDownTimeS1H2: WORD; //Простой в минутах I смены 2-ой час
    wDownTimeS1H3: WORD; //Простой в минутах I смены 3-ий час
    wDownTimeS1H4: WORD; //Простой в минутах I смены 4-ый час
    wDownTimeS1H5: WORD; //Простой в минутах I смены 5-ый час
    wDownTimeS1H6: WORD; //Простой в минутах I смены 6-ой час
    wDownTimeS1H7: WORD; //Простой в минутах I смены 7-ой час
    wDownTimeS1H8: WORD; //Простой в минутах I смены 8-ой час

    wDownTimeS2H1: WORD; //Простой в минутах II смены 1-ый час
    wDownTimeS2H2: WORD; //Простой в минутах II смены 2-ой час
    wDownTimeS2H3: WORD; //Простой в минутах II смены 3-ий час
    wDownTimeS2H4: WORD; //Простой в минутах II смены 4-ый час
    wDownTimeS2H5: WORD; //Простой в минутах II смены 5-ый час
    wDownTimeS2H6: WORD; //Простой в минутах II смены 6-ой час
    wDownTimeS2H7: WORD; //Простой в минутах II смены 7-ой час
    wDownTimeS2H8: WORD; //Простой в минутах II смены 8-ой час

    wTotalDownTimeS1: WORD; //Всего простоев за I смену
    wTotalDownTimeS2: WORD; //Всего простоев за II смену
    END_VAR
    VAR
    tonDowntime: TON; //Таймер времени простоя

    tDowntime: TIME; //Время работы таймера простоя в секундах
    dwDowntime: DWORD;
    wDowntime: WORD;
    END_VAR



    //Присвоение значения селектору количества часов в I смене
    IF ((TargetVars.stRTC.sGetFormatTime>=TargetVars.sSta rtShift1) AND (TargetVars.stRTC.sGetFormatTime<TargetVars.sH1_H2 Shift1))
    THEN TargetVars.iHourShift1:=1; //1-ый час
    ELSIF ((TargetVars.stRTC.sGetFormatTime>=TargetVars.sH1_ H2Shift1) AND (TargetVars.stRTC.sGetFormatTime<TargetVars.sStart Break11))
    THEN TargetVars.iHourShift1:=2; //2-ой час
    ELSIF ((TargetVars.stRTC.sGetFormatTime>=TargetVars.sEnd Break11) AND (TargetVars.stRTC.sGetFormatTime<TargetVars.sH3_H4 Shift1))
    THEN TargetVars.iHourShift1:=3; //3-ий час
    ELSIF ((TargetVars.stRTC.sGetFormatTime>=TargetVars.sH3_ H4Shift1) AND (TargetVars.stRTC.sGetFormatTime<TargetVars.sStart Lunch1))
    THEN TargetVars.iHourShift1:=4; //4-ый час
    ELSIF ((TargetVars.stRTC.sGetFormatTime>=TargetVars.sEnd Lunch1) AND (TargetVars.stRTC.sGetFormatTime<TargetVars.sH5_H6 Shift1))
    THEN TargetVars.iHourShift1:=5; //5-ый час
    ELSIF ((TargetVars.stRTC.sGetFormatTime>=TargetVars.sH5_ H6Shift1) AND (TargetVars.stRTC.sGetFormatTime<TargetVars.sStart Break12))
    THEN TargetVars.iHourShift1:=6; //6-ой час
    ELSIF ((TargetVars.stRTC.sGetFormatTime>=TargetVars.sEnd Break12) AND (TargetVars.stRTC.sGetFormatTime<TargetVars.sH7_H8 Shift1))
    THEN TargetVars.iHourShift1:=7; //7-ой час
    ELSIF ((TargetVars.stRTC.sGetFormatTime>=TargetVars.sH7_ H8Shift1) AND (TargetVars.stRTC.sGetFormatTime<TargetVars.sEndSh ift1))
    THEN TargetVars.iHourShift1:=8; //8-ой час
    END_IF

    //Присвоение значения селектору количества часов во II смене
    IF ((TargetVars.stRTC.sGetFormatTime>=TargetVars.sSta rtShift2) AND (TargetVars.stRTC.sGetFormatTime<TargetVars.sH1_H2 Shift2))
    THEN TargetVars.iHourShift2:=1; //1-ый час
    ELSIF ((TargetVars.stRTC.sGetFormatTime>=TargetVars.sH1_ H2Shift2) AND (TargetVars.stRTC.sGetFormatTime<TargetVars.sStart Break21))
    THEN TargetVars.iHourShift2:=2; //2-ой час
    ELSIF ((TargetVars.stRTC.sGetFormatTime>=TargetVars.sEnd Break21) AND (TargetVars.stRTC.sGetFormatTime<TargetVars.sH3_H4 Shift2))
    THEN TargetVars.iHourShift2:=3; //3-ий час
    ELSIF ((TargetVars.stRTC.sGetFormatTime>=TargetVars.sH3_ H4Shift2) AND (TargetVars.stRTC.sGetFormatTime<TargetVars.sStart Lunch2))
    THEN TargetVars.iHourShift2:=4; //4-ый час
    ELSIF ((TargetVars.stRTC.sGetFormatTime>=TargetVars.sEnd Lunch2) AND (TargetVars.stRTC.sGetFormatTime<TargetVars.sH5_H6 Shift2))
    THEN TargetVars.iHourShift2:=5; //5-ый час
    ELSIF ((TargetVars.stRTC.sGetFormatTime>=TargetVars.sH5_ H6Shift2) AND (TargetVars.stRTC.sGetFormatTime<TargetVars.sStart Break22))
    THEN TargetVars.iHourShift2:=6; //6-ой час
    ELSIF ((TargetVars.stRTC.sGetFormatTime>=TargetVars.sEnd Break22) AND (TargetVars.stRTC.sGetFormatTime<TargetVars.sH7_H8 Shift2))
    THEN TargetVars.iHourShift2:=7; //7-ой час
    ELSIF ((TargetVars.stRTC.sGetFormatTime>=TargetVars.sH7_ H8Shift2) AND (TargetVars.stRTC.sGetFormatTime<TargetVars.sEndSh ift2))
    THEN TargetVars.iHourShift2:=8; //8-ой час
    END_IF

    //Сброс данных о простоях I и II смены
    IF TargetVars.stRTC.sGetFormatTime=TargetVars.sDataRe set OR TargetVars.stRTC.sGetFormatTime='12:08:00'
    THEN wDownTimeS1H1:=0;
    wDownTimeS1H2:=0;
    wDownTimeS1H3:=0;
    wDownTimeS1H4:=0;
    wDownTimeS1H5:=0;
    wDownTimeS1H6:=0;
    wDownTimeS1H7:=0;
    wDownTimeS1H8:=0;

    wDownTimeS2H1:=0;
    wDownTimeS2H2:=0;
    wDownTimeS2H3:=0;
    wDownTimeS2H4:=0;
    wDownTimeS2H5:=0;
    wDownTimeS2H6:=0;
    wDownTimeS2H7:=0;
    wDownTimeS2H8:=0;
    END_IF

    //Включение/отключение/сохранение времени Таймера времени простоя
    tonDowntime (IN:=xRedButton, PT:= T#28800S); // Таймер на 8 часов

    IF NOT tonDowntime.Q
    THEN tDowntime:=tonDowntime.ET;
    END_IF

    CASE TargetVars.iHourShift1 OF
    1:
    dwDowntime:= TO_DWORD (tDowntime);
    dwDowntime:= dwDowntime / 1000; //Перевод миллисекунд в секунды
    wDowntime:= TO_WORD (dwDowntime);
    wDownTimeS1H1:= wDownTimeS1H1 + wDowntime;
    2:
    dwDowntime:= TO_DWORD (tDowntime);
    dwDowntime:= dwDowntime / 1000; //Перевод миллисекунд в секунды
    wDowntime:= TO_WORD (dwDowntime);
    wDownTimeS1H2:= wDownTimeS1H2 + wDowntime;
    3:
    dwDowntime:= TO_DWORD (tDowntime);
    dwDowntime:= dwDowntime / 1000; //Перевод миллисекунд в секунды
    wDowntime:= TO_WORD (dwDowntime);
    wDownTimeS1H3:= wDownTimeS1H3 + wDowntime;
    4:
    dwDowntime:= TO_DWORD (tDowntime);
    dwDowntime:= dwDowntime / 1000; //Перевод миллисекунд в секунды
    wDowntime:= TO_WORD (dwDowntime);
    wDownTimeS1H4:= wDownTimeS1H4 + wDowntime;
    5:
    dwDowntime:= TO_DWORD (tDowntime);
    dwDowntime:= dwDowntime / 1000; //Перевод миллисекунд в секунды
    wDowntime:= TO_WORD (dwDowntime);
    wDownTimeS1H5:= wDownTimeS1H5 + wDowntime;
    6:
    dwDowntime:= TO_DWORD (tDowntime);
    dwDowntime:= dwDowntime / 1000; //Перевод миллисекунд в секунды
    wDowntime:= TO_WORD (dwDowntime);
    wDownTimeS1H6:= wDownTimeS1H6 + wDowntime;
    7:
    dwDowntime:= TO_DWORD (tDowntime);
    dwDowntime:= dwDowntime / 1000; //Перевод миллисекунд в секунды
    wDowntime:= TO_WORD (dwDowntime);
    wDownTimeS1H7:= wDownTimeS1H7 + wDowntime;
    8:
    dwDowntime:= TO_DWORD (tDowntime);
    dwDowntime:= dwDowntime / 1000; //Перевод миллисекунд в секунды
    wDowntime:= TO_WORD (dwDowntime);
    wDownTimeS1H8:= wDownTimeS1H8 + wDowntime;
    END_CASE

    wTotalDownTimeS1:= wDownTimeS1H1+wDownTimeS1H2+wDownTimeS1H3+wDownTim eS1H4+wDownTimeS1H5+wDownTimeS1H6+wDownTimeS1H7+wD ownTimeS1H8;

    CASE TargetVars.iHourShift2 OF
    1:
    dwDowntime:= TO_DWORD (tDowntime);
    dwDowntime:= dwDowntime / 1000; //Перевод миллисекунд в секунды
    wDowntime:= TO_WORD (dwDowntime);
    wDownTimeS2H1:= wDownTimeS2H1 + wDowntime;
    2:
    dwDowntime:= TO_DWORD (tDowntime);
    dwDowntime:= dwDowntime / 1000; //Перевод миллисекунд в секунды
    wDowntime:= TO_WORD (dwDowntime);
    wDownTimeS2H2:= wDownTimeS2H2 + wDowntime;
    3:
    dwDowntime:= TO_DWORD (tDowntime);
    dwDowntime:= dwDowntime / 1000; //Перевод миллисекунд в секунды
    wDowntime:= TO_WORD (dwDowntime);
    wDownTimeS2H3:= wDownTimeS2H3 + wDowntime;
    4:
    dwDowntime:= TO_DWORD (tDowntime);
    dwDowntime:= dwDowntime / 1000; //Перевод миллисекунд в секунды
    wDowntime:= TO_WORD (dwDowntime);
    wDownTimeS2H4:= wDownTimeS2H4 + wDowntime;
    5:
    dwDowntime:= TO_DWORD (tDowntime);
    dwDowntime:= dwDowntime / 1000; //Перевод миллисекунд в секунды
    wDowntime:= TO_WORD (dwDowntime);
    wDownTimeS2H5:= wDownTimeS2H5 + wDowntime;
    6:
    dwDowntime:= TO_DWORD (tDowntime);
    dwDowntime:= dwDowntime / 1000; //Перевод миллисекунд в секунды
    wDowntime:= TO_WORD (dwDowntime);
    wDownTimeS2H6:= wDownTimeS2H6 + wDowntime;
    7:
    dwDowntime:= TO_DWORD (tDowntime);
    dwDowntime:= dwDowntime / 1000; //Перевод миллисекунд в секунды
    wDowntime:= TO_WORD (dwDowntime);
    wDownTimeS2H7:= wDownTimeS2H7 + wDowntime;
    8:
    dwDowntime:= TO_DWORD (tDowntime);
    dwDowntime:= dwDowntime / 1000; //Перевод миллисекунд в секунды
    wDowntime:= TO_WORD (dwDowntime);
    wDownTimeS2H8:= wDownTimeS2H8 + wDowntime;
    END_CASE

    wTotalDownTimeS2:= wDownTimeS2H1+wDownTimeS2H2+wDownTimeS2H3+wDownTim eS2H4+wDownTimeS2H5+wDownTimeS2H6+wDownTimeS2H7+wD ownTimeS2H8;
    Изображения Изображения
    Последний раз редактировалось Mikhail_NNT; 24.01.2025 в 14:00.

  7. #87

    По умолчанию

    Цитата Сообщение от Mikhail_NNT Посмотреть сообщение
    Подскажите еще по системному времени. Программа считает простои сборочной линии: кнопка нажата таймер запустился, кнопка отжата таймер остановился и сохранилось значение таймера ЕТ.
    Все работает отлично, все считает заносит данные в таблицу в панели, но делает это в миллисекундах, никак не пойму почему?
    У вас насчитало 509 секунд, с чего вы решили, что в таблице мс, у вас там 509 000 ?
    Такого не может быть, максимум 65535

  8. #88

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    У вас насчитало 509, с чего вы решили, что в таблице мс, у вас там 509 000 ?
    Такого не может быть, максимум 65535
    В таблице, и соответственно в переменной wDownTimeS2Hх, вместо 509 отображается 37098 и 29851.

    Значение доходит до 9999 (так как в таблице ограничено 4 знаками) и начинается отсчет сначала, и именно это значение записывается в wDownTimeS2Hх, а нужно чтобы 509.
    Простои.png
    Последний раз редактировалось Mikhail_NNT; 24.01.2025 в 14:20.

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

    По умолчанию

    Цитата Сообщение от Mikhail_NNT Посмотреть сообщение
    В таблице, и соответственно в переменной wDownTimeS2Hх, вместо 509 отображается 37098 и 29851. Нужно чтобы было именно 509.
    Не понимаю, что тогда записывается в переменную wDownTimeS2Hх?
    Простои.png
    ну так если Вы замените wDownTimeS2H8:= wDownTimeS2H8 + wDowntime; на wDownTimeS2H8:= wDowntime; будет отображаться 509, но Вам же не это нужно?
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

  10. #90

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    ну так если Вы замените wDownTimeS2H8:= wDownTimeS2H8 + wDowntime; на wDownTimeS2H8:= wDowntime; будет отображаться 509, но Вам же не это нужно?
    Все верно, нужно, чтобы к старому значению wDownTimeS2H8 прибавлялось текущее значение wDowntime

Страница 9 из 10 ПерваяПервая ... 78910 ПоследняяПоследняя

Похожие темы

  1. Ответов: 25
    Последнее сообщение: 03.09.2020, 09:37
  2. Программируемое реле ПР200. Отображение информации на дисплее.
    от mchelarsky в разделе Программируемые реле
    Ответов: 2
    Последнее сообщение: 08.08.2019, 12:50
  3. Отображение float/int на дисплее ПР200
    от flicker581 в разделе Среда программирования OWEN Logic
    Ответов: 0
    Последнее сообщение: 17.02.2016, 19:12
  4. Ответов: 8
    Последнее сообщение: 05.06.2014, 21:33
  5. Ответов: 4
    Последнее сообщение: 21.02.2014, 09:24

Ваши права

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