В моем случае функция Z=f(X,Y) задается таблично, но все равно спасибо!
Вид для печати
В моем случае функция Z=f(X,Y) задается таблично, но все равно спасибо!
Где-то на форуме выкладывали функцию отличную, дайте ссылку, если кто-то помнит, что бы еще раз сказать спасибо автору.
Код: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
А если хотите изучить, то код библиотеки Util открыт, открываете в CoDeSys и изучаете.Код:OUT:=MyGraf_p(IN, ADR(GR), SIZEOF(GR));*)
petera, здесь
Добрый день.
Подскажите, пожалуйста, по ПО Codesys v.2.3.
Мне необходимо реализовать имитацию работы конвейера который считает коробки.
В условиях задания есть требования, чтобы у конвейера было два состояния включен и выключен => vkl_konv, тип переменной булево = 0 или 1. Весь функционал разработал на ST и он работает.
Суть вопроса: В визуализации создал графический интерфейс и на нем есть прямоугольник который отвечает за отображения состояния конвейера. Удалось сделать, чтобы при выключенном конвейере была заливка зеленого цвета, при включенном - заливка красная (требования из ТЗ). Подскажите, пожалуйста, как сделать, чтобы у этого прямоугольника при зеленой заливке отображалась надпись "Конвейер выключен" = значение переменной 0, а при красной заливке отображалась надпись "Конвейер включен" = значение переменной 1. В настоящее время отображается всегда одна подпись, заданная в разделе "Текст".
Заранее спасибо!
Вот так можно
Вложение 78972
Добрый день, собрал схему аварийного отключения работы установки при аварии вентилятора. Собственно вопрос, можно ли убрать из нее таймер. В проекте уже имеется 6 таймеров 3 из которых почти постоянно в работе, либо оставить так?
Изначально включается xDO6_FUN, через некоторое время приходит сигнал TEST_FAN_ON. Переменная TEST служит для проверки отключения при отсутвии сигнала включения вентилятора (изначала надо TRUE, инвертирование не поставил) Если убрать таймер TOF, то в целом система работает, за исключением ложного кратковременного сигнала авария при первом включении, на время прохождения сигнала о включении вентилятора, хотелось бы от нее избавиться.
Вложение 78979
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 и выключить установку, дабы не перегрелась.
Я не знаю всех нюансов, но может так попробовать?
Вложение 78980