Страница 1100 из 1155 ПерваяПервая ... 1006001000105010901098109911001101110211101150 ... ПоследняяПоследняя
Показано с 10,991 по 11,000 из 11547

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

  1. #10991

    По умолчанию

    В моем случае функция Z=f(X,Y) задается таблично, но все равно спасибо!

  2. #10992

    По умолчанию

    Цитата Сообщение от Lev_3301 Посмотреть сообщение
    Помогите пожалуйста правильно написать CHARCURVE на ST.
    Спасибо.

    Для решения задачи требуется написать пользовательский функциональный блок, который позволит расширить возможности обычного блока CHARCURVE до возможности подавать на вход и получать на выходе числа с плавающей точкой, а также одновременно интерполировать по двум переменным Z=f(X,Y).

    Но для начала хочется изучить как работает оригинальный CHARCURVE.
    Где-то на форуме выкладывали функцию отличную, дайте ссылку, если кто-то помнит, что бы еще раз сказать спасибо автору.
    Код:
    TYPE Point_GR :
    STRUCT
    	X,Y: REAL;
    END_STRUCT
    END_TYPE
    Код:
    FUNCTION MyGraf_p : REAL
    VAR_INPUT
            IN: REAL;       (*Входной сигнал*)
            pt : POINTER TO ARRAY[0..99] OF Point_GR;       (*Массив точек графика, не более 100 пар точек X,Y*)
            size : UINT;
    END_VAR
    VAR
            a: INT; (*Начало интервала поиска*)
            b: INT; (*Конец интервала поиска*)
            N: INT; (*Число точек в графике*)
            i: INT;
    END_VAR
    Код:
    N:= SHR(size,3)-1;      (*Число точек в графике*)
    (*Начальные значения интнрвала поиска*)
    a:=0;
    b:=N-1;
    
    (*Обрезание графика для крайних точек*)
    IF IN<=pt^[0].X THEN
            MyGraf_p:=pt^[0].Y;
    ELSIF IN>=pt^[N-1].X THEN
            MyGraf_p:=pt^[N-1].Y;
    (*Теперь можно начать поиск*)
    ELSE
            WHILE (b-a) <> 1 DO (*В конце концов, входной сигнал ТОЧНО попадет между двумя соседними точками X(a) и Х(а+1)*)
            i:=(a+b)/2;     (*Делим интервал поиска пополам*)
            IF IN=pt^[i+1].X THEN   (*Может нам повезло, и мы сразу нашли точку? *)
            a:=i; b:=i+1;                   (*Бинго! прекращаем итераций, нечего в пустую молотить :) *)
            (*мимо :( ,тогда посмотрим в какую половину интервала попали*)
            ELSIF IN>pt^[i].X THEN  (*Если входной сигнал больше середины интервала поиска,*)
            a:=i;                                    (*то следующий поиск будем делать начиная от середины и до конца массива*)
            ELSE                                    (*А если входной сигнал меньше середины интервала поиска,*)
            b:=i;                                    (*то следующий поиск будем делать начиная от начала и до середины массива*)
            END_IF
    (*Таким образом на каждой итерации отбрасываем из поиска заведомо ненужную половину значений
    две соседние координаты X(a) и Х(а+1), меду которыми попадает входной сигнал найдем очень быстро
    для 8 точек графика нужно не более 3 итераций
    при 9..16 точек в графике нужно не более 4 итераций
    при 17..32 точек в графике нужно не более 5 итераций
    при 33..64 точек в графике нужно не более 6 итераций
    при 65..128 точек в графике нужно не более 7 итераций
    инфа точная - 100% ;) *)
    END_WHILE
    (*Теперь самое простое - сделать линейную аппроксимацию по двум точкам ;) *)
    MyGraf_p:=pt^[b].Y-(pt^[b].X-IN)*(pt^[b].Y-pt^[a].Y)/(pt^[b].X-pt^[a].X);
    END_IF
    Использование:
    Код:
    PROGRAM PLC_PRG
    VAR
    	GR: ARRAY [0..49] OF Point_GR:=
    	(X:=0, Y:=15),(X:=3, Y:=25),(X:=4, Y:=45),(X:=8, Y:=75),(X:=15, Y:=45),
    	(X:=16, Y:=45),(X:=20, Y:=65),(X:=22, Y:=75),(X:=40, Y:=95),(X:=50, Y:=105),
    
    	(X:=110, Y:=15),(X:=120, Y:=25),(X:=130, Y:=45),(X:=140, Y:=75),(X:=150, Y:=45),
    	(X:=160, Y:=45),(X:=200, Y:=65),(X:=220, Y:=75),(X:=240, Y:=95),(X:=250, Y:=305),
    
    	(X:=301, Y:=15),(X:=305, Y:=25),(X:=324, Y:=45),(X:=380, Y:=75),(X:=415, Y:=45),
    	(X:=416, Y:=45),(X:=420, Y:=65),(X:=422, Y:=75),(X:=440, Y:=495),(X:=450, Y:=505),
    
    	(X:=511, Y:=15),(X:=515, Y:=25),(X:=524, Y:=45),(X:=580, Y:=75),(X:=615, Y:=45),
    	(X:=416, Y:=45),(X:=420, Y:=65),(X:=422, Y:=75),(X:=440, Y:=495),(X:=450, Y:=505),
    
    	(X:=621, Y:=15),(X:=625, Y:=25),(X:=634, Y:=45),(X:=680, Y:=75),(X:=695, Y:=45),
    	(X:=676, Y:=45),(X:=680, Y:=65),(X:=692, Y:=75),(X:=740, Y:=495),(X:=750, Y:=505);
    
    	IN: REAL;
    	OUT: REAL;
    END_VAR
    Код:
    OUT:=MyGraf_p(IN, ADR(GR), SIZEOF(GR));*)
    А если хотите изучить, то код библиотеки Util открыт, открываете в CoDeSys и изучаете.
    Последний раз редактировалось Николай Суриков; 28.09.2024 в 14:24.

  3. #10993

    По умолчанию

    Цитата Сообщение от Николай Суриков Посмотреть сообщение
    Где-то на форуме выкладывали функцию отличную, дайте ссылку, если кто-то помнит, что бы еще раз сказать спасибо автору.
    ...
    petera, здесь

  4. #10994

    По умолчанию

    Добрый день.

    Подскажите, пожалуйста, по ПО Codesys v.2.3.

    Мне необходимо реализовать имитацию работы конвейера который считает коробки.
    В условиях задания есть требования, чтобы у конвейера было два состояния включен и выключен => vkl_konv, тип переменной булево = 0 или 1. Весь функционал разработал на ST и он работает.
    Суть вопроса: В визуализации создал графический интерфейс и на нем есть прямоугольник который отвечает за отображения состояния конвейера. Удалось сделать, чтобы при выключенном конвейере была заливка зеленого цвета, при включенном - заливка красная (требования из ТЗ). Подскажите, пожалуйста, как сделать, чтобы у этого прямоугольника при зеленой заливке отображалась надпись "Конвейер выключен" = значение переменной 0, а при красной заливке отображалась надпись "Конвейер включен" = значение переменной 1. В настоящее время отображается всегда одна подпись, заданная в разделе "Текст".

    Заранее спасибо!

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

    По умолчанию

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

    Подскажите, пожалуйста, по ПО Codesys v.2.3.

    Мне необходимо реализовать имитацию работы конвейера который считает коробки.
    В условиях задания есть требования, чтобы у конвейера было два состояния включен и выключен => vkl_konv, тип переменной булево = 0 или 1. Весь функционал разработал на ST и он работает.
    Суть вопроса: В визуализации создал графический интерфейс и на нем есть прямоугольник который отвечает за отображения состояния конвейера. Удалось сделать, чтобы при выключенном конвейере была заливка зеленого цвета, при включенном - заливка красная (требования из ТЗ). Подскажите, пожалуйста, как сделать, чтобы у этого прямоугольника при зеленой заливке отображалась надпись "Конвейер выключен" = значение переменной 0, а при красной заливке отображалась надпись "Конвейер включен" = значение переменной 1. В настоящее время отображается всегда одна подпись, заданная в разделе "Текст".

    Заранее спасибо!
    Вот так можно
    1.png

  6. #10996

    По умолчанию

    Добрый день, собрал схему аварийного отключения работы установки при аварии вентилятора. Собственно вопрос, можно ли убрать из нее таймер. В проекте уже имеется 6 таймеров 3 из которых почти постоянно в работе, либо оставить так?
    Изначально включается xDO6_FUN, через некоторое время приходит сигнал TEST_FAN_ON. Переменная TEST служит для проверки отключения при отсутвии сигнала включения вентилятора (изначала надо TRUE, инвертирование не поставил) Если убрать таймер TOF, то в целом система работает, за исключением ложного кратковременного сигнала авария при первом включении, на время прохождения сигнала о включении вентилятора, хотелось бы от нее избавиться.
    VAR5.jpg
    Последний раз редактировалось Dmitry_KV; 29.09.2024 в 17:21.

  7. #10997

    По умолчанию

    Цитата Сообщение от Dmitry_KV Посмотреть сообщение
    Добрый день, собрал схему аварийного отключения работы установки при аварии вентилятора. Собственно вопрос, можно ли убрать из нее таймер. В проекте уже имеется 6 таймеров 3 из которых почти постоянно в работе, либо оставить так?
    Изначально включается xDO6_FUN, через некоторое время приходит сигнал TEST_FAN_ON. Переменная TEST служит для проверки отключения при отсутвии сигнала включения вентилятора (изначала надо TRUE, инвертирование не поставил) Если убрать таймер TOF, то в целом система работает, за исключением ложного кратковременного сигнала авария при первом включении, на время прохождения сигнала о включении вентилятора, хотелось бы от нее избавиться.
    VAR5.jpg
    А "xDO6_FUN" кто включает?

  8. #10998

    По умолчанию

    Цитата Сообщение от 1exan Посмотреть сообщение
    А "xDO6_FUN" кто включает?
    xDO6_FUN включается когда установку из ручного в авто переводят (на схеме не представлено). Далее, если xDO6_FUN и TEST_FAN_ON = TRUE, а AVARIA_FAN_OFF: FALSE подключается нагрузка. При отсутствии нагрузки xDO6_FUN отключается через заданное время, затем при необходимости подключить нагрузку сначала включается xDO6_FUN: TRUE , проверятся что он не в аварии AVARIA_FAN_OFF: FALSE и так по кругу. Пока установка в работе, вентилятор TEST_FAN_ON должен быть всегда включен, в ином случае должно перейти в аварию AVARIA_FAN_OFF: TRUE и выключить установку, дабы не перегрелась.
    Последний раз редактировалось Dmitry_KV; 29.09.2024 в 19:24.

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

    По умолчанию

    Цитата Сообщение от Dmitry_KV Посмотреть сообщение
    Добрый день, собрал схему аварийного отключения работы установки при аварии вентилятора. Собственно вопрос, можно ли убрать из нее таймер. В проекте уже имеется 6 таймеров 3 из которых почти постоянно в работе, либо оставить так?
    Изначально включается xDO6_FUN, через некоторое время приходит сигнал TEST_FAN_ON. Переменная TEST служит для проверки отключения при отсутвии сигнала включения вентилятора (изначала надо TRUE, инвертирование не поставил) Если убрать таймер TOF, то в целом система работает, за исключением ложного кратковременного сигнала авария при первом включении, на время прохождения сигнала о включении вентилятора, хотелось бы от нее избавиться.
    VAR5.jpg
    Я не знаю всех нюансов, но может так попробовать?
    Безымянный.png

  10. #11000

    По умолчанию

    Цитата Сообщение от Dimensy Посмотреть сообщение
    Я не знаю всех нюансов, но может так попробовать?
    Безымянный.png
    Спасибо за идею без MOVE, но так проходит кратковременно авария при выключении xDO6_FUN, и в целом нет аварии при переходе TEST_FAN_ON из TRUE в FALSE при xDO6_FUN: TRUE

Страница 1100 из 1155 ПерваяПервая ... 1006001000105010901098109911001101110211101150 ... ПоследняяПоследняя

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

Ваши права

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