Страница 589 из 1041 ПерваяПервая ... 89489539579587588589590591599639689 ... ПоследняяПоследняя
Показано с 5,881 по 5,890 из 10404

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

  1. #5881
    Пользователь Аватар для Эдуард_Н
    Регистрация
    22.09.2014
    Адрес
    Курган
    Сообщений
    1,612

    По умолчанию

    Какой элемент в КДС может заменить "DC32" из ОЛ?

  2. #5882

    По умолчанию

    Добрый день.

    Нахожусь в некотором замешательстве. В основной программе вызывается блок для подсчёта максимального количества работавших за час насосов:

    Код:
    (* фронты включения насосов *)
    rtrPumpOn1(CLK:= inNA1, Q=> );
    rtrPumpOn2(CLK:= inNA2, Q=> );
    rtrPumpOn3(CLK:= inNA3, Q=> );
    rtrPumpOn4(CLK:= inNA4, Q=> );
    rtrPumpOn5(CLK:= inNA5, Q=> );
    rtrPumpOn6(CLK:= inNA6, Q=> );
    
    (* фронты выключения насосов *)
    ftrPumpOn1(CLK:= inNA1, Q=> );
    ftrPumpOn2(CLK:= inNA2, Q=> );
    ftrPumpOn3(CLK:= inNA3, Q=> );
    ftrPumpOn4(CLK:= inNA4, Q=> );
    ftrPumpOn5(CLK:= inNA5, Q=> );
    ftrPumpOn6(CLK:= inNA6, Q=> );
    
    (* считаем количество работающих насосов *)
    pumpsCount := pumpsCount + BOOL_TO_INT(rtrPumpOn1.Q) + BOOL_TO_INT(rtrPumpOn2.Q) + BOOL_TO_INT(rtrPumpOn3.Q) + BOOL_TO_INT(rtrPumpOn4.Q) + BOOL_TO_INT(rtrPumpOn5.Q) + BOOL_TO_INT(rtrPumpOn6.Q) -
    					BOOL_TO_INT(ftrPumpOn1.Q) - BOOL_TO_INT(ftrPumpOn2.Q) - BOOL_TO_INT(ftrPumpOn3.Q) - BOOL_TO_INT(ftrPumpOn4.Q) - BOOL_TO_INT(ftrPumpOn5.Q) - BOOL_TO_INT(ftrPumpOn6.Q);
    
    (* запоминаем максимальное количество работающих насосов *)
    IF maxPumpsCount < pumpsCount THEN
    	maxPumpsCount := pumpsCount;
    END_IF;
    
    IF rtrHour.Q THEN
    	dataFlow.maxPumpsOn[tmTimeNow.Hour]	:= INT_TO_STRING(maxPumpsCount);   (* сохраняем значение в структуру *)
    	maxPumpsCount := 0;                                                                                (* обнуляем значение *)
    	oldHour := tmTimeNow.Hour;                                                                       (* обнуляем разницу времени *)
    END_IF;
    И эти данные, соответственно, раз в час сохраняются в файл.

    Что непонятно, так это то, что в некоторые часы я получаю нулевые значения, хотя на 100% уверен, что в эти часы не было такого, что ни один насос не работал. После этого блока уже вызывается программа записи в файл, которая пишет значения структуры "dataFlow", также раз в час по фронту "rtrHour.Q". Как то можно это объяснить?

  3. #5883

    По умолчанию

    Цитата Сообщение от energvk Посмотреть сообщение
    Добрый день.

    Нахожусь в некотором замешательстве. В основной программе вызывается блок для подсчёта максимального количества работавших за час насосов:
    потому что в эти часы у вас ничего не включалось и не выключалось, потому счетчик и не рос...
    хотя да, странно что счетчик обнуляется..

    а вообще не понятно, для чего для такой задачи фронты использовать? почему нельзя просто посчитать количество включенных насосов?

  4. #5884

    По умолчанию

    Цитата Сообщение от Crusash Посмотреть сообщение
    потому что в эти часы у вас ничего не включалось и не выключалось, потому счетчик и не рос...
    хотя да, странно что счетчик обнуляется..

    а вообще не понятно, для чего для такой задачи фронты использовать? почему нельзя просто посчитать количество включенных насосов?
    Ну мне нужно знать сколько максимум насосов работало в этом часу, а не сколько работает в текущий момент сохранения.
    После обнуления:
    Код:
    IF rtrHour.Q THEN
    	maxPumpsCount := 0;                                                                                (* обнуляем значение *)
    END_IF;
    maxPumpsCount все равно становится равным количеству работающих насосов в этот момент, согласно
    Код:
    (* запоминаем максимальное количество работающих насосов *)
    IF maxPumpsCount < pumpsCount THEN
    	maxPumpsCount := pumpsCount;
    END_IF;
    И всё работает как задумано, но в некоторые часы (процентов 5% случаев может, не считал точно) maxPumpsCount оказывается равным 0, хотя это не так. вот и пытаюсь понять в чем косяк

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

    По умолчанию

    Цитата Сообщение от energvk Посмотреть сообщение
    Ну мне нужно знать сколько максимум насосов работало в этом часу, а не сколько работает в текущий момент сохранения.
    После обнуления:
    Код:
    IF rtrHour.Q THEN
    	maxPumpsCount := 0;                                                                                (* обнуляем значение *)
    END_IF;
    maxPumpsCount все равно становится равным количеству работающих насосов в этот момент, согласно
    Код:
    (* запоминаем максимальное количество работающих насосов *)
    IF maxPumpsCount < pumpsCount THEN
    	maxPumpsCount := pumpsCount;
    END_IF;
    И всё работает как задумано, но в некоторые часы (процентов 5% случаев может, не считал точно) maxPumpsCount оказывается равным 0, хотя это не так. вот и пытаюсь понять в чем косяк
    Чтобы знать сколько максимум насосов работало в этом часу, а не сколько работает в текущий момент сохранения совсем не обязательно подсчитывать фронты включения и фронты выключения.
    Для этого есть стандартный оператор MAX() и как было верно сказано, нужно просто посчитать количество включенных насосов
    Никаких промежуточных счетчиков не нужно!!
    Как в прочем и r_trigg, f_trigg
    Код:
    maxPumpsCount := MAX (maxPumpsCount , (BOOL_TO_INT(inNA1) +BOOL_TO_INT( inNA2) + BOOL_TO_INT(inNA3) +
    				 BOOL_TO_INT(inNA4) +BOOL_TO_INT( inNA5)  +BOOL_TO_INT( inNA6) ) );
    
    IF rtrHour.Q THEN
    	dataFlow.maxPumpsOn[tmTimeNow.Hour]	:= INT_TO_STRING(maxPumpsCount);   (* сохраняем значение в структуру *)
    	oldHour := tmTimeNow.Hour;
    
    (* А теперь,  подсчитать количество ВКЛЮЧЕННЫХ. насосов на начало следующего часа *)
    	maxPumpsCount := BOOL_TO_INT(inNA1) +BOOL_TO_INT( inNA2) + BOOL_TO_INT(inNA3) +
    			BOOL_TO_INT(inNA4) +BOOL_TO_INT( inNA5)  +BOOL_TO_INT( inNA6);
    END_IF;
    Обратите внимание, что я не обнуляю maxPumpsCount после записи в структуру, а присваиваю ей количество работающих насосов в данный момент времени.
    И для следующего часа это и будет начальным значением максимального количества включенных насосов.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  6. #5886

    По умолчанию

    Имеется ПЛК110, являющийся в системе устройством ввода вывода. Передача по modbus. Сам ПЛК является slave устройством. Необходимо выставлять регистры состояния входов, записывать значения выходов и получать из сети промежуточные переменные. Все бы ничего, но мастер при опросе ищет устройство, регистры которого начинаются с адреса 0ХА400. В конфигураторе ПЛК для слэйва задание адреса не подразумевается, они поочередно идут, начиная с нулевого. Каким образом можно обозвать переменную и присвоить ей конкретный адрес регистра? И еще: можно ли знать, что переменная прочитана (пришел запрос на чтение данного регистра соответсвующей функцией)? Хотел через modbus.lib но он работает только с мастером.

  7. #5887

    По умолчанию

    Да, действительно,что то я забыл про МАХ(). Думаю ваш вариант будет правильнее работать. Спасибо.

  8. #5888

    По умолчанию

    Здравствуйте, нужна помощь. Некорректно работает тайм аут мастера: Панель СПК110 (мастер), подключение по modbus через 485; 2 слейва из 3 отключены; Тайм аут мастера стоит 200 мс; Время между фреймами 20 мс; Реальное время, которое уходит на эти 2 отключенных слейва 20 с! Как исправить? Спасибо за помощь

  9. #5889
    Пользователь
    Регистрация
    05.06.2017
    Адрес
    Егорьевск
    Сообщений
    30

    По умолчанию

    Добрый день! ПЛК пока не приобретен. Ориентируясь на ПЛК73, дописываю программу управления системой отопления и горячей водой под 2 существующих источника тепла (твердотопливный и электро) + в перспективе третий (газ) на CFC. Много чего удалось победить: управление одной кнопкой двумя-тремя разными *родственными* режимами, управление одной кнопкой взаимоисключающими режимами, управление задвижкой двустороннего действия. Много времени ушло на проработку *защиты от дурака*, когда например начинают нажимать лихорадочно на все подряд кнопки, нажимают и удерживают, и так далее. Но споткнулся о задачу реализации режима работы электронагревом в ночное время суток - с 23час5мин до 5час55мин. Интуитивно понимаю, что решение крутится вокруг таймера RTC. Но у него какой -то странный (обрезанный) функционал. Не понятно, зачем этот таймер вообще есть в стандарт.либ. Вопрос у меня разветвленный. Как сделать автоматическое считывание времени из ЦП персонального компьютера (для режима эмуляции) или ПЛК, и записи на вход блока PDT? Второй вариант вопроса. Как написать суточный (не недельный) таймер вручную с нуля? И в догонку еще вопрос. Извините, я еще только учусь, но есть ли в ПЛК функция автостарта программы на случай отключения электричества?

  10. #5890

    По умолчанию

    Цитата Сообщение от sanatolich Посмотреть сообщение
    есть ли в ПЛК функция автостарта программы на случай отключения электричества?
    Пропало электричество - ПЛК перестал работать, появилось электричество - запустилась с нуля программа ПЛК. Что еще надо ?

Страница 589 из 1041 ПерваяПервая ... 89489539579587588589590591599639689 ... ПоследняяПоследняя

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

Ваши права

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