В моем случае функция 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));*)
Последний раз редактировалось Николай Суриков; 28.09.2024 в 14:24.
petera, здесь
Добрый день.
Подскажите, пожалуйста, по ПО Codesys v.2.3.
Мне необходимо реализовать имитацию работы конвейера который считает коробки.
В условиях задания есть требования, чтобы у конвейера было два состояния включен и выключен => vkl_konv, тип переменной булево = 0 или 1. Весь функционал разработал на ST и он работает.
Суть вопроса: В визуализации создал графический интерфейс и на нем есть прямоугольник который отвечает за отображения состояния конвейера. Удалось сделать, чтобы при выключенном конвейере была заливка зеленого цвета, при включенном - заливка красная (требования из ТЗ). Подскажите, пожалуйста, как сделать, чтобы у этого прямоугольника при зеленой заливке отображалась надпись "Конвейер выключен" = значение переменной 0, а при красной заливке отображалась надпись "Конвейер включен" = значение переменной 1. В настоящее время отображается всегда одна подпись, заданная в разделе "Текст".
Заранее спасибо!
Вот так можно
1.png
Добрый день, собрал схему аварийного отключения работы установки при аварии вентилятора. Собственно вопрос, можно ли убрать из нее таймер. В проекте уже имеется 6 таймеров 3 из которых почти постоянно в работе, либо оставить так?
Изначально включается xDO6_FUN, через некоторое время приходит сигнал TEST_FAN_ON. Переменная TEST служит для проверки отключения при отсутвии сигнала включения вентилятора (изначала надо TRUE, инвертирование не поставил) Если убрать таймер TOF, то в целом система работает, за исключением ложного кратковременного сигнала авария при первом включении, на время прохождения сигнала о включении вентилятора, хотелось бы от нее избавиться.
VAR5.jpg
Последний раз редактировалось Dmitry_KV; 29.09.2024 в 17:21.
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.
Я не знаю всех нюансов, но может так попробовать?
Безымянный.png